pax_global_header00006660000000000000000000000064147570535570014534gustar00rootroot0000000000000052 comment=526d492e91d98ce96a3b5a98c4bb98004a2b3a65 qalculate-qt-5.5.1/000077500000000000000000000000001475705355700141415ustar00rootroot00000000000000qalculate-qt-5.5.1/.gitignore000066400000000000000000000011661475705355700161350ustar00rootroot00000000000000changes qalculate-qt # C++ objects and libs *.slo *.lo *.o *.a *.la *.lai *.so *.so.* *.dll *.dylib # Qt-es object_script.*.Release object_script.*.Debug *_plugin_import.cpp /.qmake.cache /.qmake.stash *.pro.user *.pro.user.* *.qbs.user *.qbs.user.* *.moc moc_*.cpp moc_*.h qrc_*.cpp ui_*.h *.qmlc *.jsc Makefile* *build-* *.qm *.prl # Qt unit tests target_wrapper.* # QtCreator *.autosave # QtCreator Qml *.qmlproject.user *.qmlproject.user.* # QtCreator CMake CMakeLists.txt.user* # QtCreator 4.8< compilation database compile_commands.json # QtCreator local machine specific files for imported projects *creator.user* qalculate-qt-5.5.1/AUTHORS000066400000000000000000000000571475705355700152130ustar00rootroot00000000000000Hanna Knutsson qalculate-qt-5.5.1/COPYING000066400000000000000000000432541475705355700152040ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 2 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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. qalculate-qt-5.5.1/README000066400000000000000000000017551475705355700150310ustar00rootroot00000000000000Qalculate! Qt UI Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Features include a large library of customizable functions, unit calculations and conversion, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface (GTK, Qt, and CLI). 1. Requirements * Qt5 (>= 5.6) or Qt6 * libqalculate (>= 5.5.0) 2. Installation Instructions and download links for installers, binaries packages, and the source code of released versions of Qalculate! are available at https://qalculate.github.io/downloads.html. In a terminal window in the top source code directory run * qmake * make * make install (as root, e.g. sudo make install) The resulting executable is named qalculate-qt. qalculate-qt-5.5.1/README.md000066400000000000000000000242621475705355700154260ustar00rootroot00000000000000# Qalculate! Qt UI Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Features include a large library of customizable functions, unit calculations and conversion, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface (GTK, Qt, and CLI). ## Requirements * Qt5 (>= 5.6) or Qt6 * libqalculate (>= 5.5.0) ## Installation Instructions and download links for installers, binaries packages, and the source code of released versions of Qalculate! are available at https://qalculate.github.io/downloads.html. In a terminal window in the top source code directory run * `qmake` * `make` * `make install` *(as root, e.g. `sudo make install`)* The resulting executable is named `qalculate-qt`. ## Features (from libqalculate) * Calculation and parsing: * Basic operations and operators: + - * / mod ^ E () && || ! < > >= <= != ~ & | << >> xor * Fault-tolerant parsing of strings: log 5 / 2 .5 (3) + (2( 3 +5 = ln(5) / (2.5 * 3) + 2 * (3 + 5) * Expressions may contain any combination of numbers, functions, units, variables, vectors and matrices, and dates * Supports complex and infinite numbers * Propagation of uncertainty * Interval arithmetic (for determination of the number of significant digits or direct calculation with intervals of numbers) * Supports all common number bases, as well as negative and non-integer radices, sexagesimal numbers, time format, and roman numerals * Ability to disable functions, variables, units or unknown variables for less confusion: e.g. when you do not want (a+b)^2 to mean (are+barn)^2 but ("a"+"b")^2 * Controllable implicit multiplication * Matrices and vectors, and related operations (determinants etc.) * Verbose error messages * Arbitrary precision * RPN mode * Result display: * Supports all common number bases, as well as negative and non-integer radices, sexagesimal numbers, time format, and roman numerals * Many customization options: precision, max/min decimals, complex form, multiplication sign, etc. * Exact or approximate: sqrt(32) returns 4 * sqrt(2) or 5.66 * Simple and mixed fractions: 4 / 6 * 2 = 1.333... = 4/3 = 1 + 1/3 * Symbolic calculation: * E.g. (x + y)^2 = x^2 + 2xy + y^2; 4 "apples" + 3 "oranges" * Factorization and simplification * Differentiation and integration * Can solve most equations and inequalities * Customizable assumptions give different results (e.g. ln(2x) = ln(2) + ln(x) if x is assumed positive) * Functions: * Hundreds of flexible functions: trigonometry, exponents and logarithms, combinatorics, geometry, calculus, statistics, finance, time and date, etc. * Can easily be created, edited and saved to a standard XML file * Units: * Supports all SI units and prefixes (including binary), as well as imperial and other unit systems * Automatic conversion: ft + yd + m = 2.2192 m * Explicit conversion: 5 m/s to mi/h = 11.18 miles/hour * Smart conversion: automatically converts 5 kg*m/s^2 to 5 N * Currency conversion with retrieval of daily exchange rates * Different name forms: abbreviation, singular, plural (m, meter, meters) * Can easily be created, edited and saved to a standard XML file * Variables and constants: * Basic constants: pi, e, etc. * Lots of physical constants (with or without units) and properties of chemical element * CSV file import and export * Can easily be created, edited and saved to a standard XML file * Flexible - may contain simple numbers, units, or whole expressions * Data sets with objects and associated properties in database-like structure * Plotting: * Uses Gnuplot * Can plot functions or data (matrices and vectors) * Ability to save plot to PNG image, postscript, etc. * Several customization options * and more... _For more details about the syntax, and available functions, units, and variables, please consult the manual (https://qalculate.github.io/manual/)_ ## Examples (expressions) _Note that semicolon can be replaced with comma in function arguments, if comma is not used as decimal or thousands separator._ ### Basic functions and operators sqrt 4 _= sqrt(4) = 4^(0.5) = 4^(1/2) = 2_ sqrt(25; 16; 9; 4) _= \[5 4 3 2\]_ sqrt(32) _= 4 × √(2) (in exact mode)_ cbrt(−27) _= root(-27; 3) = −3 (real root)_ (−27)^(1/3) _≈ 1.5 + 2.5980762i (principal root)_ ln 25 _= log(25; e) ≈ 3.2188758_ log2(4)/log10(100) _= log(4; 2)/log(100; 10) = 1_ 5! _= 1 × 2 × 3 × 4 × 5 = 120_ 5\2 _= 5//2 = trunc(5 / 2) = 2 (integer division)_ 5 mod 3 _= mod(5; 3) = 2_ 52 to factors _= 2^2 × 13_ 25/4 × 3/5 to fraction _= 3 + 3/4_ gcd(63; 27) _= 9_ sin(pi/2) − cos(pi) _= sin(90 deg) − cos(180 deg) = 2_ sum(x; 1; 5) _= 1 + 2 + 3 + 4 + 5 = 15_ sum(\i^2+sin(\i); 1; 5; \i) _= 1^2 + sin(1) + 2^2 + sin(2) + ... ≈ 55.176162_ product(x; 1; 5) _= 1 × 2 × 3 × 4 × 5 = 120_ var1:=5 _(stores value 5 in variable var1)_ var1 × 2 _= 10_ 5^2 #this is a comment _= 25_ sinh(0.5) where sinh()=cosh() _= cosh(0.5) ≈ 1.1276260_ plot(x^2; −5; 5) _(plots the function y=x^2 from -5 to 5)_ ### Units 5 dm3 to L _= 5 dm^3 to L = 5 L_ 20 miles / 2h to km/h _= 16.09344 km/h_ 1.74 to ft _= 1.74 m to ft ≈ 5 ft + 8.5039370 in_ 1.74 m to -ft _≈ 5.7086614 ft_ 100 lbf × 60 mph to hp _≈ 16 hp_ 50 Ω × 2 A _= 100 V_ 50 Ω × 2 A to base _= 100 kg·m²/(s³·A)_ 10 N / 5 Pa _= (10 N)/(5 Pa) = 2 m²_ 5 m/s to s/m _= 0.2 s/m_ 500 € − 20% to $ _≈ $451.04_ 500 megabit/s × 2 h to b?byte _≈ 419.09516 gibibytes_ ### Physical constants k\_e / G × a\_0 _= (coulombs\_constant / newtonian\_constant) × bohr\_radius ≈ 7.126e9 kg·H·m^−1_ ℎ / (λ\_C × c) _= planck ∕ (compton\_wavelength × speed\_of\_light) ≈ 9.1093837e-31 kg_ 5 ns × rydberg to c _≈ 6.0793194E-8c_ atom(Hg; weight) + atom(C; weight) × 4 to g _≈ 4.129e-22 g_ (G × planet(earth; mass) × planet(mars; mass))/(54.6e6 km)^2 _≈ 8.58e16 N (gravitational attraction between earth and mars)_ ### Uncertainty and interval arithmetic _"±" can be replaced with "+/-"; result with interval arithmetic activated is shown in parenthesis_ sin(5±0.2)^2/2±0.3 _≈ 0.460±0.088 (0.46±0.12)_ (2±0.02 J)/(523±5 W) _≈ 3.824±0.053 ms (3.825±0.075 ms)_ interval(−2; 5)^2 _≈ interval(−8.2500000; 12.750000) (interval(0; 25))_ ### Algebra (5x^2 + 2)/(x − 3) _= 5x + 15 + 47/(x − 3)_ (\a + \b)(\a − \b) _= ("a" + "b")("a" − "b") = 'a'^2 − 'b'^2_ (x + 2)(x − 3)^3 _= x^4 − 7x^3 + 9x^2 + 27x − 54_ factorize x^4 − 7x^3 + 9x^2 + 27x − 54 _= x^4 − 7x^3 + 9x^2 + 27x − 54 to factors = (x + 2)(x − 3)^3_ cos(x)+3y^2 where x=pi and y=2 _= 11_ gcd(25x; 5x^2) _= 5x_ 1/(x^2+2x−3) to partial fraction _= 1/(4x − 4) − 1/(4x + 12)_ x+x^2+4 = 16 _= (x = 3 or x = −4)_ x^2/(5 m) − hypot(x; 4 m) = 2 m where x > 0 _= (x ≈ 7.1340411 m)_ cylinder(20cm; x) = 20L _(calculates the height of a 20 L cylinder with radius of 20 cm)_ _= (x = (1 / (2π)) m)_ _= (x ≈ 16 cm)_ asin(sqrt(x)) = 0.2 _= (x = sin(0.2)^2)_ _= (x ≈ 0.039469503)_ x^2 > 25x _= (x > 25 or x < 0)_ solve(x = y+ln(y); y) _= lambertw(e^x)_ solve2(5x=2y^2; sqrt(y)=2; x; y) _= 32/5_ multisolve(\[5x=2y+32, y=2z, z=2x\]; \[x, y, z\]) _= \[−32/3 −128/3 −64/3\]_ dsolve(diff(y; x) − 2y = 4x; 5) _= 6e^(2x) − 2x − 1_ ### Calculus diff(6x^2) _= 12x_ diff(sinh(x^2)/(5x) + 3xy/sqrt(x)) _= (2/5) × cosh(x^2) − sinh(x^2)/(5x^2) + (3y)/(2 × √(x))_ integrate(6x^2) _= 2x^3 + C_ integrate(6x^2; 1; 5) _= 248_ integrate(sinh(x^2)/(5x) + 3xy/sqrt(x)) _= 2x × √(x) × y + Shi(x^2) / 10 + C_ integrate(sinh(x^2)/(5x) + 3xy/sqrt(x); 1; 2) _≈ 3.6568542y + 0.87600760_ limit(ln(1 + 4x)/(3^x − 1); 0) _= 4 / ln(3)_ ### Matrices and vectors \[1, 2, 3; 4, 5, 6\] _= ((1; 2; 3); (4; 5; 6)) = \[1 2 3; 4 5 6\] (2×3 matrix)_ 1...5 = (1:5) = (1:1:5) = _\[1 2 3 4 5\]_ (1; 2; 3) × 2 − 2 _= \[(1 × 2 − 2), (2 × 2 − 2), (3 × 2 − 2)\] = \[0 2 4\]_ \[1 2 3\].\[4 5 6\] = dot(\[1 2 3\]; \[4 5 6\]) _= 32 (dot product)_ cross(\[1 2 3\]; \[4 5 6\]) _= \[−3 6 −3\] (cross product)_ \[1 2 3; 4 5 6\].×\[7 8 9; 10 11 12\] _= hadamard(\[1 2 3; 4 5 6\]; \[7 8 9; 10 11 12\]) = \[7 16 27; 40 55 72\] (hadamard product)_ \[1 2 3; 4 5 6\] × \[7 8; 9 10; 11 12\] _= \[58 64; 139 154\] (matrix multiplication)_ \[1 2; 3 4\]^-1 _= inverse(\[1 2; 3 4\]) = \[−2 1; 1.5 −0.5\]_ ### Statistics mean(5; 6; 4; 2; 3; 7) _= 4.5_ stdev(5; 6; 4; 2; 3; 7) _≈ 1.87_ quartile(\[5 6 4 2 3 7\]; 1) _= percentile((5; 6; 4; 2; 3; 7); 25) ≈ 2.9166667_ normdist(7; 5) _≈ 0.053990967_ spearman(column(load(test.csv); 1); column(load(test.csv); 2)) _≈ −0.33737388 (depends on the data in the CSV file)_ ### Time and date 10:31 + 8:30 to time _= 19:01_ 10h 31min + 8h 30min to time _= 19:01_ now to utc _= "2020-07-10T07:50:40Z"_ "2020-07-10T07:50CET" to utc+8 _= "2020-07-10T14:50:00+08:00"_ "2020-05-20" + 523d _= addDays(2020-05-20; 523) = "2021-10-25"_ today − 5 days _= "2020-07-05"_ "2020-10-05" − today _= days(today; 2020-10-05) = 87 d_ timestamp(2020-05-20) _= 1 589 925 600_ stamptodate(1 589 925 600) _= "2020-05-20T00:00:00"_ "2020-05-20" to calendars _(returns date in Hebrew, Islamic, Persian, Indian, Chinese, Julian, Coptic, and Ethiopian calendars)_ ### Number bases 52 to bin _= 0011 0100_ 52 to bin16 _= 0000 0000 0011 0100_ 52 to oct _= 064_ 52 to hex _= 0x34_ 0x34 = hex(34) _= base(34; 16) = 52_ 523<<2&250 to bin _= 0010 1000_ 52.345 to float _≈ 0100 0010 0101 0001 0110 0001 0100 1000_ float(01000010010100010110000101001000) _= 1715241/32768 ≈ 52.345001_ floatError(52.345) _≈ 1.2207031e-6_ 52.34 to sexa _= 52°20′24″_ 1978 to roman _= MCMLXXVIII_ 52 to base 32 _= 1K_ sqrt(32) to base sqrt(2) _≈ 100000_ 0xD8 to unicode _= Ø_ code(Ø) to hex _= 0xD8_ qalculate-qt-5.5.1/TODO000066400000000000000000000000001475705355700146170ustar00rootroot00000000000000qalculate-qt-5.5.1/data/000077500000000000000000000000001475705355700150525ustar00rootroot00000000000000qalculate-qt-5.5.1/data/128/000077500000000000000000000000001475705355700153645ustar00rootroot00000000000000qalculate-qt-5.5.1/data/128/qalculate-qt.png000066400000000000000000000111651475705355700204730ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYsbb8ztEXtSoftwarewww.inkscape.org<tEXtTitleYaru Icon Theme TemplateaftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesERtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/TbIDATx{lמǿgwsIC%vh<1^GB?=a1LDF'p׫D&1ic(%ׁ!T&F0;X}^JÏhJ_2A[lٝEDMа,kuY !:FDew9\7o6< Q a X,e˖m5:n˲.q\RPJ!b@R 4 ` 0HE4̘i@8 n1G_U]>vrA·D7>;cƌ)[ldАjbxx<σҸQsa% aZx80&-49S@̜wxпb9(Da׳/~衇w```EGGAH7RI+ǀ+\MݞeGD_eE[[[?.Ϋ W+}bm=(34;wꪴZηJF%>x/ DJߺcfg___jxE*qwɜ)OS 1 `VXal(KNSP=?)]a>9sihhhJ_q2d voLJvO&^&CQ.[.Ud#B+W-i-p%dGO\D:KJi^38py>aTLRXi%!RGDQ*KTd#"T KhR BB#.N B ͆֨BQQV+n޼)g'- !H("ш%K`ҥXp!z#G/ ylc=`gϞEUUU9a@". cիWsT7nDMM x|VTT_|~+WĩSԒ z{, $Z Q#BAMM كwFss9z˗/\k6 /H?NLrt:}NpitvvƔ趗-0+ /^ȈP^^wΝ;QXX7xW^|8rXHR,c҂@ss3xNƭ[z$TI )Q z=O?) %@@N2@cc$.TO"QGSL455I8)..V(7Ctbpp/4yPP2X~/++I&%PRR͛7{11cB qصkDQ% $sL m6СCܹsYf,XJ>}Ν P / `ԩرcnܸ#GxA~~~4 $Jɯ!O=t:y\.g{GWZZW^yӧH`Æ X,Boogu_܂ ggggɓ'%N-d ,//b{o'b֭[q)Amhh@AA%K`0p8ϣ_}\d@~~>^z%'M6. +WD}}==/xgP[[k"77+`̙^˲>ς׮]|v/ V[h-ZӉ7|SRuĊoI93hnn[oIzy555xۍ3TbC >6mڄBvѣ*Gh4{˲hllħ~ׯˑE6'uuu1_WH9O#: xd RQ/ba;LhaoD v?w*P?랪d|  %yh*!&OdT@P`"SV*QwC2wLs3^t2Y:%w,2,HX:$T  2^@BHLSjm ̹\.uM6Ƅd{Dl%BZVooo/Quہ Xo_"6mڵkq644H뮻N7'~ǸT@p88{_ܹsq\\Ο?}au,믿F__VtO,^?Á'NĕLGVСC~[¬[.RG.C/>uRH>~!xpCnn.| Z ˗/Y6øtRvh$gFPSSߏNŋw^maB1elٲ7oOL收P:6+oǏchh3gľ}vڐ,\:VZՊǏ^6Ξ={2Y(--s:3g0k,l߾=t裏믿f;ٳ2Hca۷oA{{;l6xy>D& . ީdee!??k׮yn`КO` L&9oPPMs)R*CyUDq[ D[L6ɐm(ߟI$1" @ED;m<8C{%$p2A^Hp; J$Ën[s EQL*IG a@ r+RJULR?D| @t\=:ttb*(:::%CT@֋]$:ΘT.v UG Bcc˕qke V>__!D,:::淜c:<y1"w___57^0|]o 4cGs L;]zWI_uG@5J`sA&htUL`  DϽTB/иFjj@1$*]+B}DJ52*****G2WIENDB`qalculate-qt-5.5.1/data/16/000077500000000000000000000000001475705355700153005ustar00rootroot00000000000000qalculate-qt-5.5.1/data/16/qalculate-qt.png000066400000000000000000000017511475705355700204070ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtTitleYaru Icon Theme TemplateaftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesERtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/TblIDAT8mkW?yW%1|H C.iCn!1KBO&'_ |͆B}A!!IcuX)vwr|y;O+Jn..ď'=<Ľjc KKKJ%vww:!'yq*>@@=L! P(U% C|F4McUEjt:eR؊H1u:i ^_Û:@OmEvёZKR!8zcYo$붶:55 l~称#KbMc3dOW H IENDB`qalculate-qt-5.5.1/data/22/000077500000000000000000000000001475705355700152755ustar00rootroot00000000000000qalculate-qt-5.5.1/data/22/qalculate-qt.png000066400000000000000000000022541475705355700204030ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs P%tEXtSoftwarewww.inkscape.org<tEXtTitleYaru Icon Theme TemplateaftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesERtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/Tb/IDAT8UMOV='1xLfHY@EJHH3du;XS6l@vUۉTZAB* )մL?FV"kBBg?wALz?l#_Y:t:)%\ׅϊ)Ę֩z]/(}29u=788hPG <'IPxO}' ¶mFGGCCC-.u 傟 bO(ZHH&X]]dM @Dy1"b ۰, XXX9 "'j}E!:6^탩T id8::yMQwe"mIrukkkD"oUGG 4p|_&~y 痝V ߇Q7F08νD8؁†oR]111E\pӀ՗?0Ʀibii ;;;Rbyy+++8;; yy@ط~fwgffl 4fo*0yh`rXwqP4MiHR( mVu RJ NOOB4Mi41\.w]jl[[[3 'n8s!c(JO*JF:p!.yTz~yyHiWR ' 7(zIa/(99q3u\=)"הIENDB`qalculate-qt-5.5.1/data/32/000077500000000000000000000000001475705355700152765ustar00rootroot00000000000000qalculate-qt-5.5.1/data/32/qalculate-qt.png000066400000000000000000000031041475705355700203770ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtTitleYaru Icon Theme TemplateaftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesERtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/TbIDATXŗkW?o0kpiz+8'XVx ] va]U؅D6Eek7Ju톱bͯ}.Iєɞ@>9}99Dp8|0rR¹;uM.J)KXٛ7d*P裣G~յ ǃEu_:+zNecf.7Y[^Ό~9lvއr}LNdXڟ}"4UHI[7 |jXܬ >{u2eڠTT,[ni07ro4 W@׷*f&D_00RT9G?XgϢiZ%@"ZPJdD"anݺc-uM"P^qϓd8y$ÎEM"YhJ)بѫhkDQ,ˢFn(uO4eddX,СC;Sb )pEtJ)4gΜ… -:g{=ʘض]zxvR@@ڇ$}u MP=]Mc\'?WzTӬIJ⹱ʍfQj)R?S@k#q+ <) twwcYaL&sN{4|osM<,S4GfΟ?ssshXBZIwP>,._Loo/`z]+@$ѣGmyYN¥%+ڊj:*0::JGGMMM'Npu?~\m}!)u@h40O c6ccc9Rv7B !$ԩSd2TOO===LLL099 PN&T6J| @)VR)Ν;Wg||Z9סPL&d25Wk|U3(,..^[YYy؈a躎i%Btp= Z쯥Wny{zz+)[[[4RK@>ks܆mc93eYn7us*K noo?fF_aH)9i_*cmYʀxJyc/=`4ByZ_. ny d/į?IENDB`qalculate-qt-5.5.1/data/48/000077500000000000000000000000001475705355700153055ustar00rootroot00000000000000qalculate-qt-5.5.1/data/48/qalculate-qt.png000066400000000000000000000042731475705355700204160ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtTitleYaru Icon Theme TemplateaftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesERtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/Tb>IDATh՚[LmDQ9TAPpJZ`֤h蓏TM>d5x&mlHHZI(Q4#ZPd30|> x?ٙkk9)gUUUM$ P+IGuEEPi,jFj:h*x hp\?Mggz'z<n7$( (v0 vF7ݸ-0T C7H'SLG#s0y5k~Uooo(LOOQUMu0u43I*M**%m(b޶+PS eoO8zK}9R~ 0SSSy4MC[Hc(*~NE)_g-#翿} PEEQm޼{nnp89Nb?yЋ29CMMg]4uRAbk7d,˭q40TZr+d HT( N3e7nѵCH Xؿ?"WrqA۝dQ7d#`bE`477AOO###LLLpYB-A,O@ي@$!F顳`0ȕ+Wu5{EQ@Q$`ll̖wefdz( (//Ν;{Pp<E`ii Æ U- " `֭Jjjjشi.]B4Z[[.>, sa8v7o$J ꢥm۶Y?K 7nɓ:u7n~=JR_NӧO9~8 H$,_KB Tتk.]XUnI2N!uP)kSw^1sn`K$ XVU#a,=!PGg,F|X-'nyڵR)G Gw'm'?W.[8cB,"-W׫XmEn:::H$x^LdppX;$֟Ř-;Mc.+_QCrq9xb~ӧիE%] ]8qv._\~]vki-n7;wŋ߻w]ٽ{%R2$eׯ_N4[p>X@neu.sssY,#Ř$ny&kXn;vX!۳gX[,Rh0WB\p} #GP__խi^9NB݋(y'O y*++YZZhJp[ KBp ]A@@%!+ |dzg:(,]MMMluBQ$I܌W_>LRW 00 JMČW_g/'ķ»<@5z;$Iey(a|iQe+dFSKe0EdC3ŤIj߉Gq0 , M;PF_+ <)3eHg[Kc~blIENDB`qalculate-qt-5.5.1/data/64/000077500000000000000000000000001475705355700153035ustar00rootroot00000000000000qalculate-qt-5.5.1/data/64/qalculate-qt.png000066400000000000000000000047531475705355700204170ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtTitleYaru Icon Theme TemplateaftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesERtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/TbnIDATx[]LYnUuWtJ3H#d>jdWD2l|ZJiB3 ҀcŻ߾?c? ;T~~~jQQѽD B"GE(2Sr,{׽OE(>ÇL( jB߃'?a<O0BXijr<-IXhV=&IR 7&"I߼+˻n4od'; u~ BOO-iФ2!(//Gii)rrr\zUDcc#mۆ6ܺu+ I1aYMӺCWW,vst:,6oޜbB*aU[.w(b 8qZZZ0888&n}ƍؿ?Z[[o߾ p!p|<f3,z{{fx^(娯֭[rs] I80EKKˊ,czyF9IpYy~̳gpB0>>x;yo޼єg0'2'j \< /@/)04>sp'$W@uՆ7r8x4] P (Lbq/`hf@]`x<0[EN.Y KM>,Q_NaA`c}!0L'ꤨp>_n<'$6EMM 1>>i8[hoo>e kj{DZ8phnnؘz-??(++۷#1`޽8x Ҳxx"xGCCQ Up8P__sCMMM Ѐtm3*0 Iե)n2axZ̿UPPPr Qө@7VBB!@˲r^fs077`HgffX YGz jXT^z)kO@GGA0زefn0 p\q$I¾}@Q,Zx^\~([+Ef!O>ŕ+Wa?~YYYKN'N< p%l6kv5%|5(,, S>{… Aɉ>,z)_4bOMME]]l455k$)jJ,˂V%W=; B !B RJ6JRT_&|JI%,UjF4mcHBMcl}{νs=x&{]뜙?\Hk7 /svBG@tLG@tLG@tLG@tLG@tLG@tLG@t-@#?b(Z:ly|^\eY u!@1zzm| "zO^[b/,V*AzJ498HDX(h]]8DGG4>è(ui=8AjZ:Ma -؅j݃ :tFtEdd1'@Aø [ G{:mܑԲ1#z;52B1=4"— WnRt=!$oz}/}5Þ/.l#t rhz 7sSB4 Sï;fPIL qQ,{[8M䶍l:(BQwKǥ #(f st'-Ggp*k;E 롥D U{`/w8+D%SVhWH %*g_$>9N2`z8$>pI0PᮕNķZcoP"XoQ>XoUCID7 "Q4ϼIsI} WxFgv N=T_}Is\_?}qPFJ֗Gh7O~U1?[j_!7QD>v "yxyxVA|[,~{l#+no;ބg5Gעv `iADfb:O=gPqQ#Q^J'GGi\<ᮕ-<^lr,DϪ8u|{pl0dCunKoams7Ic)l㭔Q{qbG~>? y|BN&V8mz$7|X4vq2Gaz!8 |yMϣSvzP1^{%ͤGp.-SQbW( |a64οN7 C\@{O|n Q$u$|zƌ.A*Gz,Wa 8=Io庈!4 P :]»ߒ$f}>́AUTYZuAZW|'l!@y(ˏ b@ۏz>ſ7h:xK25@6NOz%6:5wOP=Nc! a }P^^FsM%uv+Doy $MN#Nf D&f>z l~:,{GU|@KђIT 5Z:vV'σd/No5N*B%+5X(_3(/R~ʋS$|?!y- ɉ |!P QZsh)SQ1JӼԀ+AH@̒c_?i 4Gއe|PBUл9ı o)H÷:MPܝz|Ft[(R=5MBMDR'{^ҿqdknHl/Q"15"!{)p tڤzjzgtr 4Xzgx rw}/MӚLe=ۮ<{E#}ߋ7Wz%plEF.:?==Eˤim}HMkȶK|ba @l=4?g6O>z|^Sm6>Sϒ6Zvqkm@Y]GFLM.b?jW[.SяvV=~}O{ud}wB[ûv׺lο~?# `:# `:# `:# `:# `:# `:# `:XRg.[?%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:45:11+00:00~/<tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ALL.png000066400000000000000000000040631475705355700172670ustar00rootroot00000000000000PNG  IHDRZ@;gAMA a cHRMz&u0`:pQ<|PLTE      i5!;P 'E 1t~hB O s)34\ ^ X  C P 6|*(u!w%x+> K  {"G b g&'9] J ` 7H M z.qY R 9/? : A !Y 2S ![ f L H _ @ yvo<j8a I SbKGDӗߞ& pHYsw0tIMEӸUzIDATXWR[ X*D(Bb$)&$ 1E#s s4LR h53ZZ T_ta/pzϳA ( 8D"XKQ|{АK}p2)SɊb4Ŋ``,m5C9+i87fUlx@@U1\CC RK]'%&ukA$Ht#JeIIrbʕ ezPNlˤ$ 6lR9S%dmݚRh27gQW5Mdsrr !/7le mp^#;DL}ZCNbֻ院$v))5rZ^^O,Ғ=wI 5+#WV͡*}}Fk8ɵj285;x07m>t6|XH=UݠF騥?f&gHV]Yg&AZןhi5G>ijm9Q0c%6HCȧgmж3قdHC϶;-JFeKv2.iQ Ξ^ket..vx8F0D=2f0ЈhcB6zް㉉'SI#'ݓj~xkzII姽zkxWiTJ&^s3ȏ"uMMsI37s{!q\\OM2 Οvs5:;~[%4U͎$ĸC6#||5΋k}Ή"\,}M#^IOx?9>1|v|8ğœ2>}~7Yg!_ 8t(.1 [&s/ A)v;eAggho݋Ts@՟)R|+%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:45:06+00:00s,tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/AMD.png000066400000000000000000000006321475705355700172560ustar00rootroot00000000000000PNG  IHDR@ bLgAMA a cHRMz&u0`:pQ<PLTEM!n431V\g"Y"bKGD ٥ pHYs B(xtIMEӸU?IDATXA * *wv Hh!z]0B+|v@=޽I%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:45:12+00:00?5tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ANG.png000066400000000000000000000075621475705355700172730ustar00rootroot00000000000000PNG  IHDR@LlxgAMA a cHRMz&u0`:pQ<bKGD pHYs  tIMEӸUaIDATx{p\}?>{W-Y7dc)˲V?wuιwwY]$ӏRW =sr!TЭw(nF_@?÷ ppx4Hr?B/nEƨ$ӂ@8%A.t =wDX ywh: ][XSi uG;P[p5`;;1*0HKt9Fme0/<†/.6FME(Eo?/qwG-Ϸn^7o\DB+jiwro10! }sX< rQ)q,>yvh߫{7{OvB4/o^E44H*T""ֆ1vA~s!HyWWhk@HK4u~,@U5кt&OCMXWv{dhj8(͋ܿ=_$gZd9ypblkg634#lN$h@)߫Tmf39ЪjLs= `O+"@|^ߍ{4󏷮gUDZqƕ`vNIm;˺UxU51j{myKc`RY +e #CrF:&:'\ ?%:=Ż.p5Kk-Ŷ^zSh&I2RWߢ2rƏڹ,Gto+7P4Px)4^j"5-G&_F%:EB#x -wo0_&@/q8؃(ux͸F;ecKX~h.E3 TeȽD'1%zи|EձͼGW)i^\']Y8 < No+,N>Hk%vH:U #7P97Dɷv2PTF@IcKpѽA?ex~ٴtp]KkP#FCGc* Kٛ761?`e s~[#4$jY)˗Y)YEWQU?y,:/_KUi|ԌB,}p1dg$۾XJMMսDu^jQ`Ye;:QGhg%;[9SBN%Qf<בҖ8x-ˊU؎x&t6$($k&\|Dr Fx t]C$ ~U*sckV&V\eY4} Z2:SQp1A݋0<\|I`\189zʃ)ʢj`V^/\Xjda8+ *n&;ODva\ˑA8vT38ص=yF044Huu5Dchnn&prUh)Çȥc _xՄsy-bn@ `azP䃯b>Oh)8&c!lڴ ۶u\.8A4Uv,\MURϢ>nx?*+t{KQX2C `8gpGPkQ2;vSREGMQjx<1<zӥ+(8 +c[UU,[ruB*BUqAez{6a{[9ۯ7m}Giu3E5KsZHږ &PMR__GYI1.hَi k,ƶlnB# %<ԇ#Xf iQ5<'>'"0CB#RԄr _|=կɍDU_BZX/yQ;!\@r[w_Sqen"GIQݻO<hs7h\p>\St%Z)Ol$xRۋoOPHJ\K_y=ME#0!Ļ؝wBGNYU^W玲[ӖDBa^8.53_"B%ߴwj}+ 7b`'؉.a܇mFMЪVY KڸFOQqYybyNDdܛ\tO5U Ϣy;LGڇШZIQr4ဓLۺ\N_4cعvR2QD(i<?R,PPТ/Z=j}OX\X%cU Bը@CvLKX8xDdC44 E5w-v@ngE%RAhE/!N@$ } 0#jT\ @2ifIt'J))%Rr қEb>זDdh{D*I8u^`x(JU !џ')g-ˣBxYF~|F`fyΆx\!mڱ>\'I./p\`!< ehh"YylyNDFY __׵hEMfyΎ sڕyCZ*p#L @"\6S4O@⣷ya\Ѯ ݆yTͿOM;A IJJ3940Eg/-YY<,EZA `r^iy&,BZG ` -υA ` <)<)<Ӄ DZC `!-#Phwiy @A{w-L3Ru]~nzz+mr/\)lz%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-30T16:08:54+00:00=IENDB`qalculate-qt-5.5.1/data/flags/AOA.png000066400000000000000000000046001475705355700172540ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYs$$P$tIMEӸUJIDATx}lU{>gikʗ@P&+ \ⲹ]6@L7YX%#[2E]Lā**jKl ޯ\)2pqIӜ=sy[MSt:5 0LMaj S`&05 0LMaj S`POaE+cm: vƪL{@J6Wm1a:SRM7YȔ&R#I4)zB3Y(fVak %4º-մt MLWȬFX T"1]Wy  ;a 2 ָSx.[C8*&hJ}KSb#jJ^ |TRp I3VFVʀ}&8&ɿ[mpnI@ݒ"J=‚pD0h?JS]yQK@8͊ԼԼYE@D+˿isi]AtC+[5/*7[LRLVDdlK0,@Dq*tmH h= @2 y4IΎ򈐐j ɴ`-.>K%@vQҟ \PcSzzk2Aդ M]F6h0 mz6fk.-uU 7 u8>rހ6\1&7$c] l..i#8Ew)wG%B;4aGƞHV 6?D ~%җ͊`CvAw@NVEa:[1aݞjZ[icyԯ)ZMbtc]負! H! RsCL YHCY ѡyfȬ[G4}[%O8!xA d&',%Hi+>9̭f~Js$ Zdo+o:}ly{4iCϳ&7dl+` S 4Lm}o[hq;u:KgJ<*#C ?`<_7N*!hf!g<ײѵUW:}BB[ΰrٙNʹuFן B@(Pdӂoݐ/O^erD)p;X[P Xk6ӣh?ƱajE&Y̚nѵ'Tm턬`fϰP Z$ظ2e(pl`iN&ͷ=8:rU)nJ)A x`}{IxU]>ٌd4i$ _\0^м? ϱhi}E{㱧KfA㨏F2!ܕ.oJsyCӼ0r\moT$̞aк \AO?5cXv߀$,}0!t<ǿ|ҦB|\ō| I02Y8=o; H&뾟e hIEy M;<\~tt̙es^`m;/>Y%W/vY! ryMjg.{(YA h w(d279kzifLxfGWO=W],|Xwhk]=!ovZfb9%ذ?#EVsã0=[:<`qõW$?צ@#fASЉVhX _`n/;մ*̦ׯH /IFxjى>׎tJ;oN끎fݻY_{k,اod3e ].js#c2q@kxwE^iЦ\jj٢mŲE.O:8ۜLsΦP`&05 0LMaj S`~8p%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:48:19+00:00otEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ARS.png000066400000000000000000000021211475705355700172750ustar00rootroot00000000000000PNG  IHDRf@{gAMA a cHRMz&u0`:pQ<PLTEtuÚѷҹÛÞӸşŘ߽ɣᾊ׿ġã׽ߺ޹ٯuڲ{էiܵ~޺ͬß޺ٰwըlǎCƍF…8˗TϛVܶ޻ӿᾋ͚ܶW/xȁȂv6ߺԹ 0ըmŠ̘ܵVv  ǎDٰvҺɤըj…9ȁӌ ؒ ҋ ƎGཏҸ   ɂȂڱ{y)bKGD L pHYspMBtIMEӸUIDATXV1A"8 MAah@)REK/O+EfC="90AA #YF`80 |43Ǟ_pyP3|pI$HerRhu`\5)aemp݄C H$wv~&$sLhpSRR)1L]J_\^^]MՆt{sF@'+={]vKk6oog'Y9>W܆bJ&qϑl'Jloxeed( GgL.}<֜Q̜x2GHY& h=Q*(:l@D؟gbߺn{9[@Je*'zիD.ΙahB0èμn!wQ#@X7|YsHRJ_}+T󞤷[Ώ^uɁŘ0&9iBIٷoěoN()iuD6 `JYw*{T-9b$t .4cs`4 0u~_gg'14ޟ3_c3^2tBʴq !4,V^ɭ[qHKBq ~#>ur+bhN]Gzt3W/m'_YJKCa!l))oXS4 %ƽȾ/b!,1$$\;,bԗz4w fW [Xs;Di~ADA@A^5 \cJZ+5lԯ{& 곲NL\a×}t"(e*e6 !D;z>8'X8P  2H)s~C aJAVpbsmVTW Td;˾a @UNΠA@cQJ.&Dsti+o'W0y]̏ϝ`ax^T Mb:50}hcXs̤ÿ]ǸsΦ))0M]*'O~'1񍼼/5M8nٳgHqiƤǥM6xj!$%@3m^!_eAexx=CHpN=zG<}'p}\{7[څ?] /jb^>~#mrAPJED-J81"#}^;'핁;)g-&LFi-ZMV3YL "WKS)Mj]u 1PmΜfIq>XgFYY:}3cFYp) ʰkjXh,6͠{"X`.(v8Vp8QG7;.QT8䭷]sgvq#-myÒz决B,\[FL~utq5Ō{9i~.y y#yų+ڒ)`;W K[޺.a 6m:0qZ\*NLwX9eݻgd{9Yn2QX4|ܺUȿJN^\"??ڻoON^1y;G` Cy'>EE?Ja,SSf plj^8YJpWxK)`* CΐƏƉuh]ddifaZ)MkFveewYs۠A1ߐ;z+楬IbaWzxnUYYo ~C&%a憷(%,3z Z0sz8;ga|5Rp3 ӺQ2)SNF]`ͥiT4VWgdf͝ԯ_7$cACpQ_VnĄ,C/_%YH;Ng\XN7k&hCJ PX _]nhg(;hv(Q`,1o`-nwdfnwxcv*?=N"yX]n0!j*d${y҇Π^Psөp.4cZIIEBBww1ƌMH^RRE4׫2!W/W |2J//u'FE}cNC)jKdٱ_,r Kxk]{hu]Էlå`=.Xm۲Ѹsض-{\.8;!BJJ߷xCl ]wVXƥ& g[5R5`*@Ġ Զml\#n siY$0Fs+ YC^bo *R`L#a8mł4gxNJV "箦Vca{l*2j}oU.[J3/ow^k6dHlC=HM?EL݀ y>; bc=BgϞoǧQCnc,Z Qb1)jF zsFC~QFÈjXmӻǟo~DQQky}tDTTtUU]GG+d0MsTgnyQxѻ7yȗp09wNwƯgtR"MU/IJ¹OpWNu+WHE-X,)Jm@yQ6~y)3%Fo 0;uN|P1%)hlRg%&^9zt吏|SU^~^ FAG0AiDwDĉӗADD Y!g^DRJA)t"lBDRCľBrDsٲ11nzkt} ƚ[tiW_ym۾†P%҂_~@@3 n5~ 0<F88 L+&2 :(5;Q用V/8goԁS|_(HLS>l✚bړ1 #c@s˫Ob:ۖ S|ut]FFFtSuݔ  f7bŊIIIq:',HMxuPIIq+VL7 li*ε{z_Nnݢ32[22wɥӋ~{y.!أ6jK"8'Wi馝=Rƽn`-8;a-R=[vh +ya_waS RByvnw7 SʬKM~*"kFjjZvE{fiz= SWif ˋ /j֬aa+|Z@oDYy0b,X'ذ 3F?X Z$+Y_o̝e.BE2lg1خbկxD^QQ#{K)ee2"ھ﫪5jj/&XxYxO/زaî=yҷgO2E UѻSf%zi[.;'qQCwzЉAb|+1bMee-$7-e rw'n \+ӥeRBʊi+.j= 9rMeel?!UDJ%iujqqEzz^zz^qq=CT{o0oq[ir孷~c0gY4M!CbJN^kmek2$"*2ٿԦMv4ilMl>Έ;q„k9Hw{omu0t [ami gx=MM] cӲw(k?~FJJ%񚌌|߼#""Whhlu/)IIl?,DŽH$Xm#Ӕ.ؤx4YMMpa^oP4fcJdOqt51弁^cɓ'Qm%A_*7-nV6ⴝ g\`, pP\XU*%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:48:37+00:00uIENDB`qalculate-qt-5.5.1/data/flags/AWG.png000066400000000000000000000022261475705355700172740ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTEA@@CGB9b5D2ۏ:6[:B>Mtw3D6z8A8CE޲^d .U>>?6A#3/~FD>$30>PWM::BLzFR/=5B0=z_=2>ޏ_d%34A3@'5+8JRz~ԥvMuw8B/>4A(8.(5TZc=69ZPX1>;FptެrE4<;T{؝hB37?ŝ%|;A:KRE)5B_UZquD5쀥l:m8!bKGD+tIMEӸUIDATXVQ -(vcw=`ݭϩ fqg8^BM"'1 H]\i`KyA!0qxDdTsF2*,&VpAKRԴ,uv<7[RBUQqIiYyEeUF+>%ohk*aul8:u{Ftla`phxdtMLS3e,;k/,.Ye\"Y]S776m[;;fBI{ze\_Fq P܎W_:zؑ oS};s7 J>v%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:21:41+00:00 'IENDB`qalculate-qt-5.5.1/data/flags/AZN.png000066400000000000000000000020031475705355700172770ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<YPLTE‘6g4e2d120FJowvInE42G{u6_m8`#P;c~,W37`@1C?fHOs5 ?6}48vK5J?Y{"O$QTwAVy$PQt~/4]i0Io/Yp.YUxVxK3HJpvIoF>EML|I_03AAP r]b#H M׫kjt]42P`Pvy@hce۔pP8Gi>)Y!cl\sfaJ')H3¡hl1 D^qߴ&֒,MƶE"; S'eXU^F6m.Մ^ģ$P2"b=DGHs d! `\V,xR V (=à~%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:48:57+00:00LtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/BAM.png000066400000000000000000000024341475705355700172560ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTE#$ 0$$}E߷'"#&Ga=%"'0M $?&>Yawx( ?$@356Q*Yp)F('%"' s%!/ͩ۔ӛҗԮn#$+H6zVmKd"@1M?Ybxx ?+I߶͕ӛҘԐ@ݵ꫷ܖ= &^t{tM. G<bKGDo pHYs oytIMEӸUQIDATh޽WAYk!JEC¼QؚX.eE3+^zawgyf~b}x에g8H)-x?TzxeG/ " T4X GN#Ϝ hƦf;P!qz.fۥD3EKzz \4C)ߠ7oc U1tÑx,زf-_q X@D~>*Heyf鎔>@|A_R:߃Y[D^No̿ H\ز{Hd{ @${p z` LX ^D6D{ Pz쁂 @@*l=P:gTzu(_z@=Pp遆 8@:lv=>Mt @#plz{.|+}`yeU-k`}?~jp:+Ϯ` P%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:49:33+00:00IENDB`qalculate-qt-5.5.1/data/flags/BBD.png000066400000000000000000000022251475705355700172440ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<APLTE&%9t1%&&$'z%F7 Ø #$&&gP8,sZ˜%&Ǜ YF ̟$P?  {%%k XD v"#—M<  |aL\HI9 %`K ֧ %}yeOܬ!2'UB ΠrŚc"&^J&aKC4 %YE &_JrYZF ^I|a:bKGDj%b pHYs  tIMEӸUIDATXR#1`icc~E2C6lrN&V2.ڽ/nI-B?FYyECTV&,` XF"UUQa6 TG"s&ZJHՒ5c]=P_RmLpƄLhnLA%aWP8ZZt(⸭(wt])zzR]@gT?008#pZ )m1OU`&YǘOB2No6Lybg|Ωfϰ@ \x>LZ/D/`/RKXISPzKJyX[WװvSombem;n;e~q)cod/!"G1p,EpNNqv~qy\]^DP-07z[o3x|z~y^_3pYݭbvu& =[^d]doFwbVF?,o_EMa[%Ҟ%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:49:00+00:00~ĘtEXtSoftwarewww.inkscape.org<tEXtTitleFlag of BarbadoszIENDB`qalculate-qt-5.5.1/data/flags/BDT.png000066400000000000000000000017231475705355700172700ustar00rootroot00000000000000PNG  IHDRk@* ygAMA a cHRMz&u0`:pQ<#PLTEjNkN gM bL7\KIWJSTJUTIMVJ=ZK'`LfMjNdMLVJFG9D1B-B+A*A+A,A0B6DBF_QI$`LiN|IG5C)A)A*A*A*A*A1BCF>ZKiNdMzJH2C)A.BAF/^KDXJ8DiNH hNhNkNH/BBFHG,AO+Zi#6{7H(랦Qa2q~0B ꗠL\0u3E좪Ud 4$9K^l%8狖BbKGDH pHYs  tIMEӸUIDATXýR1/P{P(ww(.]e$3s |\ ѿ jV>Ha aՙ'c'$&%sN2QFfV" IENĹKJ!'UTVU\䬚ZwVbVYKPbVKk[&|ήK 584;WAİ_^Y_O-Sc}}@(C7`22G!s/V6p=)X/ ql&z9#w]ʟ`;"`/S)خn-v渿O''%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:48:51+00:00ʪvtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/BIF.png000066400000000000000000000120201475705355700172470ustar00rootroot00000000000000PNG  IHDRk@gAMA a cHRMz&u0`:pQ<bKGD pHYs oytIMEӸUIDATx\y|>g}d% [Xd( ֵi)VhQA@"UakEX?+X"n ! YHI{oބ$7$P{~C̙9sf1Zul#5:w9HHh4"j\xmzFLˆƦw>,Iۍ&OT5N!^ЂݗoIԖg0JU.]^SVKI&"P?ǓQi)Ȝ5`( ,>B mYټGkW:NԈȹ (*S2g}>9h E c>(Hrdh&")Qv]ټE[knFԨqDg~f¹9z$IigT$8#"2JR鿾5n32 Eo2s~$%Em ^;Cտ\NDEGH~#!sǨ)_)l'!$5M)Ny|}m< r8YooOϚ2V}Α3-郜y(H bkQ#c'8U_L&PAM!Dmm=,stvT;G>p$ YFϡnͽw~mfE(㑺Hk_z k6?JL&{SNtm! ˆ?UL]d|}C@dV+?0 v%&$wU:F w{(&ڇoOdu w9NzkbVI: f}0A\HPUO\hQtb<"44XbdGHϜsG@/yp{Zƭl[o͠&Q۹I-ZJhEeKj^|rf,Bs8j RzwL~P:ybzM }+)y^Z6Q pd];ȑ;oW~m(0q wDBYΉH*FMnĝ4B#>Y-fCDQTCD|s,<$+ޜƭE}%5pwD&}~@Lӧ:Ǟ?XykA\zֳz@! V!r.ye@:|5ٗ@^e܅/6sM$ ʚ:9Kw{B@##( fX&"" 2@e.l&r"whsِl_+_/mKNf3NQRמ]gfX:^SKe;m$==~6Q}fߑjwȘ/MB@d`7ܧWMT$siRSr?Hhm[۶eX6uِ9 (P:lܺ_ҷ"0"͊HR"cCS'Oox޾<[qN)$(GTRf)8Js]xoo{81o ׸mm%)"/wn_?p0I:WTܒ}}11gt j ) F*L9=O^ /{] {oИVzl6QouWgeےNz_-_ng%mQ!j n(`D@Ňsv6V|}MFFOrf5vwm,+~Al[+>Ȁy~ 7{ڊԠX*-})doU^1#=qkCD@l3+HT G%l( +0`}zGA QnK k%"`!W_?T65_.{-T}j6+Hݕ`]7cɝfJ y}luHxA"K12M|IԐ]֛W>fJ1RP4vͶ_ҷ"Vn1<z۫8t 7|RKCX[m ,Y;N62ݟ.q0.8rE.g5g{]'wf?)'긌Qo,}kqd͐uߝ" hU4G" ظuCֈr䆳n|؛zPWIIc*Ic_;:)u唺7?c] 9n8ƭk'A l<{SN%ᅰZLp{:`q0I)`t]Z$UΚ5o5Y3 I:zD}X6hx҇7j^ >?SgZhE8gG׷~ay.`ZVmz,},8hW/F~CGpWes&9l.WZp͓Yh+e n)%`Хk?9G`:ѽ]4n; )E'))l}"pa×\r33~Bd\왕wx\ƁPr0A^zzј+\eG+j1h81w1@33w{;}[w,GDb4l?Qv6Z[|!2ި#-oʳ$)>6qQt1xQIDT Ʈif cgN}mVnE잡|PC-$CA(ߙ%@ ɀal<4Oo -jG|Јq5Ѻ =?3ݜjl4h8ruӖc;x̅$aI6粁~x KC]'`3jwbEUX~36DZwF9cϯŔ#.g)5`rpKE}" jd_.rٗL$9r7Irƒ7|3^y[Cc(!ُ]MjWL&OϊsFDDALczi#;{D#u6Rk3rG9%"cuJ&zt߁1X20ܷw.Kf+3SDFoS}%R nU]gg퓐is& vml^V}ìj4A>yD" ˟> pg /~UNw`n.g LJY ]8Fe h8f߇C; I*2 wx*׵S9cw_s<Y^^>wQ`VBS! ARӁFQ!QS'}~f&RN?hsVid"ެpaѓ{|ɦ.Tg81 @*#'S " GcvGi]8f}'rbzdϓI&JԭO&zczdfDe[Z^>oq? N&J򋫳c AEg^@ny237]rL f1֘ԇ=չRk>.hקH/9: {}K.OTmכaAʶ QS4r 3 [Hǟz|;d>Dq̻g e֖?$.-ɍ#'?~xv5e6oϫ.wAͪWѬsj?ܯgKK=ܜ%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:49:46+00:00XIENDB`qalculate-qt-5.5.1/data/flags/BMD.png000066400000000000000000000137731475705355700172710ustar00rootroot00000000000000PNG  IHDR@](gAMA a cHRMz&u0`:pQ<bKGDtIMEӸUIDATx\wxUU_sK I 5JQЧ$g, JufgFQO$0!́@pD`h!!rqNxΗ/߹;ګ}fR#8cJKO־g*`EpMP;%wƊ ݗ5!n0:sMfV!v G_'.lev dypt'QF*~[ -{L>qcxǶ^͋Lu2s"q8ACM\^K>{ Q38,Qq{,B7[M Pe9:rbiTw7M֊93S'2Sn͆RjK},q?g>׿;K z4n?<.chPt:K0ͼg[)B.' "3O,83%wZ1_F,JCOcAI{C3&5`PKc+szś^xVhuUY%']NC gmnDEZ8?~dɢ4vO+Ƽ.#`LUe_Ob@ZuƇ;z z5=gw *;7F Ef,PqfCDȕ NJ-<:{m1+23D X@ "S&|qs֤*[^mtVL J R]}> 'H8l5KʔkΨ G h~~d1 e !VFy';334qg;ɺe2jm9[MvaH?`\REXnW K^IӇaְV[˵嗈8DTwk6LMS$@@8XݠMjڵUgP=I2GP3N){6ysO)$bfzӼ“,E3sZf}o9S#mye ݖ24SYkr(eW!1nsG@UG6o9p'׿F]y0df dn?e!=x'O,,7//,:Zp~-0@* /_mf1\z㻅:jc8p]] B\)k(z[Z"Wq>Mwg Szݩ: 6իCz2"@-L4vKƍrh ׺ Oz U}U]r_lFЏahpa詩݉hK83!0!Ԋ={RSB fj}o=xlw35R}y6 PQhs]@"ֲ{DYZ!RۭDDTT dJJբs3\Kv^#=_=Ǐ.c(طf~ɽ>jC}'ܗwyYA`(5k6K]{Owz`:%PgXXϷ0 Ko\[@hfeb Zig|sG^eJWUcHavgy& @qc@aKIٳ k> N}`ǃjږOwGjŸP&"$ PJ[y"0Qfi=p05Zt uZt O&܏wP(؞W2IUYBg{G>.M|]! !Y|✌`j37] IN.wŊw$=ъMK:pFG-:ɢ.جm W.5+(@ 2 S!f":1腛&`ƹbuNpӓto OEcel9~U n;sNܩ2sqn] s)(W_%0AE3 M`zRe|Q~c~z))Ν¬a fݥxd&Ҽ !k3R3[![; ҿXr"fX;s3_}_Xpџ78kwGA}3EDQb4t@eF)?~{C) e57+jUXlq?g[Jz:2GDcYi3}ݾ!F)f #ԋ~J[Vc[͜2wj0Nۺv.آ'+B.Q0JS&< Qr|;GLSΎ*5]d1n~U'en'-8AAڰ cB"Pr;Pɛ[u!%yog߼RDd̬G>Yr = ήʀB5adrPf`0Uc_qwn % t?tmc?T JVROXtؽu?{J͌o~<yӧE`~Ϋ8U)f WLv[O[VLl3oZEDSKr?[=JM3z HBJ].`AA ]'ICc>aġK웷U}.BƄP><kq]訠Jۓh?1̼gkJZC#E܆T"|bJX8&r!\H0UݸT%.+EkD]./( VǨWk@0}~\!ŠM!?nn a˖</tJp e5%XqVwIxЧ` 2}32!v{3~q":8N P_a~!{8 .fw2!8*B̔1_}"$p_ )(bf )І qI: wYU5m[tobh(.D:}4 EW)Z2kRa$/$4!f@tq)p G@zn~ `N#YeAͽe6H+qnBNmطcsl2H;N )K×OI8\gԞBϗ<Zca'NiK UfK085w ֩ jW8{H݉wUD쀕YSU+xSbLcz""<5b,:*Q+_9 =Zj!a8jLwEہ TWFیۑB`g/ˌ)7v `i\۸Ctٳ`ڞwa=c=u4@OKT7UeEhHPF97G8Z-fk{n;.8fV$yaU.яYz5F9yMU1 애6޶9*0eآIpXltM-T * "dD Q7ӺV7[,*H]{6sZ߲5F-+ko{>UN8i3?&<ΚڊVM1wEqy5 v)H%{NQGJ*Y4kS@BU>K։u~\ZɄV:m%^^UylvAk,M@ n_I;CvGJ'0apƩ?7[&68#K`h6E?Fw^L4 E nqS37QP;""- Ŵ3&Psۑ*qa(hNP_6U(B^IaA 8BZ5mpj4mJp {7h0W%$&@ 0B T' o?*Ya>d&Kn ͸t[ :WTqe Z9Qo(jPɣ 8sVUTԣ>!p3!8 2XZ#]4QDd 3}w"`$0FA& @ZƷW&|]p |* @{w*@s g_?p;d!&7wɸCMn2pqv %tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:26:06+00:00; IENDB`qalculate-qt-5.5.1/data/flags/BND.png000066400000000000000000000105651475705355700172660ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs 7˭tIMEӸU?IDATx{p\}?>ծޏeٖmɘ1GSI M??6)v StMRI&N@ 0 m!˒-Kjڽ{_]۲2Ȗ>3;앰 \h3݀f\j(V0_!Nۅ D!.-0J)rPrG~{!P(\X`>P@)P^7=Taw%S(8 r cH=r>?8?1W.B(H(( ToxbdNP%PJGQ9 zbdZGX0@)d*ٓk%&S~kAŃ6"ș>g Sd2n޿Pѣ6ekc0ikz Ce2)0gf;\|[y$*lꚋWc(9Gz`=e b68 L-ТX{0#T?GZQT&شi]%K0`۱-@,rסcrSL&ShPX9MM V\I{:;Xj5@n甡|I捷v'2E:f?3Q_C7)(a{ ]E^i]JccXlN$R<}( n9Avn*?"mPRBkV2O2%P@%ֱ|rDfX&9{_w:R p[+$r,}B/R~= ,d"QWW˲KYv Y .wӗr=0B3cdzD~Bkżυ+(AG;1kQG-DkfPhƆzVXκu`u[Oɔ9'ۿAu1*1$qaJ!f] ~ziIY7+WYV.r\&xƢlL/y{^*]22g @I@y>Fm500*(Gm *>i*⦫I3h2Jq9&SZyG&S! dw{ fox-`ʱvZ0MAz2H܉^Y0?$mXah 5=&sFPKD޻y5˖PvniSdOh x9h[)2z,J_9ɯ3Ҳh|11ރT=%͔J' ~ϝoߒ}ovWGM}']9k2?@۶3K/`?"=GYұpy!se7^+PK1k+ص.FDo'vzoiPzoBhN$S5+%yrYFR]˓0C5'fxh>M/o2׮:۹dY,vw/eo k'6p =^}Qt7}4Da4aly'}s^vf(r|=R]fĄN( Ezydv[@w}{3'd'O\4Sx~4~zN4FmLwӤ0-YѢsm<ƲS%]8s'xޕJO[I6a59_+Q:#ċYrڽ7vmJd2ׯm*v@7 bΘL0kh/cl\/- b:{g׃tFwʧރ{z;%Ig$rWӦOFԠ#8w2FEӨIwm(U)EVS^r#]V5Uk*C7IYu]h( ##8O>k!gE!Tk 7@*-:ZľC%;tHΜ/ܲ##%@g ᣨER >kxBT Hf-o בhhS4 P |YU:Vkjpɔx#caɩ5t& 0(= Dqu` \#U}-Fχ*>'}\ւhB/>t/{㾆ST/XԨqM&9Kq:)9v5dZۖV>ӒeY73g>fr hF{K?XŌX ҅8 TLl*_Ȕ94,[sMԄ $y*gؚ0ý' E SBoW s.T I; "$z-̷~k`":BnZqnx4TMPh vNaJﮬ#x&sx7O805!/^vFdKn )[ )~q@qJ1 2y^݇\h}7ݣ1(C'Zֻ5^J'}?u,W <"gR FOpa}0YiyJ@GfiT9%[^) 0 rXqH !m0f49 '0>:@C#;ݢCK㹁 ?̟&XESɚ̹+Hy9&2'A0xlO#X`wid5D BD"⣯p`gۯ5. !g]Ɣ]739.e2<xv3o  A!lpR>>FD^Jl~at6$ sA$v[2]4 dzg$OSYUA"8 aC? '5ԙ*uDau)")/HY|1$XǂH"ϳ0?G.̂@P<"v7} wHl*7) -`AXVE]@D4WGhlfp":a܏VJ ="]'ڧa̖1#!L/Y=7ل7 үbRvGͣyfl&g!=YU.t \2#;5JEEpt:5!P¨S1I`$c&$ /)0"\(NE&s61?gWŤ8]TW(33hWdNG|R4o0Lɜrڹ L^.,`X Yt\eLc209O\`2v{:/ZB9A L s `A<5;%+26%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:49:39+00:00etEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/BOB.png000066400000000000000000000006271475705355700172630ustar00rootroot00000000000000PNG  IHDR^@a ݶgAMA a cHRMz&u0`:pQ<PLTE+, z4y4bKGD ٥ pHYs;tIMEӸU94]-[l)e)^6NvpX8(^,.삝P,%Y EYȡ8bK%Ɏkt43uc$ő[>S}? qnEF"#sq0rBh Z!|73jq8a|L)#}OR][=SM}azO[-cuy[ֱ(`@̹ֈ$ĞC-i+ K .ִ=ؒt=W by'9Ո&d+o[Ī5yGP^_a-ۋjb&- }$Lh|kmQI SwVGH؜Xt5Bii Wv=zi[U4y@K 0ɻJ(/ˈ" Ɯ_j|@Zxd`@I cZ@ iw37r<;g1BHW%juO]# "a  r CYH7]3$ý?cYSl嬬#طpxK${0L`Hx]/teAZٜHhڞt\!p47-џeYXYA t$Nu'RHm+ؚ$H i `! #tkz>]n܍Ld~xS= Ɉ& GM{Qg\D`ˤŝ%w~Pȕf!`,q'/Oob]?FAK}_@[8,:"ȸ(x~W߈HI2u:$m-eb&a fLIǨӓYuWa,,|d>2hx2(|32\%[7mr]$3s߿2R2FI iAmGDnћ^neԝ%F ψ9\_^D[kU^td=y0,kB& BҾ8c/GBVXN#}חե{+3SG4t}t{]_NX>)i[d UV֭B  e&*󈟋e;Uuyl̝ﭩ $5OvpHh!`f`>Ar/'+e}#414G2h]s8WO#鞏l _2UUU({`ܛ򮸼{pLiɼ9*ʺHQ[e2T`Ff$p92X75=扶ݣPGJhCcs0qjMRgv'傒Y.g@< i\F'^_33$C+e}8%ӖcYPmkWw}ʫ O@XWgtBFҘre}#eAGw똞zvvf>]P@gc}cIҁ狨z̓O|sb#ܶ}k0jG2=)!g,o(>!Bat4(K$l$'>JHNYCD$7ַک9r֭233dH;ߛk u7-}(r4,`)O|-ˇRvc%k9k<&vKGYu{sf)px.PUd%+DkW4/H{P/-ˉFlk*طs&1Ю:7W7cZ㽹Mt a:+90Y@;^w"]u77W$㰝N"6N֕Pf8/5202SJ`HuWG";3d}K`ߔdEZ EB[_\pʧOyw -I+{j [JRv b/%Jwߴɰ&]@)@hN倣V AleYg߀@DTx%q/)Ǥ o(ij|j O9S˒nƈ Z7zoeI(n}x$"سHyW^\߿)2nF޾P8`+rJ ˗\œoWw޾q'WJp ,[O} +rW|^e#Np,Ng16 omJ̽-Ζm*^l-9؛=_jer"eţWl\ӱnEGߖZm#;}#eT '6VHaEЀN p<#Ka@l>Q (ۃ֓J%Ƴ{3o5[{p]^|K3])t-~w4u٫#YNgڬ 0 cZoH>`K!}g{~lwU_2 <32ˋjÉꬤr|Ỷgoj^|Rg.,FCVf8YwᡄsMXFM/7]w9<[}mYZ \/F; ’#?_ 3^.Mꊦ\}b,ѝ9Ğ״E\xFWd[{ >ς;aA in)ȕh|wZg,9/N|id^ΊSoL!Y]'c*$Ogk N|[l#žX8o.a EFysD=G%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:49:31+00:00VgIENDB`qalculate-qt-5.5.1/data/flags/BSD.png000066400000000000000000000014361475705355700172700ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTE2;Ve#)p:EqUd;E>;nerrrq9A@@3. +@CBVMDz5BB}p!;~q!> †bKGD6G pHYs^tIMEӸUES뀟lS> 5շ~ . ?8e xц鐐,3O5i*@T$~%péF< |u*Zߔ@ip`Rp= #AЌyzݛ1ǶFg 0`\@**PMpLЀ,տRtݾ s9C誕Y *tbTEh1ڝ?9KWjo tX&cЭ ]q#;p?Q=,oӽf0ӈ9gREݤ).njc ~P췠bu^l}a2 q YX,6zM ݸpm`fhPF-@r ܆ߋ2pLp>ɘHոU5ny7!1ln& C7ϳ-@uȧ}3U3O>:""Mb7bEgѱ~xMu$x(ZLd1DU$wԭDKʛ3 ֏"ф: o< h`MܪLBW?n=b܃p|ZK Ef@Rk"i`Diq /19q*oZx#O=} U-0e UUK$7Uێn=ݶݲxEfQь*[Hl1Єr$i>K6Tn ЭK?t;z20M`Ac-o7uK&$5v} lTφ,1,?e.ʒg8۞Wumc}jF,Zԗe[f&vVBI0f`P5mņu{h1 \Vo'&JiH^C`Wb%o$ܽxo]TYſtY] pэ9ÌFť%GOY!娆`2slJi3Xeؗ1pbFzf4\5ZPqf?MR T޳ss+TE/#TnP& y8;$x*mJ?=P$M$s@P?bg_!\#ԴZ0In~gӘс HqUlGd7GHkLUވ_ !+}=*I^?L[P&ox fzGϑxۘB5z|vI#r7=[?i \E;ps̲od@#59EvY1`tYc`f`/W7#u$Nݢ34 ‚Dg~Bpze?ggD3Pm+I!8E=v C$O *Cr~HoH)ZI)ӨJ3sx$hRy@WHU翇MpOD6b&ڹX 'Vʙ=[0{0=*\noퟠ2>=Ah>< uxAU`Fz!\ O,s+&~F"bIWDΝ4 n7a })_N?/,ܞ-$Uӆj:GsQup]A*-:T}f].*vy F1q18 g_Pe56%waur̐g;EvszC֗m@a'p{<Ǝξe#o*˸8{֐|>/^.9׷9j/k#| ~a%fvxl\,Ξ50v"?a._ѕ:*ލ]\.U3h2!1$@g:$_TFU ⃒8=~3gWt<^j eդv{VqDfFpnDcpRt<~cZ)݃h된@E%TyҘۘ.JEOO\5T9$b?޿l} FLf̉T?U6Nm d9'[ Rs(ظ| ʪQ LbTQV(۳E#m.'ЅDc'! &#Z.G1\GLM]ODUǯ{IbY>9m@q7CǰNk|B[]D70W cTUǯ{IbfKq|8fM'qR=r9{`(+ŷk+&=d1zwҎG(߽dgi 5$Щs}d \!;BM@^нh !R=ϰM#q)85"9w`SL~ux24M;ѿk+&c$=f)̤dbӧPnᖫDn1Dߎ-Ȯb@:nHo\dCoٸsU/>֬A XRfM#S4k:L>|6 `,uٴσd]@mS&mmljtDocDg7qU,z2,1<$:^u$o? _G DJ{3|<[}B ܣedAl uEMP)Ä/]!30vR_zC%2O󜘋ǑlVT %@,fx%GeIDQ $-Ed_wqXxlr8M(]se9J/! ZKuu/IPY-tf!xK|6QS)C,g6ȁmr-]g—諁yNL=H㧱NOv`AoyO,zm}HEOb(^c)b7;F~F1$ H?3|l5hʳ~H6MC@@QSir@AL~rMMg0]b2Ar#Q0x4шNG0D5y^(Mhkb&J/EE7;>{MӰ7Q؂ IA @tɯ8~os1h,j*l{Ǽ'hBɛ˰MDSW%7_tDגjk(YMTnj)ϙIY=TP~\ pU|6xЉcjg["(Gٌ xXo@vΛ{d4#$=1} FSg {d\K1UɆz. ωKFdg1vNEmۄVL匴^Zvw~o~$vJ"IӃdqKnduh, HTOiյGȅ"~]B/˸*$ ۤb` ɳ^/ {{O{X{j26D\8b&::,coGljXv ]O5Re˯\ŵx>% PI|;6cpm@NyɈao'v_-qرNeϙTD7(=5#UU82~,%Fn$z, .z0tk7 2sIu?%|*ɮh "dJ^ ѭ {ا6P~5ћ(GE Cg&uG!vIwڄ;X'Ny=F5_u۱Z$J L_?rQ" x7\Uąo&"*k<c{I<|N[6zX]F 9<J<&ۧ \08fM1点$=Fr dJ,߼f+ziXΜ'ڎ` ]lA4ѧ[& XLp0'x\e7fAτ%oiposM=/GK"J2Ei~$}d5FDB_CM2A4UhZ!;|i4EAД>soY";4L %Gv8܂T$ Zs$4E_wi u)u-[DќYXٴQG%a}M8#mmDTcͤ{_Jڕا5V eעu@Oix\\K" O"!!'Y-&Rf #Ā!(l(ٌd"2J2d!mh"m &FcD;Tef3eWQ| qU0Kp.`q\MUQhkJ2C6oj<6d`5?z,xAGV>} H=,`i4\SXJ{bP񳷱7#Ca*&$BpzĊ~0.1ࡣHV &<V?G1UIv=az;Va4^ ֈs#m.'ЅDc'! &#Z.G1\GLM]ODUǯ{IbY>9m@q7CǰNk|B[]D70W cTUǯ{IbfKq|8fM'qR=r9{`(+ŷk+&=d1zwҎG(߽dgi 5$Щs}d \!;BM@^нh !R=ϰM#q)85"9w`SL~ux24M;ѿk+&c$=f)̤dbӧPnᖫDn1Dߎ-Ȯb@:nHo\dCoٸsU/>֬A XRfM#S4k:L>|6 `,uٴσd]@mS&mmljtDocDg7qU,z2,1<$:^u$o? _G DJ{3|<[}B ܣedAl uEMP)Ä/]!30vR_zC%2O󜘋ǑlVT %@,fx%GeIDQ $-Ed_wqXxlr8M(]se9J/! ZKuu/IPY-tf!xK|6QS)C,g6ȁmr-]g—諁yNL=H㧱NOv`AoyO,zm}HEOb(^c)b7;F~F1$ H?3|l5hʳ~H6MC@@QSir@AL~rMMg0]b2Ar#Q0x4шNG0D5y^(Mhkb&J/EE7;>{MӰ7Q؂ IA @tɯ8~os1h,j*l{Ǽ'hBɛ˰MDSW%7_tDגjk(YMTnj)ϙIY=TP~\ pU|6xЉcjg["(Gٌ xXo@vΛ{d4#$=1} FSg {d\K1UɆz. ωKFdg1vNEmۄVL匴^Zvw~o~$vJ"IӃdqKnduh, HTOiյGȅ"~]B/˸*$ ۤb` ɳ^/ {{O{X{j26D\8b&::,coGljXv ]O5Re˯\ŵx>% PI|;6cpm@NyɈao'v_-qرNeϙTD7(=5#UU82~,%Fn$z, .z0tk7 2sIu?%|*ɮh "dJ^ ѭ {ا6P~5ћ(GE Cg&uG!vIwڄ;X'Ny=F5_u۱Z$J L_?rQ" x7\Uąo&"*k<c{I<|N[6zX]F 9<J<&ۧ \08fM1点$=Fr dJ,߼f+ziXΜ'ڎ` ]lA4ѧ[& XLp0'x\e7fAτ%oiposM=/GK"J2Ei~$}d5FDB_CM2A4UhZ!;|i4EAД>soY";4L %Gv8܂T$ Zs$4E_wi u)u-[DќYXٴQG%a}M8#mmDTcͤ{_Jڕا5V eעu@Oix\\K" O"!!'Y-&Rf #Ā!(l(ٌd"2J2d!mh"m &FcD;Tef3eWQ| qU0Kp.`q\MUQhkJ2C6oj<6d`5?z,xAGV>} H=,`i4\SXJ{bP񳷱7#Ca*&$BpzĊ~0.1ࡣHV &<V?G1UIv=az;Va4^ ֈs;wf"U,߄ c#‡qkG= ^B<}CxXX8>*!8&n1!i\`y qD裤dbZ-4YP!I cXQf&gFhr8!m0;uEUk-7[!A =5#!LcqR̘''$IPJ280KEϖQ6( XaC>! pC xwڋ HSBIچ'WIcW#QD|߼1 o㸒*t!hgvf :nʜtx7,8('v,!cP{7?288>G:}xa1*8T)!@44nA1.cQҐp%sEi_l1Cn?*UzJe~n *l`X:`%4% : $alOY!5_~Q~66mҠ駻ѡ'JWg{hAxh =^V10칝jظ]|wG !FcuEFK~XEN'eL[z59_ ^ 9@Y!,U,ͷr~pf8w2^zMM.۹42RX]'ze'2ڿ`BZ~^+D<1?k(R:Zwl3VP 3V~~~~_MecW %gŤ$f'^:* ?glt_`fK3>Ga._$8))8j|97%1۱ѭkSg=ռatwFx3.Vz<)kUZJUyXp%|_Q2<̿ѡggxd&Ͱ$r(ӄJҋ $02$bCl.~̮H%'SR]"l9Vn ]húҋpwb $apk$!\tI]W;'!|bN8IBǯW(åToٽ< 8dᡅaUŃ6[ӃwO~۵/qt\\R{GywrSWd`gyFFQN|r|䲬!C95/ESbEJS&,4tx]b I2v9:ڑW.{ĵC4w'RIib2Fzat87k"ߪUWpyc'fo 31 ܒ37s7}-[xܜ | 㗚~y :Fnw叮~|~=vYA:;< O0z+8u2¬D9"rS!Ҍ2PGW3jևvn=/ߎ_6x'I 4͙:_=:_ R~-}bEE[Gcl KD^*)ܹ2l2ikiZܩ`tzFz{ !=$ BLxEnSn|ug139q``UҊp"Ύ|{k}]qԉohѼާf+m8X2zhǀ8ƴ̿ӹnںW?IX(_$3A .*i, P'>fiB$h_zh6ϱH!Xhރ6&uC9?x#8((:'6@5ră<ǰ<EGu:ÿq/~9qǨ/uF !>2K†'v澧q<$M]Msr MⲇYs_*R1|%}EWsBw\6M6OP8. c%Qa/9'[ۻDJX\txm;.Ƽ-DyCb7D=p,GHa2Y7Sw[eqF0@*C>Η( *1>NJBcYe=bZ!5kdZwi#( EG?pxO\5B_:D5ٌrB"d!z&A)BaiS}z(gҟa9'T ViG CxB߽s_zew@tz:PH@~pۜ; B9e #G8 c0uWK]߿>wJV$J`G~ϰW fYTX¬aՊdXX$) wuw&반*N.9u[/u7$6mC~Q 3N<aBupppcB-<0X1v͢c'OK qdc Cv/Z[qӐH$anNHXGT0:Ylg =oƒ$Ooc B/α7qrkZ(Ɠ.ezh{fxpd fLBO]0*n{Ӵ2vUѯtf!Al:vP{%kgpw.I i53 ][uXXޠW*}jsH #4uˬFH@%' PS>wDBRPSS5k<QR~[բ{=:ss.܍ +uDY1;=e]K'†ٵqNO Wb.NXشfk 1!a#ك5`qyf c`sHS{KL0+촍$HBk6I1BUÝ,xlͱ.<C,e%iGD |bN9[Ͻkr_ShvpNePn ]olmo4t{q1aPfnٚ7"x8g --\8w<ŏ$RIB殦iZc ~3Da2OD2#zzʕ G͚BL$//HL>f̣>;gzA_]?%-':40.ńrLdJc5\Furlu''외hSH}nbvdm aFs?ں 1ٻeG"Hկ]Trv).w< ~#ԅ\wuw.GloMˑ ^tI+7vk^yd5CKes; )}Պ@cUje%iaHU3GxnS|kpҠ!1o~z}^ahPsi8<ݙ Gy˔7:ʀyB(pX];O($-cCFpkbR]N1 > Xܵ#M0_37EJueG!9=nyw9݄mf2-ΡC0Cn0V.,nUUM88{/Z%bxt6EPX{n7k@.uo{5xB,l7|[Im{wlJLP 0 p008ҽK֦I)RI CeJ@D q3RE:Ws--]BCw=v(Ef6;%$5?BS$-=mu7;4Qbj73yXu=_AK_Z2U2J.R$.7kq&Z2 Ü %^t݌M$ȩM=W7B#?-VwMDCbg'ҿ?,J[ER%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:49:07+00:008IENDB`qalculate-qt-5.5.1/data/flags/CAD.png000066400000000000000000000026321475705355700172460ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTE@@66++yy!!%%XX,,NNvv22 ..##]]55ccLL==CC~~ EEjj``((qqZZ3344xx""))DDee::|| hhOO 00JJIIgg[[__YYSSTTBB<<$$88FFAbKGD L pHYs&:4tIMEMxIDAThS@W UDO"bE{CŮpw6g_sw 3H_x_^vf~$Gx<$I!O@MTJXL.PP%AF"Z ~Lca06 BSAjhxb.Vm`{V* 쥠݆Uv($ϩ\Ŧ>v9;Q ܞE/I)%?00aFF! \(tP2~c <L0lI>7lMvgLDBa&,a 48ðEtYltNs1\3] NSy>7D\mPMs`qIx"YJxUJ@`*ʺ,ԱZMC*nm5Gf5epk[xױoGhюM?P]T I0Wb/DIM Lo&d_ht4QOA[Ni^ƏqCO ӳr)s^\fsi/\]Xۻ{ޤWXh=N߿<=E7,F-{NGT;Ϲ  vޟGUM )h٭R\lEknC c>&XqW≜L![#"Kw5 zBUBju(k<+]^ˬ"h(]ѼR]D+\C\[-z$D{'?a [U/Vq/~!0~zGT$etr++A^\P^'rrOpؽ /\u0=TFP; ѱHTiCxx[WCAq\T iy,xİc^O5jWjPAկnW}r^(Úh D:T 6RE mnW]wTgHqoW%7Nᥲ?P

2>sµVL 5Y䐨+ nNX?5z(vT?7P%F`<ꂆ4ܫ4ZN>jUTUËsX]9o Tف*!ĽS[Bӭ3@8MTXKBYC PƓ 'Dښ74UԄHu8븦eZ꺮y v FJy_o'vK{FKIUb?C'jj?,fl6MsAVIPgfKڮ*eޢG⚤sgi᭪yt%.xmQ;0͏(Խy/z'ou qtꆠf8y~0ۢl:zKAr~M5P{3xa;Lui{+l!4ݫ{T;Y]5K氻>7 -tihT]11Lƚiht㷥zG ҳ4"zp5P7eph>IkƁ [7:XN^(Of[5O(p1Tl<6y|R=a`̠>8 pK}{quUX^{tb0%X{[sv/Ne)̶t U "74\u³-MCe1|xEzGt9(W6cQ,TL%Vt4"['N[bPu4k%sxƏm_,9 4A(:9oy;4K@;Iȁ&:jz/?mN ѐ%I&UO(olg-z:W4CRKoY]5K@;n<ʯXB%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:16+00:00~6tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/CHF.png000066400000000000000000000007351475705355700172610ustar00rootroot00000000000000PNG  IHDR@@XGlgAMA a cHRMz&u0`:pQ<$PLTE::pbKGDa pHYs&:4tIMEMx|IDATHc`H&4 Q9J p+H)(U@LH4w.)ahLRP, #R!ш P":TP6 (AM0F7RԨBb`A: h |ʋ ɓ%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:48+00:00JutEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/CLP.png000066400000000000000000000014141475705355700172720ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE97Q:-\8 B6c64w!Rp|y{ @b1_F.]l>r*Z>i8]ƓM R?9Q765L-.,.00B8E9++*)+bKGDhQ pHYs  tIMEMxIDATXǒ0 a 0Ŵ{o{yw80㋣.OMDmY\,h`0 ! @)"F#Xke5fB`.~G8 wxZuuqo1DR@}j(Htta*A>Hd3Պ(Z/TooG/%B5e] { (c-Х~ ~XhɀQ~n[m(g`o4nC6wpppppppppp[~3T>%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:02+00:00ԛ!IENDB`qalculate-qt-5.5.1/data/flags/COP.png000066400000000000000000000006441475705355700173010ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<$PLTE޿%J78833%&#bKGD  pHYsttfxtIMEMxCIDATH1 @Z,` X*QIo?HLhX%6] pJ\#J°#B%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:00+00:00C0tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/CRC.png000066400000000000000000000006661475705355700172730ustar00rootroot00000000000000PNG  IHDRk@gAMA a cHRMz&u0`:pQ<PLTE+'}Zves "&}bKGDhQ pHYs&:4tIMEMx^IDATHc`#  rèJ`H#$0 : Fj,,,Da> C2Od6FH.}%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:10+00:000 tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/CUP.png000066400000000000000000000031351475705355700173050ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<vPLTEG6$u****4pY'+*;W!e),D>#q)*/O)&{+5j\'=P!h )-8$t*1}S$&~7c_(?J"k).J2%w*)'2vV=@?a@`?_*.E),K\(3ds*)>偍:M램-Qb5lz-A牔@R-0D,)/Xh(=ꙣ#9"8sRcI[1E鑜萛憒GXҖ͓Җ#8)-J/$w)*'L^DV'3tW' 6/C,A*?铝犕:Z c(3G좫/D,CA#p).B띧ꗡ*?/N+%zjyet.4mZ@Sig ̜5L3w`!sP2#K2_eWh+UpI5k׭w[vaDymYIYe[ݮع+P{|fؗp_&@'C]%#G C'NO>sE( Ν΋EI]B_+Կ~q*n{;w,tG>ˉ[; 0./_,.pZ2߼߽/QLE'Mc_ߝ=[(*7~a3b.+Vj; mm@h~_J'U8ͅF3t~}IT.=x{bifU^<~Ȋkb0ݣj.r!4 jy~pr[B42gv_l.EGyIzFQIr6lN"$%z_8D}4e*Bz_kOVRFD:QĭNe7)U$ïڲ4gHgC0PBZD<v6aR#:ƱM{t4\!;ݣMVԠx_tb4Yba19?K R w}Brap ~aTB Zt4>E**t:JAcPsm8Ɔqm%$=gzmB"B!wQ+Q΄HT_+6L CS|b[?}j&SN%r'`J_g{*.NZscN9$ kw zVM0?#ˏVR{=Ad MY1L@>W!>PJ@8s+27P ZFn]-BJL30+H+5@!hxB;o1 P "} sNw B ~/`54{h0{Y/|λ`qpǯKkOס%4F.D:" d3NOauaYQ.i\sإSh,,!@&470-nYcd|q'J@fAZN&*X☀̣U O(ى=X 1BT@*eWQd'pmr+`AYx b?Q``ǐ:eь}M8_ppG)מz+UPT(Z8}r-SWBo }8ݝcPУv&P}<9 !7V-8? sMByQN0ls9hׇ, 76OT1,' V]dY!O=p$3!*qsqM8|8zU3-e;R\'?t9T0Ǐ26]*k8vxlŧ IPc'k(^:y[p)4Fݩ-IٽqҀ/E( -U LKa$QŶ8F^[r_WM{f|Z6s+w/1Zgr&T*Ljܘ)-KWI!LTiդ.E<~=-XOH:;Xgnb0+X]|jm&I.( LpMcZXPI+Vƾ# հEY_4A 1%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:49:51+00:00HtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/CYP.png000066400000000000000000000050041475705355700173060ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYsttfxtIMEMxIDATx{PT?wawY^ <VI}Ĥm&u1fZLӴ3yLm'SӚԙ&&fLXD ./q$hM s=w~E!`&;p`"LD`0 &"D0P5ylDH'Կ5y| Kp*jפ)%r?!y`2k\d =ǠRo¢I[EV@[PGApl鐿V߹xe4[ٰqnݸa+mt=(<rUԵK xb369E 6f=?K 2CpqYs`,ozl.BL8&R@k nz)JL_̕`/ [7qSCvh+Q 2ޱ{BE[\C^#U)Fɜ,{q ru җ>i_P aLQ>䗯#ZqY*\!+_e[Ag]F0-DG–#OH1*5Y~~X-}d+34~Ls7A}83x}#G81=L0)xc_B^\.֭0E%ӄ*w[9y?QL.TܵM){$#u& ;wQ<ÃTTrg3Ņ%z` 8xtf8iexd`8 ;ٳFS%X[ 7r,f 5ihęc{N᷉Ų|M}u{r汻u/[l[pLuM.eAg'$LJ!{;_#7SeE},_3-4,wc;&ݮv)̝@s{93ild^)yEShAp :20o\mSBaOX-1:˗W=D^v!VdOꮗx`&S-*/([4/gfFgsAR锗j> !WzqmEs{5u,[T aOLƞmb»IudLFkIJtcq1V^>l|B]rI@EQR(ʟO~NlT5Cs%.@0:?iioYg/g[ニJ/OV$7&b6d9s=k.ae|W/9JZ;.s8|{f΁?; TE˹zznW;z:1Gc%dLv!3#d9sy0(oבlOU rih~.]"?G$[([dkJ rq ZI;X8g+S[@0ҒU(̛¹˰-qa)D4\mD0`"LD`0 &" Hg%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:21+00:00V<[tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/CZK.png000066400000000000000000000013521475705355700173040ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<{PLTE_D}7bE~C}JiD~C}5a3bE~F-o&?)0=nR5],ZbKGDf |d pHYsttfxtIMEMx2IDATXõ@DQ#1PBaٝ9APR/M*ڝ.{!50#1"+"p"% D"Q # ."(`"""uD) !!|#g FƓ9QTц4UE;Gu=y!P7,wdWxxOgii\ڻ]4MZauBQC$dGDn~Ԇ!Y}em1m@8W{ijRmCa0~lp<@U֍Uuyel,RIϘoiyJ sqi"1Kj6l`ݯ_fRWWAE31>LOoE8_yO?Uщv{韽@T|Ϛ4~ M@ AM%|!%~y8Bu<c- y J*ZoV8BCd=B4CUT<|3X$E ZW7RHe*+6=F|O plp">c7zV T)Z1xUj֯_5? jc# [#?!u1ar"Ŷ&T~GNj(oY}-ϳaNF%H ep3&Oҹɇ"wA0H|-{fu_ڼ&xÿF6Pw7Jq|Š.RSXF'Iӷs[U~!T$¢s4ۼM|YEK-w&U GbŐ4u_ H)]3M-=}lnc6(jEgDP?|{90v3ORV #F1TEY9'Amplf XB)(Izcm?h7jbS2(}oo0S%,̚s;._+I?wı5Y"]lnL,<gщvV(J@HdO WO7"(Mq(/v2BJܻ~$βuُk%8=G;|o~ė@M\.* lDy3x~Fq7f,#'x¥'@Hl6ư wK-vЇ2 H)e4nģn}PFj#mtE{̪L Ӟ%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:24+00:00ntEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/DKK.png000066400000000000000000000010611475705355700172630ustar00rootroot00000000000000PNG  IHDRU@\0@gAMA a cHRMz&u0`:pQ<uPLTE 03!u(27%w+5k#"痦癨吠擣瘧斥原咢斦';bKGDhQ pHYs oytIMEMxIDATX0izCh De!Q7}I;`Ǐ<OCA *TPF5Rh֨|aT+Nju͛tKG>j195=3;7HYZ^Y][٥_\Rdon_8qdX?NkYp)GX E`m%T`-(js2 Rk[Zd؂6vL*]ݺAO/( aMh`bk2ix`Z؂3`0̜e2=g#ɔE ;4ph_eҼҧ} /7ieylm; @.؂`ԂQ F-sWW%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:45:08+00:00WLjqtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/EEK.png000066400000000000000000000006211475705355700172570ustar00rootroot00000000000000PNG  IHDRe@3ygAMA a cHRMz&u0`:pQ<PLTEHH3MZZZNkbKGDaf} pHYsFtIMEMx?IDATHc``($0( IzFz\H $4A¨Q=zWLff%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:01+00:00 PtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/EGP.png000066400000000000000000000025051475705355700172710ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<CPLTE&'(*)额䚊矖ךsڡύЮ?ӳLϭ>ѯC׻^ujڿgؼblϬ;ѰD׺\Ȩ̌0ɢ$ĚΫ9ѰEֹ[ԵQ˦.̨1ɣ&̧/Ϋ8Ϊ7ѱFֹZշUͪ6˥+Ю@ͪ7ͩ5ֹYնSoͩ4ұGָXߴן՛ߴޱͩ3ұHոVАЏ۩̨2շVtͨ3xոWکסӖʤ'ʣ'ע֝ӳMנϬ<΋٥ϭ=ҕ٦߳ڧ۫ԛs՜ڨ٤ݮܫڨݰӗ߬٠ݪܧޫ߮ƥ\VbKGD hV pHYsttfxtIMEMxIDATXc``Q0 F$&f40298HE 'Iip  Q !&.! DEo-PVQUSRQWSUQzF&zfT̜8:98ɺ{xN:T? 0(8'ԋGDFFFEFąQ݂ĤdKĈT[ᒙ-뒑Mu ]ċKT] nAiYAyEXeUUuXMmAY-kjojnimk褺 ]11=}TwIL6mɓf̜Eu f)TΔ3w^Tkꂅk.tڈ`VYn6/'ނ-D۶عk{m%^^PM h F-`ԂQ F-`s̈́x%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:48+00:00ptEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ERN.png000066400000000000000000000072531475705355700173070ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs&:4tIMEMx uIDATxiygy{7`Lb7,ue)Q!Q)DQTJ[E*TKPRFJlu q)K/nM)ٖ{îW#~F;IX4(x5rŬp+J!p h:1z f,kO-K(]B/XB R@єrс`&GM My4T ֘sa UzĨPu ٓ oCH~ؕ=[0=DxӴ=l4- u80K=fǟn=)c(гo |\V+54&|"H;:]_j|8?M F@E{>MA6ܛhC ;J\Ot£=OȞYl6DVg+}퍤KP_-H{͛2]Yc1_K>YAE+| jwX%L'Z!7K0huErd"; R))&ķ_cP|)4/j -q9 F@"P" {qV6,H8(G7_Bq(PQ7)?}2aq&RcP"[T]7Tpv&Z_Ql|xM~H{_]0ɦCq0:)UOp5YQ]2♠wycAx5G4jT (ɷĸ7sIÅhX úO oKkh,k vü*Y3snB8òV۵|Poi2U6K<*;_v#A_hBb{sjSdC,9k(q5ѯW P>J$ 8mwqdB-a[Ñy 5pڠGO*@q`@/+Hn+Ǭ+uP?h=rg> o}y=<Ѻv9kH WA_!DKķa*s`PP| c1PQĵΨ gNX j`;4Le52ThN6Zt=Ԅ&L£KSQ>ޝE!ҡ`xkmNU[fz+{C)E+ii<آڌa`m\[4V#Y /FAt]YYQlo,Qݡk8,%ʄX"01s VOG4>a`*̞o.i|E5֘+zGǒШ!oIn-1s/x0 3ù !=s/cVP> SgMЂ;xN5tGp>Pkk'K ԡ;)Ջ9v:8_^FF<9 R,ii}3 j~4[ #Fr#*wW9jѿqG5R*5Đl*~'>˴e &s uv G;ȟ)poNt4|FuWk` <3J9; ?hk_DqGM%f oaLx4*)⏴ 2:m~zb*W!_8!g|e$U,VQMPPbCϙ>q6r4|3@8l nAw!P`i~+Žjai`ov qy9tX1΁*IEr#"= d2>VML|ھ+ڛ7+ -ad,>g6v:>ˆw:S593}3_ 1|5>t T:O=M(çOcc׈>t ᗟ왺ӚzG.dߒ^Y}Kz82cL=>{{^ֲgJ_L_cew>S %tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:42+00:00P/AtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ESP.png000066400000000000000000000042441475705355700173070ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYs%%IR$tIMEMxnIDATxoW眹z}IK''!MȅRTPDR%x ! o\ ڔ\4-l;9slf :BfzlW` %F?Vk z-°YJcmJk@Rg˵ ڴxPu7@MΎ> cIgcbQdPԩUCrsb)\h+Ԫ!N5YC*l8XĴ8ܞͲZMZ Crp_[dow hnUVl4$B6AhNIXY*nRM$̅ hw>d\•O#\t-lb?Blp:]qMi=٘. /[[LO 1>/]vX lmȯ ش`?r ( L¡tȺK{@a~f xC@cUR[R s*t86FSц~HVU+4(b= ]`$lrh VpE/d%6QOv|k ͋L20q/b3v/6@ f9ƱQ70deX;L ZhSۡ GBĨ%!CEG5tN`xiOAT6PoXeu!dgiVqw-H6v`{ثDT#uko#+<,KkIoj>DR59䤃 5`.۫49r0E:bz uU@5Cio.VUԋ/X8l >Fh6 ;2QDfGX]7hwm$P fv~ZQ~ }yΥ?w#W?&!;|#؁z!OW2 ,A-l 9|ζ/ ^8ƭ6~M'@p+u";5MZڒ@aZSWgJl*-eBP.,iWaRw|/|P3w?l@OJ1mb\]/I}T"ҊXo4#¼*5A`O*zڨ-RS ߧ0[ hu_po%%*64 !I#CP, ck=!~(|7%^8p?-<0s|qU>qvIƸ{3FD +0zͮ#/9o}cBpW^H:f]c79$mcgBkn?(Tgm9 D;>L;&K M 𵇣Zh^x\t}CƏ:V8Zu5(v#V)|!Ha>jac$?:PM_7Ҟ9$/^]B\ y H'lbI&L* aR HT@¤&0I$L* aR HT@ ]~ =%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:37+00:00ǩtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ETB.png000066400000000000000000000102451475705355700172700ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs B(xtIMEMxoIDATxyPUW?぀ (`ČرN&I'{j2L&mJ%1YDԈ+a{"Cs( kzT?s;9型 m;02"aΈ9#`3"aΈ9#݁j_ ѕ>н`P6 7%-+@ ; 9Z"u3᳁4v@ 7*Z}^5z6|k,z]&zd+2`!:ZzL QꇤB"/FDC{#rJCh^?4 (!%!"ם\D[lസNM B~ O(FIS%( a@ߊQQ=vԘ9 c5y{u "%"0T,Cԃ9  ¨ExC&3ą̷T,C4/f^m EDH%"Տ_WlC_fcX~+~+aTf H%HS3y;[}@*ɱ|-('㫐}@![<1\¨ <&Ŝ= 1-o|M(19GPL53L+%g\+A$JaTGoLnEu 5ÑX~=>.r$!WJnogiFVlj!&7sK'.+\Rc8r]B a5vwH%x{׽oEiBKX`4 TK;]l z51Y~;!QuM{U.X<}8|uKuMrܑBڸK<^rMJvcpv)Xt?O.ŠT;R~ E P& _ Lsu6,)j@3MŖVfaDe 5WʼnI,I?CX5Ö EuS ?NwpFP^κZyr2_MJL-Sbk}> ςga,֐SKj2xr\^^40|[>GCLO ϯ{HQ0$gєs}d C%Sqy,r1l.ȥa=o .5Mh&w#Jq,NC e,^rR/v‚;}s&]H2WS2t:}>+GX3`׀1P)JBܐy|R _z|~ @ejOHtNVv 8mEë;bct AEu-o[[04|KTigkeG5[Yz?lB*@dSꉜIjf-d%8`^KjXQK?alh l[LJGnIPtNjeS<"0I> sNiBYxR6lzVW06 +ҊT)1Ɍw|.]¾ J %2RiD-l-`W}0NV7A` $+\k7 !v=qvځ5y)Y,IO౜}ÊmdW᥼㴻Є`4Yy)ŔǡkVwT HeFB۹J`G +AX9` `)gpΡ_ՎQd%T?f^J1㣂EtAIrG)Jf߅< 8u_)5b/3wR DDMSF7qʰ e$4G⃧^#9[1-"/u;&)<} l>,ŢRQ@zO FBwbSSnҘ\JDHqܑR\]uycJ߮hRhLvWz|iG$q<1!`5_3߶>rRR'my`@6xv_|&?_|&+3cy5: A5_0wɡʏJ; SBp ; 1 4VKP [ф i 5u]Ia 1VnBGn79q@XqFρ~G(\^+Jxyu1O3&zإ/m`{ g_jkvh7WW~rK۱˾_@5 t`窷me} ;PIgu{X_%q&ynuƁ,i w UWK]XWБ7> t)Im e{E)!R+w7 )@ QQs8N^;+H鸌4]C 9t)NhF%s24lAx35%*ĺH" z5(4BMK(-zZ  ^Dy[0et1$mg ׏2P3\wJvCSwJw4o֪Cӱ0`F00gDÜ sF00gDÜm73%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:59+00:00|{%tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/EUR.png000066400000000000000000000114351475705355700173130ustar00rootroot00000000000000PNG  IHDR`@jVYgAMA a cHRMz&u0`:pQ<bKGD pHYs )ItIMEMx^tEXtRaw profile type iptc iptc 28 3842494d040400000000000f1c015a00031b25471c02000002000000 2zTXtRaw profile type xmphZYH )P){9ǟL6D nGc2%-WuLMb5^bHUSlٹa\.sF+!iY+Sk؊oR1h|; bs:PuڧFDlb*8$=q$ʍrC2aj|#0\%ܠ5]vywGMxU(ɾܐ f?QkmY:s1wMe:p*WK$|"[.N #.CSY> `DhޡY{¢;B1O*)2 TaG8BɎ j)g>*2eWɗiӞIgdx\ 1F -(i9WԣC׊Hecڧ~N'SCb XGv¶ aϑS5.{' /[/X,@Ut =2ӨrU'VA#vB4" b}Ck!4[Y#*L"担dG'"㦪A} S@"-<8ڂPHr$8ì7tF2Q8XK1t6q u^~D0͌;pX:5o ege^͈ˈJ,&"eB霔 HllumoM]鶭)S2k3[*rfˋ7ϔ.ި0mظ8\I-$J˦e ^5%GaU^.#0kIyI_̜AF5BM&$=ކvv;=OH $R4(K=P}PbLGCq4&ʛ3/>;,NĘj.cr9cj[Fw'̢ }(!H9p7hV#}|7kmX{H&妏—}-d9{-Uy_29󃡽O]0 mN耡GdhGBdN?Ohg :`h Lh̉C;Zg mS :`h ~(OKԡsKʯTWM_kRorNTϢw IDATx[{pTsݽf $D>SDX5bF|CgZmZ8-uiUdQQU: hUτ c7ݽ瞯&h޻]{s9as0 h 4 A@HqKVk:  I1f_Cg&)ߖc,~:`;ppSSvMs5:e`j*iDB揶Dg"?p8o;31 ƽ/T^*qC/=3KOASуLMuɊ7PuԒo)╻VsM=y^ulzT&)3lz RbF]3ꍽVBP)#9S` [{ ^!wfkN>іkCܞ=B_ҕ1ίX}45_ك K7,L-vf 7xܸxE83t@Z* 5F=q4`yn'טwFËZ1O_w;@"V>_A 뀩! d N,=mpŨ~tC$>E sY~`߄8yHri+䜧?;_Mu# \bDRSD_L F5?R @JnhCH BvL1cR0N53&ētikít [Uufq-4[K R>С!OhOjAD ;wRlPhH`6:Elt¾KO=x>Y-c=掬-Y>c (PE&"b{]4M[wH.> #7߲㙐 a醅lj8|XfV,;B:W8@J]T7qY?tN%.%`Epnv[ ;|ή?L)7E3-À[EOoͱ;(V8Dcf= m+PR#Źfڝ_:\Ir bv\9԰DJ A=EӱN!= )7p'xt"$C}]Ddq;L  )@! O쮟{.ЍQCO{43fx!o;& M,f iuˮ&ĤxnǬoͳ ^{|MKfV  &52G&#ov}6{7L9}ꩿYIHD"p91,'SWM~V @#[&Ȝϫ #sZ"BdjL^ˇJdv#PtgҼ)l>5_vG9cg}3{?uU"1pd9VIHMC>@$2t R NN@Ur6S7݄m頮mzO:DHRT;/mOmDݜm~ȴxcڏpҴwI~%?(7挫gO欫Dڏ/ox|ɋo;fi) 38a_Um{}Um͗}5u챠?8N{^߽q`kw:|i`1wb;)"HS)4q)7&={0.E/茢=8#2˿j=O? eE~]<&1ycWm5LC:->)Y2Yq(W@nn(z=x n[Ѿ;")ٕz ]L75a,Ÿ[Zw{@pK2UT35&d m)}]N% %XǓqMkҫwddu=߸tw[&ۮ;xc1/Fj^ơە4Ku Cl st@Š@`P0(,&teY|qeXIfII*  (1$2iKKAdobe Photoshop CC 2014 (Macintosh)2015:07:06 09:17:090221; (L%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:05:44+00:00tEXtexif:BitsPerSample8, 8, 8>'tEXtexif:ColorSpace655353{n!tEXtexif:DateTime2015:07:06 09:17:09VtEXtexif:ExifOffset224QPItEXtexif:ExifVersion48, 50, 50, 49c tEXtexif:ImageLength800rHtEXtexif:ImageWidth1200dtEXtexif:PixelXDimension2363>tEXtexif:PixelYDimension1576ތutEXtexif:SamplesPerPixel31tEXtexif:SoftwareAdobe Photoshop CC 2014 (Macintosh)x\IENDB`qalculate-qt-5.5.1/data/flags/FIM.png000066400000000000000000000007651475705355700172770ustar00rootroot00000000000000PNG  IHDRi@.gAMA a cHRMz&u0`:pQ<BPLTE:c2~5Z}9bY{NrNsJpC4KMr4ǠbKGDH pHYs : :dJtIMEMxvIDATXK@0EѦ`[5*2wgHVwKV> Uɧ)Ms %]Xx~0\{8qV!!!!!}&٭ڭc CBBBBBBBt.7%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:53+00:00: $ktEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/FJD.png000066400000000000000000000117371475705355700172700ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs&:4tIME:IDATx{tU՝?s&Ix(FB@D QvƶRv>m<:]fjigVG VA^!!9{ $ ptr%7~ۿ;GYJfzQzcMxgP%#ҙ/ܶ#˿Bϥ$(N;+=k:</z鶤CaEtr6Ûh}6lÈP37wNf0Ɉ XDc+jfxJKl$ Vh9_\׼O`ǸN'q8جsĬ[G}Quד?UKg0YFk7hhAx^P`4>@m:n͍8GMeδ9y! 9՛C<@"@Pk5V߰t_] /"r 9o+R$sV=DF)@k7RA&//#R=o+>L2A\k54UXKU}LH!\wn N6~.&eD^t!Xaa3,VO4EW*Ya7ĪeKo_%%q)!K*-A;JC_@&jt*q"/B$[/J|$/=:(~RƠw<߯)Rb>7Ob1$¿=H@pY89џJ Ad^:L 9"RX ҟ.Q386$y einɑe_.:pi?w5n@ nq) H˔D~|r!Tz˕>ޡ?q5aty@n>Œp܈J3ѫ3\dd<~B23m20s='DUfw!Tsvݝ\l E01,; E8cb*4)R $Ht$"Q & zJ?"kt1҄P9xOĀN1?nAO/OBۼauLxa-2+qR3P>` XНI#B1AtG ;a3* >L 7eUh>5)͵%( 1A((BpIysBt~ m)&NA%U ih3Q yNvyAM54i\ʼ_GILL]J7SPjDG/odٙpJAeD筴'$]C'sDO^xO_-4Tfȇ6 Q]Up6'O#a2'OtUKmN"(%I1s%.g&܉oy3,Prr ԯӲ kBe81QFq$= m 7C̖n]ΘcHqܳ_}re *9Uc-WKHĮfW! ϡhr8:Of.pؠ /L0b`ϛ7D4>Iq,=tU=+Yy~}w)|y36HUީĒw<3'j[̈D SI*@(hyYd77q_ykc5+KEhϠ Aod1p q˂@ʉjb ,۽$vxIIN~D\HТY܅}|a+v f 5?o0pܔ灻'sQ}7"QBTr-l.IZh|{|D/AAN&9mGqq= a7VVat6es)Y˝ynǬT0輆$LLyX:pnz&Ľ ɹ > wa%С*] ℛXFޏ>c8:Ύ#aVB[8zIB4$.z}E <fxKA.9+XQ^a5fnN~@6֖?z\d=>v۞{-[r'YQחsk>fݦj:;oLUUeJcmO 3ȂnmX UBB  t1oY"7BBؑX=1O !Xg:@+'4DQ+B5nK s'Y0WiIq4? N~UKg|̂1F/Z-F'Lr$622ojҠZ0S{]Sh+m$O1ax~T!]w7@!`@iĐ*tv L_ЙҞ?sSHjxm\RFW,tX*]P,* ??>l|;tV|xÄa6ě3%0X GiS<]Μwgz|z(m*6<d,c\)&EZ:gWDeq ipsn!2v3fM$'`+CtBP^27j?Յ.$];3 i҃de-7W'?-jN !<|;fmI*&t;(^X3cqtlv;H$@Q o+'B59XÏņ(6p6?W(M ]z/΅ˈ)„pS2&~wr-sϬۙ9 ZTU|m|T)TG'tu7װ{ӗ)h2!AUjAF 6$ q,/Zl7{ HJz/ NA)S;݇5Yyvڼ/%R!jN ]ZB߭&#:_߀>nȷ_J"Z ;(rhmj@9\Mv'. ˠ\N'7gȡd֣84bmko0wğ@:>!/ ג{xt)9 aP] :,XBfvNZUYu+"[ƕk[Nʅǧ$ .p0KJy~}eɼ)nmd2}#RS2㦙"͐óyIi/vM^~ 0z"޿"$z_ K[DwQB<Y齙sۆH ty/dMR"8!aHOtquXGr"(E0$VUORà4. Bp/G{>)xCPIgWmMbDb&X B][HƧqD~ d{p.@q塡-v5_ZÇ F8qV u2\h$qUf/셌5 =hhiGs L) YyԷvDLpԄJVVW?ʣcm>Z1S*3c PSߊ#+)ͩ`lNޯ /#QTT륥bl69!\aGh{L['p݋z nY2miixR3:{<;v,F:B[A Ӛ6[Ç⩦<ԃL@P/^}cXVN8׋EQΟ AkOk+c |cE(J:"-!;;pq)glݺz[甒!r8n[k..ŝm^Az`2aJz/?[&ԱtὌ7P(Ć X0o~!YLZVW5'qL7T߃0pf޾WVgY>6Lmq.@у5dfG8~Mڇub4e@ȇ RJTM#o,Z{ULcIL2 G3@H"}u8nC^N>0-ۑ"Rea4֑喊?31+|a)gaA܅WR YPQ0ڶfjl8|DnPHy^_]x /R闺] uA9H `#-A9H `#-A9H `#-A:Bw%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:57+00:00CxtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/FKP.png000066400000000000000000000146631475705355700173060ustar00rootroot00000000000000PNG  IHDR@](gAMA a cHRMz&u0`:pQ<bKGDtIME:IDATx\y\U~k}f8̠8&e7mP-2Lխ;|յVxo*-K)j9PQdaP*o~>{7o/{Ș> RJ)&}QNj82 lqee}[IYͳZ  D=!ѳPFLZY ʘjyi?ukںߴlWlv@(idO0 UX5sA{JcLSAG2RDe ! eD8;͜Vg>yxLh-uMiڿkR$BJ#O<5wɛTg.*FEVRmx{NYYSȖ8 gB?wi;cytԴ9b y{7ٸ0uhA>Í=|x'1-?ֹՙ K8,ɣGcvYL!΄>k^ڡ/o9Jݡq[_m*K7:\^\$^\YҸ䉔-qO.eM[~~{3*&< E9lYy5{I*_AnwhFFܖ7a8Y`ESVs? *MA?q~m_Sʷ=8h7T:|rߜ]9;kVJW9W$RJrB32|.A_V4!0BU>``@H#3j ^װdYʑ-qO.eZm[ J=4.2e8_j"DTב ^?u=xpU|! +}'o}q֜q>)ڽ3)QhSSGp֎^;%sc1IZ0$*.Qi@A`q6EJ:݀(kr!0c$aryA`l7&|9oО -Z y0`(XAZ!p?1g 5>]};/@xe֘1vQR`!wɁD%P;]cYFQ3XƵop|FsYq9# s+^$Ld;N :^> =(juV566DFD:ժQ; {0o^-E"F^y?-_MRuWiy]sHP+xmru 0F. .A~PI=,L-?_Cz]pPB("2J4($L%d(mTRK2 gҍ(3Tk.c$@[`^"𕛼2L0F:Ns&X`-zNp6/Ї4kڟG)ѩqkc!mK,V zx.7N׹0#Nw=--L;~iݼ NKBL!I5ᑃL K1?`z`@*aaiBz=BHY,Nt:[[[ qXa- u=bIKaXcOIKjvx]m>Vg% Me?B%]?db*޻IHPkmYwܒ}g-ҳA|[\3fzf$@]رD ʙi֯-|}ON@A>tC3Y4it(oC^[3?ӥ ̞mdLZ U}^Q32`. F( 1m vm@΂^gd&? pƆcwI;DoC.ٖ22TFpݵ`Ҋ!tے0101'UmUy1dKqնkdeǸ2ѭ{\"5li*U\ : ?kNAtWL 5 5);gEB( eV4Ci~Ay3GקR{FZY.xvZ8]%s֭9<ƥժڭ5u@=i;!'m</E0[=s^ 8p6:u_fMZ y6gHzfяA?1U?1'(uY>c/e8c ua#@o'NP\`m`^&z˧%!{j d;Nc *g{Yi sNXWP+(u;ďA=w^ُS0BCQ8-wWj~apuߏ;$j(!{wQ.*"j`o>X{p|,O0a $e'K28iq8O7V;76<> ېHᝌqFΠ!r3`ة_t?݀]V{vqō3Ȱd(""O%)>=U`hi^`aw k^ Otn8qt iWi5Aab8`vc&]_r*dzlJ[`EĤ#)>ErO4B,QRf' lu ]o^ :YfYY0`qK]W5+ O`X Kacڊ(K?L6 tTxo= rļ<=zŝM6?5 z+~V8!2{h@`M!1థ+7p!:x'ivQuDfj368a8?1_ K*{я[~?wg?#&#鬛>2ڭ5)6m1ީ;e V*WJp⸺hop,5@_y]{Œ:[fˢ)4uPG]+rj;3krwԼdv۷Ī֚ݭG'$s]əɂMҀ\1xK[Tщ1!G(>(OiiVBL#E>1u¤b#>6.]m]vSzfJ?ΌWPA]Yx,ZK1CれÆjhd :pH.Q #"|S k1BP5H/\T9FWS>zB;>:t ]f!|Gib)*b}Q^D67MI)Ϭzp= |QEX?2b狜'/h)yX%ZCxVj,wM6֔)R=/6bt`uVEj5J!攞^<Qjʸue -^psА Ղj-(VLlY0(Ta&,>yNg 0R'2@tN۫cO-og"`C숽' j㣆JF;緟D\j;+ /j#3y=Suu5iӾxW>cC_~k=)58, ,g^@i_HD"""qCU |ʛGԽ~c@E1IRDi=pAO?1g{ T"l-eE0;U;8Vcc5*c!-tu.` #Qiѱ0zF\T RRްty3o?vO2͚:ZL-ta!A%ÊuqzzS__o hOLv`7t[zqxScN"ێVNiR"ʼnpCc K1}[#SSSֻ+uACH7z`M3Ӌ3OruNL "J )6s\r[U+6ք]~Sa (%jn-~M,[X:r *T=^$:kz}+'&w޳̸2E'c@)A1n)Y^ZUauah^m3qaa)G: x*Y,_:Yj)I9=ERLCĠg$),3/]d: BH!I/=q}Q~U!3v좼)cF9 PtqW Z̺BpORb5=}"SV&tt1{RH lBxn$5 3W>y!DE>ѣ-;oۮWֻJHfbPb8= !LIsݶy5u9 뵵B2F> ); {r%"DBX-;];!H)!y !B0~_aaQB2Fr1"T~߹kS79z'+TW "P<Κ~uc72[]k^Uء]~VU|ٲcǤ^{<zqӨ'=~rhhfnTâb㧹/]pʐpWUTf$0@nTülM nٍ U UHpbڑ=!֟`` w 0@p[3b g1 8/ $$ghB 8,9aY;1l>S| U-uRZ ܕIzMH?޷P o@;&%Twc}j窵m@H^/j1-m"Ӕ˻FP^GǏvJtW)I48\T *zz5Wv_ߕ~Q>L,JV׶mT̾S'\2 H&b>-}"P@J{u _gBMDQ$ %H@u^Fa}??]R]~&#{G)%!74X8Vaaț߳:l&=^S=TEn%֌t%[J!Ѻ ǙVꆥ&Oh}kN09>ik/3 Abw 얙C7Hɹ.Ցtӵ;vc" %IIzMxnS~C I @.sBDq0J!&U4uBXIbLKw5J)(~:z;wI!}Z=usQ}~<>pˈw Q) BQE0HpŘJ!@t'%1<(gI#AJ: : : : : : b(1h4bQo"|A6;վz!>2=kl19/]C-H; H-ӳo.ޑFS^Iq B{?\EE>O D$ Cv%x\iB&ysHEUutVٺ(/V!(!a籴s%#rMX.bsD*| ='ʑR r0ntL-)RF-K 1RUՂ]i']KO¬s%D&߇K[wJΩ I1цq-/|cM'V>ofP#{)IaQ_`vïfVqѐ#/??Q8=hB"@Pu7RRX37S{ ﯜxKOWUNm쿍om% ,ܒt5\5ٲkn)k \pn#9#Ep-כ']/  *zQc"7{hx-ɯ?Ǭ+ϛ7_ֆ>!oԻГ YV5:#}|ilG}g.yS2rDjb{|C U{*62 •B!_..[/wed AP֔96+WqmqwN-Z($EQ=ޣOpWε3ʱ<[gƚ>-gn 8}UBH@0؍@fa^4k1!@cExY߇"uba53DgqC AXo !㌡[{Lu͘$((Zg .?[d)`Z 9սſ^o>݃ӌaԗq.=Q`PAV\ks}3mGr{j]Anj!Eɠ^m0ڭ%mi%MʨiE =>=SG}/1LxxQ #`w[ڇLR5S|wY*D)T%7+#{ۘ- :T_| o$ ju(1G;:y Cı}?{̻m5w+|WJٞ $&(KnO?ٓ󷒪.Xtv:a^^Vꦚ%'>dZݨeaWx߫]HH%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:16+00:00 WrIENDB`qalculate-qt-5.5.1/data/flags/GEL.png000066400000000000000000000023241475705355700172640ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE0-%_r_q )5"./ /6-$.1*CYBY,4 '^q &!I_I^`rmynm~l~gyBXybKGDH pHYs oytIME:IDATXXkW@E"S*yT1<#*"ts(d'hN|Hvfvvg\[n-{!zGO 133i`ټؙ#9}< H DpHbx9hD >y]≤1^SjRĉ[Q8}) 4Cq(赈|p"%_(#D\,AȥPM8]%4EE pVyTv@ Qu+ula Dh7j9P /U*.p=~뜟+ MEv@ZHgdz1,+\8Fh H SXh  !Txs<]ʅwDm-^t5˔m;tdxY_ h0 eL%/S ejI(A$'Wƚ؎ q"㴠L?E/ުfH yv/KHK7 fD$Yed_"Zj7okz]E2vQ4;%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:04+00:00XIENDB`qalculate-qt-5.5.1/data/flags/GGP.png000066400000000000000000000016351475705355700172760ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE!; ).--. .- - *-'*,+"; *-) /,,. .-,/-.. : *!; )'+.0X YYbKGDHtIME:IDATXko0@@š2䍊)&:KEL .q("xD9%e4F؇ɐ$  H@ֿNA%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:22+00:00y|MtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/GIP.png000066400000000000000000000066611475705355700173040ustar00rootroot00000000000000PNG  IHDR@](gAMA a cHRMz&u0`:pQ<bKGDtIME: IDATxk]ukss^ 6~b 6&r #żM#1AmBy4"$!R(Q+P$B *%TƦ$ؘ`cv cǼ8g~8so.d=W_}{kglO4-F>G5 $LDN1h% HTG1q)JGFF(jGEvED =wW+.[}ւ۷ܾ}.[_l~MstQ@sO 2F"s \t޽]4;sc]otV;gdxj[o]bEqW3 $4柮Z֭Þ{[]yGӏ𹡗wdy&WaϽuOWfD4I>o 0Fsɮ>pܬY_^|zL5+089iv|kfqu|]W{{%vxs}$}.=-Җ!}Љ~o1͹*vl.p)ϜDG;|K愐wΠécsJ䂜i^|kLDV Zu]@P*φ{эT7R݋n$ A 箁Y*.T+Qe o]=׆Y7[@<Xs 爷Pn+[{ l"Nԉt"ۉ6f@=X`7u[qx p爷T ^;C$IrA5EP'P/7IKg e koof@ lZ"BUCE4bw(7Wl0Fe 0l-Y.( YH Ls9ȭ  g!HcIC-0"_'9 |8>XO: 8߀$( HBvE9lԷNAq>zV× _:(L44 = @ UӮEj`AxX4ca ad8`fqla(PY@ ޖtW1H#iH_ς*9wtIL`" [=w7>3b Jݛ7yêa-RI3!M?@߻=k/l滥*pGAYo?ph 2諻vɋ}nd!((07}SOkW?eHdVG g~8#旣- '\Ŕ{(v3Ḫ +qe0܁Ϊ-95:V-oC!H\k}_xN?{s~رYEȽšyZFfWcG? A6 'NP4E82Y(cDeXkE-0t޽[3x#p)S5sqHL>V:n!2;~ !Z*Urjke˗km7n./|?,-_~{ tڽ9AI7r zꝎM b.+49D ݳlT3fB/Feš\w.+~t䠐]Dgod|>\9Q{rǾ% Gt ҐC2A'"!H Z[Qm]KPQi#*؉҇01e,6 ĮƇJ  )HM3]V3KD93J@0B@!GdơBRI,6BC=5QHP#=Dx%)@7T@9^ V koPJ8Ii 9'(- Vek5o0FK$wo (7V^I(FjX,sz ѧo߳e AWg(%F$̈IV0btf#490BlB0A%CU5H[KP6ۑwndI˽ |agKjѯ:}T=;Xu-Ż̥ӪTy_Yٷ/U9I A >#4u-ԃ}#{5y^9%0Y;)`U+Vv߱5#_E}WRfrjyؔQ/eo i8ԊO^Q;-fL11Ux%ɨKL}S'ޒjE^ rsR*ο+VhHfS$NI5YQ-vCSA6o3 .(%5tuzQC \T/ u>vZTFON)mtJ.g|%(B5k1CbKDB 8-&G_34f/E]«]pXu?P  GܒpSFmg :+[l{M`~A%OD BpJwRrs3ֱ^O#j%'v\+q˒qriԂNQ:S{QOlOQlA퓐ZӈIle^g|'Њ#-{N\2_:m*ӥMFPGK/Zq* Zd%b}4J`{?g:NZi3eW!cI[z)-[Ƨ(lmh$B8Mݏ|CV*-4JdB,ʫM4elxfѴݸ.8~)%f C UO $'Ώ#wZ<h*0tl >2m B\dJC땣W{noےx4?Խ?. %tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:36:39+00:00rhIENDB`qalculate-qt-5.5.1/data/flags/GMD.png000066400000000000000000000007441475705355700172700ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<!PLTE'β:w(&,  :w(!QtRNS|RbKGDo pHYs^tIME:RIDATHA ZP XB-T%Aw4 hEK>x%Ĕzz|zHT_J tlPPa;%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:05+00:00t tEXtSoftwarewww.inkscape.org<tEXtTitleFlag of The GambiaGHIENDB`qalculate-qt-5.5.1/data/flags/GNF.png000066400000000000000000000006201475705355700172640ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<$PLTE&&($Wa`#s9bKGD  pHYs$$P$tIME:/IDATH c%bI%_\e"  ¯%%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:24+00:00xtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/GRD.png000066400000000000000000000027331475705355700172750ustar00rootroot00000000000000PNG  IHDRb@RgAMA a cHRMz&u0`:pQ<PLTE ^ \7z썳^q x ] ji>Rƣgf [h ]ꐵW#m&o띾cd \pOx ^ ^ ^ \9{^ ^ ]i \Bf [t ]_$mc \U ^ \9{^ ]_gji ^deZ6y [cB@dBBHëKfDECYݖܪ}uu ][7z \`L`_8z$m!kK$n \UǛXZtRNS_* bKGD \ pHYsQ'tIME:%IDATXc``DL,lllTVpqS cS803501Za1q E ` ŽvV؍0+YJp"ʊ,򀣰qVdđ D"\+ĆLL._+D+*.! Wp\K"@YyX.V]S[WOpZ!рV4# #(FP2dA0a%J #(FP2dA0a%J #(FP2dA0ej7?qܲL+}ibY0i/s~̜X)8n5Pm}\1lne09kxSW?6F2쏯K8?tSov(a*ӋW d'}f$ʇ@m~0j_S6T5#}ZJ:s4kW ؍i]ekP`ЏXQzF^8ꛌ$~F"Ov1:pH0zEk*9 u?^@Q>=B?Lvq:5l>eCZ± [Ki & zHNW=A`9 (7YE{] ct(1OQfs;FuFEzp};ﯡ:G a\.7nXv%tMX\fic|)at, 4Q-70M,F@ycv=Ss-P,0|vv/A:!$mļ%Ѳ, [(IJ8hcv:hNz+,h&@>{-\N#~*wD=( 0ʛ\ie`tZTY?  0>%LӴ{:athZrinܾsmMq@!^`СRQitϪ\J2u9mLq9nNF@T&oR/;\zR)F|mK<*#O!̞Ѭyr(E~8"ljY^[yBˑc/( [<@Ӳh6[DQ|^Raa5(b@O4nx$thnc5%A+?y2fr4[-KWVIجd͟F1"n^?Ǟ:Pov%~OS G)}8Om:w߱"12(\Nb!&/ 7cy&@^ȓ ʷR4܄Q[@i4^{^7x .`V} +4~o1}C |GȕL{E0;2sE 3Ȫ1l$pi>zaxh{&_7ӻz!)TUiDH=FZ$zUܞ UQ$''#ԛU|,wVfx~%"\b?HrqǏl3/72dA0a%J #(FP2dA0a%J #(FP2dA0as` J%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:16+00:00ntEXtSoftwarewww.inkscape.org<tEXtTitleFlag of GuatemalaYIENDB`qalculate-qt-5.5.1/data/flags/GYD.png000066400000000000000000000061011475705355700172750ustar00rootroot00000000000000PNG  IHDRk@ԉgAMA a cHRMz&u0`:pQ<bKGD pHYs!8!8E1`tIME: IDATxsje[7CbHbr)bP&dhiڔ0m&iCtLcI:p7`,_$tVۇ+Y$K =00ُv9VnYn|yˬt^a A  r"p}z9O] Wvl6 SQ0aw'G @rYUPQ)uP]ٿBAb)ۃ䧱 Ǒ\%@Kq>y& * wv>ģKQ ̋@SƕAWhw]H"|3ݪ5ie1*04*W/M lފ"6u- ljd<NumtHoeZƯ>ziF-U"& ,AlH{݀cI.ύ^e0SGC@TC4h,4"dpiM{Oԇsܝ8Ic(ee2_|2Asmcuu Hb$`oE<5ˠ?1O7.'gz $y4^Ou L?"wIu).Mpi] 5\ pfv{.q?@qYPYzL@8-9CJO6~Y)ERMҾ-K'q9M7ɥ"}F5S*KmƘrynlcm] i#s5").NĸpqsvӣW 1˲4(_|h;ě;,u'*ْem68q!XLRVcJɱ. C˲DqNdиbv[9AcK.WgpiO{x,@o#v;qzP崕GD |>#"V ȥC g_`oCI\iLpo)QƟ 4& 4._*.;0T4fK&#XW!۴YƃtxRl*KNwIhEZmcrИ-F.j\7"86!XVN2* 99CIer|Ȳ`[ė1h3K`}rј-\6i7Vlk\֤VTWdsc8rrM&xP[DBi467[[VEE;\i\:\:Ҟ዇pNΏxQ,@PU_Q/Wc"=# MwȲP, ;;|{IR%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:32+00:00MftEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/HKD.png000066400000000000000000000057461475705355700172760ustar00rootroot00000000000000PNG  IHDR`@jVYgAMA a cHRMz&u0`:pQ<bKGDtIME: IDATxkTՕSWW7/DPDPbcx awfgLL&Q3c"$Jb$b213'$ "Qc$44]U]U]{9{>ƼtJcWp׭S֔8zZO:2*:2*:2*:2*:2H"YCZ0sq!gD!t&M2e<;xt=K^)H 0 "0t2/d>%jB.Z"4\E$G~6zٞ`ϫk beEˠ J%3Pm өo\]D ""gAJ) !t>vf@B, D$XlKq`ξ:ز T[>D~-mC TM_%sTeq0 YUIP|(H.#!l{ST_/;6S23 Ӥ@cNC ]'`Ik "x YDi׫M"N`~zhG ʎdK;AzV"' fnX-?l$PB"@;ZX=Z,y-?1F%_pyl`Nv{ܯD8ʪRe61Ο(4' n J'G@X$% K{^;|bkn]k嘱#c+و7. ]nBWxSU  $%`b"B%5>ߚX$;Z]yC;]~1~Ew?j+ǨNZkf!@)VYv7ɶ-/jwcW?>}:[=*dׁƳ8wY?&;Ɓ=l铇.SzmmWfg!U:{Z0 B+ҫ_ޭ-K⎭`5*5*5(;NN;hhTd<>gq= TwsNI~.껞#iY$dYC94qow=B&Vʈ6UGd婁tF/@5:j- :RdYb%DA=K$ g3]J b E$ʚW3dۇ d9nR3@ZeyK>Df\#qH"I@o+/f,50j\ʨʨʨʨʨܴjT%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:15:56+00:00IENDB`qalculate-qt-5.5.1/data/flags/HNL.png000066400000000000000000000016351475705355700173020ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTEstϥDHx:jp5'IN!uzfMt+0vsno>dE'bKGDhQ pHYs&:4tIME:jIDAThg@5Ǯh{3!ƃ=t|XexdAAy{t/уxJaxJwd%bmZQN%e _'L0 >PBHF¡;\,nV,F)V&bYAzm- ,% >QLdC\^UX T@.ҍ@QX"ij^U=BK@h4[Nw_zNlT hqÞ'g *rAAoD2"%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:26+00:003itEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/HRK.png000066400000000000000000000053231475705355700173030ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs B(xtIME: IDATx{pT?3d'K$!  A,̀/|))u2i mǪZ 8#P*j P1Ey&}?.f74+w39g9{=ιFHĉYh_@@@@@@@HiFXpX͛ŽMϲcӳxܑR.\3X,Ѿo틈HN7i|.~)edg3ii3ؼ~])E]Žz,Rr?@ uP!Rdu6{6mĚ9ԻU*ܞ&-{$}_aiUaf\ SeA/l>[ͺ/ږ_1Η/鷒n_pzx6weQbv%.㏖H;Vժ@<qbj Esؓ|Ad|mWr|y͎h_co>$TڔiQM.+g[4&)Uݳxn;] f1}G8ߍ!΂9ۛ pIͤAٷt ?: Ch߁+ _8q)ǽhd.SAi+tUZ$,bK/QINjoHl {>c[&#?1$0c8]> _\=Xr eyO($^&:na㒒EAő¨\={3!Ӎ`af֫[9w Xwr>y#]GF술 k3o% f&`gm\Ԙ|mHO$rI5DHؼ83Nfp3H`\')#jNӵ 9v2| h ,flV Uf+kqL .21瘱xF|m^:<8e2 /)wCPh:JNGG䈠 |snOeeK<"vW'F NyyYBf3$2pq:Kg! ٥$rǁ67b).Fa<}Ϩ8[p{e8|8GzjB>P_݃( L Ctw֝0@::Uu$(.CH)#'a68qBsBa!8=Zw6X*섵kIR CYY-IN';aozz < *^mi#tBܬ([z8OQF3gQ8MPM`j9cn#SUB~6ZZ@D:9ќ(ɿiiUkիCTWkΖvظ22A1ă(B9klVBs';LgeCAA0톚h[QG@NJb 7BS{^> R"{ z;A?.vp٢[l}|X}K׮A?_+lX?ޭal0c1 EK3adjG{B0i;Ѿ1!R^vXE'ʎ} u>[qG\1N\1N\1N\1N\1N\1N\1N\1N\1N\1N\1N\1οv) xF%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:09+00:00֜uAtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/HTG.png000066400000000000000000000033141475705355700172770ustar00rootroot00000000000000PNG  IHDRk@ԉgAMA a cHRMz&u0`:pQ<bKGD pHYs!8!8E1`tIME:wIDATxYL\Uw00@ĶbV4&>>h1O_&AMKl\hXՊvAZJ2=>Խ}@m2{"$ܜo{\EC 0S+Z|KJ{:'^2R ՚Z K)\$9skDz桫&eM1=;CĻYn *R, (Om=XLTHXwG/~MMH,wcSF.y>NE'mffKEEHt*Wu %r{› zqƩxw{OUDcTDmp'{tWm6k/?ə߳M{ 9RǙ:9ʎ2qRaI} #b+˛GtB?JyS`!i~;Ok7WQzJN'sώ=F8s"hB-Ss>):ΦpS~I{gY~S ͗'v,k,u= =4']2ėDimXxZkiJAnp9J\c1$;އ^ނ:u #f|Wxha)E~iH_ݠRljF4fU3n?~Hh/Vuٞa:]BIW4rfwo|7rbi'ZNlGw3vȏT*Z3Ijǎ053&tb%%?f5wxsbBX(s>zFiR.PeUՅ.M3!V!ӧ4I{m=.!ϝϑV++S 4IU4/k~Q~$d,E M)A )ʟO l/1;Kdm3~jJ}>FΞaס.lm) a[6(E2&oYסhYؼ ,%h4[e3ٟӅ/-j5ePsY9O6YEe\;wYuv9&$& & & & & & & & & & & & & & & & & & & 4K%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:28+00:00 tEXtSoftwarewww.inkscape.org<tEXtTitleFlag of HaitiIENDB`qalculate-qt-5.5.1/data/flags/HUF.png000066400000000000000000000006151475705355700173000ustar00rootroot00000000000000PNG  IHDR@ bLgAMA a cHRMz&u0`:pQ<PLTE&'RQpJ0bKGD L pHYs B(xtIME:;IDATX0UB* I=RvI &[A0.r%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:42+00:00DtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/IDR.png000066400000000000000000000005721475705355700172760ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<PLTE&$.@v?0bKGDhQ pHYs B(xtIME:.IDATH1 0 PQ(4 9+ٿ:RWA6fp=%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:38+00:00(tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/IEP.png000066400000000000000000000006141475705355700172720ustar00rootroot00000000000000PNG  IHDR@ bLgAMA a cHRMz&u0`:pQ<PLTEHEZZwyGbKGDhQ pHYs B(xtIME:4IDATX́ %b !cb[D @ 08%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:47+00:00+ktEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ILS.png000066400000000000000000000014741475705355700173110ustar00rootroot00000000000000PNG  IHDRX@@gAMA a cHRMz&u0`:pQ<PLTEP68Dm˜;.\5|HL[4s&V)X)X=7E*YĽC:99;9kFV{И"R+Zs؋MLs'V9eȓ᩼=tIME:3IDATXn0 EҙfQnӴoZ F?HBh ,]7XJ0^ P f eQD73q#UK$>H3Y33tC2Q/KmeYV+^\tMNn9 Gr=x4hu5.) ^ޢ%/3N{X[f-W*bp|GG7Ç8r Oj01,nA4 7ф{XDoz3_z3}T?iHDUy %tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:53+00:00OUtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/INR.png000066400000000000000000000012251475705355700173040ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<~PLTE34۷啕{{FF))??UU}}""ww22丸޾ᯯڒ́hhiimmSSӤbKGD L pHYs N Nw#tIME:IDATX  @QZ A7Dm{ q6 0 ~p #4 Y^y(y%dT-E끄7aV7{ 1&9+v55Z.iE{Ҿ@n\fYt1@Ǿsz1j;pvTE ~Mv:p<#O 8@@7 {Lf%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:37+00:00btEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/IQD.png000066400000000000000000000026671475705355700173040ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<sPLTE'&ηLHt7gWȊ¦ȯڍĨ Eq*]ʮ·KǮPӿɱ$X U>lX0am| FQ:iNxe5e6fI#XȗɰQ̴Q{&Z9hgѼRN/`ȮRAn'[8gi(\Yw#Weǭ^w_w8HS!V=leǭJ8h)\݌çMNjç}{xvèT}?m)\k\N˴fİï§Ѽ'ZfJ̵HDqPNxr˳ƬͶ|?}A D}B~C{?lɰ}A DKI ENDpOyǴƺňs[T«BtRNS|RbKGDo pHYsttfxtIME:IDATXc`1``ԂQ F-`ԂQ 怑ƀƀH 188h7/++u,R2 ZILN^AQIYEkhZAm6]=}AC#-0610--m tm)əՍ-O/o_? - :74,<"2n~tKl~|A $SRaRY9yY_PXTRRRZo[^2hAT74F'54,pVЂV޾ 'N\a6f#'Ch =ORO性E:~/'DŌp3ȼ\bf^&l66x=Y.JHnȗNB$UJ?`x,X.tߧ5ɪ.ymLT]"P>w TZܛ<$ G:^A)uEktvɽ7tk Y] `cUN c4ie~[P. z,ryW)e]Kn^b,Y^Ɠk9]Ƙ5Vw֒3撛1th{%7c\%7#,nߦ|oK<S1Unutk&5j0@)믓ݾ1UuῴV$#:7o߹WYo:7o}pῴV~n sWYK~^ῴV@Sw]fV R8:8]y:8@1(eyUJRxfmdCrqo ɭ[FGkRg݊joM=B]?/qA`|/ O~uM}tDgKk l}FMPC1" ac{͛}x뭳 ߧ;5~Hrヒ) LQp$n1kУwAY?/[iz6[h?~E9jgϖVCg!HI~xj![-7C?<8G1ԓ z8ץ+}(K`92Pf {3_ ~זo4AG1rI8[ۧ|-I3r:Mq+q#tln.:0e3Zrt eOԞ0lnr1hmr1'hBSn4zkΒ׳.jx|pGGFnrGȠl6OCd5yy- Oϑ62l.+#D4|sysLa_mq0yZ}匱߮2O,G7UE=!$}N Zc=z^`IIStj˛a}c!fB\-Nb:P>ŋqSR)jk …S.hdMJd:q|cۏ'ܥK[^Pb ~#V $ϟvvOv%d" 1IB=LU![-=tj&f6>>5ùz=`EfӾEnȍ1fz2lB]#77<3[nq@LPeih6CL]R)۸.z+@$=)-%Gx׮8. ;L,tfɂs_yjk 롧Sm YW>zpdܤqvwmv.8ȍ 8{{8;;v}뢺]`@=^ކI)>6j{U? %uza*$$6;I0Y;$Qn(]TgĎ>r@N/ar5V?^DQ_&$RAr/(7ur"rI]!C 2dR\4<%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:40+00:00(UVtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ITL.png000066400000000000000000000006061475705355700173060ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<PLTEFE\EO)5+73(bKGDhQ pHYs  tIME:.IDATHA dQEl`/icmAA(%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:51+00:00BQ^|tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/JMD.png000066400000000000000000000021011475705355700172600ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTE >,=9:9-;-:-:08.7.=6.*"-%:/3.7-<8-;0<27.;,LbbKGD@\ pHYs oytIME:fIDATh޽iW0IܠEBE }D/K$3iZp3TQB:NKa~hG`Ye"EW:SLK55Wgy7|+voH\hCg%Kp緺(]A']ד$x˲gf@P73PRL~ ?n6?$S.%? sX5oy+ wBay'J{Bx b !._ Oط}\< I\laHp4O>#t pBحZ|p߄qnj"fVAPt9ٹ p~ 1AC%PnQ TgX#`D怗hDpbegFg1ױ'_KӇz jAϏ$1/ %@|> %_>S @"O!LO<=<33h79򓄦hfE'hBm;0'w1 f~S7P:y{޼~sn^7??&~Hܽ%%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:59+00:00qIENDB`qalculate-qt-5.5.1/data/flags/JOD.png000066400000000000000000000021371475705355700172730ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<kPLTE G &$ = &&'% > $$]c&3]k%#.Xg&-($ft4F "$:KK[(;p}+>Tc1%.@個'偌5G.Ud2}IY2es럨Ve8J( ""5狕 -?gtcp)*&2[j&54yDzӽѻк'0->[6 w=~A{>v<|=z=&'1-=[6*+GV5 uPQYU]#z=jLH&H  rF0@GgWwOD0GFPe䐾:6wɩio윾:lKQ\][WNNhWnCyo_ѡ"IGA|G1`?H<=@P/.onrPWP̻$od`[y3<@PQR>@ˇyoxy״_BBPYp%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:51:58+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/JPY.png000066400000000000000000000013001475705355700173100ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<cPLTE䗩\y3WC: 6[xB-)*,ؿ 7䚬Ft3+g.[ibKGDH pHYsttfxtIME: IDATXY %?egFJL>^FS.U|ǨjwO2p (]|pdcbx&>b"x"AHrJDDJ2tIU$#S23>;ۢqQ[R/ HIП!,JAlbyXl8G)&Czg > d%%MOYa)wj!|ɧx6{0$ܮ.A5[dCV'(^_b$wUF){$"UUuai 9_WjM. y482ܓfaBMD;)}ˀ⹀ջ)wh_<#~9S,+ K},ԡ^$9*ANyjO\@9Cr9U"%BaO5夷hjzِ@]_Tr`ƀsdJOSt|sUq2`p8ރ(LHRtѻ]@"|*P3DKӷ &qOpO]7E|Κ}Tjr 5Bh^QZ{S6=_w;$IвwOh3Ⱥ{k[o\ 89:aowߗ`2 #%wGAFUrG{X"Et$3-& k7=ȟ|wrKg ~wL,HnAM8D-H"r~.0)RgXr%"Ԍ\ k}4YG-#BP/틆 !EL@9" -pJ7֤9%Ȕ%9QPPkdz[F9;3BM?l=ܠRa43K%ȆԣBu0C{N@UAxgcLvo} S#L"Q2hIi}a;jUn ǐ?R;#m sB:Kr[2v%ŖW/C#RX  gP@ wF6tG⿳]]}q3}01ZP܇o0]Ed:5$)WTdP+3ۺ#%f }eTa yePNr{5n׺cwِkfe69]D`el&:86$"Иt5` EM)䶶2w}ﴈ%:q zΡ̓?V|=6!{~ 8ƘDخM9=x! ^P_ BwmrA\@z_bsh/x r: $mm-i鏛xz/CN\.%{{JD9YbzQ̜cǀO pjW Te@AUN9^w}+ctq .i = jxojENC(`Kccp)LWo{:]--t0I5j`"E|E|Y.=i^ָcg!1!qMO/a"4o;O&ȱn4|cQb#TNrgYH2 0@϶O.Yg0YtAŖbsH% :'Hoo@qrJ@LHXh.^zP<ؚk&qn]I%(&fiO֢*IIM#$5jm8=\G4+2Xm"jH [6>̈Q88gjusdJTHx͚p ayE|@r}MDA߷veS3$j0 Z6 T[\#.A43! P@D 9cC^% nzA!1VةTm'>+M;.P+2:Y)m5E|(P5X*z㣻3w)8l?q1. f'k=6AN8bM=) <̂Bt?䊜_|Ej싪$,Kg)d?iӺf'o!sDm5Q p `lYnP/Mg%ާQYʌ) 9;ZUYۣwpO.[t>2cpØ KF-m;dehL@ų&6wcLpIpO_;Ѣ_$, -֣}eybX^Sr(C tW9ÞuM_?ZG9ττ' w,OFp:"T%a?IlY*LjGN"Q!!%Cu~bO%`ooZ']-/OV H&Pfi.Rl?7jc@Stɟsл]!I԰DAݭtHՅ(a3kĞ0}mm}ʭ>ɭ#$1agvXXA=%|!)D]; *3F>,\2i0$qܦG& 9nR&6)^;=*k{ n||1 2\$P_[}QES(5ߢ07GPd~^*ud2ID @25/~H7")XJ2Q)) ,Bڄ?}gopډۓ%JFy͈N"v̭.#:< u.yt(!pI2OP`c-nad \q]cǢ9?_<^W}7!M+b߿zxAGLifL\&ϓp,+'fp3k38n.ܻI9tZG 4y ?KoRXd bNBriۧByVpiR">GSL}Q|zE>B!W6?v) RJLӤx"whw!2Tt]f8"qg{` P,4Ako!aξWp+e cFFaHEd2 DLW!KZTUP,A) !@)β,<#2 ZsIa<!Bi֘Bb~V(ݥ4?" $bQ8>ݬ!Baz Ayib&eRJlFy,,,dPJ.a`YmNJ%,4MjkkywC$`ә&p%%e!8zpzvl00xeYA4M\e0 @)֚pH^4Ml&" BjL7B"@k}1)s0׼102˟$!$BыheY!h4x`00Y}&0pAErppp]z=lf4!$"Z1B&FܥWI{OQ| _OڤIE) h:E(,-B40 (BvTG)\M(kxG)~Ҍ$6!!k/qW@M !zt]2 R !}p@6X,6wcpט}!|Y"D<0-iAdz=Ƒz}^Gl͐f1tI,B"B?Ϣpv\AE0??L&z=* Z gk7_];GvyC =k t:{d>gvmGw:ٽ- Apsg(cc̽ Ϟi{)qbDV;t*dL;R}G ARe|uen B$?ᇗw߂v$ AB)%8}B4JiɤPM|P+".s4.7Exa]<M9dkgԶq/NGZZ"$\$澛@6{󝓳وgZ~^g;FL{P !0pYT$!.dSvz[3 q> lt7'{-7M@P vƩZ}4.LSk /7dbo7TkJe^+8Tr]u5q5ss{첩dT+j;.6]ͦ-zJ瘙v]l3PH)5)l wරV:'d:7JylTmcݜqZ?*FYR8TTr{XT\A !4u6K.tOz~\ S%b,)D fR MhTVeٓ,vdD{Oh龀ꤢ#!T Ǖyr EY鞋 53K)˖U[R,goPZbf,6.ބZ{ZhnA%uM+?ͷg\6Wd¢i(rN5DՓ8!w;_MB_| )P޾)т۳"?s*BSIH,isgظxSkkDJeI6ơoG#t!JI}MoNq;=?&w@[OHACW~r% if41bխL˞U{& Jx ل# =sܡ#  rw`~j8ؼ3'/3,S bgOI|BӒWx fFbhBÐrⱥOP)M!.ܩIʄa#ħ'>#Riu|Mzo+NO>|E?,U;ԴOd,,(\ļ<0VFaS#+mͶ۩,]~&#Tp2XR4Z]) C8m.‚E<Ըk~yck\L1 fRWŞ뽧1PXđJRg:gƥ(5y]6[z2qeH]9d&Q`DF6{&fa EBÞw#kT۩|ҪqȚ岹?̢. tS}8 GoJ $QwmeQl fvu5adPC#v${,,O؈$t ,-c؋f:[14]IJn 1n/~ +5 &t.,w/Y}ƝTVq̵d:i9cZƉgMAdk" \M.}礬!Z{YYr˩=Ȕ7 ï:Ca :$*dJCT_&AA_HǾ5ɕy{ϸ3\sCt2왣M¢z?A})t%HIQMhԵޑ&dbgO1#,iH%8wskD ~>;T?rDXrʪCaۡ~=;0꒠khpҴJK78hH)o-j`)(Lua%Afw"%GrxBKx@J@IyMVzT\CLV^}"-#-&1;D~!>H`gIQ2<4>PY",>bKGD#*bl: pHYs a aJ%tIMEҡTIDAThc`` 000```:mq;'''9_@`r0vT⤫8utA@O_L+Q3 9b1)efNEp~K+km (ƖzIv*;8r898.Ts~pdc|| x teoV64ZY8Y`*3 RsPQD$DE $ EQ)9 >!1)9%S"i``z Yrj){+(DrE@2;**C÷$\ETHu)74B8@皚aѢGdfBmkEG{T0޵bX<wCPMln ,\+tpg5Ķ>eف`"X(E124}TilcXA3gـs8Yұ:6H_`m-c$Yd" /c (]l eP_R VY֭g 444h?)]kN) =%x Հ @`(` 4-Q-%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:12+00:00&tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/KRW.png000066400000000000000000000075161475705355700173300ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYsttfxtIMEҡT IDATx\}PS$|,XK)`\_]#*L{@-uw{˨\pY6TZ*tkGGpٱU:2W,\ZZXi$|?pk7sG={}y0DD 1G1G1GQv6xɄOGD"UVVzLG"eeeybqqqP*jh&V+T*X QVVvu7f6oL) ꢤ$H$GCCC`hhH"PRRuuuBpرyf2nv*++I,JLLNڹsÐl&X,3\gX,DsΝIbGR[ PT$ IRzdIRQyy9d2!N7cΞNG999$ɨT*EGGdT__Ouuu$JUԓLYKK EFF w)88Pdd$8(99y\*Zr%UCAȦM`0Pff& atƝ>0 L2 iӦqHÇIх nz***8@)))d01 JII!qUTTKETWWGDD{졀!J&LL,n躉 a\*y&;v̑ ݾ*63zv2Q/HZTx=}wzGL{Dv3(--ubUCL{{;x C* ,"==}}}FMM m6XVԩS?TR0t?~ ď>1 l`D/<D {֭[qF#|Mܹs2 OfCFF|ݻG s*a#e4 XPBB[SVjP2j]6u˨oeJ?3O]Sgg'%$$Zbi4 V R8x ֭[̜v5.u=r >Htɯ:mqF׃80 \AOwXwLh 4`,n *ox|WC]Y" BhEЈ%sV,Xh5AoPMo\UJlEF<#Ѕ3MJà`@!#&Az & [$K1 ?@7ny|930XGpN^:^a40 :9?- @kw+b,1 z#lÏJW3?ŀQ;h pD<~^?=4I[@SHCc4s.7|'ih|x4«BHD/x7|!\,,UyV\ X}Os!~c;*#@ˑޯŚY,$ga B' 82f^%Gg9=Q",xjK"X|?9F"?Dzufs@’q}ꥋEh7=Km'e_':uO^4Ɏ`Xm=GbA[[l6v/ǺD[FTlXj9Pl6`Xd~ 'n3bxlD ߱Q!600PbL&|'hhh޽{aِ>~)N85k[o8ܘ\puuuغu3%"\k]C >ba2FY/D9~0 BL&u;;d2***>tN=FeӒ饴R^ZR~[N[˪?k=٧q<> ""HEEE$z= M'w;{>-g4 M&v;{>&Ѽк2ؗדּL '  %&&&!D & ;bKGD|Ѩ pHYs B(xtIMEҡTIDAThG0DQ"3xPv9HJ 4[JCN{?zs ľ֜Qtr,hlr9m_Q.A>_ĉ[FgC2P%`9ɚR|d-Y7'->xE }YXsGO&oѯ \%  ZdM3 ggF  R+2-/,5'x#LCB&lsQb|s-aY_Jxf]⸏FÚ5pK,"B6H'rOV_߂KY"Ӛa;>xhxXY}?[׽kXY{Ӳ/ q(5!w.zJ@1yOvnX^ SWMUjc2E(!cB_ `,(ǦyX߉3 _fJ 6qp˔1exqe&-S; =rsf#V)*J@)0 B햓;f*0W1%(jHI JH~ ,X *3)m9w||=ыlcyǴB?95}1s7^:DVl[3!$@cysJ%!tj\o~!—Ŧco~!0\$9Wr,npT "`ƫս2{XRTѨ.иcsSFhgJncd`c஼,6,MXyxR!h-#5&j0qsXn +CC㦲B'ˋwr=TmɥrA@JE:K Hyl (Ev2[m۰X^[bHGbiɼMle2m= 61(F 7/wj:FnI:5䶝J+IU? B #G$Dc\vQ!Z--s8JJӳL).Vܕrx jaG>,&>k{{=_qR uvۭyNA62AB:aB)5nL:_́~لÅ?>vp؄Anw0m ؟=]su4I(֪s_EJEs@Boi E6?R0 pah߅[.-7Ʉ={Jy'r7#&30T >cz=m (kHJh#~"(\!@"ֆ(?oJ?ؐҿha+d !H_zosIJfY{/~-E8y`{R ˀXpc@|~@:m0Cx SQj\c6Z l~|W{ݼd1k~舵ASչqV*q0&6PaJ@S%_7g. A" +LA ?OSv:ޓWd~#Cia/P:G|#E.tI"Xz!6R3gwUٖ{skO7q-TJcdϜol->cQFo}-Fz2}ؤA.&{atgl$F mutYҏ2Xǚ5@3}~۪S F v+MhkN6U(`[4eﶝBo?:zOT,Ú#ܠt~陔zx˟SNy瑅@łLaLX4J@8uHǻO;Rly4>y8MEpa{_vd*sD*Vw 1J #%&>gg I wU>7s=.sǬ4iwϝ9`]iczjm6/JeZC;qC'JQvaDIթ%c.e uEu?\wy&LKeGU,FH i]u!l 6ה{ch(DɶBX!Z4Ք`iT쾚%w7tU,(^?6o @571-٩ =#{w^Y̞Bjdu'!Va`nʄf Yٛ 'tD$ФfWG̊WxmkI4B/D;˴nә`>a^{yڮ=z呚=o=]BBSщ_Grj* 5yAť'4+%g#w^05]-s>QI26N(2fLHNv~NnaڸKG%'钓G/y/H_`G" ` +@ gYSZY4`a)UɜZ]ԗk@Logze@5( 2yhBBAܬ{kw畦,=ŚEU+RKf旻Z($J5kdgqu'jIYn&$-|{-2OQrq]Dm]V)?iMNde}‘]ٛ N {i*_'/^ $'+?gca}II]q% xNb@1f`i}ơ]2v~U' gy' pkU`YƷ{_9"^"]ӂ,ˠbR Pذ썅2А2wv ϦU˿LV{a<BLCBgʗ8_j8!t3 '+Ag<ETxd*[P/rޤ|آ'£,~C% #z= K{N좟N~!˴gGh)iyY cjr~w`E'z1(G^SSD5}im[b a2$~yin$h@()VԃGP:Jx.7 ke^ @M4"S 2-r#KL?x kWђy4;~*AYZ2D_U5\:ɒ1TT9%-C: |A-VްE Q]^CA7T9Lm˘{aZW|<wATiv@@Yͅܪd( @ )E1a@@}&Zz70`/LkRPNj޿z}T0*폟-lXv!ʰQ:;8H1c\i;sލ8,WB+{6=Odjp 9G􉫭{jUP Eioϵxp@>öǷPIfn@Gw_Wnr /]g”CcvV!ئS=tAH0p6)PpM#?ip̌Gw z}A Ϧxv%{Ʊ&Q_Gtf<ĤZؖv!hCS#4r?%$94<ѽIP +F?6iG'4 uN:P;B`YLx?N{Vc P%%sgjKlo}n>]oBY?mZVk o yfG F@\:,#&l{;:WOSc\=Bq\ߠ}cr0[c7n=O|/_AMnM̀%f BTA]֮]NDi N'rFqOlW[ﬧm;UUVWSN:TowVW\NN5xOV)E@ua ɍoBTY:ÚItIwW)!:]dbx6ߒ-Lk` {멹KT8&5wYnkx Syke7K]n>BL78|>p˷]q7 | Ɲ*1+#kf=+|9S?o~Y=ٚ t=th\rۯn(!DbD^'m.g/n?0[TFk]14 QRpғ@(.8w X搘Edž+*< 4YYF ̤6uMϣ{#jG(ؕ?*Lꦗ>1o[X㿦3hJM.?|lӸr-,SJɯ3p[ B,wӜϢv,7iIym(`zG:2!(l&fjlrm=K!듭^n;;"zړ U=^\!8*/ :e`ק ?M1CHs\owD0j/۱a=‘&&%9%)\iGF^z~] N}:kb >!Bv A!}9YZTuff pl!C5=DSUuPH9[Q!nEKpww֫i|fި8؝T2()L3;()lk"@.,!*I ܱO,2pB.$uQ)ۛLveLFRh2 k5 .FvD³wG/vEnI#ECu }D@@Eқ?hO#5vA"DZ-wh5x# L\x٪oPPB]M8@,"E^\% rhT{"uVioI_u67:EkaZ+jA0l]C.v\#@dcI#JIt++nMFhAa (_s0dDE ñY{G( 3H~!Q-;wL(5![۴!Gp7Yp7Yp7Yp@%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:28:58+00:00-I(IENDB`qalculate-qt-5.5.1/data/flags/KZT.png000066400000000000000000000120331475705355700173230ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs^tIMEҡTIDATxytUս?{s  (*Z[8ti[P}gW>WmmCi[[h)8 3H͝9{?$Ut|:df{~{a: @l;rEYkO`[DGB'(LfYi9ls3Ypc_ eem-`uz*A`lD֑E(Uu(w" 3j ۨUAߡ*!,blwʈj?̓ĴzC&OFxbO_LsRnV6%H$P?} 6L2pS4[1pI_}N2"5S3ſ&ş 0q)-}.@-bhŲ!`6AƒC19ĨEYFاfyXU{!Tu*pRڢ "u:@H!O(%45*Ҭ""$}!;P6k,(7+Գ+IB"N^(Nf6cȓKYIl;,@@$/6R(k2L73ʷHUrFEE{s- {u*ܡ<:M=]O"̭g0KYmYd(BhY  =ETWV1 Kp+X%,lb=Fg;ElfuD23,,( v2 z~ >ZKBbz&S \u|GGbJ[NaeY<6[[mT|jU.ݬ'tOApytY,EDif BQrdmg<IͿζ6sw wFN%pzbN)^Lk3C(Vg1I\zXIYZt?&luFpc\}2܏ti!Ǔx0q Y"_Ék/ F?E_^ t{KeF#5#jN QbvLdȕm +<k/? =F;uv9<8i((bD;O2ŃKk/WYH3ɬIE [7㛁4Fj$y5-*@d^MOa%bIRX$G\ق^w0WQ[4y,|7Ə2-Ht_1XMY <ߜ݀)s@s-‹MXXGleiLDifJH#lVҪ̴vpc`!CQ;NJLVg[ߏ}|(.M\E|}v'?_I޷mT'# m<287+y3=-H.Qy3= A6H4_[DS" 8mmCa=X\k'OMԨ|Dqё&ws #|Q' 79ElcY+_Nv{NB!qD+6)D͡.KSjUP鶇:xlApMT%<[f[XwySPUh!Vȷil ey/Dԙ=18`;n^JϠAv;|DMgX^w Y΢ܨ;2{.~zQQ~?%ppOj W㬳S([7D#jx:ݞ ]rQZrg('so%$b[|Y 3jԻJ{Wdr[ M:Na'4,4-40Sr 1д0ߍ^Tk/Wz_46Ir]N: = HJ[c*^IOr\[͗}/·OAH$ 7m$cf7ϰ.HX0-*k8'eH$EލDTM *Hg3jΒxYkSrabpHR9=4~b;Fn,+lOkhYEǓ1:#Ԩ$x|@sgw~ϲ (6n`3on`[k8%T<:nK{"K=$ޞ.?Da`Z*9;uxFG`VC%-ve${"Q4lT;4l\LF{V'<5X6r֯"?96;c]d#3=T"Z;0pjQnVIlgy 赁gN _ro[4\%K eQg:N x5=D ܁ ,lJ1x6-#ɋHk)zA_į`=L d$JXvb&jT> :LƞDoWvʡU8BS&UgG)z618LDlFq4k]\{oR|_^w؉bcM2^J =A{C|b3X6?fYj~n?s3x͞LD˾F5Y"A2K%GFe-ZqT[DO=H ~_,\M~w^+gt4wSlrFskۭ,ն;:6SH2ƨX6ѬCTiP/:6|j(]g/gФPt>0Sc0̨jjfZy VgwM tdQC45sL*j?%.fpN\J|pA`&_)T- Dr)>8#`ޑbQMyC&SbW:eFDrlTc3 =iPD{ wIMemjj2cW)eF ($:H}ǹ  S;wb)t˃K0P|Oi&3']2_ <X^LYسvc.mv3mmti6'# 4r-VC&3r_ UmOq| Ol k;3ԩA緉Ki?m:@v>tK wY&δQ([kfey#EoFs\}{_exAim uΛI%͓ 3nQݦN)ʌc5E,wvGs|f`=#PK840q9jP'}7"H;6:qz6qD3¨&ڑR4pվU8ܶ~N.@q9b"$5D\^ϩctJIc1֨@q-GFdyH)#(e+*LзqK(MԩH]%5ĥI%'P? 0pyӞHQϹwaTSRtsh?./tXo;N92VgĉG> #<ձ&> ?/x?a{iBV%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:45:15+00:001 /tEXtSoftwarewww.inkscape.org<tEXtTitleFlag of KazakhstancIENDB`qalculate-qt-5.5.1/data/flags/LAK.png000066400000000000000000000012051475705355700172610ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<TPLTE&%.%`(i(h&g%f*j.lAyToͻ'h&H'g-kc{ 1nMbKGD \ pHYs^tIMEҡTIDATX ET1>͢Ip''rma70~ rntTʪ*&@Iml45ZTA:ncmڼO=&?sLg$h}\K,jJ4N"P]p;b E`.6SJ^B  3 S CkDPG"#AS"!)K\e>~lkS|5:‡_P 0L[6$D%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:08+00:00ttEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/LBP.png000066400000000000000000000051701475705355700172740ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYs%%IR$tIMEҡT BIDATxkpTlBB @%ިqґqw-ֶjNkAZ؊xAiZ[=Ą$B!$$9 rfgo>'WlhA(e 6`":՜Y= XOŅI֧H_g}hjSg{"JI4J@:.ꃝtW.̺?5F 4m$2FwBG˲/`t%@3g4౺Y[i!JcrE63'Uh v1.?h 3qK(tdf2٘av{2c`<{ٶtv؞8{iTw?d *CݼܺE))LѮC7dQf3D3ŶՓE3=f',g;_;:@AgyrED7Ua3y%N$1LXIkq1SH(ɤ]ƭmS̱d`ռ5LzxǬܳݧDD7c?VLuLM3=fͬ>,)xv ɼ#=cMSe$@=Sy=:½<2,>k;t#rY4?'%,,mʡ>AEzOQb~m\FU<nfA6BP4PZw'5;&1wTQT[97Jlt\dru$6 Bhf dgeEp1`K22plk>,f5;y =Ãyg 4[ɚoW5CECFBE?6*,"8#b *1v-a= x-NέƂ`1ز>|SSI%k610GB,Ih@W$swu7s<<^q".}Zw,-;,]q2N"qS,IXƜpni Y,(eEB~Y_%kI3ل rl^Ry7b_xPyd UM#_I xib||Ed& _~p'E,%1ST`,[9@7W~[5(*g>3=N/-*Zw:)BIl7x?Rx ?q-`"Bp{sLK15Ҭ: Pu|x] ,Z+$$8 Meq =ɒĩA veL;GH9E:nL-$1q٭WcZ~tCϣ %`R&%`R&%`R&%`R&%`R&%`R69 %tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:14+00:00"tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/LKR.png000066400000000000000000000126641475705355700173150ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs B(xtIMEҡT~IDATxsy3;{bq HB/Ѥdm+Sm%";G%?R?"\'eGlY-HY%$qctC/R`,rT-fzg}}~GDBo&I&M49ΕS 坟wbMd\@ @7ĕU?dDxϠ-<°Wڨ$! DBH;"(.xn[%]{yе礌pf/(|FXo0 E"ÂKp)&brF$WH(Ko;%3Qf5d=Xˆc E1WjwsEkG`ZjBj\N H֯R|뱺ripg!Ž#jC$,a_8JUN+J .6g fq,ru}C>]R<y1Yߌ{q$bi:LE @+VdΚW3̟ H m}^ f` qA5 l?m9e_L„DŽ?S[!W''%o xuX8vyjNCզ#Tʨ~JA&>5.%:xg!\s!L7ꅘW@ 퀂 4ꅎʔokkܻAQ)c6ݷ(e,pt !gҁ} )sC@KE5U4uIæD@^{9E)dݲ6(2CcAP6j&J!^|ryyzt@ IdC27nZzaap,AZ9) `16ʘbʱb a[$K)uV>nM}}CК R2OYHͿ?a۰a} 4%a*Zw/|2{LKCu.ǠPlC֪ϥp;(Ɓ7jxeZ:3!A (-caņHH-,oM{_>4O[&`#|XB \,L*͔P+")gH_}rФhm*R)PѴy\)q$]EVPէZU4͇=ƙ;5 uFEb(3{3MYJm+D"G!4Q:ܾƆ[e2 3LMնV 6acZo p%Ѐ#>kZcC'Al3Hntw10챹"'ǹ)_)\))V>0F2ɥLJ֑. *BnP&1=xb[SI-iMO@ |rQD[z^*`t0C$R #kvbwG/%B˷~S80>)Kr{#’[PPX܂atDs 8 +sBlO(fJ7N#M{yeJ ).&ݞ4ҽ? ii2HppOv|Tj:JE` =( bfJU %8gxDYi_px)HF ,و ``X0ڛ™&Yȷ(Cdcx{ 3r؈0jadxrSg/lL> ˺MƯm1+L+Oy0\v^R_/pI ir bL /",3@+8v$k`#@JV\2a۫9zUu,a$;o} ",D0r|w5&@[F4vf9&@w[]uٶ7MG3t Z&rıx 3ՕF,H7YܭH76KJSaEaҩ^Y Xlo ֻٙK^[e6Їi.L( !esn`<5mR髳C (lwHaA/#&o,JP!`583fޡƯzM"f"0Z{rj(1 ʶO,L׳'(%63Fos^ւ-/Ʊ5ղM؀KNq,FZjz~#SiiqHe"j"$*bʤCgt'gb4i˦AwHm⬩mfK V(rYcC]*% =IϨz<Փ\RK@<,!49>?pDd]`&(yi .5ΒG ƚ[\,eq Ί5΅3Iz*i2f]ϟ|-9se _ШGv0S. WJ $PPOh@ Auv5 4qjp%ld0B~¯3+3х. `I(H/M&NI*k>}=@?@cl˩Aho8C@/XwDBpջ_dux[8s^# jjU(n?1xxsv/JHuuv@ɐ w1F-9O|iߝzi"vw/^РLڸWڸy7ytobpMhr0}$%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:35+00:00XtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/LRD.png000066400000000000000000000035211475705355700172760ustar00rootroot00000000000000PNG  IHDR@OXYgAMA a cHRMz&u0`:pQ<PLTE&d 0%d-*gC`6q7q7r0l嚪./k+hSn- %c / 4n@%c(g 0 0--*g(hDaC`7r*i8r*j8r1m)i栯嚩..0k፟+hUoSn%c--'g / /!4m7r@@(h(i#"^ 4 0 0#"] 1--)h-l&-gBaDaDa'g6r\v+j&f.N%f:Y>x/PzNi/O'h 1nؓ&g#d1R9t$e(h!D|7W7V4Th8W9Xu֙袰碰?xs 2o[t@^5T@y'I4p 2..g=\);rч㏠Ꭰ⎠,k΅3SȀ&HRm*i 0nn3p]w(I>])i-N5q?x$F}/O'0iRoUoUo1,-"!] 3 / /8s8s43jD@@ VtRNS2..2/424242231.30223/2..2.21222*A!bKGD4 pHYs &tIMEҡTIDATXc``W #"iF`O+UU ƄD$% kgB/-=#G+SW¢4$KJi @"?"*od̍nuMmi]]灆}>4466X/n&@A6wtvuuuwuON&OJ+`aɏ(+M>c,fϜ1gi-&.XEӻ\ bii/Wۿz , ҷZlzXa&Z+k6gsi閭۶c4{l턐?Wm奇`.iE)9zx O @9`0!ːpϿr>'- u48PA;w 8+iAwwH =~VKh3^ Ix}VC` ~1xI~ncRr&d?$e?,|iÈ^4+a)iVSbn4aE]i !pVM,b_\Xq wC.&1Ok+t7joiAFbyM,_h ~6fXaP 1O,*4a#fm˟Q~c,:n%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:18+00:00VtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/LSL.png000066400000000000000000000025501475705355700173100ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<CPLTE !}|v|nno jjl$$$666 ,,,"""000غ###UUU;;;僃EEE333rrr))) %%%HHH///gggģOOO***bbb777???fff222[[[444___LLLVVVCCCsss&&&NNNllloooBBBMMMÂ===YYYXXXwww獎<=<;=<%'&hji,.-üd]a^W[LEIB;?]VZwptž>=<:9:;<DDC1NbKGD hVtIMEҡT"IDATXSAWAkiFOQψQDcGEƂ`{]&8Gߝ>sngFz8DBbbZBR )9%55%9I%#H}SKli@``JOvࢌ!YCsW3ݔ;|yF(R3 Cyci\~/ȥ4DNrD`PwM:0sV~P͞373HdxIt9!pe(S( fW8|V#MR>ABB(d jY\7&^kem:^f#jY f ڄoy +KmKv쬬 TQ*cLݷ?(r&!_aa87ǎם=yLΞ;ꂸo.^ \ko-ܾsVUܻO>{%?%^hnim{?~_t|;c]]x{;&~ݭ?F @ @ 7W\d9/%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:41:54+00:00l-IENDB`qalculate-qt-5.5.1/data/flags/LTL.png000066400000000000000000000006461475705355700173150ustar00rootroot00000000000000PNG  IHDRk@gAMA a cHRMz&u0`:pQ<PLTEZ3iEjDkDDR<'-'-4pbKGD ٥ pHYs&:4tIMEҡTKIDATHc``*Ar9@`Bp6mTJ`H#$0 : FjՆ `R.%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:20+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/LUF.png000066400000000000000000000006231475705355700173030ustar00rootroot00000000000000PNG  IHDRk@gAMA a cHRMz&u0`:pQ<PLTE)9*:޸rbKGD L pHYs&:4tIMEҡTAIDATH! D 0C0x#A+ّTEh4-ڎ84N%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:17+00:00N޿tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/LVL.png000066400000000000000000000005631475705355700173150ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ< PLTE09,6ƅy`'bKGD L pHYs B(xtIMEҡT*IDATHѡ_%]R0L\H: A8 wK:<Pd%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:06+00:00$!ՕtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/LYD.png000066400000000000000000000013651475705355700173110ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTE <<<ΰ:::mmm;;;,,,666KKK sss!!!fff 444%%%tttvvvOOOJJJ555~~~>#G#F#bKGD|Ѩ pHYs&:4tIMEҡTIDATh@U`Ga슽d J 'vn6_"q}.p Nx `(JHҙl.d\&ʒ^q TYcplRmC5n@%Myp4L?vuk |*ʯthc%~/#uC<N 8q0 `p3 @%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:24+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/MAD.png000066400000000000000000000016061475705355700172600ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE'-'-,.&-u>/v>/(-aRYYZAkUt\tDk.V5Itl)[vyX  h8@$g2uLs|e9빩Vo\V woy˥g=<“|WC̈!Bo|~!"%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:49+00:00V#tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/MDL.png000066400000000000000000000060161475705355700172730ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYs : :dJtIMEҡT IDATxylW7Wv}^;I\&i4TZ.%!@QB(*4 )i9Ls8^kvFdvҌ}f v< ܱT޸ ~2W™vFhyRԖuNC:!@iP4s9 ꜆uN jE] `P(:ˋ4a" G!_dzjN 2y08=2nW @%[{Np/BKKs(Ͻq ;b(((@U!zAH*X.? Hm9R +a&6OWI z$&4B"慊[? u[|mus96v^~Dcjvȵ}LnX +TŔ*2MMi:ZPӳyDHT1{.~>^8:m34G*<'/ nDpYsBcaXQTp%V %N]bX84|®-r+GLS󰪳@İ$Si2sqTE躂&P(W1 TR$57S EKTZiY'B2SeZBQ%7`E(/–͖L#>TvhJ `ꐃ‘3t .!fCr0 1D5!I .I,#ϸ?-K`y'WK+_yY'C#[[-tz 1`fs%J~o'ƎczB [ҬfQUWGb=}}ZBRX|g^Z}+8GwmE"izYah(́O!軸v.JE'hz:6PD#!S-Es&90_cеEڳl '$7e~-ÞgOsnF2 ;o5A.iͱ0v۟+{y> 깫N"9JxRG%ޝƵ~0ewԗNZT;5 OYԯ uOC:!@iP4s9 ꜆uNC:!@J\k%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:45:47+00:00%NbtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/MGA.png000066400000000000000000000010011475705355700172500ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<xPLTEJ@:.>3=2J@:.>3=2I@8.=3<2N@>/B3A3!G w6z:z9 H}7;:G{7~;~:G|7;~:bKGDH pHYs oytIMEҡTqIDATXGP@HdI!7 V@xr8 ! Dn+y[TO^ZPMYhA~LZ%ql%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:34+00:00=1_IENDB`qalculate-qt-5.5.1/data/flags/MKD.png000066400000000000000000000031611475705355700172700ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<}PLTE68E Fc$ E( X UM-Bxb7l/`p&CJ}O?t 5]i ,eS1" i!AbKGD~?As pHYs ~tIMEҡTIDAThՙW[0+MGhDq{ފ{oDT[)=sr͗} ɲÛk4B&9 kb>/j@Qqy’t#PZb.W\$‚<er\QYeQMixUei2J՛l`SlYl}]-'4pcSmNW*4 mnjĚZwa6O2x Z-h%jdkh7JљH2]^^_!`}FQ]W*ۧ{` J@^ 0`^C@Gt򏎉61BxMkZ'ćy[ #P@E͠)Дffd2 ̬V\cqN+46w.#^ZT,8S- 2JX.2Z ڭ,c"TMeVB`Kytsc]{R+SFxNC{1H@=֑iiKJ98Ѓ87SRЂ7613/1NOt5r2)9(9+;(9&7CR{-=%6r~Sa'8):8G%7&8@Olx*:nzHW1B=M^klw?N}*;:I'9bKGD hV pHYs : :dJtIMEҡTIDATXWW@K`hD1`zE(k Ѹ&liG';S.]?ho 5hK 6?<""\|CdTT5F(ZXbc7#aS '&IL_JNIuRSp#o`edfyYperiKE^2| ?((.PQqPR\$<+,P`K+LVࠢUlUd̗0]D7dVM[[.JzćttvIwuv%=Fh ?2@4Mvа0) S# ;*%/9*0,  i:*}Q$/- { +.j6+Z!K%@(]! C( F'b?)\!tl<)(/a #0/-J&,.A(P$N$R$5+.- uW" B( 7+` Y"4+=)4,Y!G'R#O$5+ e).R$ p~X"H&vxX"wg_ s<)G& ,.C'af2,bKGDJ pHYsu85tIMEҡTIDAThSQpԮ/TZXRGhFPKeX`eKK,{hi=6A{?ęΏ{=ˊDF\|†(#!>.F1@ +HJ;DJj# =#S*Zr& P(ifu)@lUk@gؖ@K0&!(-K۾..aGNcWS%b̻&2@ X,׺ jLqM[l*Yx{kKAJ&@|P-;bOm($mGڛU1nxViAPH1='Nz VG"D)oQ3eH IY_c97Iw^H WBk2>nx %%(@]6 M1`T bt&(\׳8):;8ACE؂7'؂0Ey|=Z`IBP܂ր(xA Ѷb,,B{Ps\qlGs?~R`ۚ\XReașp@pNd~4Ogz&<ŗ{+]*e hZF*e hZF+ t @(F+"y1d\-h\ ]#wu \rhAaL"BDb[klΎq憷s䙎ojxƷ0EDRwuj w2YH8EW=@@>X3 ΦY [ߞo}t'ҏ||f v\}Cux @,}oyK<ʑ {,~u/L!Y YPtl-ĈfYow;][,"@(aCL9INӊp}t`mS,'l։L*b;o E \An< nB5T]=ҷlmAW @I/c@|edL-l?,fTض~#Zo .Y[2gg?BO1lBdi_L6"ʚŃ>TvlD{& YEf6"6p4İm+Hbfcow*x>|n_RȞ;P.2"B kFga9`4>wW|stڷf<;D1:Mˎ^ڈt5};Gs%wkC4f90Z$[s-3|Lp+;71Cg @1+fv}c,lNZZ3yfߺ 5ZbV   [;Drukǿy}oSp,65ǔ*Zb0QRwM[K) uC5ŴGW uXb!Zwn>~WpX26P Cc1D>DH,@:c|ŬׅjXbI N5 "191959ȹ?'F^j&R71 r>niv݆mk[ı_<(tB"@1k#Tq7ۺ1-lj7{w=bBfO޶;|C<9]{F?Rn)ŤM1(R1HmjhĒNV*7}fC]} [|W4F}ԻGϝ_=?7;w~n}Oyf&BqYX$Fʞ=uXųsb RhT8;;ZSźxr] k?^@>gspA F-Mq`tSi4w<%HvVyx#|( sӝ'jK Y Lz#AdzRDRF$rԶ-4O 2"L?~rpDLhˉ'R;xg $"#brDĎsb,xZJ=z|Jc6<77ʊ&hyFKnthEzW|ƦBa6C,V1M{&ށo|7bFDê67fuġ6+}.$ P3}M{Vy,H lo|x.ɟS'WJ T҉211c^v]Wt$y腟|G&òa &M$kwafO*eqbew7hZ_w/nξ5 "l熳#ݝ[vuu767%kN@ѭL|\C[+UpUU Z*υeqleυvY7]Ǥ8h X"H߫S+Т>}˫zj<$_ZV-U@h2ZV-U@h2Z '=<%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:43:26+00:00 IENDB`qalculate-qt-5.5.1/data/flags/MRO.png000066400000000000000000000027671475705355700173250ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTEb3d2c2\6Q#Z7b3a3d2]6A{&e2^5`4Y8c3n-ڶŮ ɯ ȯ ۶c3_4 _5q!o,k.P'C1 uGS*!b1U(^xIV"i1Z@ɩǟ>c7' dϞ՜ sV}WT~WZ^G$Zf6>@@̾\Vj3xEMO5޾D戢D9CLU<?*U*ťŅyGG #>VJ=V}h6K 3ZX5 ~ɬ' b.as_Y{HP'C1 uGS*!b1U(^xIV"i1Z@ɩǟ>c7' dϞ՜ sV}WT~WZ^G$Zf6>@@̾\Vj3xEMO5޾D戢D9CLU<?*U*ťŅyGG #>VJ=V}h6K 3ZX5 ~ɬ' b.as_Y{H=9Q2ESQx[G$[1!+VP}9@sŦLĤu_Mε~;ĥbKGD&Z pHYsgRtIMEҡTIDATX 0 EA* `q_52c;8wibaFmjouWc}ރi;f|TRt{0A?x2"bZcvfERLlWHXR ѱ U'%P98])L„v0|X,>k hR/v?(膃o߀ǖ: aoxhYsm%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:27+00:00s\tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/MWK.png000066400000000000000000000026361475705355700173210ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE#$\A d ~ } c @ - h v  |  i .L^      x   ]MF z  y r  fs z G > l { KU ?   w 8 #  q !n  Pe2 * *b S%3 X!  %&&4 t  u  %'&&N[#o D & J!m ` H a/  Z(&. C 'R"  &C+3535bKGD6 pHYsttfxtIMEҡTsIDATXWQ/9Rb 3Hl `B!$*(J9`urϹ{kMHss3: ;ۂojp #"qGgD!v ߕݓ+*uOoUJ7/ЊRo„B7>u,h!i67l(:`p!ZA{~Gc4\HS0⒡C&󩢫]ߣ`x8. c>èSg Hɘyb=≤mzږL{r#o.}$ϨY;shʗd/΁֌3\U7@iǵTXi˅E'uDC*,+xZ(~Ga;W- =|s%ypm= 7nùZP^ʔssk{g7.dvw6TYdG@ҿB8B5ӵFy>DXRkԇʷJhPJQV;e3:Z%Uj>4Q\ '';Hr>jsqY#22000&e'Y|a++-GrQW%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:33+00:00tEXtSoftwarewww.inkscape.org<tEXtTitleFlag of MalawiAIENDB`qalculate-qt-5.5.1/data/flags/MXN.png000066400000000000000000000047431475705355700173260ustar00rootroot00000000000000PNG  IHDRp@šgAMA a cHRMz&u0`:pQ<bKGD pHYs ~tIMEҡTIDATxo[9w;I%I4Љr([&.iwl&M`6M AEiJ4mCs;w˛_=_=k|HKOG(e\}懠} nPpz@Ppz@Ppz@Ppz@ܗ>`X(1zK.Ȼ$G$*ZC;ۃPn/]fr.Edn'LaB,Yl;m=]bzܛ&|@UItyD?sqyhqiV7|γ#sC%>d 7EWS.l`3W>>I*W5>r K&tB&KI6X߱Jsg(l6N&"~2MkÁQtk,NQ([$ dU2:oxKBsSR$?fݠ *FL$]%J6UU Jѫ"X5nޭz 0mdU75Lv=ZTY_N⬳bT&hpX rk^ UdWNŏK4%јVˬf+*:fO3JPUO;N׾ôwjg& $e.pqm>v`,d3B"aW4x:Kx5A"Bh Eh!B@I6`Xc#KPdg[Dr3j^f6 wk3{S;U"*)I rLbk9 ,IP.s6i1{8]} ] J:\ty{8}wqwpngk;iNB1[뵯PIp7Q*n`&]A>eknb?7KlkŖR)Dd*Hϟo?]GPV&߷ Q3BenLd悧c=aזh}чaz,/r\ 5:Odw1z@I1|8"NCc`Pk ~5ΎNZ%M~&2K3(E)e56^Xu b:8KE?Ekg&ZVgKg/):2 Yxgc"rE26yg{$ iR5m=n;Z7Dx{;I-z*4е}/SmFc45-򥗙Yҽ-ԋlx ( 6 kYtXJ.BeOOHb4oK䓋{9ϭ:e20vpP>onLG^|D+Pr+U?8LHsvqb笄`ogeO)]}ƣi;n;UDrXw!I;.:;ȏ~|־VMπ9Ys,"QC(BSxT4lB$H`mD*?~?}p!<@2 c CW`Nad✠qM|GHiIP9i0eVd( &h|3ŚtCM@4biMظ ,3C3H sa!0\yKƔ GW_da(78Sa\|_T*{mo-"~\wh(K[*%|sٱ?qh?s')j 9!h )@rɩjٶ$mC$EܽK|6~|:zVġ%ׯ؉+ߤ@!Wxk/mŝO-0e+n ^DQi j8ViPr' Yz1*cs-Xo@N^׍\<:F\֮#8DRSo6A0rQ?ag[0@dެit{X|m}6u{B2q9MBajF4PTM2vqQc+ CƃXr  E! |v/_ފ"$>/ϬⱿ0Ok?ɣ``8Ho`W[]m<.<]i Yblz}NN 3AJK*̎DO(HHH$A|TQ3ƙ]}8=|r ᘓdU]/ u=J%x M /iz{Vq<$̞u߶Ss]_MWĈ+skqU\ηUyJ|A8wIgp^.XMei/;{X$u|/5~[Ԍ*^RA$e0RHJ#:heɕcDh.xI\q]z%`XB/n]O~c@~X wE(Yhȉ̾ A#9aǛ*ɐ-4ω8DbDk|oʋ%כwRѹSs{'TFf5Hq&ܹŠ@Lx6Ts#;aH!frU;X~noz6_dOڊ yW?޷@Wx/hgp4n!9.ʘjksWkع%@ ; fݩ#)BnL >}Ӆ )/ a]3W0-p%{M ] yy&߼zFIgJ-ᇿndoOr! f^ZNϠ~7/m{uۋMn/FS^5*Y\=xfۉׂ72#9$ !7Rɒ~Vt~f}B '_ǒR~txH)BPlO0 HwVAEiguO r|W}l(|w%%HW;'*j+&a@r-eԷ az[ZPm-<G"-[6pAP`?x뫉Z:R2p9MFByJyz0LWO bDxSw1 *l,E-SXy<i N! 3J8yCH X\ðRw 4Es'TI$ՏA\'HځH\4O({mб힠;X"PVo(zLS0u}_ n1-|3s9!I*T:H.IC0Ks*B:NIPc[E}l-NjaBDPEM&*mRfb)H7P PhD7]}Ty+* AIʨ%w2::⬜/ᬚVUdXA]ҶARhҶψ(=6F[>dKJa7a ٯDfO$T_a#Mr!)Z܃"mOl6C,"9r5Ѥad9H9Wy\ `crB6'6G oޜ>"b0WK\9>h>X%LJܖ0#WݕlNN999996 ԉn%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:31+00:00o tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/MZN.png000066400000000000000000000057341475705355700173310ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYsttfxtIMEՑ IDATx{pT?޻̓$$BD|D8Z)bS:**h[i2 :֩VZO TGgT* Iv}s&!Hݽ{=Y*"uRX_ U[q赏940kw>kA h_A|;Sh 6x䌓hu,K:hOWZr ޾SZ:AXpzY^.ׂ,)qV{?߯%+aZp@ 'erAQͤ֘%1@n{/o( SƸkG5|ĝ,hѓ`/bjVz )Q"S/\ueN}KϰF NVoǕ7LK+U!òNVOgVCo$(Q XY3k9 L*T4vp϶}\ 2GdA_DSL-"v˒#7R]*=qzc pT#7R]15aECLz3{1<ɤR QΌ@?Hu*Wt==AT@Bh+֒r)sgVҚn(ܒ [8ȨDe",gޔvrDm*>eRdR%T`/2cyA Eףʌq@&ed!.4 K0/*1R!^*9c0h}#x+x-2wf=D1̌(KT;g^~\-@4;; mc:WSm3NSK6yaڟ,$!TͱZdƟOX%|J5'7ć3+](ۂ< g)W6ٸ7߁`N M.٣d_*Yx$dqum l$Lu뺲;FŢ0e$'p^M`I=.k=3O#%x\lXT rL?J \z"P)ga%tEFúb- >|D/cQQ^o2sJ"C?CVN"O9?W@څ$E:"u*gt@i#E ¦PRE1& &0 <(yWá5aGs+)'-#gA P }2YOso:Y|+P.lƷ?SXQ@?oY {9r]сZ\;$LIYs[^8id(S`(XdeMhni R:›xX i oQV9b.9i'oQ#״,(0$)p(1@2e9G}Q+7p-9/h4yɿ=DzcAQZr е5›8G3oY1W~I mYqzkY?.a7Yn3갗XU_@k%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:55+00:00])ltEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/NAD.png000066400000000000000000000050031475705355700172540ustar00rootroot00000000000000PNG  IHDR`@jVYgAMA a cHRMz&u0`:pQ<bKGD pHYs oytIMEՑIDATx{TT;Q|*Um1&V4i<=TǂG#Dm'zk45mBEYk,, ,|}oo^+㰢PA}B pEٲk:;Xܪ0YmTx:>)TcNL߱bZҠ(g)7,e= )@ Yt@vj>񄄅1Yne}PCqx)yPݒoXBAkCMCqBۀuB@1#LC!@)0,F=("O0E@""jR.0È1#i>ObBW,'ESb3,|Sҥ$, zq2 .244B6 ae_<GCЪD# @1'-;9_2ݸy!q9D BͿi68eCU[.t˶UC=b@-3}0uBbƻ;1Y;sdҴS9@Ԃ[;f?Ap:KbRܡfMl7_tE7 Ymj _븽%iyjWJ[QO}>)+Qd^Im6 eUa Đ}=RC1? nB@eG,⛽*lxag&}\jؐq剽Tek0#" G7i_B$9 50J]d@(Z=v{ ò_gm3Ϯܜ46h!sCeq([: NNF;SUF(CD/_=bM5}x41j:@s 0_4U>N+ݸi?ut8 pg֙H c:͜r zN  cY/~9گƁ ϳ3f~vGk"NQuٜu aI!`T3rB251I|p1Ȓ=&j$m+NF3@ymLe5bLu֜_zm\ ùh?q~|<@t䫓2w0/{،HN41Tك[D8jxD441j0GG~pNs:Mb|7rNH1MRb`~s'vjA^f՝S繹&$ 44r3G\\2@8*)2DR(rȄ eۿIQgŀ@=VU9908#󕥼64e@1Y&~Z[^YG-3A |*i*L:?7`_NS,na)xWU5Bߘ~d`U ?7; ` Zʮ~Oe޹ȜvlyK 'V72ޠ5AI=ra/V/ 0RU]"J᮵I158^iq8gNv@a連pO{7ԇLplU0g?yD`Sbvբ]ejj E #ajPCmPd;t*q' }BmKJeN[1bYF*=;ƭ;xY?X} N'^p>&N!D ( _z%X*-J@οG2Kwo:}VaAGl %tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:51+00:00fIENDB`qalculate-qt-5.5.1/data/flags/NGN.png000066400000000000000000000006011475705355700172730ustar00rootroot00000000000000PNG  IHDR@ bLgAMA a cHRMz&u0`:pQ<PLTEQNZucbKGDhQ pHYsu85tIMEՑ5IDATX1 < ׄD@F8+S@ @ ~ m="%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:15+00:006tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/NIO.png000066400000000000000000000025601475705355700173040ustar00rootroot00000000000000PNG  IHDRk@* ygAMA a cHRMz&u0`:pQ<mPLTEgi]]^éԙגљ؟¥{ҍ|zФ@Fz𔵬ġ䔳ʵidhqaugcpʿ~1-ʅ}00<@CSOVuXKwH݆wwy~qxus{sxw{~ߦߨ۟ܡީ٫^JbKGD tIMEՑIDATXc``Q0 F Lf&2t1XY989XHM']I@PHXDTL\BRLJZFV4ͤKN^A[IY[UM]TZISK[[WOHj.Cn#cnnS3Snsn% Kn%ZچЖޑ֐ِF2r64vusr6P!c$?w@`PpHh!O ⎎OHLiJ)J:iY9y:$x*EqWTVUpGՒthn]Wm`E#{{'L4yigM̝7E,]|J4fªk֮[fM6nڼe+)ɐ$}lw]Ľc.nZ%` ܵ{IVZsݷ?4[/pNjؑmvmOvʎy?`nb"6bKHlm-z{W0`7P,%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:13+00:00UqtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/NPR.png000066400000000000000000000060301475705355700173120ustar00rootroot00000000000000PNG  IHDR1@xgAMA a cHRMz&u0`:pQ<bKGD pHYs!!K6tIMEՑ IDATh͚ypU?ּ䅐#B.DDN: mgRN;kEHřhkveFA A #ow9&/yI&;=*h(/!ڪt( e@?g hyצZ6ّU[1@WUSԄVS퀞3B B0L𛦃loE0u]61#;b;Z& p't5paC{XN?d0C3R WJ$$lt3'!ΡiMC0sB;i '2a 9B_ 4'p5$A65heי)QiǃJ:F6 H prv,NjE]55T*s2BW΢JJPVP/Ld:UaiW?{Vr1 >וλt2χye:׃uDnA)If%0EV|OTo~$c0,l17m@Bm=}rk^<+nhǓUde!(3:ۣ5fJd(H>, 73(#X  Adq"d#F;5jm0@n1$b7v4,@`+kw,#{teЮWY=I=ԑo'=~2~ISXnÿtb񡜵M ]]=x{-_sNO's]s_|ʻ jMHOtbtN h%E^+$}k.<;2,~- r6M0M {;y+oF P~B燱qe#4 D*:TYfH.P5 F}m\&ZQAv v4C`rCI9* T Ba|kVLOofc?z˫7=( 9훰Μ⽜*/KJK"Y߯Jݹ!J'q/]S)e7AD#**n fc=a 굧yxgI>H}+XBw"%hX K2Dzny:pnĕ|U"ɜElbfp i{598}&gcxjhgȄpBhq|K>^mz]w$ГzZ9>kX/O'+-SX" n<ž^&r;!j˿SRv2)}f2pc64E%f/t<~9p=f`k_!8j۹k/yVF`A+ΙqO2*nyni:G"gNc[nLLV8vf_>ުj׌r~Cqg 0ʯ zu͊z' ƒL +ݽ_U Rh/@66h^s¼a6HkUxx]n3gDXY4{i|t}@Vh#p N>[0!~L0hH"o5 R~cAʎMC' tҪ\mFK8#wl&2cr:DzJ;s}K5mj奘|g̣1̌sP~ GNPGOS b__UTh+E8\h;4³D[(Dq0ʥb(<[k`J8K7kɄ0(aM֛2t)1i~;ُ&l`igΔ&Q5GLݲS;Ι!iV w_M((tC@ølde%+W{@Gv!:lZ-wQqTؘ;mǫ=d8Q@)b{ֹT*؞J&(D(.Swo{"PᏌ.WO;*.%jWTpDlBΜ֡t5 J@A `IO5QiG ? H 3v:\qEPWjh$>’m65{A!9]H)1&%8KP@~H'<=4?ÉPx/4>'/։bWsB R2tP,l\qe(;lmF}/#*w0hQf3' ۃp!U؉_ cbKy#e--YS`l*G1`6dݝ9\%fq&Sb͖/aPg20iy/)IڥDlK 994Iǐ_N\×ѴΩ@“{5U&&.%Oʷg:$jhq[?JPbHZ I*gƞK#h7ݕi0aT[A)o<ąk$Z/ "PLNDLpJ)cp0fd><o ݠzvM2~L2KDэ#l$:*gS>NT&7݇.B^qɖFS1ipKOlv|ocD,"W.HF%뜠IC-T G9gw}v(p>uv=vTn~cn>#q2/ؗ_1WJf%bBcnrhϨcVr~ 4Ku+p|s":n| b6a6&s}8BƤ_hyЂ00Dİ?2[0yVڭJ[e($9O?qZqϗ˖NKΦ%8h 5L%}\ oU۽2&: j4&IgY \s2A?5h0uAm:c-&a8i`ׇм>,C^_^6U|Nz!̤Z$HHgT86|&dT?'ْӦ'uUϐ=~KM(ji ?iOkf3>Wi8wNpҚL@m;wO:-?jǷBۗOshfj:bK'NZA}Ro]at_fQiX >ݝ I$^JʥAq|d+@ "Q*աu@sg`/(ݝ8>>F = YR=f o=#pdq8t2 jIjmrfºpk?xUqV),hri"1UtuCndC"Hx}4NH}8!qBI$]{!"#MDFzT!Y,!B!Qqq<5.a[ ASi 0 -'B7+RcaMV:#<5u Eg-\wh[Dm>7C!y8]\]>c<L/-#s$ !脔'JY[ZÏ`iZ"TWuʹ-ĠP}N;0N<8L\S}[_Ch#s ̾UvٿF=HOMmx^v]mxOM%9!Rw4e):0|rĔ|Q@:]XC 4yUNBS@O G @'$>NH}8!qn.K%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:52:59+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/OMR.png000066400000000000000000000024071475705355700173140ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTE26,1"adkn"'ilKOQUcgTW!& %삄^b+0;?>CRVqt뀃셈).*.$퍐틎#*/(,gjW[샆~WZ8=ADHx{=B>By|',twhk/4JNaemqwz섇!솈z}cfIMMQ+/{~-1_b7<#ss@$ !bKGDhQ pHYs^tIMEՑIDAThc` Yh X!62"8tu;ZFw320  20"bL @[DEV)iY9y9Yi)V'BE%.e F.%ERjZjR:zFz:@.}fnjfnale-mcknFO;8:9p z{;;9:سN^>~ΎA!^NtlhXxDdTjLFT\,]c|BbRrJjZzF&0A2}!kVsWj^~*k6-,*)Ѱ)-`vŖWTVTU@uS'UVwm=+Gk}ؤ yfͦFZXZi 6wt2"Ύ6Vp G[1@3rBX:4 `Q0 F(- `}o_8i40mQ:`uF0Q ۲H%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:10+00:00dtEXtSoftwarewww.inkscape.org<tEXtTitleFlag of Oman{߶ IENDB`qalculate-qt-5.5.1/data/flags/PAB.png000066400000000000000000000020021475705355700172500ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<>PLTE-L24쀩;z]QЃˆ̄-pPfNRISQzX_TMMbb:yl+K 1D`gf9vO鈚Gc@ꐠ떦鋜ꍞ錝:X,L / 1 23Uo5肕;#D용36Xq .&G딤Fb卑v1b>bKGDH pHYs$$P$tIMEՑIDATXRP P -z'*Ͱ׹3c*;H +`20  ,TZQZ:h4il2 z윦)hj~`s\m0;r j.0" yP0H4P, ĵp\'0p{#~LDɻ{+NJcy~LJBV/ܡ2XQ[ r9` yPX*A2AR hkj=9l;G\i#Ↄ>Fjә̦`hN.9V o+ "߁ ȲLJO6 /;sR; R%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:28+00:00‹tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/PEN.png000066400000000000000000000005731475705355700173030ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<PLTE#!-=ҘbKGDhQ pHYsttfxtIMEՑ/IDATHc`@B&.(Y?0aTèQ F5j0aTÈDIP%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:38+00:00StEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/PGK.png000066400000000000000000000072231475705355700173010ustar00rootroot00000000000000PNG  IHDRU@k;rgAMA a cHRMz&u0`:pQ<bKGD pHYs^tIMEՑ 3IDATx}lUe?sν:-:h!P0MvCpTd$:ʼnk]'cfVqkˀtxaaEaU@JKz^B}449_~^gz8IP\GM9Tmzש-Q(+j+1RV7,u=(ƑzsCr.J*d>#BI[$ (7I- Z%~̥4G<-Hԯ65yAi*Ec*9idk4#8.VCٍS:I @X&W>v 3ur!5$ x#A劒EkNAg)ś␛FRr dHQ.MLe6!}t^3ydkGpQ$ʇЍq]@cycdgPyhWaLej, N=#3DJϳyXGX\@8=` )4/Q\5O 2( V#Jh`ȰhI}:D ySSj*Iޟ.N}mz5 |[ tE=FNJNb#VEmhQC3S̛.pMgѪI%I %hXbD:. Ali@ ZE%,N$URU3J}C+S WiBݥF@JܤY.vFc-1k7IBeb &}˦IjVYTP-BSSEk @u;(fS4(>)dBr3n@;5ijBZ2~{u8 Ov\4_B%@D^[݂E'uΜ9[P(4)o=gHy?XRԮ2Zy.4s4c_- 455Q__ϲeXp!~;455a&)==Ӊn>Tw) H3S}9y C\iGQ4uѢE<3̘1Z0]]]$ {=}Y]3U`ZAE Ë }-q%Pi<`l x Z"/g0[=N}JOBX'e^aWD`^|E.\mۼK͜wHH^ " RX%0bw(?P4KICCwu<lfh5 -PnoD,+CyJKuJ/$Sl 27$Ǣ%2-ZĻ˓O>X^$ؒ?.[_ q^IvވM)£|;V惢E)Spm۶k.Gmm-De1a&L$$hP ;49h Ȅ=™*L fFh5jd}HӉQ 4CWf:Zϴ1]&?:RrJ1S711R\AⰎFNGc:TP>e6B@^ZUUaXusuS|ܠDV>1B\c_(קI}a4*Y,!zq˖-cҥ=O;8Of/x׎ {NAo PzLaA^^. kR#7o&+Vp=d}4=@\yA-(h4}osiڒ.>@m~*받1c?===9?( rwHYYK,!LC._|v2qj[35~՝66-IZ'&yD)}+91!---\43g<qxϑ#Gz8ضͣ>ʼyƎٳ-[eNcϜ`DdVad?&*˲hoo穧btM̟?{Lh.ٱc .ݻwvZ:('iF`49)Ph'e^OTW^y~^uL}~i^~ܞ4AH)4KlS>gьҚƶҧtnɯ꒳ `й`twwj*xbrK[]t@n%P~K^|1D7zޝ˖kƚ5k;w.7n$L68L>49|pĞEDh|ǜr!2Rn>A,a0m4;6VϚ5'N &ؐ 6j d/Eܶ^k7hC5|#/yEԆdNݪB1<:$;0䉒j&SNeӦM s`BMrwhM&z9VTTuV6mDkk+]:|MQ/4koR.)tJٳgoV_Pr7XJ---b1jjj&4OF\AL`s;eE'ᏖT*]oU}T>}:W\FM;UErEߠv7#mP=–xNR[rBQHm=^x1˗/VqKD?K! hQ4uŬ^@ ҥKikkߦNoNoo-+h+x$)OwPM 6܌Yf y78|-Q z4Z&YBeY|ᇄa,Y@oo/k׮壏>z>|'A@Hn 9 EKTRJMFww7;w$ mjaPyNn֟)g7=\^xKpQg5q=nvh?`XD4ZZZ8~x{5Dz3`%uEt64\k'nM6jgA':F7YeTb5SI-+3L } uR)2á(=LC5%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:26+00:00ƹtEXtSoftwarewww.inkscape.org<tEXtTitleFlag of Papua New GuineaB,IENDB`qalculate-qt-5.5.1/data/flags/PHP.png000066400000000000000000000060561475705355700173120ustar00rootroot00000000000000PNG  IHDR@gAMA a cHRMz&u0`:pQ<bKGD pHYsttfxtIMEՑ IDATxipU77$ *.c̈L˴3ڎ:ti?q8X*E싀 6IHb $wsާND$p~=}Uwp-%`(.HG(8(. Hׇ#-1ZGrT0&OVUdž䲖1g ddYMo,co] GN @,0;h"v ʼnɜM'N|081 &JBQ?ϵl,|X,Än.@ѾiJPwb\=Φ%|תRہ׎[,+^v){w2śzlb!mL?Y# QEQ@C7ɱV42gMm  )g:ny5~'@}9OoT׳T2C@,Cә N6Y$Ӫv06`(pv@ܜ-r|? ZY4&5f`r ۿ:~vLt tb6^_TϮCA)+D]*63sy_& `@W1(U#ⴝ/**IDP|}ZZg:6j's~F<1&F1DdVެg_]؎! "Il#P#5͟f&fj=CE/:d(Ëd@wnM�5N噟_R7X\r,,Es>$8=unY/L{p=P2G'>FrH|1( P(tY:g;^U6x,x/wpvl0 ˰@XQBsQF) γ5T๒..H 1Htjܟ{[AWUVij]Ϛㅧob @T$'Б%}l3h'l# {rIS$cv)}O7yR[Y}' tDr-3)YNnG2 Y{_ JnAj?MɣJ@?pI&i8z -]s(CAr-ȟr#s5!T~`4ǂL_і6'WqP9//1?o~Q0*8z<;Kx}3Pi;cA7Hr`@i!/Nuڎ+IF ᪑L{vCJ 'm=?:Z$׊(75 &ArMC*I"`x!ߎ踽{s}oXQ50!76;+:v3G$x`tx.g nk^[qPwN{ /^ID3}1@W!偢+ (]X Vc!HaFlנ3+K6Gع, jBsB Q&.XQ$4sa_*$TrO"Zq'|ͨ$D~N&݃ZG$*c=6Hp>l*DעByvpcm*\#.$ W=dIfY*ȵY]Aj?Xa U|-׫Z8ek񿻀3jč+^5G7ADK3SV@UF"S2D?Iv\:lOB1eGMz`E!fvZl?K(BF"L)R0Q/R1XjA I&ʠ J'>V5T3Ȱĸn}*`A-bCP.ZkrFuZU4uYk#[;l|=nR+aBt]niy_p2eG9kNQ/iy[lBWi$[;AM+[mS2X7$\< I%5hJ񊨗>nRǼ X8YjE!𪿳 G#`q5hK%\<C)_@4gJDsXD ar H$&]>3fIk{W7~gw0dFR0 J&F#K'6hKeu择˻¼QebKGDH pHYsttfxtIMEՑIDATXgwA'KX cl"݀4 h%ލ#ݡx(axyν3{U3"tZ`5icՙ5@2~v)ub$Dq"tfwS s4X-5:At8y(ٝ`Vt]٭s07 8y% 1 , IaqQ<`RP 1 F/PÉ+V}j)? nE\k֮s7 lTaSWnaV z߆cg. -!bރK{?pPG;\ @G6CN,yO,<*x"w :x &SYuFҙFD 8ۏRt<P8dp65RZd]hԥB㊨ _d]FrMtF pR \mWIyCw޻b~N =zJ(g_XrN Wߨm@v#p{w? |l _%ȍ#Ϧ_hcïvzWݣcJyxŋ^ W@ \=@~zBX"ɤH$jd!Ɠt2 a QD0j@:@pEA%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:17+00:00>tEXtSoftwarewww.inkscape.org<tEXtTitleFlag of Pakistan &IENDB`qalculate-qt-5.5.1/data/flags/PLN.png000066400000000000000000000005721475705355700173110ustar00rootroot00000000000000PNG  IHDRf@zgAMA a cHRMz&u0`:pQ<PLTE0S:<6bKGDH pHYs ~tIMEՑ.IDATH1 ,`p{Z^N/8{Fm%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:35+00:00ttEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/PTE.png000066400000000000000000000057221475705355700173120ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYs^tIMEՑ IDATxY]}Ϲ̽wvcml]@Ӓ@@ThJ4 mZ)jڼFQ$%AB/e{<>\Cy)+݇s7.4|f{/2Ģ~;3"fF@3# bfĎ13"fF@s h C@O,lA!z,dE/,O8nм1QGH"$ܸV eN3N v'q9ZsCo5pn]InX.˷PmLaJFjjcTE㴍DymAMy|;GQ♮)m 'e+Z/1rq2S[|1S 6-W/fr-3iFHse;Cs_8%.(%<[?ڧuN(}CoA3yzdk}$pz][Ք>ȜDδ dm;^H@оMs X,:x|9 c( =ŠW :,dr3E-Pbg P!}oL: dy_rLS]EEK\Y_:^MHËvұCp-ꐾ7!wcr$TM DkhRȐ!Klgvf͢NR{abWyTCO `qqEoP Cq_3?2Mi.n"A䟧)uh/p<219*3ik=VO?>d1u{YJcR3$:ʱvӨC{nLqe:0=,ZDs;˅շKŪp_>)Z8s_{-9>YcDžNbO1ƒ91񉢖'd2%8uhύYȳk.']NH9gcOrdYo)&/5w.3SkvMkN79%# n/OG1>9ce.Y~Y){F{edZ'Րcw߲DWF䐃/ٽLXz1ݣ2r'(Gm`,/qUf)N-QH3&&߯J>_ǒfJr/h;kDbSM&kZiC1qo :ӷph<߽K53;{ԟ _aanмt3(\zIuZy#hકff=łv3zLk qteʹd8=A,FtrŶ~wHњBAc04$QWfkjgT+X!xHǙp;ML2d"{>&߽$,nܮ)5HZm ,uHP>k|+;ثX26=lnҽ#s4'U*'&Z.*]1lVS Sd!Sp1Ĭ8^&{g_GINovk%~vZC0P$1Yj>q ? "^8R[^Pzbcwk|wo2YFvp9ď7x|#'7Qx?o|sf\-&mCĆ~5e\&?r651uMP!|D Xçjaȉr,[$։֧Uf/cϲQ_A_Lx&=6ӼSOɹ%ֱp, 竛g|~? ٨6Q#6F"y?\y:3"fF@3# bfĎ13"fF@?Ƚhx%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:33+00:00TtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/PYG.png000066400000000000000000000022551475705355700173170ustar00rootroot00000000000000PNG  IHDRk@* ygAMA a cHRMz&u0`:pQ<PLTE+,੩טΖˎ߿㬬Rm}۟вʭwvwӣ&}GzNqꈈRiVnĜ{Ԓ.>dLN(e2[R32sr &@-*.)-+ +kjB8j7465m&r8]=}~퀳ѱ 3!gfE&/,.-7o蟍ͭݽãSp63vn3xN;_(3|޽jgU,Oޟ)PC;t-la [5vtEXtAuthorCaleb Moore%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:24+00:00YtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/QAR.png000066400000000000000000000025331475705355700173020ustar00rootroot00000000000000PNG  IHDR@Ab7gAMA a cHRMz&u0`:pQ< PLTEĈQk,K<9;=Ϟi>Z#D;:<ƎZs4R!Bкu&GѣoC_(H>ڵNi:ǎ\t5S@<Ҥd{7U A޽ĉVo1O?֭xHc)I˸q&F۸„Tnʕaxٸp̘Tm+KԩtEa˗cz9Vڶj%E͜iǏ"C89ɓ_w6TA۶Pj-L=Ӧ`x=ر}Gc A߿ŋXq1PΝhP軂`>}LjЏ 1ҡ0< 9$(sq}Ns 9Va _;} `_5{m!DnFwK%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:31+00:00ˇtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/RON.png000066400000000000000000000006201475705355700173100ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<$PLTE+*?r޽#($&&bKGD  pHYs^tIMEՑ/IDATH c%bI%_\e"  ¯%%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:45+00:00~AtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/RSD.png000066400000000000000000000072251475705355700173120ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYs N Nw#tIMEՑ _IDATx[\}9s۝]}%)P$!%PԤTyB j>JRZEU^$)(q5o {˙9P }Cvv / !Vh+v|#ۂ4(>+; h?F阃_w[#o nT4d&cTδ>fNYX HAШ&ѓNug NnYhfk>JXq#sLI xS-N[%nqa w6@!qR14BNmh)4vVcvk8d$U%_G"=JoR<$% +pc{ k5r Pe.LB8C)]"H]R-pBz-) *n Pב k3[n9y0לTHGNmho$>fnWt [Ԥd.&Sp5lO  z@!ZP0%-{^ёZQr!ذ*QF$M B$#74L,ItFC/-R[X`b >\B,@ i-yID18$֋1 @QL謤.K/T)~uZHS|6@uL8(Kl28,Ģr]-`!=HhVA Qa̓NY)Ԋj B|86IaC F|C_H˖ir(!@!E*`gIX%Au\h8<i=u4eOzVcԟz{ ^uDmdaT_-x7Q?|Q*!ryʡ;VmC),ZL}[]JORyY ޵oz+?Ï=7)[+\ Deߦ &hH,tGڷE O!f Yjr1Wpm҅BGG2rI䑳L=sNҩӌ:Ț/ s_m5o>@q0Df2vʡ^T41{H`dgͦq_c-r(}~ZçRe ܍z{Xotfq@]o"aqLXz{{qj#.a. =z#]>ήfmнg7bt:CT"0 V]@ ̀Kg8igs cx['HeA>u#4B+lm+R k-Z/fw MP !%렍"T+9rHޅT)d2 r4>e+TX΄_WI C,SL';2"}Ylؚz<GE%qֱtڗ6bAkxd8#f iL=4ZPR!|[z}h X.07R`Mf!"^n E<%1iG 0Ơr9$b mR`Z|.( í'Jkl#XcBP*YX' (X!GiFR.RHj%#\9.N_@8$ =;v` bz=,LJdnA6H+DQ@KW)?w>LmL=So0؟ "D뺄a@\,:ڷx~c}!LNR-4qa}keXF$qq&&F$+f8v!x kLK"KG2g7ak݂~+@)\:*&1~j|X\1u@ $3g~7bׯCE`3QD޲Lj|kk5LbqJz+B+)퀀o4qJ?$75狭+Re{>ĉ۸S؏Rǘ(-QbWe?Px A$iPkted Oc+"ѓNzYD^o\C*!3޸@"p /qs.^%[_;Aڸ$O^;J ٩'O^dR{iş+"M%8ccnHƬ=Ef1ٽ}H+1h%|8&I |z3s6Bdw:vB ?Gjx/fZY; Z9rfd_r%HlL0W3KktܖB0xxz EE _1V9ÃAFAuh M!#j49IvnI $1 BJW b$¸7 4طGzNmhA~wޢôLӈ#d|5By.Qݡ<-{I^H3NlYi{c15<=5T6x-;M@87υ7|ԡm߆ߏڽ ĺ!Hd}0lvT@G9>G(SmuUEBIrp@`vlwk.!,[C-.B!J  :n6_= `=p:bKGDdfn pHYsaa?itIMEՑIDATXc``0FF&fFZH;9xxia/$?;'3*%/#+'/ĤNeU54ut 9Ml#UwrdvvquscgjȺxGDFEQ7Y9SR=329Yy ^iE%e U5iu T "ަֶŽ.{n6f5FSAS޾ {˥'Q9%'O:mugǸarVf;ECcu{)psRFBK*h-YTJAUVY.h،&kˍ+6njbw@ّy Vm9+Yha>0oK#Ӈ1Ncƀa'.4Z0jXƀa/>4 h F-`ԂQ F6WEV%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:53:44+00:006xtEXtSoftwarewww.inkscape.org<tEXtTitleFlag of RwandaXc:0IENDB`qalculate-qt-5.5.1/data/flags/SAR.png000066400000000000000000000077141475705355700173120ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYs%%IR$tIMEՑIDATxytu?U՝;I:+rˡDt]q83뎻>Wx p#@HitNH_u ߾lWӿu F#BD0f"LD@3a&" D0f"i.hkŗzIwaAkZ{\T`9?s$T(o%Out$Lbg# TdrzhVhg\v1 tH3r)L+,a|n 8ZDtzTdy'e(B.krKz?)EfR1F\>7\cjw_2$9{+gOKJ\";`5 7PuS JQ2 S=GgrMn JgQ5FMcGa~5>'k߆7){9c?`FQj6sVcdgaeg۩Ȫ NBH@AVBc2W2 )MGbFd3qH\]j8 ʐLZr1cv?1(YZz쬫|btQ}i'2f&IxFZ󩷟㈭deL0&1C|133|"h $=FBJP\CC{3+CZEr xh\_2QVPFvBAEc@EDIbS^_>%/ي9ȼI$aDK}TdޮºB%-l8̎Cz=m/SiuvroЇ1:sLm.ZAiDIzRG_GKOn:PT7|cgjn5Ggz.n3|tdL 0.{8._C-9b9ބ$srmvWw*uM9z?qB\NAE&/Դs%̱q4j*ƨXr jXS2^8m'rǸuX5y!~d+rٸDҬ8,zڛ׹wSOjcH1YUu I),{X#m.>q4Uxjkl>:\)=37[[=, b k:ʉ X\:,'>^NJ~#ejA)-nQ'Z{3%yhbJՅN/vn9uzadO$ŘmocDfَO "xOi0:α:> 2aZiI7a !ԂRR)}NVs Ixt=(}>Jg^v]ݘcppLnR:-uȪʆCE$.O/}L[Aʌ zp<>vS"J@eX~.](URkoTyə|]uw`SzbN%;%(I]^qAQU]Xͩ }36{8~9?eJn)q{$r)?D +"+'Yp+3>˕fmz;pdd2t"J0Td qgqlAA)GASDE *2 u<2k9'A^79rfL*'i%AEfO1ʲ]OGwl4c-3y×(A,&efJj[:I(]7g (AL1J$gEk:S1:YUAKyh'BHs@>)c 7FPY:~E9fJ/ ^vPd[qĵ<:{9NY[|-CnR_pΝpKg:mjoF[4 ]6^C #1ƚ;q1d v?ufP`pP Tr)WH6ij8:InjyL/^mYrxt]j[m=nS"|Q,,}INW3ZH1gQ9%:WKVNZF t{lobf8ּkYl=OWRk?*t{sc i*<0u> j'YT:TSo~i[iw;=Lp+L +)Z{3[O05Wn<~ytzOb[?}~`f.eIlj= ! ƅ."zq{63<-#"n7̘"e鿽WQ ̥T5װfs9s 0SG3Z*lٍtg g:m\_R˷=7MI}{3m.n1JYj7PRGl4SWFQj6/~u@BDBm#+2(Kz:\:=c*6K|I3x|} | b[]U.yhkfu4,!+Ed'FnrGmhmDB Tb:KɹBE Th ^tAgѴ+)KR!$;'WH+$ITt߳zDdVD3a&" D0f"L\>Y-~W'|e̱tJEUPTUSQ5 Mb R{AQmŗߊxb 6g˱A쁍0TFZxvRUY * *+APXk[A߮le˲>8RҰWDա*:QBECVdܟ#4U##1ZA@EID ($t$t%bbH2fedF>sOD' "$,::{sP5xL;Α`4㓐$*_NX\~B{/M-%[qx]E h:Ȳz {|˒aLs\^VeՀgԽ0%#@l/bKGD/#  pHYs B(xtIMEՑIDAThgT@:uāTVZ ({+*ܸADQ([nŽ{LHR4m5ҾrD"!\rkܲwDbe@ PT 8C+KؕRJ;ʸ8qeiE ܧTtU%dՐ" 5j@0k)˻O]u5@ 7+YNJ5F֤ZfNͩ-ZPݺ m^CGԹ D< !]dB\ z>ٷ? Tr٠CsvF߹t?!‰&ӎā 2u䙀Hv5 zf ]2k6A#xx&@D=|@?Xo\+0oL\{y.yGѸ`  !K/{,9dY;jm|~k ĕj>< $Txp=7pM=X8y[*|K;ȝx݀]#/p:()hg)Κ}l<~rX+"A乐}Z<H*MM;8*ZiSόJ=,O9:~:qf:dE\z 8x*\DMIWnXxf \#^o$[!^*C 5`dȀrL<<|=)JT xWW ߜ}.2 DfUVVUA1*'(((=]wuXVWQp;.*'V]VKQ3ChC:-&']xuWo;-)''%%&&44ZZꏏZZꓓݸ޵ǒƬmJu,^M~B}By<x:y;z=V'V^ViT9,#%디]yvRm8+'34[\.Z}͗TaA⏎¼ѴȒȮlIu+^zheyT2fPx9x;kCbKGD,q pHYsttfxtIMEՑIDATh޽BQE( bABQ,XAPl`.d}of8w)k;q'OuuK3=l?·D C s<< | 7z5}x X?> G D@~p@ ֏ x(#|T:O~w~g~g䢿{\CXy|brJ@>}m I^;A45 o61 OL~;2H {*@~ "@~NC+_@'P2:1FDn +րL~5}v<_Gu{{n z~PVV1\t8:_DVV8݅6$t? Qtv@3~.AgL]Nh0Ztz@=@F:5 n 8 G4SB'j[E7DO>ҋ@چGOLxY(:zλB>Nb?~b_Xt-%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:01+00:00옛\tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/SDG.png000066400000000000000000000015531475705355700172750ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTEOM-344r)2[,'144s)h*}8044o)UJ-31[,}8/665n([hF՛覆u+<^p&?ƨq'v/gr(q(;[9Yu+@_n&c8s*f%.W o(D  GGbKGDr + pHYs^tIMEՑ_IDAThYV@(W4 (N gtk!1/@~HVV3Zv} s[L/B^a eXp2D Q!!@g,l+fppa~#9>9=>T46 E P7@9C n4 R$h\]k;CDG1e~)_=_^ԏ}8fO@[-qx=?@?`̿?XOCq07oy}gk%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:31+00:00btEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/SEK.png000066400000000000000000000007531475705355700173030ustar00rootroot00000000000000PNG  IHDRf@{gAMA a cHRMz&u0`:pQ<?PLTERQ2jv 9PN.hx:iVgXFį"hWiWqbKGD5 pHYs a aJ%tIMEՑoIDATX Eѩ_[EB 4Dܻ87"ɪ1`````````nd3+M|i^.&˒FcbU.46Jө=a```````~Y;@%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:49+00:00[=tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/SGD.png000066400000000000000000000024051475705355700172720ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE)9(8'7&60@LZfeqN[(9Ua\h:I@N9H-GUMZAOR_BP'8y3Bs~=L2B#4S`tP]w$4q|{M[p{|>MKY%5}]iIVgsQ^it%6CQRbKGDi pHYsnGc5tIMEՑIDATXc`v33spr|nN^>~A!a8KTL\BBRLJZFȥr JL@4m`TUS/& 2XVVCSKۦo`hdlBM?07`p-M$e@26@mA%Qn;{[&(*АZgNL .nDK sWf`ZF ` ^ظD*X *Դ XxdJdR#-qg-YP0)8`>r FQM d!vULx2VQYUGEuM-J DFc`䨫ohlb`tnli Eg[DG'#WD ռ({{ I˽wBG.*'N ,䘦$M ǒ+?\r1SGTӨTb؀Zи@6h 0̠1`1`ԂQ F-`ԂQ F-`ԂQ u:O5%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:15+00:00}tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/SIT.png000066400000000000000000000025551475705355700173220ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTEw7fgYSgk[QVXN'q\\S3dd__^^]\k?jb\]az?f`]_U^hCf^]]`If\]^[cOiX^PWmU`Zg`dtQaU샰iVVVSȜIfWSRU|:`K;_^emB9>/||_x+ +CBوHN"#e0 DEy*&F%::bDSRJLb ȅԴ q̬LHOKHP.d!FhP^nN6QXӲ%%V+.* d1)+akjٚʊ2 V[ZZ[m]݊GކH0Zdl|br OפɉQ,A===Vps K++K sQd0olnXgĴ;{GG{;ۄԀNp5?_\y\6\^]\_]b+měݚM- f=!8/P* Ab$1UbwCT P*@~ %n%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:11+00:00 2IENDB`qalculate-qt-5.5.1/data/flags/SKK.png000066400000000000000000000047411475705355700173120ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYsttfxtIMEDjSIDATx{l{gvc;NlxJ6< Z4B EjVZ Ax*HAA  *BqHSB҄8v ;w}?f7cjd~Y;={9XP$4t_NQ) 2EB(@!S dLQ) 2EB(@{2 24JM`]S |ϕI"nXjrRd2#QI`5/,Ftt}Dгkp-lSϐ㳠U28!x\I$|'̑"H*{y)!1< "$*+ cwbq q=H$CqX؁>V}z󝬔b1'8coo⩿*Wvb3—Zfe)fdž"˗\-$Gb1$DU)(ۂѕH2ۺ :R ;x2gl +%Xbvy؊rTE(s ?1VLiEVS,y@؉`p<Ϊ=ݤþCn}?%Ŷ>bFɭڱx>$>d]CqD̙`lpb[zBÙg`zz/p@[#?5< ?h) W4GϤH.bTA1ߞ;%T9g2> ymH***+X"$1$ dOkUj#ހ$#*$x.VK32468(ӠSNt~+"HcD-6:jDEP`~gj֨3`t+"CR7fw>#dNØ ?#ao AF"d4s L %.o?u < 5i5ܸnz>h ң8c>K1PЍ8 뿺jqX xZ*M5 G<*Z x3sj+'Z,&P|?Lw ^pI=]Yfl,Kwo+YJkb%8%5gEx`W^ZC;e=Xѿ ~etrK'x'^)^@qcM:ZqF8RίΤ.c[i-{Բfxu;X\䱜Ag_[Ďiw@)4ҴEkhkG]N{2\C*Br"ν|n{M?)3O)L)Hq4N_R1cWAm Z"PQbzR^o.؟v$<Nbڿ2.+\j! gq7LyB/rKI9ʈ3<ڪ׭t&>"/?g>̳;X+VM6qO){Oatco[秏lw{=#T;\wq\qr&놊Y7OBcdJSS5߸ D[l F%S+K;*ߩ/< yhEľJ^{HÕƙ\z|֜Lͦ^{]~˺?`->k$vRmWvikV,`Ï^|0yr̯|5,!HIL{_LѰ3pUUE3WH ON/RS:/ޒ;( 2EB(@!S dLQ) 2EB(@uSO?%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:17+00:00CtEXtSoftwarewww.inkscape.org<tEXtTitleFlag of Slovakia/$IENDB`qalculate-qt-5.5.1/data/flags/SLL.png000066400000000000000000000006321475705355700173070ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<PLTE;滣r:rW,ietRNS|RbKGDo pHYs$$P$tIMEDjS8IDATH1 İ,` XfO.PA;l(ʇ Cuώ:%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:13+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/SOS.png000066400000000000000000000016051475705355700173220ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTEA@I>{@T>RxPEGFCw^Bj?Oߤ}Iߗrjg]cp唽U?ݮEHXWQ!?bKGD Qc pHYs B(xtIMEDjSjIDATXYs0 `TШ?TuN37/|/!y8ޓdp8ΟA$mg*`34PHY&$PGyH*(Qvq1A"To NW$@Z6\䊑z.4c"#Z*WKBIɴem6ժWZU*P Ą~o6wvn8 נ=p$x׭xFt0tG5rvdǓ(N'cӆPuBfs ! bIVkc^6#ylwl*؇S=OO%_%—3p8ο{%O0X%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:20+00:00ʗtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/SRD.png000066400000000000000000000017051475705355700173070ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE7~?4|)q$ g%:) ?)m%#, X&-ۍ"4) ((*m6TbKGDhQ pHYsttfxtIMEDjSIDATXWo0II!PVI!4My\HDtFpn.-xa z܀p)7 vP ^K>1 rD'e9b'(!f&cqEǨrdJV9dAL6y!jy{f$b,_[\* ,TjE]6ufԯFMa;U73hf^3&pKہ\ N=xQ``ufΐ(DToX 'a6%d XR4shxlwvX}ݬW7?uq>c&.~t̟s/XSp%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:39+00:00QtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/STD.png000066400000000000000000000020471475705355700173110ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<PLTEr^0+++4+44+44+**4f% 42p3oǠu^3) ~e:/ԫ^L7-;/;04*ͦI;qg -$fE8Φs oZF8 լdQШwGdbKGDR `- pHYsbtIMEDjSIDAThwS0кwT`2S_Ң&iz%iWQ7CTų م ,XcN (L0iD0@f`$?pqTɩ{c_\"@=!^e|9@\@|@X@}>$_ -b- 4'0&b,9`-GC,X<_FrJ@S*a,N= "FU cS#ͅu?{^iN}|\o"KJEb'xK-WIOJyRUw^}f'Kqjw([͆>ƫ^ p,jx͏Q,GLG3} 8 7I'] ަt j1 t7{7cţdL ŏu/zG*l{L-zABi5UTE#mg?Cmێb%mӣ=W Ca7mooU;-רK_5ndwBxU;\&d|qoߧ¾`C.C^̙Un<.٧K4GQt>q+WVƗ|Ls oPݬ}_~*0sl/pЧt_nNe-pᏳܙGRjcDOcTCSdYFkig2ōsƆ&~/'܆[ BbM{vJZ=tg2zPf>F !4'{AI|)x?Hy`,J4Pa|fM>*.|('Ы^D+JMp#'}QJ7W߂ٝC7+{_'J(Q2dDȈ # @F(Q2dDȈ # @F(QJ8%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:50:46+00:00 RtEXtSoftwarewww.inkscape.org<tEXtTitleFlag of El SalvadorGڲ0IENDB`qalculate-qt-5.5.1/data/flags/SYP.png000066400000000000000000000015711475705355700173330ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE&'bTiҽz=-_T}x:~CɰV~H GH|@z= D Fèzy;z<Qy#Z!|~PpDdJLgJ&ⱨ L$2_Ҁj/K%YmQ.BF~͆@eDmBvGX^{Uݢ-?dO:' *!}ztEO3t2}drްz\u CNBݖQq\oq&%m-E08i1XAcCs6ljtwӷk=6Sn\pQ!~\T+URͲ`)3͉*io?i2mN:׬aq6kfc9vt'{M:ujVmK^#x" u\)Yc0r.V|4% 4܈8"{ɪ}3[{7r{Wi>, P:9?6ڃ#.3A]gmfG?ȝwމeTEow`Q<7Iyم%@x/wɉ]Oy] Gv2P6)T⺟Q {젥ɓ'LP}- &>C5l#l/nF@'E,!Ή IH;\ OY3 .Yc(fm(86U#Uh+eѢE< giY1}. d" 9U\_Hpdf>X q$\`$i6+ nVM]z84Ȋx1ݕ$݅X XxXT/?ft ɴ`wxR-^4c]^~6|TsN{3lpį@` Y3c3)kѺ.Sj/ ә\ p۪u7R66PMI1Ђ7s$P-[\_0jeE`JFS1^:vXĉ/klV0[l!m66Bjо)ȶm۰,kP(\uUTWW3{lJJJ;w.̙32f̘A]]xsnd{T &+lFz\(؊#%BdGJ/ ,36uI".i;PKwqyIxEYa"ˆ\o}n3{PUEQmM0M˅eY::O01m\y<<H)QU˲p\iض(H)RrƵ'Wrg5.]Ʉ#+,$x=L4NiaUć (p !%AW!ەlWo)HI~Y 8 aYB3@ѓ@|=ˮg ʍ~nID#]YEAwg=R8`ұCD}*EFr˙ ㌳!Yk1 q7or +Wdɒ%<裬ZyىiL1_)@q…frۜB:ps$ƹGss)z~ ɿ~Mt)' =LRű0\^TDHm&8!K"h H7Z*B Mŗ tq'~ tA&*P(4nD8p}}}h!ގeY(]wŋyw4=W_里Bcc4m-+V/XiC d}XU!%t ozK(LLCh6>@i)spN%hts_G M Xmɤ"t]'JzI$x^R&1{l֭[GEEd{$>d2!NiRJa6[+z{o2UBMUݙ.E%\XESor[(YGֹ M*3TE#nYlU`!i8riضmۘ9zd4;QRRBee%UUuEQp(2]u4MC4\.i`K/Y\&eĹ)!}qCN F*$aGU.&dImI`ekà9,X)**X4ʖW_cJR"Dkm冮?S9&l` Py6eAmm-f͢srmv\lkUs1Lr<#3B@Rii"4g}%Kzi۴!_ghvυ񓵳IBH\\dP ;î]hmmŲ,*++'$bP~e] c縊.6L2c {1.\8'ȗQ-j1Y/~=>=;v 8)M T 5L .D%`ȑ[("c&v/3Oř/~FqiX {cchޛk}hC "N {#O@' c 1yr<9F9kR"x{-%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:33+00:00tEXtSoftwarewww.inkscape.org<tEXtTitleFlag of SwazilandWJ؜IENDB`qalculate-qt-5.5.1/data/flags/THB.png000066400000000000000000000006531475705355700172750ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<PLTE$ lrrm L$OڐbKGDhQ pHYsttfxtIMEDjSSIDATHA ѱ,`, &sdw*UI510Kۤe@Lpv.1? LCC,=+OBK=rA`s +Ӻ?\@Fzs%;DO Ѕ ||$='8(ݓݝmVqԫg3{OORQ28QW02:Q41D"@ o` %tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:44+00:00:tEXtSoftwarewww.inkscape.org<tEXtTitleFlag of TajikistanBnIENDB`qalculate-qt-5.5.1/data/flags/TMT.png000066400000000000000000000107371475705355700173300ustar00rootroot00000000000000PNG  IHDR`@4rgAMA a cHRMz&u0`:pQ<bKGD pHYsGGtIMEDjSIDATxo\}?uv]DJ$Kc[ı &md"-P @_- Aixc7eˋE)pHp89C۔8Mk>Pzm;W_vƙ2UkE,-JE #C1b/*&8B{~r {bezg 1I}?cJX(b72UAlVlt,o Hb6,63\t'drD^8\^W{FsMQJdx0cv1&r'ʼn/+*>igE^R4TLW-5M/r8w -vرdt>O rS= +Co)`,g` V稜9v%O=wK1K;:mCCE>5N=p`\xfGX®NNPr3X:ˇ`~[? Ǒ 3;esϐ? {fX3l+wpήrfp(痟a6j}y?wt-)$_3Iv/hc1n( r'?" J5"-I=r}6X3O=PٕCu'bCyh.7c<0;Aˣ{,m0ve71grl?^g2}.6 | @ ?^%eԐH>=p7hFL"էbwy=@Y@\g{?a陧yx[g4O}@Oڪ\Y|~2ˉ+M=If'\t}s(I._3ɷ!*3*{[7yn-9XXIbHVk\A\DZ1 A Dp0NivTJ!yxN< T&Y oO̟[ͱOϗd79 ;_vyEkΌϑ lw.L= ?BZp%{W-+dl?=Iի.oa(Bs_)~v4`e584%ZXrk-䦅q1͕4fx3ǑBKoHB)|˥m >`[G*  (fkA[eh`\MӮqVΆ_Al'r,qg߳dVZv*߯RsW+9{A*\ty!QiKMcQtLAϝ D;3lF>bC13e=1@wPT;wmdls&{'GӿwBoc>7+&\?ʟMWw'*35\e]V#31-2m4{'O+@F`;_,b dG4 ~OB2v"pGdA-or36&pPOGg<7H~2߻3$~H[dԺ) jE]D:3O\y*/JSdb'/@zoODRH @3 )zy5.O=xa-~<Z|PŻn2DNa3@Z#<%H'Z$\ [ͮ "`KF:8Wf,;LۣnMrM-(7liAFB#mbt'coiA#X;zr2kۮ Bb^ӂlJ+N+4YJJ(-C!j⦅҂z4F @$j[ ~K =.t{b"[p`FBÓՄc !%I t;^#fDݢ^8w%#CIDU7P]6r~طѢ-r kKiMᅐڣtj+-aB9m1CzK jA.A/T6 &ʙ zB콏iQ̥=5Yª m-`)ЕH BC"{^`}Kx!-bG{ZG 0b1&Y G _$x%-QX4dBM:?m$a)+ٻ |Cs H ]f3(:L\ zD-$mjF6 ײ6{N Cyb刽M"e;9`mjA6l@Cc3QH%K &HHM /IFBJvGZB{ZPy# & \I ]A[WF`T=bӂnׂL^f}҂>9l}\C蒽N6j!S ޞ C,6%[!G@B6-l&4F[%EDe7|Eb5McP}΁P#sTl:Qm=-H񲃎`>\%/QyP48bkjAxmC[P8ޭ9/C>Nx-)"?7,2Yf'%QWBp9;ZvO7KH6*~@G`Xpfd"ȅOl2W5,-rhnk.f' f*ωh/gCॡ~:F:ŐTJc&& |1\Z g09_c0 \.'08&٬X\.K5?7Ѷ$oe͕}Yzm'.=ÿrx4ŸfԴMju IOPy5r)`}Psa2G\krޤ#OձR!NQvmUmD>+(c/O%(Jc Wl`wўQ؉F™`Ca| eBK$ qk.(vG N{gF#IVᎆ>yD55 P `\бpB4[X#9bkEX)dMDv.)$-h;iAɜXb1sT90>h0 V6 ?$gfU1wvҞ$-6;o35ERn2Qix";Rhnc 3:2{ح8S:6ISQ[[mpP.`eZ%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:10+00:00iHtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/TND.png000066400000000000000000000021251475705355700173010ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<JPLTE '."3]i5D)3B?MO\0?`l& #\h/"@Oq|~R_?N am,KX*[gN[(8-AO(IWM[{$4co;J!U3bKGD{l pHYs B(xtIMEDjSIDATXWG[@n6!$ATĂ{OryoJJ b2QTOUL虦@0  1F$jaS/e7`[:bmc"L4־1XS30v&ٌNsG ,TfP;o|ħYbD"?08Qȴf¹8^[ @aN4.Y iĿ99PWXGx両di(WV~CDw7eց_;NOe"dK{~ iD p3Y-LdW׵w D f"S !z; f2)?/opސ,|."$)~ a?#_[/w +]\Y#%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:53+00:003tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/TOP.png000066400000000000000000000011161475705355700173150ustar00rootroot00000000000000PNG  IHDR@MgAMA a cHRMz&u0`:pQ<QPLTEZZ쯯 oo餤YY[[馦䐐PP bKGDH pHYsMM9`ctIMEDjSIDAThA0 !)*rYMK{2Sٴ*UG]ԀgK `D@ p?Cnw9^>(O샒1TҌ5݄1/5U4c_CRc=p OElxiU@@@@.ozp h%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:00+00:00-tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/TRY.png000066400000000000000000000017621475705355700173400ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<#PLTE   +&1 +6ck=H!-;F|[cLU>HFP.9HR,80;z6A}!@J#  *6"5?$FO]eV_EO\e ,PZ)OX=G|SbKGD{l pHYs B(xtIMEDjSIDATXWS@dzBPH X!Pbキ)dd o{C.)D"H K*Az$jDт~ zN/.k1!gzs=c P?5U/Ꚅf@t= JCi_hkD? t~{H$?F%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:11+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/TTD.png000066400000000000000000000103651475705355700173140ustar00rootroot00000000000000PNG  IHDRk@ԉgAMA a cHRMz&u0`:pQ<bKGD pHYspMBtIMEDjSIDATxG[門R$ds` .f?,{q3ƴA &gYs>}6g9s}=_*3য়~bxx9j/P__gȧ Ț!?wv1v4̤-dKp455QXXQc%;&"% - ؛7o`jjD"!K޾}ϩ@`DN=CR PMg$ 4E Qո\.Ѩ,IOOOlddd҂B@P(05-+F;=CP(S!>Q'F+YYY%\.---KřzHFcs=j`_CI$ z-`lkD%,8==ezzd2)K1>wQYYIEtg*}](&ĉiУ@n W)xhdppA'R16Aьgţl<5T O{G]h Uhx%8,El6 NT**>:`Hb'gGP7^wTVVt:9;;H$XVz=ڒBLW6l}|T? @P$"N8ƶ&Qmm-LNN'KqDVt9٘Z\}4⟂H}4J9Acg tꋋgee5يF^^Tx0G#N1Apz:&Tҩfhh^lnmm122BMM eeҝi1 L̐ 4 " Nz7Ԡ~ lfhhx<&R! u*%&K<ĉ~aBPD>~abhZp d)a4 (JSlAWWEpzmXNCRj Ņ,Ea޽{b>/hi#J{% R?{ `hkDP,qXVP`~i%%|V:?sȶFN18KV @yy9ͱ-Kd24ssstvv *3^gU`upOޑ:Etd{{R266Fcc#EEҝ01 ,-,[P< ##7oM,nSZZJMMTZՓ D qQx|{XW!7 8=+Kb^hZ\.HDtgggl6immK hK%nWb塯@Rdzgp8Y򉢈n'bXnҪrg~ڻ+,Hu)T܀T .jh140v^"}' :`\$fʯ"z<"+KP=} Hbi@/qQү)Xp)7o999 'X(MJ,waTU9_K(v 7 *&k꼧V*A #06b@K0Ͳl6z=#H:5S^bG~><,#Hݔt:%ߕX*"VmJӖbl!B/>HX/\8F$666܌P|x>Zfr1CxK,, %F'~~):ԗ<[[[K31?$4҇ nF&foN1M:Wbc~~^kkk|;Sac~ J%/܈ ZQH>==7o bvjkk2jL$/{q A MAWUDӫy:)Xj6o- *#N;9ÝES?ށ:$Fz{{),,dllL64 bۉD"X,2MfA+ˑ1CKRKK s||,KX,({{{҂gl~$HKs;QhS_QQAOO^'Kd2$ ҬXzr*S|F,uO}%k677emb@Z7$Sn n:EsZom/XZVVFUUTFmH#01?`] ^LDS$5 ~ZWbiff&7ۛі^-Y ngo͕}n'Lu3TS!E{7v۟s CӍXNMM .SY}۾z: mQPC[uX]]buZZZn~i}xy A pM;4k<l=Hx50وD0YC%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:55+00:00P7+tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/TWD.png000066400000000000000000000020771475705355700173200ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<DPLTE (( yyǑ␐77;;77 ddQQccю~~AAhh 66AAbbggbb==&&wwƺRRxx''<&ͥ)cE0&amhHѢ1>a%TV"M\#-adII鄋 rsyN N^FelP,-.--HQ š2T zAt͞b*ZZr- 3v$ZTq#6 [m=5$(ۇC58<ӎom&_G5oK^njn WYVQeu3*ꝨzQEK5r~uzݹz92yzcߢ\s-G4BҀ2Q$G=@$$ /—kuu%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:53:17+00:00OIENDB`qalculate-qt-5.5.1/data/flags/TZS.png000066400000000000000000000017631475705355700173430ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<#PLTE::"97@4 %H,]Yq)J> t|0J ,B> ȶ߹-Aopo@[0Hr?O;o9&^^ߪ!Kߜo"臚%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:46+00:00u(IENDB`qalculate-qt-5.5.1/data/flags/UAH.png000066400000000000000000000006031475705355700172700ustar00rootroot00000000000000PNG  IHDR`@o=gAMA a cHRMz&u0`:pQ<PLTE[ZjbKGDaf} pHYs B(xtIMEDjS1IDATH1 Y[A>Hֿ$АKbKP(  TZ]%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:03+00:00KtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/UGX.png000066400000000000000000000026501475705355700173220ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<[PLTEYNKIGM\dcXLW[懋{ಋɽVZXX-ˬֲ6 퇇@%".+ 4~~񛛛!!!>CAwqqF=@>B63ZZMQNFKF|||V\VUZU}}SSSX^XAFArxrrrr\a\خ/222-0-flfggۓ TTT696"ZZ\\86ەZZZbbbLLL ᯯ```~~~eee\\\ܹ<Die'DDF͌OHLJTb2Rg0dfeɥMA!$܋KJ++ x%ںƦ99jj6Z淵wtvuR| @'NUjִɭ]''zU+lÆU@?ݸxs ^0g-.ض}9Tw?عkA.:|CЮpĉQ F- ZRdRddQ F-@J 0}%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:07+00:00`XtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/USD.png000066400000000000000000000111321475705355700173050ustar00rootroot00000000000000PNG  IHDRz@ոc/gAMA a cHRMz&u0`:pQ<bKGD pHYs s s αmtIMEDjS$IDATxYl\yw;rH(HHbZbɒĖ5$AE})7g!Ca%Iȁij^&nz0=mtiy_d6?JwyiZl۾Gogl|˃--M>d*G]E۬^Ç#6u@4*#Sv `Y6T'/r|/X(Hed2gt3Boi5M/{e``]7Euҥi4MGni3OjH%J+Ppיs X,K8/s纋~Y,W*cF::0MA0 E)p 6 q^Ti۾>&#ܤ;;qB?dvn6i?/ }gqpMӢo|(+W./`YUa˖UTTxUjqŃJ]]%/>\ʂ<>;dr2T$4٬F˂ Hd%16>K2g29FGgDbLNDFS 8dI㳅TӰPUU#ea[{-|t7b Wf6T+ger">X]]΃{ZYW_9KWu&ƣU !v5Z/ 21qC/++a5ofM/>螧Ŵo`ltӧ;?W@R,1$^yQpӫT*+?=Ȍ+]0LY<P۶$I0t My%.^$UHE0Ltܹ191i~(saX\οM0[Eo0'̢i: Xf:^}WW,44Բ|ygt8etI*/.EB$$IdѢ2n[{]"Ѱ( Av゚ӧ;I&3`s=D),vuqZ @lۦo|(V݇$I8[϶mrlݺ@@g0 E۶)/ۻR?N ̳{c_RſtUU'v{Yz)7R8?v±mo $7ҫ(8i,Sq&  \G $&q2mLf:Z){ bԼ8X|eT݁KJKAFF% @"DIEo IDEYI$I"| X Iihep`A(:#Klyׇ"ضCEE]7}bi,˦ Ķl^ɟk4vgo;}U߿x@.jQ-M,$nJy44Ԑ+mz 54} KqFFIH(X8dddx<(itM9eFFM"~ 4,NdxxX |n;g^ah0,~VΝڵ fBБ6$swCh`CTUaŊ%47N,)D>BCc -MsćB!2 8gȹ$s`3~U?~=vէpX;?obs=HȑGw/u52 џmA 9D,D#NWe?ZoXaQ<=;™3Ngo~frt'=#$i\ͽx&wv (2aHH& o Y :"N}46;(B4MGU$re=#8i:~B*CV1,& ҫt:m;Y yG*c7jh[ӌG4˲M{8zt \v ڵ 8,QESd4EfFfgL!ItP\QH L&ӅmydYB.RPZu߇iX 8PS `]]1M[W-T许}t= JX| yŊ%l̛ogf&AAw*˖ղs:NH$FwuWWU%KxhF93'S[[Ɂpt'&\=+30gP庑>=~^!6mZNp!q()Qy= ;w*pŃݷ Qn$Iȑ6?##IEQ,RdM?0?m=~5^MO_pڸH0G).\':óD"åa&=rzј(yeʕ!2m^g+Wm*H^ا1/ SUgYY4pKkBTՇ(锔X˗WQ%YMLEQP` FGož2t˖չ?y/vKkdDIq,2v=w-n|_Wwl*m+ @o |]xMA l1bџx:`A$   ^s@xa-dAq^ Ȃz! ~ 2@glqw=NcVم0P^s@^-W[ xg<>w>z9u,<+/PY@qVΙs7g30 4$+XL`2qRmd&&&H&v2"fnߪGY/{ny?A_ *+B$1~C7 tV# 4T;o%EI&xn2:Fz9Ξx0B\F(2-+ dYyutCNb{Iħ)v &tjjmC- ˞kb&͙ Hbj}bXV[/;kϭ5RÏ棰'0|=:>UMNӏ򮧾~s !<`mK0;quR*zțS.By 3u!P1`$gN1Σg:ٛ(23;65 qʃtގg{pG(**00tK{XT8bYlw/홷ǐmD,יDE08|Io=DyU#DRٳEY$Ǣ=JxOințC 5h39J20wo':r(JkL)4w"stCTUoZt6$]FΣ . {t y.X-5*22^@a|FJGv T͎@':'+m$|otʜK;# <;-<^ \Vȩ,hS꜎IN52wRn0 $IҊi2%n錨}=C*.j!/!I\B ̤qZ[[9W5rYv4b !AʖYA@D: $&$D!doGSS#v>0Kpaa!MMMTVա&ArADnB !@ӡ\XͮV#:.@!q#BĶИ|ܠnxCFe{*| UX,'g,K 9?5lSJj@)%dmIXR  M nFPCYFg k=13\2cIcћǎ(/Q|·{9H5l褆$n`Ju6245Y$gfs9:W (.n+uCP@OKD34ő$EPdR+r͝e@IZjjF/eI+ht^C8IKFp cd( W>?a+N{ʳlf{հ`WUg~]аHZ.Tҍ!g-kev2n_ l6ؐ3U=;-41jOgQ`Qbx\,::~1JbKGD0- pHYs!8!8E1`tIMEDjS IDAThYWA$Ie԰&ڄ7LQâ7TTP\+* n989Ru̩zd eA_LX!B=AK*_p6jVj 󋺕 -UոFabkֿ~'*J6)d Yn~ťNԀ۶3@L6Þp+=ZвSE*w=U{] Qtv5DB=)#{X i| Nĕ'O))=`A%`ܘug9FbiEƫZfKDs'A-\LlWk׳@j(÷n[ºs+ ?xhxh{(<{lp_, ^Z2O'&~*#|%}%~D_F` ,j2OQj4 .{=%~!{Ph\sC^/M+ez-K0 ,Ib7S$C8;W0M5,J {PiB]&~Vn +)Kd8 - /Oh z?s;[rUm'Rk6S$}7 0$~#~I`++c_bKGD/#  pHYsttfxtIMEDjSIDATXN@ẜ PD. T˅DNċSҔNaREd2L/p8eᔡ.DU=c^بE8?019b:8593YXf#3P߀X!ZI,/-.>b5Jlc=N%WmV i[L]"֦A=n?B~qg; Z܃om?{E5l)U?鯔Slo_Wj* N 3٠:K!u@EqlON؅Ng'VN5./:ExSy@p+mu#̶>7>1ʳ)/:$  H@׋A+%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:31+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/VES.png000066400000000000000000000020241475705355700173070ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<&PLTEZ`Q! $}#} -*H"|#B>Z2O'&~*#|%}%~D_F` ,j2OQj4 .{=%~!{Ph\sC^/M+ez-K0 ,Ib7S$C8;W0M5,J {PiB]&~Vn +)Kd8 - /Oh z?s;[rUm'Rk6S$}7 0$~#~I`++c_bKGD/#  pHYsttfxtIMEDjSIDATXN@ẜ PD. T˅DNċSҔNaREd2L/p8eᔡ.DU=c^بE8?019b:8593YXf#3P߀X!ZI,/-.>b5Jlc=N%WmV i[L]"֦A=n?B~qg; Z܃om?{E5l)U?鯔Slo_Wj* N 3٠:K!u@EqlON؅Ng'VN5./:ExSy@p+mu#̶>7>1ʳ)/:$  H@׋A+%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:31+00:00tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/VND.png000066400000000000000000000015031475705355700173020ustar00rootroot00000000000000PNG  IHDRU@\0@gAMA a cHRMz&u0`:pQ<PLTE%$(Q; "d 6_#20=:8hgB < )uN"4- + y*J5o'zabKGDD pHYs B(xtIMEDjS7IDATXr@!clq 1JETܢNIJ8r5s꟞n M# ?&D I'?-O>'9~гt2il- .@^ (XHRxQi_+\ZwIF]-,V5[mn5#6t{!iۉ|kL_Ҿ-0 Gs48NWsw Iu6^l: )VVaϕC=6j|!u˕Z`=pe2`)ww:)wn N |癅XCAA##VX%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:29+00:00rxtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/VUV.png000066400000000000000000000075741475705355700173510ustar00rootroot00000000000000PNG  IHDRk@ԉgAMA a cHRMz&u0`:pQ<bKGD pHYs^tIMEDjSFIDATxypUUeW싐#Ҳ]::S33=5ճ35U]tY?ڋhO۸h dk$-d.g82I :_UH^}{$3U}30Q$>Jf\& i!:$ ;t۹3SpҮ+Ȋ* fZz4*|!L$$kxolV@iAJLcroMq䫆ghV>5^ ܳ4)i!̞S֝ x)`pA8,P ҒǙsM~S]U4)^3&ZU@Ilx@)8r)\ %ii &+lrgJkT&6zMD( iWs jViOHGKJTNWn*hl*5׌аҮd 8t,ݵQII *ض!9bNErp]@SkWi,[f",kdUV߇GWHK ʗXYYS-fOpl-e'~3(6ᄴ~sQYq<ji;>H ?GrtonaZZk{4\ֺgoDP(Leq=ϲ5.d L\ɜ2St .s{Qݳ[pPڄ.JeʼnZھC\V/[nS9.#ڹ}|Dr巒$ #>'-,+N$ ;,[e,IaDJ@id~Mx T}HadaPXwei}>˪:P-)ȑHR=3l5iӃhi1i6RIIHsdi뀚=>˫]J%B!aXwXLmG\s{n#_K|ic%],!tգ7Z[v{,v;P'͒4#[i1qzwn8m`A0ɓ -O5W!L&2)ʕDk|VH=yqNܢpˋK#q q҄]Vb]k]TViX<ۦ$_"ϯ)hkSlo:XV.C%=/.lbz%K;ظ2<&߰2Y2PK .8 Ne'xMzX)ZZ%R,_av{G 5 'O+Y֟zgZu^?O&7]}M{:qZ&ŢzK3{;,mS'9񓊷>ҶzLl #i@/QVIKRy/|x|ͥ]jF5=bNHDLafea#`HtX8&?Gtv!wF;v@׬)Mz4ϽjVŤ[Mϱ^jnk}m8r<s[H)eU.?jKu@wZZZX0mZƁGQ&g;iROu/}Y,a._=9pL4c >첿<)_5\SҒb]Aoa)8RhlVt 10zlJ)Bgn'N؂$9_`Dwڼ:@IšcCJ$[w{C!WX I$5}{pZBq9z<=%4۟1{}6UT[QO]9Y enà}վ naP);6I&?Q2?zS dž rDWa3M\3 }ɓ LuXk+#<ʁ~l6}O'_' ?<|uaXdWWDرJ&+] $Z3-碰H o5yAgdiI"vGwU_.hu&5,Sf` 3ض.<0 5껑LbR|CKiRBf 3Um Y<ȡ8O XQҿr!(NmJjTR?$3V oڹ/KTܠ\Ӌ /܏ߟ^ -YWsm}F6HJRIduDM.wyT׸.oix[rz ")NG*%XQ6a]%)>ld˜-ih:t>_8?[n=0fUx,Yups`F1 ƕ4)X8&bb:C@4 붹,YaF&ʂ%0"C~ wqde ̴o51NIy,yֺtґ42KGVBR.[VzJ-iyl7#,r4DGTLHKf*,|ȡ|hI"|l[Zv8SaZlH$]~GVr`t-rE($ooGX( {HY݌b--y$D]>GV#kSB5ԏ^t*z]/މ=O!iP^ r ֒Ee96TNۻYj/}vW#~ǃaP4>O.^eY&TLݼrNI(_(^Cz`hIt5!&4`XBgEFy/^WVD{&*|ݺHH"eH ڝ x(Zaߡ^$aZ!L)줄+5an?0&/~A_zS KWҿ$3nK#rB0@GS^ I_#pH2=M+קo屫0)֝-J9ℨyIjˋK;شOjÄ<(/x =MW >*󺳥i-ׄ'I&IvCwg' p[6TMu2`THH P9H+p=7C%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:15+00:00;tEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/XAF.png000066400000000000000000000244071475705355700173010ustar00rootroot00000000000000PNG  IHDRA@EgAMA a cHRMz&u0`:pQ<bKGDtIMEDjS( IDATxڭw|TUezLzH E"]tXײ]gmkeݵ.] $$6dGH$4=~{cf;yݎ*vF @AӴsE xTs_5U@M8c6 " I DdYFS5[s\A' ?@ɈՁ xz<̦_54& ~l`zKXt&x<MQqFDu7*Jii@ Q(DQi)4hJrQh@U:FM7C=(3ΤB%fΜ9,]t NEQ5M"Ixs1cH ziES5:ݮlEQ27\~dff̈_BgSWWMk1j2b| ;5M[+`wMCf͢zv;&L 2?Wpj T?3TUEE-1&^*][fJވ,Χ5IZt_q=4v K2 1DG>wߏ,ɘd=}Eb3.&ךO۶j@C}:UY'nC|?Iqq1t( I:64ĤI󙙙S̝#L9^C߿'^L>Ixk(tcr<w̞tMA`OxjG:c2)ܱ6sK)>~n?c~֮weY~[fرc*b ٳ?ZOO*ե=©wϜ7o<TƣX~M5f|{\pd'>Y9zx1e_̴ٴqS(ɒh0PR^τ mкELZ;U}-33qZ.WeeeTUUD UQdavbbbHNI%55JK[+_ob]gTs8FLt 5/ 0/}CK.ᙿM^h)~o c;LُEqm?#<"OY")1oZN/EgB}Hh >A/:022?a p>V2S҈4Bg  /ȒodT VJ }J8a!],ٶu+mC(d[/FȘq<-lݲGTR3\2%FmJkk+ǍG4-v[ldz:S&^m Y; rro1tR>v0$$FSQ^Gl`T"ys`0a47Hĸ5z4;?d,ct~GaM1z.^{jjGl޼;{yב$i A &PZZ @fj:J̽W_;MQy4p7p}s}~ 5UKT 50mf8.cs֓e`DAG el ,Co?l~!&K , PTT`dp>Fx߂x~㿱h:4ҪgcTF{bYZu 5|$hJ|eAzPRr{0v\.f弲k6?a,18;GR4lcUcpvɭZZ#0ol4Mu]tE#""(++C\.EowP$n=<.da U5آ'm'('%HH =]gbccL5EQKDf -vL 3՟8{K|ύ7Hck|EOPU MPP'UU~hD"^EGhnnk|Y̙;>)cl}\NsEg2ΐ0O;w0~$f:Y$]]v3dZPu39s$v1s9bx>\q&Xу1(~=iM&bU1j;r52Ii  vg'jsY>LFd6ۯmF ƝzP?6G#s8ӯBgg 9ʡOi 6DQ @8C0g)ȾDe>݃Y.-f ~[>؀6[o 7^3 EZR2 f͖O΢]?p1y :ʓ.evdI-47 ?]d iWü{o#>>S>wsMf "U|{za|vqJ)-6}ʄܡٵʴAhW?EI'ƍã8!uP-<^${H˗" v~44^Hjj/:.}33v4̚@-/>->/JKKHHğ;n{wGETLTf$Qbhg/F{ p11Y!Eɏ:[1FTE7MǏd[:?U^[ U~Nbb"PzcEFDh2'{_Nc iq3طXjYFf\3|{|k];wRqZͣ^piT]g5MtBӉ(C"# ?@S5{dVx#7$OBrr9^܉$Yi`yyT"#~un\\<5 M!KpG4x,Ͽr1qpnD͛N1/Ce`$`HN$BHQP5mXJJw}+n'#fHT*-DDDQ[@ #Ea1d Ābkfy$" MhoqO~b1*)Pn7TUU! "S.G S/_e-|Cf(ꗇ~Zapjj*6Un7P.CGĉ>(t$IC7*@G{;. iyø 4!Iv6wopWY0sj*?/01TVUq˹[ *idrt.!UfT%zi4(= bRbb"F aL1oU(mg*/A)YVtj=znw7%%%炉oȱ:` Lkݙ YPzLMU'qHbӧNXgM pi) $Y(PL"ۺK`,9ikm'>щ$~k8D:;]3E#2VJf5MprגڌX؆(?3$.@cc#:ᵋ=Vb#y׽1L=LBbo'hjdj1ȪHR1C̺ Nپɏ,%T4sڊ AАDzEᒩS(**$%%0 Ȳ$I ݅N;ر/>-yEQ@m]5 Dl%/wr,Q&G#%LTM%Q/tZI9t`ʕΚ=X ;r-DDD 67c #;;UUDFF wmVQ@Ӡgx8Cll,)i*W@ !Kg Uf{Y~|; nDF+QL=nAoݗ^[u 7i6݆$I,f#$HD^}::ùy x~DQB!o("-LCaeVMRNG8DaطKCg!lfώ$$lv7 ykج6l6Crr_wމ$I ؿス{֌x<IKQLOЇCӴ|J(r1:2 dXg^IғL]li怆$yx\IߋaڬrUW"2z _Q99"B}$''?=z " րS,K>EUk*wөEEk-<ggD\|,ސ 6g@3HEp`JYa40)ނ,[PLUBJ;*'URSi"(kYrG::U-Yc XWn$BvUUʫ*+ irm(G~$fdd9QYDA{Rt(> ].Ç/9YQAwwwBmkui_MRZ#<άHM%>!dg,K@W•: $|{`oUJ[[+)y{x08NcAIDil fkױl2{k ?mmۨgS{{7?2g(A2ݼy̿v~#Gb21#w@]q<16kkT˲}DȨ(.taNG/2"B)r>6&֡*$ ==lftwwrQtQ0 s#DoOFf'OrLjF6NÃa̧ɡ B>xb-fҒ+}{E04PQ)d{k ffpP%3 Wj ҍk[=cƎDDIBTRRSZtvvRWW7_}d&:Fp Q]P(@nK'r zMg_FZ ͽRcc#EEE*ӳ=w׫@hiia1;&5n f⥒Ŵ]H̜q)k^?`֝ULeE.dsd $#k0FDAd258NdY s8Ƞ8Ry D=3ʝw8QQUf[%Mζm۩(<3 ݦ!jkj$Iy9hMnڒ⇎;ANZ5H^̽YyK.EɗG4n5Չ" a0D'ilj"!!ukUhnp::l(5(y62dh, v4bfk# gȐ/:WOz4zEETVVFssuu! 6z=v0l8NUu:xGܹ PpQzvC)pf1:x`'Y|%uu&~o|qz#Zm?TUW=vy.㥒k/g夿^|ΝKEI綾y')5ÁjE^^c1TW-hDzS3شa#}dwL&""ޤln:B^N43ĞCgA/ʘ$='z9p0PE4o'9ZRimr@&.~G],JDX$X? aŽ\˖}vƎGRr{va܄ TWU1"?2TEfM'S_WOۍ 3+VLFU(J)N军nd܄񴷵LtL4Qtz=rXQvkYTg&eY:ۮ}V+?,frx}f69d$ll63n8v'I7a<'(:ZUWOƠ 477bn<^K.Q#)4e=Me?~7wLE4: 64^\4ŇX׬[>#H§#(z (LX`QXXȆ (--eϞ=hͷ܌RNt{+ʟ3Ϸ{-ٝ`pPJwG-YXZ WC5l>1v~%9aI:S6_[++,nv}׆-BJ[štfv\jwΙKrz<ɠ9))n^HIM=pPQ)AJpd\ y/Tʾ]{Fvg$IM};י.nl2. +sM6} ~XQGECU7[lyW])^u4x}!Ea TEYf;Vy`9 Ν;Xl{wiX..淋p$'R`+ ..P($466jt:7ᒗ'N\ A`k;D Y B3EQ9:7/:aDFIjj*:-b=0x)v:Pƌz475SRR;ٳkVQQQxVEl\BWW6 #v:Wӟ*F4ueጚ g9N08LVj=mC:Fss3555T4m6 *LMF"BիA !ЈPLE[)bTY!\j0P~"(ԫ5YѸ`Q\'-!XqKdhҚر(M2Z0( 33U ^ =G[FbX ^wR[<vbz[~v6 C="51T9"b &n-C$L3iD &t:\aB'I45p:F+z}$Eg.3_Z\i4ZX˘ q!hUQ> {?F4gBSQWC(HʆM(*Z&߉Ӗ ^4kUj؍r&Qm5k?%O>~M-#7ڙٌ6[B̋ nrF%hgUGo7wuE1A1@ʱ_X=+.!)LPakyf'L*=w*IfJrs;Mu&&7Q>Uk"oy?WNx9s$PYt*\swfYH=6KF,4m8>;rhd#ɠ%j&v*$ D[' V|f*iI|HȋF <Wn5:T>K7d(q,G"<Q7yk* moGoŧ6Z1v#ϼ=qRt}+[׵^f?sO¹Y63=?k 7@(tl*6ˣ?Fjd]CGkKh%~>>Y>l7'V_7wsb)It?e6 " q0%֤0~8Y;s{?BJ'~쓳z@H5$D!Ϛڢ,d dU%.'ޫ[hO'rl;Ss~ek4yOܬ`7}{n)}uy5%E2.9A: no v+G*5 7d7ԙi}3M>緆k&!.6ҴUQ* xE DrMomGNQ㹇_=v|yvt{#7ggk qd,vh`sEY5P/{q֨.>Vd lK!qiXG&I]"\չ5jhlrqTlUK/`*Dm$@0*c?h I[VgT@@RhT%Jo+.Ӷ(aYS]v?ojRFmp>OA#gg:נV()@REst{xDA!r^= "Hř]s:RR M4bqƷ'AuIQ:J⽟WZn.$C'sy7RJ*DZG+I hsO*[?O[U߱j >hM-Q ˔.tr*J\y2@C1Uy}['>u0vSDjos'fְ ɕ?sk,t eQUa%yq=xr}[IY2'$),b4e}7`]z1C|-fW!`)?`)PgA"nzso?cKx] o|{'~a.)Qp~6BdO}^݈ %D"PI邆{LOPkidPR@Kqo nN[ڱQ$upE>ɑHu~\n~ߵzMϭo-wǧ=w}t!ȚzIeUeP#Hl־ɶRxHCCFKik6gĹQɶ(H]WZRCjx̑F\Nr$yv86G13H`Xm|NOɕGJ;]k'cK?Zxn^._8_|*৚d̤i~l՞*+Dc)agU* @kS5%I̭|! Vb!"*ꄺ].=/VpE̛0lRKj%sre?\9!%*#J.k4?FuJʨ8h B rR@J D!h*Ih!bT).4oA]͗K3;'vޅq .l5UlbU1Bl>B[!DN[F9a()G'Vf%Q. @*d# ҜN.@L31i_t/WplgÒ@W W{u0CmIZwݤURWm~(bƓ7Gq >$I# G$PvFX" G $NCj$j6/h0 Sԓ*vBs*K:@e0xx/nqȃQZ+{o`n6 =q:^xeoŧvCC'`nU(JAj,C mmOH=XUH@f注NdiﱍϜ^IMqؕ3bI\Գ>>{T&ZuǺw2W.ptxx:0 h Vq %0@(mb`6[Q́kf `FMl'7 u7 .{㓋FNJ%tnt[O˗,MmIg:/>у_{ݱ XQP( DLJLtőķ1S Çީ,shvNȶu8FCFKQ~:bD6T|px.e r/zbGa5M$Gܯrt¡km{bpMEUZ/ P}8~Þ7.b@UDUa2Zxb^\5{-8+:tF!qTwYOx65: J6tae‰&BA+(Ε {ݑc'8cpő&" jEĂj@I=X}cP3I&XUZC *ȢQƅbEH%#Ǡq j,R@ѕ~Ij?|V sxy}8UI՗&`RGZ-޽yjlV d\e{I7WSOXTE#D o +B @Aܦ&|x֋얌;8WDTILGRV~{9efѨ#+;޷gCf"R 1vdoD̼+>yHkIJ-TkNa)WdJ5}_ H @"I3p8hFw/*uGA`,ws/?vR0GqC?qhA\!+u>GǙC[A;pvtGɆ/mzvƳP]R/"1ȦY4/*zIM^@E/Z+Е=|Toz9su/^:<\zg6Ol~]f^M8:u96|ƶMo[HOYm&tak_F%lUq@M|(GLAU@ ڻ,I#ۭ^c9?={/(*FŔ_v2bl8&\<NjQs\)}9՜9~׾S7?}&KR눔8jD>Y:;@GF7:VH3R&6`R2BT3Tiߎ^CN<8iwܤ IDQd;s݇>i]Sw@c13+WTGPb VdӠ̮K/tn<5_gA|(R5!1FؤPG _ Rk&lolZ!ŪЮ޸C*4@ c/?'=Yr/H`U@UĀxX{E⑘k+12(&kW鲘zj#3 D dtbB!E;=Z%Z7LVO=xLiTPP(kFɓ6TV-\(GψiP*iOe{d,!Y;OfuUAqta;Sީ[k'p@S3;Н%Qt|? T C4~*Zwj?UAA;^F;H#RıC03qwMZ3sTcYzWzb(:wW!Zj !l |tsOj Z%ReX@;3}~w}Q?_3.N8*X*8>}/NQ*Eob)/s|]prorW.}UK_,뭣.$͒$Kl+\!qHŅaB4mYξ[6?|rQb0(,EΜNF[_&Βԡu7meG`k78W:5!~OIuV% V^*E% v2Vk\L52t?~Zqc`w`8YaK8(T("}/øʍPze"A1sMrs: ^4A.`EEhP! (Sjڸ\ :bTA/:V3=s[p86F) ƫHC xzr- 7Wg#WW5 !R0@Kwhsk_1׺MElYZ"ȫz 'P9|b2MV7(޸/?&C[Y|[ۭ8/Ɗe$q%ؐTZٺ%l RG(Gl.E)'H4@k6Faق#z﫺/җ_]^TC*.ECݙCF{d\á\(M0(H5a,z5 `,Yq>A_w*&b'9Sx/! uW"U@)~r69 ʉ *\ּv9Y]WN @ k,j)u$-}ֽȏCegY*j? bdG51)E0"a4*Twt t-Gf7x*McQVԖJ,zr{99\oYlGZ,\kf`KPh3MV-I]k? (B#P)2T-iɒvM 15$*j 2Y'K8L0@ * X( "UUq\;/ <"4ӴCYB I]D&1ƶ,6)#V "loBmCpuu?&@ux j[B5H v@QD8ji @R諬 <6Aeg80)]Wt CV-vםz}V!9 @w6J4Qd^ TI$F[Q+a5B BL @:)sۨ!10rQL_X,m%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-30T16:04:01+00:00pIENDB`qalculate-qt-5.5.1/data/flags/XOF.png000066400000000000000000000124661475705355700173210ustar00rootroot00000000000000PNG  IHDRq@:gAMA a cHRMz&u0`:pQ<bKGD pHYs  tIMEDjS%IDATx\iTՕWU4 ʾAB":DQnD1K~jbe1%d"hbW@E v@{7M/]U{|(Dk]Uޫ{s.13rSeG8cs,cP(Lp̍gକBmM,rk4쟳.`ƆRwީ@.|Q`v ZD!p`v`$)KUtI0\ӌYd,ZxZz;;ݻg/}H>J2kC䆶 vl3Z)Tj9o^v}/]9f8R;v\VM脔[k-~33YFKo6g:@ʋ?zRCwѺNۙFȊQ@DLSRiOm*p^ز=y9"Ú Ͳ/pl‚H)Qؖ;#>stIsأuui"$aR: }Du^EC.D/dQCdž_pcֻ"#H8 E2C B4鞔'onjzcyS̀fs'.pADFZ'6?- LAb=Uri+&_8cK $a@@yT{U3LG3ZH"c} tԮH,<3lM% 5 N ;~|]?0('ɡ>-ުHs>g#E ?[0@wCusrSkP+/pk?Z0M"tdpU]7T YL9ygPrشK?sK~uͥc'}gC\.t64R+vN;bR1IM=x=,ƟkW2"!M3B5˘21V~kk 7zѬu‹>X=vYMXD:Hls-Y~ͭ6k3m18|avF)%LO=U_T"-tCB p{ He$'%C3^<()B3~A6z 1Bߨ>.k uAL%YjJD|2Aۏ|3 6Ϋm$9$M"Y8ĭЬg_͝ەi>ٓO\oE'\rY^8}wC[4tc>y~! ruK*zFgZ!_Plut6l- f_;I'L')1"̰nQҢ/-ڹcgUzt(:2>m~^AiunU)*/]RI~mP?kᬍ}eU[Qy#zj .VyR*QlTgwO4Y8*#e9'2#4fϧMMi%|WE#흮9A/joEWk*2y%S?%j}Yu nx7 ݔ\ٯ'%.ilMtD iӢW`ێoz9uO-yzk5w5 k}feoNgS{~Ҥ8gC{Ş} vǙ֚,J-BuߐʪW(-=|# 󫀸 ĹT%oKxI!hoM5$d'v}̐6T۟t̙c}͆FSpZQf}M/~)SJpЉՅ%M@ 8~sJnC^ZPXӛoysD$xdomW^>"p׷mrˎYQ)>8^"uɏso{|AC()1@[kr@ 9kٝ E MWck ްPW@]w}%Ey^4؈-ۓ.̣Myq.-ο 3@ܶ{Gtx˗} }i1V { u[JpGq7/'S;sgD;@⑓ pJPriqMMw޶7p%{7{}M[oVא!o:)ow& YZ[Y9gK^~ Ǝ47>{̘=8ܳgM;ca.zc~x{uJ=UY:$$]Ȱ˘O3G1sNĬB ":Fv>`+6;{3'Xk|Yg3 qexw1*r,w稯1/o60w[ wnPK# DykأY%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-30T15:53:06+00:00q IENDB`qalculate-qt-5.5.1/data/flags/XPF.png000066400000000000000000000051511475705355700173130ustar00rootroot00000000000000PNG  IHDR`@jVYgAMA a cHRMz&u0`:pQ<bKGDtIMEDjS mIDATx{pTǿ{E6l򆄐H| AC*M[[[Q[kkeh[{,K-F@6BBȃd7{ssG8Gws9Tbb|=4 LubB &(1A! ALPbB $9LiD F;)(&'E;_x*uMXS*ᜀ1*p8SQ% BEQv. @UDNi嗏qKt=x5$JP Bty2`?/၍RQsOwG+ p@Ѷ ; uq٤Kο} UFw7oYAPb)l*c/gdZ$ Tu8Ҿ`A\'4h7UЅ0Wya RG/:3`gwrt[`=P A P}KFjDms/n&Tc\1`k[^VS1s!˾ 5[iF1 LppdH9 @Ë8zV5(0F<@(gu4Nl?&mcN?9r߿Ik T տqqmzoھ/:Z|0xÔ }>?vj4J@A)XHF, (D %lB)|̵&>Y `Ay:gKzIЃ)s,xD1'~?O.J- u6Bv TE d=Hf- Ow .Ga$4QZ V _rF"?UW}Q:%Y(!ehyc_q8t f`=8Sp52b Y~nQŻsO7de}"uɺ> 5X[AEpe RAvoA_8]H.ҧg)>g62#@Q >1m&a̹9As!Dd"0 )uOU=)^_vz0i# rpYNwL'ZaA'@DI~\jnvO}CVQafSF`KotLcЍ7̪Ah|/4^"3q\ PJEMܸnkKۦ=_u|Ž[; Kn$)r-)Qt1.@QeqrTإPh 8;w]nM>7rt]|ε]v;c\ LZ{:$cP[sB6Ϭs48cEE~o ([  4Ըδ9qn)@iog>O_t,ace/gJ[n d0-W' ʸw֑@|';sz}yW)Eurbm{Ͽ!>nǖm*3Y,-M:{sͫ908%3㔆]Q=ڽgRSVgM)c ?p_̹:&Oy:IU7OY~&+RzKqDo/qN6+?9߹}#gwERq輥ӗ*^[lA=;5{zKg?hL!A :9)l$hw65NvkŨZazyʼA`40licAl?0iN8"WAsBH}HhԵw}6M/n^wynf|@V }t;X?+ȯT0BerV}Ap>37dIα#z w._( EPiq굢A'UKM'˪$R_@i8H2i&ڝ%kL"z.gn> 9V_ř۶&#\;DYe\e\#Q?X0#6k{[[, :392Wȵȶ;*ō)Gݤ٥>Y&$$}3 #">X|G`!@bKGDo pHYsttfxtIME3mIDATX՘Z@E'hqwZ@]׆YN;Y# 44RRPVщuu~)(}ȨGZ" CD%(JD)Aɩinvf(A)As.TWVZ[JhTXKl%D Kln1Jl'$  .$Jrb$I8  Aa @QNON'/4T5xA/v/.޶\]ۇzx|z8m kˮ_>Y_cl5Z_,V\_5*k@Y_Yo֏ۻP( O_al%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:54:26+00:00ktEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ZMK.png000066400000000000000000000027451475705355700173250ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE6y0]iplmw>yGq54imfo;{"6epqd}k:s${WcflrghrN{3##uwoNj<~Zxqgllgi`RkVpeeelq\ddltnw~lcqxywsliee`jkkic2x)^kaktj\]cnhz}zljdbcd[frngXkEoedkiacs}|ub_`osll[uAuamehcaoqbbdc^r@|%8vTmqfhmlonh`RUs\Av"$Gycppbad_jacbJm`:g/}'0~plxkf7mFpgtdcl/{"}!|&AtBt?tomm)yFTj'&&%-b;~Wh! /g6~Wi" f7ѻ,-bKGD󬱾 pHYsz<@tIME3mIDATXc`C02x&fV6vv0f-73  rr02KHd䒒WP|%eU5u M-m]=}C#cS6=3s K+k[;{}GaOHLJNIMK/(,*N+)-S/`|`(UVU;7465ԷէwtuuR|0qR)IIS%M1s9z2a .Zd+VZg>(88֮[aMlIܧ}]ݷ9zLV?143siZ)C0 ĉeru(v&PdwB>O>,x% z޾ˆ,x#X]Z0jZ0jZ0jZ0j,;o::+5%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:26+00:00ɑtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/ZMW.png000066400000000000000000000027451475705355700173410ustar00rootroot00000000000000PNG  IHDR`@<gAMA a cHRMz&u0`:pQ<PLTE6y0]iplmw>yGq54imfo;{"6epqd}k:s${WcflrghrN{3##uwoNj<~Zxqgllgi`RkVpeeelq\ddltnw~lcqxywsliee`jkkic2x)^kaktj\]cnhz}zljdbcd[frngXkEoedkiacs}|ub_`osll[uAuamehcaoqbbdc^r@|%8vTmqfhmlonh`RUs\Av"$Gycppbad_jacbJm`:g/}'0~plxkf7mFpgtdcl/{"}!|&AtBt?tomm)yFTj'&&%-b;~Wh! /g6~Wi" f7ѻ,-bKGD󬱾 pHYsz<@tIME3mIDATXc`C02x&fV6vv0f-73  rr02KHd䒒WP|%eU5u M-m]=}C#cS6=3s K+k[;{}GaOHLJNIMK/(,*N+)-S/`|`(UVU;7465ԷէwtuuR|0qR)IIS%M1s9z2a .Zd+VZg>(88֮[aMlIܧ}]ݷ9zLV?143siZ)C0 ĉeru(v&PdwB>O>,x% z޾ˆ,x#X]Z0jZ0jZ0jZ0j,;o::+5%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T11:55:26+00:00ɑtEXtSoftwarewww.inkscape.org<IENDB`qalculate-qt-5.5.1/data/flags/cent.png000066400000000000000000000111321475705355700176030ustar00rootroot00000000000000PNG  IHDRz@ոc/gAMA a cHRMz&u0`:pQ<bKGD pHYs s s αmtIMEMx$IDATxYl\yw;rH(HHbZbɒĖ5$AE})7g!Ca%Iȁij^&nz0=mtiy_d6?JwyiZl۾Gogl|˃--M>d*G]E۬^Ç#6u@4*#Sv `Y6T'/r|/X(Hed2gt3Boi5M/{e``]7Euҥi4MGni3OjH%J+Ppיs X,K8/s纋~Y,W*cF::0MA0 E)p 6 q^Ti۾>&#ܤ;;qB?dvn6i?/ }gqpMӢo|(+W./`YUa˖UTTxUjqŃJ]]%/>\ʂ<>;dr2T$4٬F˂ Hd%16>K2g29FGgDbLNDFS 8dI㳅TӰPUU#ea[{-|t7b Wf6T+ger">X]]΃{ZYW_9KWu&ƣU !v5Z/ 21qC/++a5ofM/>螧Ŵo`ltӧ;?W@R,1$^yQpӫT*+?=Ȍ+]0LY<P۶$I0t My%.^$UHE0Ltܹ191i~(saX\οM0[Eo0'̢i: Xf:^}WW,44Բ|ygt8etI*/.EB$$IdѢ2n[{]"Ѱ( Av゚ӧ;I&3`s=D),vuqZ @lۦo|(V݇$I8[϶mrlݺ@@g0 E۶)/ۻR?N ̳{c_RſtUU'v{Yz)7R8?v±mo $7ҫ(8i,Sq&  \G $&q2mLf:Z){ bԼ8X|eT݁KJKAFF% @"DIEo IDEYI$I"| X Iihep`A(:#Klyׇ"ضCEE]7}bi,˦ Ķl^ɟk4vgo;}U߿x@.jQ-M,$nJy44Ԑ+mz 54} KqFFIH(X8dddx<(itM9eFFM"~ 4,NdxxX |n;g^ah0,~VΝڵ fBБ6$swCh`CTUaŊ%47N,)D>BCc -MsćB!2 8gȹ$s`3~U?~=vէpX;?obs=HȑGw/u52 џmA 9D,D#NWe?ZoXaQ<=;™3Ngo~frt'=#$i\ͽx&wv (2aHH& o Y :"N}46;(B4MGU$re=#8i:~B*CV1,& ҫt:m;Y yG*c7jh[ӌG4˲M{8zt \v ڵ 8,QESd4EfFfgL!ItP\QH L&ӅmydYB.RPZu߇iX 8PS `]]1M[W-T许}t= JX| yŊ%l̛ogf&AAw*˖ղs:NH$FwuWWU%KxhF93'S[[Ɂpt'&\=+30gP庑>=~^!6mZNp!q()Qy= ;w*pŃݷ Qn$Iȑ6?##IEQ,RdM?0?m=~5^MO_pڸH0G).\':óD"åa&=rzј(yeʕ!2m^g+Wm*H^ا1/ SUgYY4pKkBTՇ(锔X˗WQ%YMLEQP` FGož2t˖չ?y/vKkdDIq,2v=w-n|_Wwl*m+ @o |]xMA l1bџx:`A$   ^s@xa-dAq^ Ȃz! ~ 2@glqw=NcVم0P^s@^-W[ xg<>w>z9u,<+/CSY> `DhޡY{¢;B1O*)2 TaG8BɎ j)g>*2eWɗiӞIgdx\ 1F -(i9WԣC׊Hecڧ~N'SCb XGv¶ aϑS5.{' /[/X,@Ut =2ӨrU'VA#vB4" b}Ck!4[Y#*L"担dG'"㦪A} S@"-<8ڂPHr$8ì7tF2Q8XK1t6q u^~D0͌;pX:5o ege^͈ˈJ,&"eB霔 HllumoM]鶭)S2k3[*rfˋ7ϔ.ި0mظ8\I-$J˦e ^5%GaU^.#0kIyI_̜AF5BM&$=ކvv;=OH $R4(K=P}PbLGCq4&ʛ3/>;,NĘj.cr9cj[Fw'̢ }(!H9p7hV#}|7kmX{H&妏—}-d9{-Uy_29󃡽O]0 mN耡GdhGBdN?Ohg :`h Lh̉C;Zg mS :`h ~(OKԡsKʯTWM_kRorNTϢw IDATx[{pTsݽf $D>SDX5bF|CgZmZ8-uiUdQQU: hUτ c7ݽ瞯&h޻]{s9as0 h 4 A@HqKVk:  I1f_Cg&)ߖc,~:`;ppSSvMs5:e`j*iDB揶Dg"?p8o;31 ƽ/T^*qC/=3KOASуLMuɊ7PuԒo)╻VsM=y^ulzT&)3lz RbF]3ꍽVBP)#9S` [{ ^!wfkN>іkCܞ=B_ҕ1ίX}45_ك K7,L-vf 7xܸxE83t@Z* 5F=q4`yn'טwFËZ1O_w;@"V>_A 뀩! d N,=mpŨ~tC$>E sY~`߄8yHri+䜧?;_Mu# \bDRSD_L F5?R @JnhCH BvL1cR0N53&ētikít [Uufq-4[K R>С!OhOjAD ;wRlPhH`6:Elt¾KO=x>Y-c=掬-Y>c (PE&"b{]4M[wH.> #7߲㙐 a醅lj8|XfV,;B:W8@J]T7qY?tN%.%`Epnv[ ;|ή?L)7E3-À[EOoͱ;(V8Dcf= m+PR#Źfڝ_:\Ir bv\9԰DJ A=EӱN!= )7p'xt"$C}]Ddq;L  )@! O쮟{.ЍQCO{43fx!o;& M,f iuˮ&ĤxnǬoͳ ^{|MKfV  &52G&#ov}6{7L9}ꩿYIHD"p91,'SWM~V @#[&Ȝϫ #sZ"BdjL^ˇJdv#PtgҼ)l>5_vG9cg}3{?uU"1pd9VIHMC>@$2t R NN@Ur6S7݄m頮mzO:DHRT;/mOmDݜm~ȴxcڏpҴwI~%?(7挫gO欫Dڏ/ox|ɋo;fi) 38a_Um{}Um͗}5u챠?8N{^߽q`kw:|i`1wb;)"HS)4q)7&={0.E/茢=8#2˿j=O? eE~]<&1ycWm5LC:->)Y2Yq(W@nn(z=x n[Ѿ;")ٕz ]L75a,Ÿ[Zw{@pK2UT35&d m)}]N% %XǓqMkҫwddu=߸tw[&ۮ;xc1/Fj^ơە4Ku Cl st@Š@`P0(,&teY|qeXIfII*  (1$2iKKAdobe Photoshop CC 2014 (Macintosh)2015:07:06 09:17:090221; (L%tEXtdate:create2018-11-27T18:19:30+00:00,bk%tEXtdate:modify2018-04-27T12:05:44+00:00tEXtexif:BitsPerSample8, 8, 8>'tEXtexif:ColorSpace655353{n!tEXtexif:DateTime2015:07:06 09:17:09VtEXtexif:ExifOffset224QPItEXtexif:ExifVersion48, 50, 50, 49c tEXtexif:ImageLength800rHtEXtexif:ImageWidth1200dtEXtexif:PixelXDimension2363>tEXtexif:PixelYDimension1576ތutEXtexif:SamplesPerPixel31tEXtexif:SoftwareAdobe Photoshop CC 2014 (Macintosh)x\IENDB`qalculate-qt-5.5.1/data/io.github.Qalculate.qalculate-qt.desktop000066400000000000000000000035561475705355700246540ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=Qalculate! (Qt) GenericName=Calculator GenericName[ca]=Calculadora GenericName[de]=Taschenrechner GenericName[es]=Calculadora GenericName[fr]=Calculatrice GenericName[pt_BR]=Calculadora GenericName[pt_PT]=Calculadora GenericName[ru]=Калькулятор GenericName[sl]=Računalo GenericName[sv]=Kalkylator GenericName[zh_CN]=计算器 Comment=Powerful and easy to use calculator Comment[ca]=Calculadora poderosa i fàcil a usar Comment[de]=Leistungsstarker und einfach zu bedienender Taschenrechner Comment[es]=Calculadora poderosa y fácil de usar Comment[fr]=Une calculatrice puissante et facile d'utilisation Comment[nl]=Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Comment[pt_BR]=Calculadora potente e fácil de usar Comment[pt_PT]=Calculadora poderosa e fácil de usar Comment[ru]=Мощный и простой в использовании калькулятор Comment[sl]=Zmogljivo računalo, preprosto za uporabo Comment[sv]=Kraftfull och användarvänlig miniräknare Comment[zh_CN]=强大而易用的计算器 TryExec=qalculate-qt Exec=qalculate-qt Icon=qalculate-qt Terminal=false Type=Application StartupNotify=true StartupWMClass=qalculate-qt Categories=Qt;Utility;Calculator;Education;Science;Math; Keywords=calculation;arithmetic;scientific;financial; Keywords[ca]=calculation;arithmetic;scientific;financial; Keywords[de]=Berechnung;Arithmetik;Wissenschaft;Finanzen; Keywords[es]=calculadora;aritmética;científica;financiera; Keywords[fr]=calcul;arithmétique;scientifique;financier; Keywords[pt_BR]=calculadora;aritmética;científica;financeira; Keywords[pt_PT]=calculadora;aritmética;científica;financeira; Keywords[ru]=расчёт;расчет;арифметика;научный;финансовый Keywords[sl]=izračun;aritmetika;znanstveno;finančno;računalo;kalkulator; Keywords[zh_CN]=计算;算术;科学;金融; qalculate-qt-5.5.1/data/io.github.Qalculate.qalculate-qt.metainfo.xml000066400000000000000000001351371475705355700256050ustar00rootroot00000000000000 io.github.Qalculate.qalculate-qt CC0-1.0 GPL-2.0+ Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Интерфейс Qt) Qalculate! (vmesnik Qt) Qalculate! (Qt UI) Qalculate! (Qt UI)

Powerful and easy to use calculator Calculadora poderosa i fàcil a usar Leistungsstarker und einfach zu bedienender Taschenrechner Calculadora poderosa y fácil de usar Une calculatrice puissante et facile d'utilisation Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Calculadora potente e fácil de usar Мощный и простой в использовании калькулятор Zmogljivo računalo, preprosto za uporabo Kraftfull och användarvänlig miniräknare 强大而易用的计算器

Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation).

El Qalculate! és una calculadora d'escriptori per a diverses plataformes i finalitats. És senzill a usar però proporciona poder i versatilitat que normalment es reserva als paquets de matemàtica complicats, així com eines útils per a necessitats diàries (com la conversió de monedes i calculació de percentatge).

Qalculate! ist ein vielseitig einsetzbarer, plattformübergreifender Desktop-Rechner. Er ist einfach zu bedienen, bietet aber Leistung und Vielseitigkeit die normalerweise nur für komplizierte mathematische Pakete vorbehalten sind, sowie nützliche ls auch für den täglichen Bedarf (wie Währungsumrechnung und Prozentrechnung).

Qalculate! es una calculadora para escritorio multiplataforma y multiuso. Es simple de usar pero dispone de poder y versatilidad normalmente reservada para paquetes de matemática complicados, así como herramientas útiles para necesidades diarias (como conversión de monedas y cálculo de porcentajes).

Qalculate! est une calculatrice de bureau polyvalente et multi-plateforme. Elle est simple d'utilisation mais offre une puissance et une polyvalence normalement réservées aux logiciels de mathématique complexe, ainsi que d'outils utiles au quotidien (tels que la conversion de devises et le calcul de pourcentages).

Qalculate! é uma calculadora para desktop multiplataforma e multiuso. É simples de usar, mas fornece poder e versatilidade normalmente vistas em pacotes de matemática complicados, além de ferramentas úteis para as necessidades diárias (como conversão de moeda e cálculo de porcentagem).

Qalculate! - это универсальный кроссплатформенный настольный калькулятор. Он прост в использовании, но обеспечивает мощность и универсальность, обычно присущие сложным математическим программам, а также полезные инструменты для повседневных нужд (таких как конвертация валют и расчёт процентов).

Qalculate! je večnamensko namizno računalo, ki deluje na več platformah. Je preprosto za uporabo, prinaša pa tako napredna orodja, ponavadi značilna le za kompleksno matematično programje, kot tudi uporabna orodja za vsakodnevne potrebe (npr. pretvorbe valut ali izračun odstotkov).

Qalculate!是一款多功能的跨平台桌面计算器。它简单易用,但却具有通常复杂的数学软件包所需的强大功能和多样性,以及满足日常所需的实用工具(如货币换算和百分比计算)。

Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface.

Les característiques inclouen una biblioteca amplia de funcions personalitzables, calculació i conversió d'unitat, constants físics, càlculs simbòlics (incloent integrals i equacions), precisió arbitrària, propagació d'incertesa, aritmètica d'interval, dibuix i una interfície fàcil d'emprar.

Zu den Leistungsmerkmalen gehören eine große Bibliothek anpassbarer Funktionen, Einheiten-berechnungen und -umrechnungen, physikalische Konstanten, symbolische Berechnungen (einschließlich Integrale und Gleichungen), beliebige Genauigkeit, Unsicherheits-fortpflanzung, Intervallarithmetik, Plotten und eine benutzerfreundliche Oberfläche.

Las características incluyen una gran librería de funciones personalizables, cálculo y conversión de unidades, constantes físicas, cálculos simbólicos (incluyendo integrales y ecuaciones), precisión arbitraria, propagación de incertidumbre, aritmética de intervalos, graficado, y una interfaz amigable.

Les fonctionnalités incluent une grande bibliothèque de fonctions personnalisables, d'unités de calculs et de conversion, de constantes physiques, de calculs symboliques (y compris les intégrales et équations), de précision arbitraire, de propagation des incertitudes, d'arithmétique d'intervalle, de traçage et une interface facile d'utilisation.

Os recursos incluem uma grande biblioteca de funções personalizáveis, cálculos e conversão de unidades, constantes físicas, cálculos simbólicos (incluindo integrais e equações), precisão arbitrária, propagação de erros, aritmética de intervalos, plotagem e uma interface amigável.

Возможности включают большую библиотеку настраиваемых функций, расчёт и преобразование единиц измерения, физические константы, символьные вычисления, включая интегралы и уравнения, произвольную точность, распространение неопределенности, интервальную арифметику, построение графиков и удобный интерфейс.

Program vsebuje obsežno knjižnjico prilagodljivih funkcij, enot, izračunov in pretvorb, fizikalnih konstant, simbolnih izračunov (tudi integrale in enačbe), poljubno natančnost, statistično negotovost, intervalno aritmetiko, grafe in uporabniku prijazen vmesnik.

功能包括大量可定制函数库、单位计算与换算、物理常数、符号计算(包括积分和方程)、高精度计算、误差传递、区间运算、绘图和用户友好的界面。

https://raw.githubusercontent.com/Qalculate/qalculate-qt/master/data/io.github.Qalculate.qalculate-qt.png The main window with keypad visible https://qalculate.github.io https://github.com/Qalculate/qalculate-qt/issues https://qalculate.github.io/manual/index.html https://www.paypal.me/HannaKnutsson https://github.com/Qalculate/libqalculate/blob/master/README.translate Hanna Knutsson HiDpiIcon ModernToolkit UserDocs io.github.Qalculate.qalculate-qt.desktop qalculate-qt qalculate-qt

Changes:

  • Option to automatically calculate the current selection, in tooltip
  • Option to calculate the current selection, once in history
  • Toggle fraction format action for custom keyboard shortcuts and keypad buttons
  • Fix copy unformatted ASCII without units when unit is placed before quantity
  • Fix solve() function with replace() function as first argument (fixes solve2() function)
  • Fix "where" operator using (in)equality in variable
  • Return x=a*e^(i*r) (with r instead of n) for abs(x)=x
  • Minor bug fixes and feature enhancements

Changes:

  • Place approximate value before exact in calculate as you type result
  • Set ans variable to solution(s) of equation (as if solve() function were used)
  • Option to disable cursor blinking
  • a(i) and a[i] syntax (the latter with support for functions) for element in vector
  • New function: factor()
  • Use hours or minutes as default unit for conversion to time unit of expression with time format but no units (e.g. "0:00:12 to s")
  • Always use four digits for year in date (e.g. "0064-07-18" instead of "64-07-18"), and support input of date using DD-MM-YYYY format
  • Fix display of units automatically appended to expression in parse status
  • Fix reading of expressions from file
  • Fix solving of x^4-4x^3+10x^2-12x+1=0, and similar, in exact mode
  • Fix dual/auto approximation when unable to find exact solution to equation
  • Fix rounding in 1/# conversion to integer (e.g. "1/2 to 0.99")
  • Fix unability to find approximate solutions to some high degree equations (e.g. "x⁴ − 4x³ + 10x² − 12x = −1")
  • Fix automatic variable detection in select()
  • Minor bug fixes and feature enhancements

Changes:

  • Apply dual approximation/fraction to calculate as you type result, as regular result but with length restriction
  • Add option to add/edit comment to history context menu, and save comments in result on exit
  • Add "Search by Date" (also shows the date of the expression) to history context menu
  • Improve decision to automatically convert unchanged quantity with unit
  • Option to automatically group digits in input
  • Option, in menu, to open settings folder(s)
  • New functions: tripleProduct(), multilimit()
  • Updated French translation
  • Fix equals sign for calculate as you type result
  • Fix segfault with calculate as you type of "-(300K" and similar
  • Fix saving of two's complement input settings
  • Fix erroneous HTML output after format of result with error/warning has been updated
  • Fix case conversion of µ to M and similar
  • Fix segfault with very large integer raised by very large integer
  • Minor bug fixes and feature enhancements

Changes:

  • Show language menu in preferences on all platforms
  • Change "Hide number pad" to "Always show number pad", and add separate number pad when the option is not enabled
  • Improve initial value and clear all other fields when edited field is empty, in number bases and floating point conversion dialogs
  • Allow unit expressions for insert unit action, for custom shortcuts and buttons
  • Set minimum characters to two for all completion with "Limited full completion"
  • Support x without backslash for custom function argument condition
  • Update parsed expression and calculate-as-you-type result if variable, function, or unit in expression has changed
  • Improve support for small displays with low resolution/high scaling
  • Update chain mode to match behaviour in Gtk UI
  • Update calendar and floating point conversion dialogs after expression calculation
  • Portuguese (pt_PT) translation
  • Fixes for overwrite input mode
  • Fix unresponsive expression field in some cases after smart parentheses has been applied
  • Fix completion with both custom app font and custom expression font set
  • Fix input of max value for number argument
  • Fix memory leaks
  • Fix segfault with recursive (self-referencing) function
  • Fix input of negative exponent in scientific e notation with RPN syntax
  • Fix parsing of 1°2'3" as 1°+2'+3"
  • Improve handling of "where" expressions with inequalities
  • Fix definite integral for 1/sqrt(1-x^2), with limits higher/lower than or equal to -1 and 1
  • Fix crash with empty vector in plot function, e.g. plot([])
  • Fix "did you mean..." warning for two implicitly multiplicated functions without space between (e.g. "atan2(a,b)atan2(c,d)")
  • Minor bug fixes and feature enhancements

Changes:

  • Option (enabled by default) to show expression status (parsed expression and calculated value) as you type in history list, instead of in tooltip
  • Option to hide toolbar
  • Option to preserve height of history list when keypad or number bases are shown/hidden
  • Option to change the max number of history lines saved
  • Option to show/hide hidden units (hidden by default) in units window
  • Headers for keyboard shortcuts and actions lists to allow custom sorting
  • Reduced minimum height (one line) of expression field
  • Physical constants updated with CODATA 2022 values
  • New function: allroots()
  • New units: therm, thermie, IUNS calorie, rpm
  • Additional names/symbols for turn unit
  • Use symbol "cal" for thermochemical (instead of international table) calorie
  • Change title and names/symbols of weak mixing angle (prepend "sin2" to theta variants)
  • Return exact negative integers in log10()
  • More conservative handling of infinity in equations
  • Remove n from equation solution if possible using assumptions of x
  • Fix subsequent tab completions after completion of unit with prefix
  • Fix unnecessary parenthesis, with wrong color for closing bracket, around unit with exponent
  • Fix convert button text, when toolbar style is not icon only
  • Fix history list not cleared before reload if there are exactly one item
  • Fix input of scientific E-notation using lowercase e in numbers using concise interval notation, in expressions
  • Fix "bit width" and "signed integer" arguments in setbits()
  • Fix a^(f(x))=a^(b*g(x)) where b=2 or b=3
  • Fix auto/dual approximation with "where" expression
  • Fix "where" expressions with multiple inequality statements for a single variable, e.g. "where x≥0 and x≤10"
  • Fix crash when a variable name/symbol with more than 20 characters is used in "where" expression
  • Minor bug fixes and feature enhancements

Changes:

  • Improved history list efficiency
  • Add two's complement input and binary bits to preferences
  • Ask for the desired interpretation the first time percent addition is used (e.g. 100 + 10% equals 110 or 100.1)
  • Hide expression tooltip (after 300 ms) when input resumes, if delayed expression status is enabled
  • Download button in dialog shown when new version is available, on Windows
  • Support for solving equations containing if() function
  • Support for solving root(a, x)=b (requires rational value for ln(a)/ln(b))
  • New functions: powertower() and multiples()
  • New units for solar radius, mass, and luminosity
  • Use parentheses for exponent using scientific notation (with power of 10)
  • Support integer factorization of integers in matrix/vector, and of numerator and denominator in rational number
  • Relaxed conditions for (x^a)^b = x^(a × b) and x^a × x^b = x^(a + b) when complex numbers are deactivated (fixes segfaults)
  • Fix AltGr for input of operators on Windows
  • Fix (ax + n)^2 > 1, where n is even and a is not 1, returning false
  • Fix setbits() function
  • Fix Number::equals(0, ..., true) when number is infinite (affects replace() function)
  • Minor bug fixes and feature enhancements

Changes:

  • Detection of potential spelling mistakes (a warning will be shown)
  • Add support for n...m, j:k, and j:i:k syntax, for sequence of numbers, e.g. 1...3 = (1:3) = (1:1:3) = [1 2 3] (note that brackets may be required for colon syntax to avoid conflict with time format)
  • Improved "where" operator, including improved output of parsed expression, support for previously undefined variable names, and assignments before expression (e.g. "a=2, b=2, a^b")
  • Click on binary digit in bases dock to flip bit
  • Improvements/fixes to conversion completion and menus
  • Add retry and cancel buttons to error dialog after failure to save preferences, definitions, or workspace
  • Add last result to stack when pressing Enter with empty expression (was unintentionally disabled)
  • More rounding methods
  • New units: LightSecond, LightMinute, and LightHour
  • New functions: bitget(), bitset(), setbits(), integerDigits(), digitGet(), digitSet(), flip(), colon(), and foreach()
  • Support for hexadecimal floating-point literals using 0x...p... notation (0x1.4p3 = 0x1.4 * 2^3 = 10)
  • Add support for "decimals" "to"-conversion (display as decimal fraction)
  • Allow plot grid values higher than 1 (true) to specify line width
  • Improve handling of zero solution and initial guess in newtonsolve() and secantsolve(), and check validity of solution
  • Change handling a vectors in multiple function arguments (of non-vector type) - return vector instead of matrix, require equal number of elements, and use the same vector index for all arguments for each function instance (e.g. atan2([1 2], [3 4]) = [atan2(1, 3) atan(2 4)]
  • Set handle vector property by default, for text, date, and boolean arguments, and for arguments, in global non-builtin functions, without specified type, and enable parsing of vectors for text arguments
  • Do not apply "read precision" setting to exponents for values with units
  • Change from line to point (or dot) plot style for data with many discontinuous points
  • lambertw(x*e^x, 0)=x if x>=-1
  • Use parentheses for number with scientific notation in more cases
  • Fix x and y reversed for paired matrix when using plot dialog
  • Fix saving of handle vector function argument property
  • Fix saving of multiple names after editing of existing unit
  • Fix saving of preferences when a workspace, other than the default, is currently open and the general preferences file does not exist
  • Fix dsolve(diff(y, x) = y), and similar
  • Fix log(1, 1) (undefined)
  • Fix "to"-conversion to prefix and add "prefix" conversion option (for optimal prefix)
  • Fix segfault in newtonsolve() and secantsolve() when equation does not contain variable
  • Fix conversion to angle unit for complex angle, cis and polar forms
  • Exchange rates fixes
  • Minor bug fixes and feature enhancements

Changes:

  • Support for specifying a fixed denominator for display of fractions (e.g. "0.3 ft ➞ 1/8 ≈ (3 + 5/8) in")
  • Restore decimal number base after closing programming keypad
  • Improve appearance of conversion menu
  • Save position of main window even if size has not changed from the default
  • Always add result to history (even if identical to previous) if expression contains a function generating a random number
  • Prefer capitalized function name (over name with underscore), when completing function name
  • Return gcd of numerators divided by lcm of denominators in gcd() with non-integer rational numbers, and vice versa for lcm()
  • Add units for mean Gregorian and tropical years
  • Ignore underscore in number
  • Replace defunct exchange rates source and fix bitcoin exchange rate
  • Fix custom middle click button action
  • Fix immediate calculation after selecting to-conversion completion
  • Fix asin(x)=a, acos(x)=a, and atan(x)=a, when a contains an angle unit and default angle unit is set
  • Fix output of value converted to unit expression with numerical multiplier in denominator, e.g. "➞ L/(100 km)"
  • Fix segfault when trying to solve "(x*sqrt(x)-y*sqrt(y))/(sqrt(x)-sqrt(y))=x+sqrt(x*y)+y"
  • Fix parsing of case insensitive object name ending with Unicode character when followed by another Unicode character in expression, e.g. "микрометр"

Changes:

  • Fix besselj() and bessely()
  • Fix display of matrices and vectors with complex number form other than rectangular (default)
  • Fix conflict between decibel units (e.g. "0dB") and duodecimal 0d… syntax (now requires at least two digits)
  • Fixes for title options in plot() function
  • Add additional buttons and button menus to general keypad
  • Add option to show all functions, units, and variables in tool button menus
  • Add recently used objects to functions, units, and variables menus
  • Add option to bypass dialog for functions in menu
  • Add option, in context menu, to display text for tool buttons
  • Open functions, units, and variables tool button menus using long-press or right-click (in addition to arrow button), and add keyboard shortcuts
  • Use keypad tool button menu as context menu and show keypad type in title bar of keypad

Changes:

  • Add option to disable tooltips in keypad or everywhere
  • Add option to disable units and to interpret unrecognized symbols as variables (unknowns) to preferences
  • Make closing of application with Escape key optional and disabled by default
  • Hide name column in conversion list when applied to current result
  • Add temporary option to unknown variable edit dialog
  • Add Microship (PIC16/17) 24 and 32 bit floating point formats
  • Add support for specifying position of sign bit in floating point functions
  • Concise (e.g. "1.2345(67)") and relative (e.g. "5+/-2%") notation for output and input (disabled by default for concise notation) of interval
  • Round high precision intervals enclosing integers for integer arguments
  • Optimize rest of unit expression when converting to partial (insufficient) expression (e.g. 18MA×100ns to J = 1.8 J/V)
  • New derived units: Debye, C·m, Daraf, F^-1, V/C, N/C, kcal, kcal/g, kJ
  • Use international foot as base unit for rod
  • Fix fibonacci() for non-integers and recursive use
  • Fix conversion options presented for speed units (and possibly other)
  • Minor bug fixes and feature enhancements

Changes:

  • Allow multiple actions for keyboard shortcuts
  • Add toggle precision, and min, max, or min and max decimals to available shortcut and button actions
  • Add option to exclude units for unformatted ASCII copy
  • Fix copy unformatted ASCII when local digit group separator is same as selected decimal separator
  • Add option to automatically copy result
  • Add optional value to copy result action, allowing expression copy and formatting selection
  • Always set (primary) selection clipboard contents when whole expression is selected or selection is cleared, e.g. after calculation
  • Support for custom default angle unit, e.g. turn, arcsec, arcmin
  • Append default angle unit (instead of always radians) when converting value without unit to angle unit
  • More consistent addition and removal of angle unit from function arguments
  • Always interpret ./, .*, and .^ as entrywise operators if user intention is unclear
  • Change order of operations to place entrywise and ordinary operators on the same precedence level
  • Add function, kron(), for Kronecker product, and constants for Pauli matrices
  • Add radius to planets dataset and update other properties
  • Support replacement of unknown variables within variable values
  • Fix besselj(0, 0)
  • Fix incomplete calculation in tan() with try exact approximation
  • Fix 0/0=0 equality (do not return true) and output of 2/0 (and similar)
  • Fixes and improvements for newtonsolve() and secantsolve()
  • Fix segfault when MathStructure is deleted after Calculator, and in destructor of calculated DynamicVariable (called from Calculator destructor)
  • Minor bug fixes and feature enhancements

Changes:

  • Improve abortion of slow calculations
  • Fix segfault and inconsistent behaviour in calculation of a^n mod b when n is negative
  • Add modular exponentiation function, powmod(), with support for calculation of modular inverse
  • Do not make any difference between row and column vectors in magnitude(), norm(), and dot() functions
  • Fix division and exponentiation of scalar by matrix/vector, e.g. 4./[8 4.5]
  • Improve parsing of element-wise operators with comma as decimal separator
  • Fix rref() with different units for different elements
  • Fix segfault with empty vector in uncertainty calculation
  • Fix segfault trying to solve cbrt(x)^(1/3)-x=0
  • Fix segfault in handling of vector variable with uncertainty
  • Fix segfault in function assignment with equals sign (e.g. F()=...), when an object with the same name already exists
  • Fix segfaults in some corner cases
  • Fix internal id does not exist error
  • Fix erroneous simplification of sin(x)^2*y-cos(x)*sin(x)^2*y
  • Do not try to calculate norm() and magnitude() for matrices
  • Fix some memory leaks
  • Fix order of argument titles in csum() function

Changes:

  • Do not automatically by default set prefix higher than kilo for meter, gram, higher than 1 (no prefix) for second and litre, or lower than 1 for byte and bit
  • Do not use recently introduced SI prefixes (R, Q, r, q) automatically by default
  • Do not set automatic prefix if resulting multiplier is less than 1 or greater than 1000, with some exceptions (e.g. km)
  • Default prefix unit property (use for gram, and few other units, instead of hard coded value)
  • Option to change symbols used for output of digits 10 and 11 in duodecimal numbers (use A and B as default digits)
  • Allow the same variable left and right of the equals sign (e.g. var=var+2), in variable assignment without colon, if the variable exists and the previous value is known
  • Use Unicode symbol for minus in scientific e notation
  • Do not show multiplier if exactly 1, in HTML output of scientific notation
  • Prefer Nm (torque) over J when the result is a vector with three components
  • Add "amp" abbreviation to ampere unit, and "thou" name for 1/1000 in (mil)
  • Fix unit order for Nm and Ws
  • Fix conversion from ounce (interpreted as fluid ounce) to litre with prefix
  • Fix automatic reactivation of global object after deletion of conflicting object
  • Fix parsing of scientific e notation when the number is extremely large and exponentiation fails because of floating point overflow
  • Fixes for output of scientific notation using number bases other than decimal
  • Fix prefix selection in denominator when multiplier is higher than the value of the largest prefix
  • Fix segfault in multisolve()
  • Minor bug fixes and feature enhancements

Changes:

  • Fix retrieval of exchange rates from mycurrency.net and add alternative secondary exchange rates sources
  • Align completion list to beginning of word, and do not reduce width of columns in visible list
  • Add option to not format output (size, style, sub-/superscript)
  • Add m/s³, m/s⁴, m/s⁵, and m/s⁶ as derived units (improves automatic unit conversion)
  • Check that the output of command, in command() function, is a reasonably sane expression

Changes:

  • Use history font for RPN stack list
  • Use log() instead of log2() as alternative action on "ln" keypad button
  • Conversion to any type of expression (e.g. "1000 BTC to million USD")
  • Use current status of limit implicit multiplication setting during parsing of conversion expression
  • New SI prefixes (R, r, Q, q)
  • New units: ounce force (ozf), rack unit (U)
  • Use standard form (sorting) for polynomials
  • Improve consistency of behaviour when global units are replaced
  • More consistent addition of units to expression without units for unit conversion
  • Improvements and fixes for arg() and atan2() functions
  • Fix completion (including segfaults) and expression tooltip on Wayland
  • Fix RPN mode deactivated after application loses focus
  • Fix interpretation of Myr (megayear) and Gyr (gigayear)
  • Fix milli- and centimeter of water units
  • Fix genvector() with for negative step size or expression as step size/number of steps
  • Fix randuniform() function
  • Fix automatic/dual fraction format after conversion (e.g. "8 to score")
  • Fix inconsistently displayed parsing of "7d 5h" and similar
  • Minor bug fixes and feature enhancements

Changes:

  • Add "Clear history" to available keyboard shortcut and button actions
  • Add option, in keypad button menu, to reset keypad position
  • Show exchange rates source, and update time, for current calculation in tooltip
  • New prime number functions: primePi(), primes(), nthprime(), nextprime(), prevprime(), and isprime()
  • New functions for intervals and uncertainties: upperEndpoint(), lowerEndpoint(), midpoint(), and errorPart()
  • Add meter of water and related pressure units, and more derived flow rate units
  • Support for vectors and matrices in uncertainty propagation calculation
  • Proper support for uncertainty propagation in total(), sum(), product(), and for() functions
  • Simplify display of parsed expression (primarily for quantities with units)
  • Avoid parsing of implicit multiplication as nested multiplication
  • Allow use of curly brackets as alternative parentheses
  • Include +/- statement in function argument without parentheses
  • Return values for approximate variables in exact mode in dimension() and elements()
  • Improve parsing of quotation marks as feet/inch or arcmin/arcsec (e.g. do not parse s" as sin)
  • Partial Georgian translation
  • Fix removal of additional keyboard shortcuts, after first removal
  • Fix font dialogs when "Keep above other windows" is enabled
  • Fix saving of sub-function precalculate property
  • Fix exact calculation of re((a*i)^(n/2)) (wrong sign in some cases)
  • Fix erroneous calculation in some cases with physical constants both outside and inside unit relations when interval calculation is set to interval arithmetic
  • Fix segfault in Calculator destructor
  • Fix segfaults in some corner cases
  • Fix use of random numbers in iterative functions
  • Fix writing beyond end of array during exchange rates check in some cases (results in activation of old style matrices)
  • Fix automatic reactivation of deactivated global object if a function with the same name exists
  • Do not convert function arguments which do not allow units (fixes "arcsin(0.5+/-0.1) to deg")
  • Fix prefix after conversion to optimal unit when the optimal unit includes a prefix
  • Fix exact calculation when function argument is an approximate vector variable (fail)
  • Minor bug fixes and feature enhancements

Changes:

  • Fix handling of Unicode powers for units in denominator, with adaptive parsing enabled (e.g. parse 10m/s² the same as 10m/s^2)
  • Fix "+" ignored after "E" in number bases where "E" is a digit
  • Fix scientific E notation with sign in argument when function is used without parentheses
  • Fix lambertw() for values very close to zero
  • Fix a*b^x+cx=d when a and c have different signs and d is non-zero
  • Fix a^x+b^x=c when a and b is negative, and c is positive
  • Fix segfaults in some corner cases
  • Fix potential issues in handling of leap seconds (e.g. during subtraction of seconds from date)
  • Fix name field not working in argument edit dialog
  • var=a syntax for variable assignment with calculated expression
  • Replace ounce with fluid ounce during conversion to volume unit
  • Solve a^x+b^x+...=c in more cases
  • Improve remainder/modulus for numerators with large exponents
  • Truncate number in output of parsed expression and end with ellipsis if unable to display all decimals
  • Improved floating point calculation and output speed, particularly for simple expressions with very high precision
  • New functions: clip(), qFormat(), qError()
  • Replace selection (instead of wrap in parentheses) on operator input if selection ends with operator
  • Act as if two arguments are required when applying base-N logarithm to expression
  • Show padlock (or "[P]") after protected expression
  • Minor bug fixes and feature enhancements

Changes:

  • Variable spacing of x values in plot (unless step size is used)
  • Option to plot real and imaginary parts separately (enabled by default)
  • Updated plot() function with arguments for specification of plot options (in any order after the third argument)
  • Polar plot style
  • Ask the user for the desired sinc() variant (unnormalized or normalized)
  • Support for binary-coded decimals (BCD)
  • Show names with underscore capitalized and with underscore removed (with some exceptions)
  • Additional information units
  • Units for volumetric flow rate
  • Tradtional numbers (e.g. dozen, score)
  • Show warning when log() is used with a single argument, and always show second argument of log()
  • Make names with a single character followed by digits case-sensitive with suffix by default
  • Accept more than two arguments in gcd() and lcm()
  • Interpret a single vector argument as a list of arguments if function requires more than one argument
  • Insert minus instead of executing RPN operation, on key press, when last character is e
  • Updated Tab key behaviour, e.g. cycle through completion items on subsequent tab key presses, and traverse items if tab key is unbound
  • Fix segfault when result is a currency with quantity of one
  • Fix copy keyboard shortcut in expression entry
  • Fix limit of floor(), ceil(), and trunc()
  • Fix plotting of derivatives and integrals
  • Fix randpoisson()
  • Fix reactivation of object, after object that caused deactivation is removed
  • Minor bug fixes and feature enhancements

Changes:

  • Improve resolution and sizing of flag images
  • Do nothing when Enter is pressed if expression is empty
  • Restrict use of reciprocal in unit conversion, e.g. invert in "5m/s to s/m" (= 0.2 s/m) but not in "500/lb to g" (= 1.1/g)
  • New mHg unit (allows use with prefixes other than milli)
  • Always display abbreviated unit name (symbol) with abbreviated prefix (when unit only has short name)
  • Minor improvements to automatic unit conversion
  • Fix display of (1 + f(x))/n

Changes:

  • Add option to show both parsed and entered (or only one) expression in history
  • Add option to clear expression history
  • Do not add duplicate results to history
  • Improved result copying, with proper html format and ASCII option
  • Do not replace *, -, / with Unicode operators if cursor is within quotation marks (apply same principles on paste)
  • Do not perform automatic (continuous) conversion, from conversion view, if result contains no unit
  • Use non-breaking narrow space as digit separator in reasonably short numbers, and between quantity and unit
  • Improve appearance of icons with display scaling
  • Update value of austronomical unit
  • Fix segfault with local digit grouping when separator is empty (e.g. with ignore locale)
  • Fix freezes and crashes with extrememly large vectors and matrices
  • Fix segfault in matrix multiplication
  • Minor bug fixes and feature improvements

Changes:

  • Programming and algebra keypads
  • Customizable keypad
  • Customizable keyboard shortcuts
  • Option to hide number pad (right part of keypad)
  • Workspace (mode, history, and temporary variables) can now be saved (to a single file)
  • New matrix syntax (column separated by space or comma, rows separated by semicolon, as in matlab)
  • Do not make any difference between a vector and a matrix with a single row, or between a scalar and matrix with a single element
  • Support input of functions, units, and variables with underscores omitted in names (e.g. µ0 = µ_0, FermiCoupling = fermi_coupling), with some exceptions
  • Option to disable "simplified" percentage calculations (e.g. interpret 100 + 20% as 100 + 0.2 instead of 100 × 120%)
  • Option to truncate numbers (instead of round to nearest) in result
  • Convert K, Hz, and 1/m to J (and derived units) using conversion factor constants (e.g. 1/(550nm) to eV ≈ 2.25 eV)
  • Allow use of M as 10^6 without unit
  • New ksi unit
  • New functions: divisors(), rate(), vertcat(), horzcat()
  • New plastic number (ρ) constant, and new "hbar" name for reduced Planck constant, and add second Unicode codepoint for µ-sign in constants
  • Allow zero (1st and/or 2nd argument) in comb() and perm(), and return zero if second argument (k) is greater than the first (n)
  • Calculate statistical functions (e.g. mode(), min(), max(), percentile()) separately for each column of matrix
  • Return the lowest value if there are multiple values with equal frequency in mode()
  • Parse text argument as expression if concatenate function name is found in text string, and fix concatenate returning date
  • Fix Unicode handling on platforms where char is not signed
  • Fix bitrot()
  • Fix segfault in multisolve() when initial order of equations is not optimal
  • Fix segfault with empty sqrt inside sqrt, e.g. sqrt(1+sqrt())
  • Fix incompletely calculated nounit(), e.g. in unit conversion
  • Minor bug fixes and feature improvements

Changes:

  • Unit and data set creation/editing
  • Complete variable and functions editing
  • Percentage calculation dialog
  • Periodic table
  • Show result in expression status tooltip (calculate-as-you-type)
  • Horizontal toolbar with added units and plot buttons
  • Favorite functions, units, and variables (shown in toolbar menus)
  • Ctrl+Enter shortcut for approximation of current result
  • New functions: linearfit(), quadraticfit(), cubicfit(), ramlatency(), parallel()
  • Improved and extended parallel operator (|| is interpreted as parallel if units are used)
  • Merged inv() and inverse() functions
  • Allow nested subfunctions
  • Solve x^(x^(-a))=b
  • Fix pearson() and spearman()
  • Fix a*sin(x)+b*cos(x)=c
  • Fix display of incompletely solved equation with dual approximation in some cases
  • Many minor feature enhancements and bug fixes

Changes:

  • Show result index in history (click to insert value)
  • Remove paste icons from history
  • Double-click to insert history text
  • Add insert value and insert text to history context menu
  • Option to remove, protect, or move history item to top
  • History search
  • If there is no selection, copy the result/expression at cursor when using context menu
  • Options to use (middle) dot as multiplication sign and regular slash character as division sign
  • Move keypad button to last position in toolbar
  • Ask (once) for correct interpretation of ambiguous implicit multiplication
  • Improved simplification of radical expressions
  • Improved Im(), Re(), and arg() functions
  • Improved output of complex forms (other than the default rectangular) in exact mode
  • Immediately return memory on MR clicked if entire expression was unchanged (or empty)
  • Function for drill bit size conversion
  • Fix crash when using the dock menu to show the RPN dock stack for the first time
  • Fix link in new version dialog
  • Fix parenthesis highlighting when cursor is at end of expression
  • Fix initial value of interval display in preferences dialog
  • Fix saving of approximation mode
  • Fixes for equations with complex inverse trigonometric and hyperbolic functions with no solution
  • Fixes for complex x^(ax)=b
  • Fixes for localization on Windows
  • Minor bug fixes and feature improvements

Initial version of the Qt user interface.

qalculate-qt-5.5.1/data/io.github.Qalculate.qalculate-qt.png000066400000000000000000003616551475705355700237760ustar00rootroot00000000000000PNG  IHDRUeXIfII* (1 2i ' 'GIMP 2.10.342023:11:10 07:29:32 iCCPICC profilex}=H@_SR+v␡:8jP! :\MGbYWWAquqRtZxp܏wwQa3 hm 1[@} &3˘<=||,sA5o1'2ô77m>qd8fsegLz8L,XbV25)⨪/d[rUj}OP^_Y:Q$%H2*U'Bȥ FTAv[09J %@8ǎ<W'=뎦;ȓ!+i ~FߔoZ>N u"e{ϴar6 xiTXtXML:com.adobe.xmp HbKGD pHYsetIME $ IDATxw|Uܙ @"{EZI[WWZ[m]jkݣ*[7A6!{qG $ @B|>9syRQ#B!fЖ JB!BaW(C5?+WTB!8v`s B!B7444B!'O!B!$ !B!'B!BŸB!B B!B!aAiO d !B!Oo|-jL6Dh2$&К:Eq&!B!D?qUlnZwƓCQE^Z܈ *hB!BqO+xiUM ZcӠZp6q>S# !B!DDž?ortBii)~h}R B!M4fuDw߶D'Vƈ;AٱuX}L#,ʅ3flܸ.]JII (R ÊfWm 4HB!]%LFseL>b(029&?A6`|٫_UU^yf-[FUUJZWGe;ņ2-B wHF!BQ“C<)mC 0l 3`b UO{`m:%h7 K[]/j`g3h7UaM ;wÊ^ ~s?8c>VxZQHoN'$z.$jtq<-@/g|K~:M p BEbSK/=!B,fSkᵂUcr+Ht” E/&G,C0d '=<4،(wLGvN'ƲeLsO!OZ@ {j"̤LCq-,f7X?ƴjBRvluw}ơV ܃b钪)\T m <7)*kB!NtĻ܇r,2 u|L(^0,Xu޽j}?13Alz+?YV@l?5 nSQQAUUYYYۤ3Z1::PL+1yoY=*!xz3nuobَH %1H( Fn޴F !Bqʿ.ۇ36޶rO@ qgDqÉòְ;<qHLL\{bcclZcw_>ja (r|h̀ 0?~;{('/KO⌛ڴÆ0] )yB!(]WLhNæ+.MԠpfq,}59nޏ();w.i lS<X@Sn!Y.\}AZqN"9o-T\ ׈PB-j 0puwlG9ˤ~c=1 8eEa˩ųs$vWO7.v ԙo-$B!*f}I!04kg3>~`u߮ g.?, ˲P{U˧x߄ns]DU6>h;'u%M_lPZje1p@2cpr'_П~pDilaXRW_K n1tC"9Ua-e 6s|zFDêVi$CȰZ>9[ ;Ietˌ@VώOֲ5~'1dz*NՃO'OjlMz1hZ6DbԁSOe|ZB!ʈ0Y7qw< >ގwO S1`B6;+gεIAhhh;)( zOл"viTnn*)eGs+ϊ%UNMIBtͧpGwf Yd/l a8ƎjVVL!IploF{UTUD KmR:;w)=&&QYyT)]GHyt0g^W&H2#|rFŒ]I$ 9+B#xDfl]S SPż~|g-CtFۗ1N8!?c\1P( l.ܷdaKk2eB{f%TM1}AmQgnTlo/!/LP_R S}p^ch*.7PBH@h _~BşSW0i ޅ^'RC n1L 1lq!d&M,}NjUg᫩#cV*BS8'n['Er)HqP##4VТrk 1"@ߺչ8ffpp8лF!|X45N,#cF[ S+hqJ)t@Y nQЮ I:cc&!=͇MAaֳqF9`잗/#pjZ]&k9;H#h]glpi@՞r)TBj'H.&uj&f= j@ChvB!8^Ytdo"J (j`g;(}MmcFsҹ}LŏŬ;5ѣ1MJvʦMXr҇Nln﷟,o 31z-`:q6RIE@Q㣮6'={͆/7,TR;hiShsR[K$`Ȯn!ae2Y7ﻈQSIЯT%W3!BvG?Ğߍ&6#6?}Y ,:`yG,bر$$$ /PVV_͛mMㆩa?g5&eKpCI.($’NSIQ1*",@ł|lLυdeF0+CG+?k^ͫKl];(6_|;n+ԃ\le 6o=E?b9e%)B!$9ĦG̻y9ri-_=3~=abK]et|#=33UVaJ) %66@&xWxӌR)ZC9l6έ`w{`j\S4>] a@4!1}$E{x(g=%to#{ XfNBzE᮫@kA;5ti֝x{thbR[GkA6UMF1"g44%䢰%T!B1~cXjumckA/*ƶ9l ?ßR;vbbbTTT4gkj<MfE=9~' _XΊyUݙx3yi h _Kz0t'upI ahn oQr$;`peŒVl_Xg!EIӍKغ.a.zً.1: [RS~- WYI߮ߴWX&Gf~փ~LX|tIk(Rز"DF`KرLB!Nt6 w'r3oqKCd0hbӣY~|j=f} sj ?ay}@k޷9(\.,Y)Bٹs'C ?ov0`GcwͿ[0;NKa}3 oB͎߬f[E=R}!%c2\vN!^d[$b\73_-Ifsj &;}n!޵Edig1iWaK!Urrg0$''RsKPQ6~SK=bn3=p7Bg_2"ܲ1)TUEy"-_Oa8G(R3eh !BF_4Qӆ:M5 $xd?/ >Qd=K_*V=1>;VmFcvjS7$VUi*Kdȑ|>$&&NHH(]L4r_Uf-ߜ&oዝT+thW^BrpR%WPAYNRVb϶0 ,~p!962`D{y544-j g[%h70ڤxj#e Rr%=Fa8-˷3gțYHmPg'0tY,BMX ^WwHeJ!r|]H]`ҵU'9 U@=3P\lBQ9sJE!pWD;{ZʼJePqP5S&O!Dj'63jKkWUI5UTv(XAU;Vg_"j{Km6z[+ f:Uvz餬Rzfcǎ⎍qm^/sJMÖ*4PD_ӝQLrv,y,vM'0 ZX ;*ؒUZbwW(}4 K=`@I:F8UذFҞ^ ɺYXɺЗXc8#ζkScU&jI7@]lbB!℣}Ț!m'ȪXe#vXAj(( h6q>k = jժ=iX)vAy0~ &  #iwy?o*X7 MY[G ^qšy ! #ĶZ*wp^ oC l!{nq;l->ۙd 4B!℡\ {!?h5T9)K[Dm|Z&gMž;>mpO ԙA6yԛxߢJU^ !B!bQXE$&ab,v7Xl)- b?#^jԊ XVM !B!;JHUXU,]!B!D'Z~ uB!BqdG!B!'B!BŸB!B B!B!$ !B!'B!BŸB!B B!B!(!.B!Z 41;wp,˒B!B" ݫ(x=hKB!⸉°5>B!Bq'B!B!BHB!B!O!B!?!B!:NEE/Ka!B! v),bݺu<#RJ FPǃ!bANHl6 0- 4C܄}h>r--s( !B_W^^3>Ϻ|:3-# IJ, |$tƹ&pEtI~Laa!6nd}JJKі暫s+VD71qQIYi)z~mJn&7Kv6vsyhvM*//g$୨מk׮߲eK_k"VZ%O!wlQJOfj x`W_%** ˗`֧B OHTJ]޾mfLaM`Xpk'~w?G{HBB6>}zO>ūFϬLzlP.hw+zN0hgђ;dwC#Q¹` YB!᯵ ~8Gl/`sf7֬Ï>~fcs^W3n M7MjbtY$%%>ߑ];&&[n!wA(q&f6WC ؿ__~!=ATWW3s{jyyìO?e%ZnݻU&11K/UWtuM!S?˲YXȆ ]Ӵ݋>}zUV3۹f{|7>^9qiii`C>zWg_?a[~>G#6QPXD}=O&.*ˉeYV4P0\.g敏j"Cyc@esG()-6vM+ dTVU+]yr>lgh }Emm%{vuj JB{U 6^>W<BqG\!OkͪUyx8l6RAƟ:뮽!C^ SeUs sq8-_ӥK  6tB?-?C70zhnyS9sx9i`^4M7_xɣ?SOsxx8Cg_ZZ>5rn!8rגq>iS7n\DŽ@0SJ1{gZ{ 5{v9k mBŗ^~5J)ygS3t hiMh0GZX7)k/rfqēO)w3ziNÆ ;f*رc~3N;=lr3{ZSӉa,^_x]Қ:o?^Z}mBqݎe(8}B!:$5<W. MɁ`46Lmyor瞣Olvڊ2UNJfm18v~vmvAt8)P:LӤ{zՑ0ӟj-uZo@kB!wZken  ;eeerCQJw:©\sՕtY͌i̞=r/~f,߿{4R; .kw};-S7{‹=x.f3f` Lk#:th-fEe3hr IDAT饗/BJffae#=,,Z 0o6mi10%&sO."|QJbJ̝i}jjwa9r>O=/`0xXZG0 N5BtB' ac՚x\IIIrFfft_}3y瑖n @,[FCׅ?jto.B!$a38VX) N:i }iqb7nraGK\,bȑ >y.}elߏ?` 3n|/ZBA#oڔMMh:ZDP& =Vwf~y-[nʑCs:\ye,_yRS Iyy/*E%{dn\^v-zuuuTTTmaehK ErR)))gN!oGVV&555h '44 \~e|5Yll,NJTTQ/oKk*j uHk>UiZzZ\/6nTYYɗ_~=111L4 5M~ׯgٲeLG)Eff&Gn\.23R|͚ 4Meua}7|C~~Ap0rHw~XߡfcС'Q#ƍذ)3N=kĄ^bŻZh^yͷx"#֛ҥKk>_۴S6:OۤU #[ !'H:t5. ա7mGn\Kx?$\4gӷo-6lq 3rp""b''kӽ{vv;>ޟ٥Knl{ eYg9K@aB!e6l䩧p݋71s:L9}:6lyСL6#Z3f̘}oaCn#GkVѓWߟ[oᄏYīѣGHSOe˖-ͦ!ݻw|g~H!PĩBtt qeͦa`Ջ㮻B)Ebb"7x#m{x76׻L#l6Fyg1 &0ydBCCi3>,wOxπndԩlڴE ;2dH}cŲ,KJغe+յ5h C &>.ֲh6mDGMvv6ODDDD]]|orB!N)EnDt8a`0H Df{u.O7q}TZVƯsz˟9- :ne˖qg}_X"""8q"UUUTUU1m4|a(..=a4q=nѿMr$,<ښ:ޜ Wv&F\c@cnsBM?&Mj `֬Ya5Ǻ:? r ҧO~QGZQf/ RXXȺuٰI~$1!y2rYXn#99X۴`ᳰJ<^<ڟ(J}rp ,w=RJ.W v+Z[g|iZ,]!Z wVn+l#F0bĈ6/5_Я__BCyoPU]ϗmC9gń 9s=@bbw/,*ݻﳌeY,Xw?F lڜ wK4cBq2 㨏$A/^/Ȝ59isՕW1M5ks\XC ɓ8qmWm?}=yJ.2OQTZ~kgx0M Rλʄ mڧ^.D)EBBO>""#< /økH5ٽzJQQ1.⣏?믓V!NZu6{_@4FE}}=/Y /}sPJlyy'YlW_uÆ9*VQSǀ9餓=؛&aG}?x ݎ+rQ\\o[3%>.xF%7ǁEkMII VRرaBAHKMmVٵkcǎfE,[)ScF!;A~?e>g{?GFF:Y`?7,]=&`at9,"''GEVJYp1~zgggi͉|[bԨ}Df}/@.ƌoۙ8cg*x#ةSөFd?<ˎFkͲ+隖v-7݄Ï>^o#wf +.㚫:fG_|MAV.p1|>[vtFd4x8"##(/c޼z)Lz!!!.|~B!h/233YGxx֧ۏ.]RZvZ,\L^9''A3Z)햳1L<&G :(-ea O1npױ ר >ŗ_.g3f46 \bB!֚K/-y 2arݓ;#olGAagYEENٗQQZZo/B9mPpu5z=vei~?\z,\1cF-# 0B!fG)zggoŗ^f%,Y#ZkLb`L~]Ҏۦu4 ދنO CQYUIQQ%IAyy9EEE<Ճi\NQWWwP^^oŗ^rse0yY[ W^q>n#,4OuU]RRryL9]私v9 ~***._JDD|B!D BCCM7`۠"Mګ\.&M:.]X|9y[pճ''|2}>Zч^0hhmq9wW#$)>(n6ʫ=L*EzJ1Q;(鴓wBZkV^cO77p-\"""0 >>ŠA5rIS. 8N9믽pgG?S.͘BNr5f!;󰲐z=q չWJQVVRNwcRVV'>兗^ Îam=zdo`̘1DDH/!:kۖO3t5G-^|kjj߾K tBZZNW[ҠZa0-!B42 \κ6;5oFbccqх7v _~ ,FZZ*z # %%yB=E=[}]jIDDm QVgvIB!,sDY.ضBCC֭^}W_yE668X{>%` !#IkJ)v)Z!B!D!9 !B!?!B!B!B~_N?ՃB!BsMŸRVX!O!B!#]5yz!RΉvrAL_mR'B!h=g}m4)'ID;Vş sFRP>4f>5s>=~Sz; qg~o)Ael)ĴB*wlԻFp#=R^zMxJ7ÚJ+`+ua)Ɔ0__EAAɩI]͋UkMYf*6bm3m ^gy2N%ǥB!F͟/x0gOzu%ϼ6K ;xKb3Κ1\0u3ܫ2Y?|Ɇ2Zf֥y cc" ku\~}Q~kY5K~ٓksݻכW4'Ux;}l,ۙOsNu^?W[ff=ȢX畃R!B _\,7a6᫗/<Ϗ/zٲy>Q?Q]T򛧰|:ZX|u%# OwÕ;>eotyd6yyylٺ%o捹K(o.h ڻZOJg/ߟd=N>{_{yjzga0i͕4lDǰ:9*B!m}?Oy{`T vhһuG?s|>yr~|-,!)?M~ClsmmdmbЀhBBk|.|YI8w]nD7oe;{p8=R~'0~Id3?fzK8)v+! ;B!B279 =;&MaOaD88;>gAL8-Iv{#{oA􇂊X΂!7슞"JU@C^C ˦lI }߯Wpwvw|i<ng4C H YˋvP>d򗼭lA͂(3 rug8`z=̛Â}cvM%g^۟"a]u5?`%%<*]^z~v-ydm_TZ>:6 %:1{d٩:,I hժ>! IDAT=f4w]eT⫕Mtw:?^ӓ1M\bС7xImpԧwXxj*\9r\|7#68N*GPʓ,n39zχYo_"O:91n>&3{+fODDDDDgIhӏG>[a9adpUGXN`̺iRm+9@D帳j >yH[憫.QHry'yX\Jر[Xt]ȟcBo/{\4&ޣtܸe%LrYtЗ8kIUE?|^O|c/^nG~]lW9#ȻtFiySٴe[<'}G3dVKKyL[a_ O>ΐe)KgG<8R:ELva6G~>f|NБPJ|݋e3&a>|>/^/ {gN)h:5Hdqa~.dq,[pȩie?| kô-3-[=mW H^IHew~_ !$̬HV M;VZ,OngΞ;陘Bh{7fn{ 5Wsv:$Z0y҅_Ye۹ou=_Duz|?TyuθY#(/XļApmbjS/@(=g<壢x3Y|om(""""" S}xnVV'Q1:""""""e# ԴHQ:hIq?Q?Q?Q?QQ?Q?Q?Q??Q?Q?Q?QQS(Ÿ(Ÿ(Ÿ(ŸŸ(Ÿ(Ÿ(Ÿ((Ÿ(Ÿ(Ÿ(ŸŸ(Ÿ(Ÿ(Ÿ(ŸŸ(Ÿ(Ÿ(Ÿ((Ÿ(Ÿ(Ÿ(ŸŸl=&`TDDDDDD <^τ8+_-gƒ|iץDc|*ӄaL/i3ML9}_ _DDDDDD((Ÿ(O}.,S,fzvٶDDDDDD /?n,A[n/} E*!Ć6[Ƙ?SɈFj[Àxn8o$7?1 sy H 8sB^y$-rXŏuH!co{B>6 p؞_Oz\sfweTd!o?"<-v REϟ_ w |XqVEْ0 ow&iRZÇoX:ڏ\ϳo~NcI?473u{][^W}A#awxy|gK(>oȗK3DDDDD _*YtbC^e NyHa!! Ŀfj n3ߺ5 88P mJyam:UAHL4g_ۖna /CM6le>5~|COq9ZflZFsŨFsm@jP &(﷋Űiu?te.19 G\͐γJ]ic' 9"4=omkƨPwz6#."7Y~zѯC?M*"""""'/Ui%o*~u+V`=TgOŵC,ZL̠ B-Gok߁v[\VHǬh]gFv9>~^ "+ 9+K^aQ;debůX Wmem~]*6|r \?4}-ۅkXb%֯eݱ}lߴ+Wzk> 3Yx"X<0;G=6[&A $.ȃ[c`jZ7iF̟ٞ=ǎZȿ"LfE{g4#gHw;y>Kso2S;3Q<>nJK0M=ׄ=o"* JGb07W<9|5wg]=q@f](.͒4{R-+~sLLasl{|ͤX(t+碩8P\R#vM7۷ٹʞgj9Q;adBϫq2 {qOԂ5++tׯu^DY(Fyl@ҿw/e4y9,e g/vb 4<Ȩ/z\wmbqV4.޼d5f҇ !^$֑]ayHsfm'wc8?5 Vuj_ՁA_&PbR]Zm6Z1iA&W>'++X\7m;^5Cz؎|1b #/ǙZڐ[_d L/iX_q4^r=M^)(ja ʷb٣8=2mv;={CCItwT>/~iX۪nfKf̕cyG gϡ?^Şݻxu/_1f !ZIrV4:w%o3uvLv>I,xnbnj"첛oA{A@< )99Ufm' ᙲ&&GnVE4"@_ϧQc(wwǟ?ȁWܿ|=yګi'xНYcy1y 3WG7ӵ`ۋ7g!b+R4"ZEԍ,)wTk/pع;&LDd.4 =FAi_yrѫtL <곊4.|,DID˒ZDDDDԇ?4#CPE yEc}iq).аp ywG_57_ԓdQL9E䖑#2Þb7u!6j$o NxzH4mE|r7k2vP֓3F}ߝCS3HQ]URY[#@|VlJggItb|5E_dAYF]ڏT1}t"a4뗯,ɍ鹯GM*|#2Ɲ8k) gAh=Σӧ2iS!ރᮼ|gZ0|>+٬ؒ6Y;`zܕTxj,fIA[*\xe :g0Z6 Xf`;hB ~YgdءD+xUfkŚ2eq1ۅZc$ .""""lƏF;<=ER]1?ѼcwCٲ'`&=F3{uko'6dQių'tf&G6bJ2bwMU^_=,[( NS3]yy@B{ٙݑk8HIxuMbyLX= iXw~ i҅ b_/+f#]|Zٕb`YL|ccE/\O֯/y. фT9 KJu<%x˚{w;~RLqbe_\lZ_p k^j;hCTnvQ;!a'UMts_ A x<hZL=4q_޾FA5J cf|WmϾȄ.I8P"{ug=~ am<ǘ$;) A&3,ED.n8i[aǨ=~;7lTQO^|?wS)Wg(6cOgM#x&H}g6=؍$z^ȜI@K bKwbEy39v>֘vkK\rx2 VZ ՛v؊֭jzdO'^y 1[Ŋ=Cm6M3[3/gc:ȓȈ0^jYZOeV1/e%9&:9?ۛM!Q4L@ n"b/NIYz!L+:S~A$FGmR2S!Dƒ[ʚyoqSLq;/ź厭/2Ȭp > ᭚]/O#Ԅ,d[{gCSd﷎'Z;Ty%XB Ca/^Ka-$Ƅp\YM*+Kس'~DEtءG4^}nZODDDD_'pg艶Y Qͮtv b Oqxxww0c*с`@x1~DĠҼ|g1hp"+v7YDrPa)@y)8`8bSirG% s A˛K'%9g?45_,͸++I _BJJ1mY̬i{tVs&|0i5o,Nny,aۗ2%!޽ A?vGKyɍ3ۜ<*NQoοN :?z3>LO`td&|1 ƌ↋`}.""""Lr#.A7gm qrw[q$)ǘֻUv qQ'\[kvJzv<_M_sݜ;leE,x{f'rt VTf|LX P6MLb"s.#9"-w mH|^.ȣ h׆8 2WĎ'c'ҟUXgǴ#qHk3>ᨛgwW 1/aGܺk6;Q&nFWXKNz⇼Q_ C;CHO72NEΏPmM_Par*&gf`$@UIǥ?f;`D]yl^`T yʋ8uKZ'Fz47{sFwrf' .祬0J ;Z+!Aebkvmcoo@Ἶd5ۺcl0+ض߬T5ኈd<^v\ oBlu-.fy[}3V|V/x^#y㲑 Nw24Mӗ0a*s5WwO5[b/yiL-kgH29]Υ]l(VIѷrmn'\Gs9-8_rn)mxb*a 1}˵9BsZ\ƓogO$Wq,z<CG?1[ _rɼkesyɕ\۫1i!)|{'L- ZW^ݱ~^IQyXRxv6\DС;kg {;o%a+OA̹r$|<3ÇpMKiL'lN#\x7. & t’W{FWi2r;LzuGBe9[KѴRӒדŬӘke_V`8>y^FX5ФcR//Σxf3?-{#i?"r~ l;"$n29=gȠs$^NBSv@f/_LWhpz}7J$qBWv6=`n$Z5}l竩~f&eAMX«6nDl롲i kLgs_hjՈ;wzw oi:ToZ3ؾ y&E2ӲC'z8?lgA Um  tn݈șLrL}3}?BX\~exfXghys(/ڌv aO5ذ!Ͼ2v #3 OQ6r((d۔7xn^\3&-kuݲĵrqr1?Ft8[,:i?mV-Ѷe\HUY?mxpyHM~a1v%$yj᮱]/c찁l?%,4;۷Q#M#VMMY m瓔rXGʏ@ KtiӸV&Kx߻zkwOh />u?=dQa(Obneo.raCΩ,ԫج cqFa?0svfpH6ec jH:/dX\ZgrؕA+V66pge+#r|h=iøxyz;z~'"""Va ]HvZbBkMRSBJ<ڶ SNnf6'Zؽ7;9t@~ϵswU@\$v ((Fj%'?LmYU65WwHFh@{λ>0=b= L{IfOi>E $08}D;pXJq}?N-iE3YY~c =fY^Ys OJٰ)3C#+=I!"""h[=(&}<+#!UHF%;˩:j2>l=j%\z_<=5MfwNId`ңWsۃ1Ef}Lk]FlY h +y^PgIYTqm_?ʤY_3s Mg-]?Jc5}w.e^8D:Bėz>UU+g'1$vW8vN_a(6/,DIMo#-!ضAw!bEDDDTV=G- AofĂv,=RzImY6ck 2#~#n\+0a*Ir~Z./>mz)-JgC#ʯ?F Lɿ/0gZ Fb,&:T|HbBo.>'Ǎ㞫cԳ1SYoɨ.H¸w?aT̒`O~;^Mk9?n`_~!+fӥ152Ύ;¢ANR2{w~ɍ·u)_ꕼ-^}/ LGUN>~}c#n\qpul2{Qn뿤Ӫ0G#HB}pm挽TFйI3JWl/F!t#Ф Ot㲫],7=U`#mO.RL=i֋U7F^s_AM[eEoMh[Zy'^/g;sל-f]Þ݂`DZÈIW6k]LyH]ܩsYn"`дu;>uLXyw> ~ev5l}ϧEMSBpX>]~fZDwf7 CYiTA]?nX /! g֦3x`{G[BquAY0tE/Lf ї C[1Tٚ絭G6"wVkQqwhƁu<4~{LD-Wni7x8w(nYKe=w\UldqY)0F5$^Es뫟s B`Xq8"CJJ#rd?0?a8[Q3"Η^F?lc9ͭfhj&'&炄^ri\<8E0o> ={:3^^^||5II`8᭪<=5G,Z?-SUQ tLLk3u{Ip_q.͌?o t朞:aԢ/T/yx'IՕ=voWufŻp,uU-,0#8YMb9W ;v[^ۆxr*Gt6-pFl:~]Ym?x2=(tٰ;;WWtc+~ Նah<~s=m۟s#v+j*"o/RG|ˋMR#c2˳LPs֜K.E槢1ݒpu-F.֛{* '6c8Jk5b|u Mw{onekd/r$pdCvJ ?t&&nSUp"zv kJz&[ŋ>9+~-'ǯ3ےdx|zϥpXt=:vφ=1@Uw#4xl`ɖ_.I ~>:Ӳp!S~_uWz6=~C8 L>g\)lNˆ  KgqIl}URPyu6BxN+,=Ű}L7U/$bu#%@?1+پd7<5e҇^BXZHjlT1_?ņGuLU[w2nĄgq}/d4ňOBkXdF_u{>n6RGgbS'0wnqr Ȯ7s~Lzl$)'/Tuz߮hۛ˯?0$yMoE~Y,6B2z%l}M>jύJDn|Sԏ!<ƐC^Ǽ)ϱRοGujp+0&PQo`P>imbTU9{l2\}ޥ\߷/or\L?ᣬtLe=L;Ӳq}Zg$ (ݛsMmdrѷI?>37!*egl^/iAS1*{#ߔ8eKZOM@s[1im>Ǐ;d٧ONw]L3EGӲ{|ZF`WKs A80J* kF\h*G"ҳJQDA[H53iÔi5I0‰ UŀP0e1cg>i!maБz UeO~%a(rZ[#.ؘ^-?ak\gf&Ƽbdn_N6xr9[N fg'83L7YUŋ(4chuۓ @pp Os3?y/LȘ_@?}yY<>xKH-Bd\wwQ\ǿHME hR^RP5P ! $d7ktbTޞ=s읹_ơq1sk7Mu~X4+eV1AcVTRi4`  \4ތ." cO?-gsϷɊҫg`4aMUO!zB#42 0uȶVR颞lܰRv*.jÃ11ʭW^k:)gp"Ŵ_iaL'|޽u"ZE4s5-Ay4ipqkү`BCO2e?QE8ª ORQa`a1|hsk8U o#hC{JW?՚ʏ[ә1Z)mXʬ_֕o.=4;ig@l+L~~M^gE!=̀lܨ& 2FdfsXRU,2Bv04cjVģyA<>r"8uGYN^p\YSɲ5VR.7keA_ni^% IÓw)z]ɍv/2Jt"*/mCDٙ^NYpIݽzc?=Mqv`m+rQVOҥ #K˨Ӧ ˏ{BV}#8L7AA\o2=0O&l!p}mƐ !B>1ɨNuOK,9؟PY9e8u"GxniТ.Ք'}'gs+7jױ&:zs QM'a"ei,w M$h8ڶ4ےE),8Fu BWߵJJsְ.?hF|MKl?;0NKR8|k"{q\ٿ]Cfe{z1d~]BUc&%;^:{¹ps({'\k\mY}{B!%#%ѩmײ`4jO meĞ'Auv LͻH` a m+\I8tFWƒ,OP/8lƤ` t؎!g_@^tCfFB~fUn&TC.Ca&q2z gw[{k3bs3 ф89*/ 㙔rƇӣ3LGoK+,ck7#2<qWDCo!v8BxS0/7}ĂגDM<P9Wʙ3$;o:~L2glInc8@L[mitaiV{j3fveL1ne?-Bb3;fw^|+&3AJQӴzGюb.q>X`q_"{),9 _X4QF^kD7ݜl9rm.y5w&gG硡9:j8;1ǿUۼyqUo>o㪗>⑋7vHc}K;$!B:x8Z{Wo:plԿ/j-:ӘϮÚü.h9¯v;4Nם n?o[)r4͛,qߞL a1u?DbC~2n6owA-$1S:6m)şB!)}*?=u/e,5_%bɌԵY&c FF~Xt߇,,7g:y2NO$ƞy `s^7Flyet i/@f6t׍Vu 3w|1i+ʪ99l< aƣnٷ#"md#B!Uo~k5k8ͥhxO@CN[_ˤ>K7bq}L$~~+16{59>m?_)0dvk)<_մztbŪ| xuP[B-fJ-woֹh.aeIMqq&_,[Z;~\iȕp du҉[~V_ɤrG{xn\=.|޷V/^M{yai\]M!֬`Rsx_oXU]Ajy5'.:JoդOq(wgڹ0Q~0 rn?6B? %EU@HNyQNmB!_hrX_xfhƽ682 bO,{7c-ԁDZT۫(s4˧hxvqT= aP8LGE ]~ߡM\3h3U\[TUS\dMcgo1mcKv@?I='[ _0qAzzROҥw}x=;0ϙp7XQ5z! d\6w*Ah5s:1E/)}q>N6 )$0*P]\J)޺ڎAҽ|dVY]sY)%3!BRE:s楰Kg$1$P-E{YJVML7m<)\̰kSHp]wWl$ƒ"O#>,&r\ʺy:7rÛㅕ!NՓ)aCF3fP:@t 7B -_ry&/gOƄq~:?;㎳O#^oUؑ[iB>uy?ʪ*ss8\ZE`` GJkNԏ2}>n6a>UCl~B!/*Y7U&rc#'gck6~N!6+Æ$a>vf|Mohxu:Oxo};~nZmm央Ӕ5q:hmg/?Zޣ012vrd޲T}_vj\3sDuw(a|1t:RJ=A}0ʤC*qxUPjd:uqqxB~SEš]l3}>_ﲒ{36sO?ӻc+ z3]Cmblz9])mdO!BgsSk7֗A[|YZX`U\2pݖ/ײ,;>?:6J_2Ԏۆt$413(mMcރC3gZb UhFޠN*P MWϫTո@oOTVEηvTؿ+rrE.;:"{V9?~'(Wyt>B!By2~ISd#@luj|1<|$z4\.'TXn:4:Wr۱8ī_Rnc猤}?cOmz ^tn0@]x44jfxS݅17B!V~. 33p\ϜN60wkb<<5r}G˶1IHkGVg'?-&]۠S2 ~f]Lj xz/ dT{iޕ˸kE\?z0||+;3sU\޷RUOy|k&\ʤX|h2 ױ1]㊛R,\JۗGolUeEVۏܚ:g $޺ &PK):+2"rimb?zȓc/WΡ{\ƞy;LItOֱ_@4&O]v1ja6KŽj k°]~惔4bFqUۛ k7ה%, !{|gt҉E3ή_(qi:9t`3H&CkΝDRt@QM^Z^˶ӭ`&7R`%{Y2 ]=&sNP!`_F c瓌?v]^> yV:FaX 3)L_׭=7FߺB!84Np\mtzz>" Ǒ/ㆃ|peI=:clɡ֍ KQn'B!zEMNq+HJJ$e|cfAt tw)_9K$@Y.fsJ L,z+'%EEWX\B: (()h ̝:Lo}w!. $NC}{I<1cwH#Ҏ^\2ȀΪ"y;SKh&@Ui6+(. : h 8WשvaJ/_tJݜ6l:|I&ɖ'aUC_?#"Z-?ٸGpFX"vڟCyk$#B!⯮WW抇kx3G#'YdZwH"&71oV\G&2a 2ɋՠWW=:3t|MʭWsz;FmYY%3]۴@;1vqS]~;g*OMʠM,5y˹`a&5v*y?0mz̝m\7W](l:C}SSy?bQi&1ϐ``cd$eXLX(fKfB?!Br9)4^a2.͙zŒ{n~^v(X-gІ}; 6u98ZAqrL{a06fBHcY20Eg5`;ARTnO?mytϏKaȚ:pػuJn f"b"=ѥrv~P\?OJʃ{ؒS-0>q*QOł]FiE- h[JWnBf-VtColR !B"{ï2ku 6|/ `caNCgp;x`l8A8 H?QU&pB0䍍QRTNjNu&"۵'%};Y1.-Rt ꫹ܿ)oGctFsUc,[.>!m镘ڳ\CP_̍j;+GEJ*m mJ,, ]"#hk}IّE |~B!/3Y}oMo8r_}!袗I'Mgp U!ΰSk%V',>rIYu;շ|:FVr8tx7sO' c>;NjaI$6TDLrn|:u$!0FcrrȪ#"^Hᰣ4&C)de|}szTݿ۬V>>ǝĥ_~3WsT6l\ԭnX38KJ}3se!B#Fq\ F?YN޻ 坹QC-|U֙> 8vU3WIcO^UݿUs.>z&rɜRܗCC1}<!L<-Bm lz"r Cguvn⸬+?C^5lua&6/VPҪ7MAZ(߾'G ,}2Wҿ12=Ԟ^Gϱq3ӬՕ?!B!>Ē-eж#}onl@:) <ϽN xp#WЕ/G%b1խ~ ++ k^W-eCqFI2倭` Էq//qc myIj:yܼ4#'ILuoE[j#FO^ i{MWƒ.z_8 T+;]qr+@QVv?5f>歫B!BN47Ma=z3MzNР=>t0/ϋ8ggMg)8B "9MH߻: ->>]զF^Io_LI??#렋2k Y0K[g!%dЙ~͹9{ ~AN ,~N㌋dT{cn΃yuq_3q7Ak IDAT۳Y\U ]|ދPZMmf,Uծ3Fӭ[|B!Ŀ:r ӭ̘\ ?≛nIN䢔a@zprN?M?w:jpT/tLFZK~ ӁFh4p`hh'.ÉBCo4cj.jNJy#fn΀hdr`5t&Yi̿o ~dO!BZGMH9ٝ1q j}<5Mdnʨhhl+ F3_h &t%^o@?%NJR3`4cf|Ʉ/B!B4 5x"bCA?B!B4Dn;WCiB!B4;9371Ks)B!_=r6oOsiB!B!şB!B)B!BH'B!B?!B!R !B!O!B!B!B!B!B)B!BH'B!B?!B!R !B!nUV~O+V뉕LYY'NJ+l؁Xr%.۱c֭7nd˖-J)֬YÞ={<1AJJ ĪHNN+**"99jO,++N'{n֬YRKMMeӦMucڵܹs\\LOjLAA'VZZJrr2ÇYbv۷oWv{b۶mcÆ uhÆ l߾+Wv;+VÞXEEɔzb$''4W;wզMUzz sU]]Mrr2EEE^:DJJ KOOՖ-[ `ݺuر+Wl6{beeeUMM'~VZU'W۷og^ڶm[\^\0W$''cZ=LV\Yg{޹s'k׮F7o&55+WwĜN')))deey媰+..UvvWի,֭[ٸqIsj*222jŊy媼=njoiii^ڸq#[n޽{OJ))) ruA\ڵ\m޼k߳k׮:Zr%UII TVVzb999XN/Wׯ'--턹jl?Q;W檾~vR^~";;jj?Q_j窡D}OԗOO}S;W 'ӛO4Oon?q>~1}z}D}}zCs{?ѐ>9D>~WXQo~}zSjڵk{Nԧd?QO OOO9x`ı:^?>v?h3f'ҶQO=dOl P{VZUTT} P6{ꩧԨQ.uwx;N~mOBj…XvvԶm#~V'O)SzNL&={W?oybPڵk'n:Oo'{95dȐ:ꪫ-Rgӽ{wky?'vaTOl֭ Pٞ… zKuرNO]zurug~ګO/իW{ĒO?+W>:Sw_~"<<\}^įW^Q}Op k_|+W'6lؠ#-mzz+jf,Lڕ1yhuKV5AI\uZOgN.*6\ջ J,?J)nPJگ ]Si9VTc !B!Ds?.w0V**Mu'r1Xϧ8  :IGv$M;|MMIah*ȸqJXfoGKG@9jE(Nl,Y:6FDa.rrf7|piTn{77ZG)U pҷc-nP*œ{ܷoSf:v"+.%FN;fdp_'tok#oheݼ]ȔpPNd&'gv,`k.m۝`](!C|Vԁ 0-k{rE>x8du&>F5l~^,WmSc0elIo,Ϋ#,!B!MͥW>:.x6.m~zPCM'Ø~3y.{,Ly[;{OrV ?t.M(Wa6Z*KJϣsPZOkc],p5"(-f"_0pjس=Y=Cgs{n |yVćWR$ii2k8F k[x"|N&zA95G2hjH/\Ƅs#xl&4WNN"6GXkO!B)/(N #vЫcY q Ǿ+`錻vҊn/@.y >{Vr+9+ȌWo c\J@4@Gҷ\U ܸۺb<=q2Cb#XLғ_S7xch&B"&3Uv!qFO)=H/[q`cwNU*J@cJv:9tCJ;<ĔC~0$ UeKB!B37 7,  ,o^fP(<|J{VwM{}6Rc࿷L_G^GoGDo >_'oqwP:_S{}wȭjk|crHsQXCK4⃒PƱߤ-B!8N$vʊ쿇%l'rC}LK,kFᗶê;-gCP\LBM''I:ֲY˴kOuo"; Z.%/҂l>{A5{J\(Td{C9s>$-zˉ-51GnʅB!MsSQА#jp.)<|܍#!{ .WswQʅx܏p/Bo&WǶ'7 NŅ3lFŷxSe9ݲҞKn09~PaOx;|MpQ3qл @RL43wK4+cx8tw}+E ?֢/fu yw>n__'`Ԏwve+B!B91Gp ]ƴ'""50(Τ3 13/&#{! 7Hńt? ItAHHXx8f1@PPླྀv"ЛVF!* Gd@doP<:dUc1ZqgtzƞFdaJ1$F1bƲl\\3jTXq0f \dDѵ!Cm4_^`7aKS`2!7zB!ߩKc*Lڕ1yhu[!B!;Ҙ5?!B!$R !B!B!B!B!B!şB!B)B!BH'B!B?!B!R !B!\8md+)$@!;IUbαWXxDŊJ& H$m&t9|xٙ&s?̽BHB!B B!B!$ !B!'B!BŸB!B B!B!$ !B!'B!BŸB!B?&KQUT@Q@EȔUkGQPB!r=ߏS׽>{=|*_{+ݮ95X|ŗy"2.OcQjv*\K޴Sz㎅sǐ B_1=]uP1$r;È"B!j±lo>A#pabaY||?͠r[bK sB2+Ekw& ˍ'6N,צ69> OٟTװxaiT^>.%?`x%z3\Q֍]GvsA~3SwaGŻU^܋ SHk(:]B#xWn+uQ+eycn>7?"E8mm[׬5F 7*F^xĐ`ZY̾"HB!_-mfڥ3s~ wa"~,w^JktP^=Mhӯ='?dl+!E%Zn_{ۄr6k9gE q\m!>9r[4QCϽS#}q9u}%ga|auV@O`P$M؝T̖R-]G?ZT;wƇ/1ͽ'Hm^=?l=u nF5X-çm y;P27=:qo Ce?U 1.A. dI;A)g_q0Q4k=ϡurvB!rV&M~ zw¢j1ˢtF@]UMjy{u=z5Kr DFsPz<tjLKK_߻Ϸ-V1;c 2n ϡSI7Xf|NC0P/d]hN4z:лC[*7gm**kj~*Kb] e 6}tJ Mhr䯮ߧ}Ʀ|,[)<-N;F@֖;U/ v*hފ IDATǣ5ɨB!v:6;* ZN{*vf3Vŀӳx i41? 4z\jW9 Z[vEQ(z +nwBqSNPTbk6KEextόԅcPcڨ$:! z[4ĊU,&:Y̢XliۃYAҼo5hp{NL/1x;Q@lc_J? B̶H ZT< 2Ò1swѵmE^5dsЬG\};0,c]Lcjr|gZ m-|=zܕr6lZE V,{I̴&ƶPd~>(h =$tfrk'1qj*!ӫ<UDsq&xNַ+C7Ha/ۻ'jf/LiKPr~B!Hmy)sG=BnnysR䕢l演C32 WW#.Vġ]7vgK iΔeᡓcO4;';"b˴gs=r4=SQ0 \/)uuԪ*6¯m޾VqD:agڊMhC%l,HEc3b`۱y2;wm2#I-۸C'ZF_:3dwa@F zEmRݓ?NrP"*n>dKQ=UCklq$%&s96ٜl~{+cH N$肢r,;n|+BJ"12l WZNB-}k7ObP~>L]Jt) PH^a5<kYeڅi.8.@Չ5MCۻR B!Vjزk>QKgSɜzKG(ɋZ1N#gMkn ܹ-Z7->G3N$0$kvJ᫹k~-/o2McXm..#@y6lJc*Ƿ0a<{(披j;r鹁/#1y&%Ą;e%Yi nOMׅKxV|J%luUlX8s1rXѨ칂0xHECX7]OK?/Jx1tܛ& @Bӝ!@3,[}szP^?¯p$`@ fǴ6<FuUwH 17-`.`o~nWy _jK/!(= [G[Sb.:Yþ囨hNL\ B!⚩%+{xµH_tϛ?k?:͵xUid>[zrcr0Ac;W1vztI%5ÿ]W όDBL k.WSnn^P{0Ѯcgn3pQPOᝃd.|;eU-xf5Ԛrí%l޿ >#>·Uk%ࢱ}ytgo-9_f[e_]A)H: $?3[0jm%#モaZ t,YزUTŪƎjW=-c~( ͚*h`PMGHuDtcpQJ@\nXC٬榧b:FRh2=/t綡zFфǞ{G^Sux&L>Gն,sssRN M. \wk|ҧ%-\hΓK4=!1my6tMT|*tQ Ṛ" M w=l2PQ?Sx:K~mzx,vLo>腗qqAhEq%>&Ķ9S\?NϾ`B>+WuץѠPIYUjPZ 3EyZqAӠ9q~M:' B!ZGS]~ufm1pmT5'hC0jpkLxllZpzO+ƅF u܂Z^6rπ@몆Ү>yGAEBpd^x mRgX:B(B!ĵ1_Q/d$ЊC0` a2c;cmhNE{>:Š@]_D鑫1MI߾M'*!^')\VWEOk W?)f2Rchynt8#U4(xexin#rǎY<3g'L5'8\I_ R {O RE%$U^buOG 4m:cc*vBFW7 Wf+ŝW[]8vTZTjɼ+MpC+ǸB!UgcXPm βX_ɿn [sUzM"֜y9\X]:7?bf]l-y$\)𕭎<Ӟf@tS4W7ٳfSݻ} PpW|@]6+LValŦgJVG ;sV|Ñ+9Zs%orՏo]8U( F7\qiB#B%&\p5hr"LEdƸ7ƲX1 B!Bkx?w77.o(+9%ٕ qu ҔÑ|;]րxhGJd$Iajq3z *.UE̞&h4~vΘwco>=3p5VHDtxY}3L2V 8?>|kIl7 '(h܌&LWZBAY &\-(*ح ΋-..}ft$zJLzg$~DgB!\y$x"AH i?RwMp{>H}g y9;hiTs{{y}kpoD{wr3#cWTHں<6C\#sD & z:v$pf nǞ9vK}B![m]5v6W{~AGdw} 8gfrbŘgD\%C(~g{^OkV4^{NhT]U#iޠuћ)Wn lY/G5Sv^71z]~Z>SH~gB!ڱZm\jJ]dMD0ܮND ~'ٙ[Dg5ef7(4z˨5N٧}*nTлz兮k4o<ѝߴM1{j Ը4&W&|B!VF>x ӗeZ݆1[d?d܏ic^UIoAʾ'<J+%[:;~Zx^Eح7AOKƼڱ'ڿw_3JNEҊR1 HWHbF=l߸c'h[>B!e mD䩨?Ӛ~+Xm[v[Ç+JxX\\Z)-pV! Z+.3Q`0nMҘN|Y}OlYw0h/Ah}H4w?ҩy[-'gwF'B!,S]F(Q sλ*baxv[S5_7.%'~L(u8-|4 :J*9do-SSfKև)46]zV ѷD~ͻC|I<|GN2d3fpӾ}{֭[h"66#G8ڶmFjj*Ŏ_~QWWh/yj/[o9wu'NtUWWӣG-[h;y$ ݻѶo>9ymtޝjGۤI;l~^xV=_|Sϯh+))!--[:ڎ9Bll,YYYӮ];m3gob8>#x Z`ю[VnfMhcǎYv ZjÇm;v %%"GoF߾}j5n8~Z˼N{m555ٓ%K8 HLLdݎG^^mʕtڕ*Gۏ?СCj:Gy>3gt6oh;v?~ѶqFڴiCYYm\NOxǜ駟wխʔ)SmtܙUV9rrr;wDaamѢEݛZG{=#GdȑN>|8Ǐwһwo-Zh+,,$))]v9s={S?ѦM6nh;~8;vѶyfZnMiimΜ9 4ȩ;v,ȗ_~O׏;驩l۶ͩߧ[;ӧOgȐ!N}>?t:tML>ݩСk׮ueggӪU+Zm߾A>|:~⫯pK/ěot .]h'!!={8NĊ+֭S~sϨQxj; `޼yN}zzz:[lq=zX233m6lm۶N5k7pS?;'|SnNOtԉիW7:ԧ'''; .O>N7|}TW^y^{ͩVÆ c„ Nի/h~utũOS<<>???Gzӹq>>$%%5ULLLZ5iĩV:jhjU]]h$--q9StGΜ{=  UVNM4!**QJbbbvUbb">>>Z pss๧RRR? UYYSNL?QVOTWW', 'sZ5'.u9S3ęZOXVl6ykՙ}Ժu닞{ kPPjun?aZ/ڧOKϜ{έեKfVg~|}WOۧ_8s_Dhh%:Zj'DZ5'wOKJJP{u~" O(ҠO픗;f5'Μ{|+QQQNDMM Zr'g˹:_EEEDDD8 UUVOչ+Ӌ dnX[剴K'6\N.ԧӧku~b`IHHp`(5V(c{ƶB!B!Þ=bLǼd!B!@ŸB!BHB!B!O!B!?!B!B!BHB!B!O!B!?!B!B!BŸB!B B!B!d!,El߹J;(zĐ!B =3YǩӅGl+3gaWf!B==M'$LV=z<OAB! 2w %deRX]]vjijCC+;G!oC2VqջrF$'E'nXeۜ'խ/ō7|6ml>l'u(W7&/bZPCkNyHVKWDOuK".U.OHiPb6-럖O}jgӔ|Fǣ/,|:f4젪@k"_ᯬ0e '1vvUz>G:wo%#h_XǼ XP:n}ͼ:y[D߆_P_ӟ Su1wI}Ӵj(g *k5lXN}ZϡwE$(i&@A] M25B!_S=SW荆*͚F$*'Mb'|Ϝ˒6,pf>ۥ55 =x _ v|͝É~ ^8|:ڭfzxCZK&N(8(9zG뀍L=ARD*&gÓ޺O'/EwofmE^Ih*D#ՀBZ笠&(g-E˦!̖|,?IzsZ̲?^WF'=4mS:xћIˏ{˱r2B!?[ +׭fmv69}㻗G?̄dn=99չꎛ/|Cij ڶ>;/3YK h\/2i+H{-+/4 ]{9 IOn&|Hoߙ[;Œsp3/|֖pX5 kZԮ)&7ox=kkSh( aUbۼUfc\Ū߾xx9Ʃw׃>n QjޜA\Jkmr6B!걋lv̟IikD 5L?zVK*V\\.U؞Sѯ-nS^qYEO_Ak~D6p6`fq$/I43!HU+8xd?U?B"^<" b 4g"5:'fUl|ލ'⓬d&CF xV$Ewfl oY504m?j6oAk?- 4S|7ƸO1bz3ӓ ҇M;bTweͲ{[;nƫҊ]D;3xiINSAhol<m*B Zk);lX2Kc0)i'd14A^%%S4n ;?Ekvp2@LzP FmyWj0j.!Yx9'0O{|^'\ڄi}E{jёj:=8B8Wro0Xf[j &sF)#'4?eHb٦,쪕:jn*{&" ;Q;NYG(AQPOla2ƼL*/OxW0otN%\hEqI&0IΪcsar5P~`#>zUݡ8lTfdڿA9gzu;?R2G⫥i)y75,sbbߥ J6m蕟9`\8ݾlڦ$^T" ETn>ҏVxՃ!@ nWm)*5۷|k[Fbm΃Wͮ'Q.l$ӥX[AS]hCiI dDZbZ>U!un9=ڢ\.;e05:Z u^±Ëx镯q]>LJBN"aE zeqX-XB㸰˿Nvׯ^n>fO((,Z{|gwv:QDK g!w9|]\yQ^‰C{6}@qJ*О3\wnh6ͦcX?YN2e fJZ霊"1岧x{o{KytZ6ung-$Xb0K)w7563:K{w!هv͇O 3X ahg LUح;AD&Ũ70spDXHjނ.KWR%e_*%́͞*( KP۳>2 L‚C1iz]Nhh.1w&,BXP(}|a nrznO*1?KScWallMJyڣDYAԱQD)^4 ~$uc(уx$Л|CQ<7O@uBVہ= O_翛s2IYĮ;rR>ƈ0|6ӟa$'N>Oda-'s\_7}/$EZ hygxי4k#ln/īßJAbeXN7 K FՓ `/cE6;;oٚN?nêf>޼S8n q }/:a ۊ -*څwmN4+z͈Q!/]k%6҄}kB!  ~ڈ-bzm~*ZFhu3kUHaz5:3Mɱf2y_ՀNCo]k:G}\qA}0&GUWWX>[>NB5 f%Qkty)v̟{0s57DRa;|k **鴘**o !BŸJ֬d|b̗ϓW$`8P-`q^qk1Vu 90xe輦DkE׫TI7,U"z#"\\{4ԙصvcs'<8pv*T*5EY'k=Ƚ~.J]*rYtza𛮈nW.NKusoZ>ĉGO_a]SNaOg>~z d{]$t}k҈R~> GQi6u޼ޞ6CS6M%`-% !B?MrKQN2u2U--)l_c^|m|׌ &ƶ}HDǰGPj[܁]k 3htحݵC4RIh88zg^ݟ[.jrShԬuG+g34]M,+f 9ƞm}R(=iH}jS IDAT;\=}H/xyZ:R>uB՝9{2լ'11DQtj/NVx $2}~f{iDh&W(@b{Zܶ5cED)| !BPg$ :.{Dd,ݤgבtX" 3O01}nOC@=#_O/':aA⧕ 2X~bg%_oF׀3itܓk1eStz}O Ztl6uњ#t~pAupWܵnժ]y>D[肻yߐȅILz>&F5]/]oҫ`lIeϓ]?Zz.㝤ӫNKGwq1lGαKzJB!s>8AL*e}i߾ tg2›|/82fHP>(s:|?|ߠVC^ [7o\P*C(q pjy嘂ñ<PSԄM@$?XqӁWQpee5NQӨX iʭyۑGfLua/]h1U191VҒLJ:,h̍="{4n`y O1?%o?sޠsFB!}2hh(f'@k )eeT*zBμ(LM@`33 H[ha$Ą%p|^V-/=cS><&pR?Fi1U<5ԩx's]ʚHrQ#H:J%42f`yb큑Ɯ4`>_Ʌt 4kpUJM]KA)xK1Uh $O` !Xos.z#&-$X|Hh|G\JVEGG]ʏeorڙ$ !BԿQ\͝vcôTLsp|/y$~*^Y3#w]m ܎e9䕝j\vUj*3]+?g)^!@{Iz7+op1uFZ0ˈ 8_%^k,!B溨[p:hۯM]8B5x&b~6&K) k7| ',cڎHx>ބ^qQRF~HoKoy*l qą)rI;5fRԊR7B:nw#޴h{@\sGG8!*VWŽU\f"-/& !B9㯸|R¹i &mکI9,B!B=6gT*}71i$ !B! FS0FS!B!#iB!B B!B!$ !B!'B!BŸB!B B!B!$ !B!'B!BŸB!BHB!B!O!B!?!B!B!Bᴿ~ c*3Y[ʱ}Yh"[iyÖ98U**z mS0B!oc+Xqʩ#eM- 6y ^%.TJ'u{ c)q9*W ĶO!iuKܒg9Wܔs(PP'91F.6B5^qvdI 92 ]# ;ݴO` Wʩ,jh凙;;Ryy\ȗ'=SKυ=|mB!ߖVt ~,j4\k4r:TaJ/JHN .7B*|E4`̌o_dA7B߱3? ?[s;8u| TϚߥ0tGLgw yoo{ |-g-}>F?'%GJ3S׳_(`KoN>eiPE(6}xi|OjflB!ot7'35T_œ#f3 Tc!#+.A=*@bܚ'o?ƝI1Nc6l|7>ym L*^7e'VΤ>2'/6fΫm>݋ }Riw&9| $|ƨJM6 δٌN`M7mo?<9in4ܡ-o~X" 'B!D` v*5չJmN#{)V~9tCPu}OWӞ`c5"52YVr[emj)<;*m‚eil9u&2tnv} Lz7al]ro?1SM<3nHi2Gҫ`W\M^z&mYMSJ5W/}*Yn1y.//xUs#Q)iF:^LV컂]S%0KrQֺjsŏs~AQ@Qi-NVd!B!x\NVz}w4:w!n^Oti Yt; <<.AvA[kҢ +Αxhk }=ԍPlvԎ ]WQp)*#qxԼE9/rp.9xu D[f`B :aSNTPp:ع /lmۇﻞQ! TT: ۳:?Ɩ7A`|BZAfrv2juBV/REQԬ7w~6}_xsBHZwx!6F dMxE]1˟eRS`ϼE8_;7윂ܯ毀"+a4C Pkõ]pǛLzz)?Ͽ/D:AA!B?~f֌1z Bygj^DŽPt+AF |rݨPRψɴ7GŞ)V%^/ϞhXOR4QK磘0K#^N=QCEE 'xl:=ҠB5V~h&ro]>d\}Y5?aƆG]]."P曫vjH鿗GZSޕsau(Q^ײ2ry :;qIt j쉲.2~Z;>5SJ`fnt`mٸ?+y7}  ]'N㰽^QOQ ҃0 J0:+HK;ȱ{pa=1`KUm㱧pVڇ'B!J4\tv1!Z dd{TM)^4u) urZ>#׎`峷ܬ ?-*8{ xw3j4 q[lSkjeCd{|l8G0wQlJF Ds]sG 3n ǻwcQTt҂^OJ|6uXvGudR=MCx2(]iљDn dW?ͳgᎋiy5⻸Y{u~KX(ЧU/ :]M %X׌Ĩ>]TٓͩxsM[`/dIvlMZe3:~#` %''9X?k:BɴlБB!Yob,Yʲ)4G`#0U@$b;pyi0ÉUD1On*%ZhouS:׼Vk~&kMĢwzJJoOM{sZoOٿDrr GVp(+ :.rԚ[I~5E)B!Ÿk=3mI)?cgʓø__Yz\8}Epv&J"C$Af":z__A#z-(݁zU\QdH[$`o@F!FNo]N;vKEqp֎>BNa%B؜]}9bTQ83O||ݹZII^ ]bP=X활T5#VKnI=kʬ(^ʏȇ%M27jP!BIaC2~L~ߏIGEmgxot eC+(U8]ۅ]a{W0oH: yj$]h,Ç)LJ&):= TƐ4!y2e\Xk'?ŻKfxMp7Q/v)xGR`+j76ktȢέ0Se:qhbs=_=]} ִ)sҽ|K.~FfEw?ݥ}fDE>qg71}qRTʀҾ}gP WoFFvB!qQA[3¥2,& ]+7 RcnA:W("^C թcr{y.iy'G̃r;'r)k5͉9*g-+"Mx2I!7+ʰ>T&deӁXJpX~dH!x:*3H+rhϊrJ1G$F(<bLu}8GV5`[96hQNG9'3Q >p:xr8RX>0ao`rGlƨ}256b IjԭQB!QktDƵ Dǧ]ߟ䩹Tɍ n4KٯNRԒGbT Z$/f[療:?̉3CPK" XFOLtKb 1Mg!vu|ZNBrBȯ[dSB!E)َm[g*7ӯkgJie!Bעu9,ko*gB!BŸB!B B!B!$ !B!'B!BŸB!B B!B!$ !B!'B!B!BHB!B!O!B!?!B!}xwܹ,^^3faÆ6 ؿM[II deeմeffJiiiM޽{8q"Nmݺu|7(RӶh"ϟ_oEQoYfMMb/5m7RSS),,i;tǏfմmٲiӦxjږ-[ﳌ{/_W[nil?Ç״JnnnM[ZZƍmΝL<UӶf[e4o<~GZ~O_M8}մJfffM[VVԴ۷'p8j֯_ό3z5m?#Yfz6ɓٹs__?~-77cRPPPvƏjiۺu+SN˗w՜9sXlO_M6͛7աCjڊHMM%''-==qQ^^^Ӷk.&MWk׮pBe7߰nݺ6ĉ]l IDATٳgOM[YYdddԴݧ/^ܹs}ٳYjO_M2;vԴUVV2n8;VӖرcϯi;z__m۶o߳b fϞ3?K,YOΦMjv;&L5mŤ]v RSS)++i۽{7&MO̜9ӧ,X |j̙O>}5i$vW'Ni&55⚶2av{MۦMjɒ%~}rJھ}_8zhM[~~uՙublܸѯN8pNubҤIڵqƑW'7oK.eΜ9>;kh׮ǏNիWsMg-ZsssjÇuՉjz]ub˖-D]5_~iTM?>-޽{\W6l뫺D}5:QW׉m۶Պ+K.mU'kz:Njjjjz]u?Չu~u~u^]'άg։۷Չ+W6׮}u:QWM߳g_MNW׉5ܯ\.yO,tƌڵy,+Vt(L>vlD6aÆtLII Æ deel۰֭[糣koD^#GlDx3l0M^^{Q&N3[nYyNPz0aW^9تdذa>;B~a`ԨQ~}uxժU>`̙>?Fd6lO;l>:x߆aM7"ѣ}6"ɣ>S+**x꥗^cǎ1~xe}vc( &M+oseZxF鳌wpf^}S'|Rg_.॥ 6 '''{g:tӧƍYba-_st:yꩧ| xvQ)iiiΝ;} gtzL2volUU}Oqq߾'33?gٷog~ɧ((ٳ}^/}`ذa>oߓoWfʔ)>yf"V`:t:]gW<>sZZ_|ܹ'`U׉ڡ\QMW'}]:}OVV|v~f͚W'j/u7&MjT8ƏW_z%:aZ=_M=z2mʕ>?*Œ3|S_eggYk[~_M|嫯=O+>cǎ1ay۶m~ub>5]Q:kkVgWEEE~:Q{>ի}D]5vG5NW|A:qfMW:1f>|Og։^xƍWkꄢ(L<٧N\.|M>F]_|w:kzWW@iNYGW'MW6m:W}jguUAA>_M;v_h9NL:;S'233O}^ά_|_6lOh*'(I /whԛn7jZ]<OmJU^6VeEkh4>R6 =]F?֘h2+yI_=ǹ{NȾ[FWi2j}2[B!Bq/B!B7 O!B!$ !B!'B!BŸB!B B!B!$ !B!'B!BŸB!B B!B!O!B!_/6kV'JZQ"B!BŸ6q'z7'NE8& B!B nf wLջۇ@,!B!k?KpM$02ˋ#%B!rsP^@3`ŽIEȩyN*mvN'+7 r^|[ n :V{]X.&z^6*P r!B!~ x(qqp ۬-)w\YKWMEB LamO"bP#ڍ`%)쭴>3|y}G.`WA)lB!BHK>f7Āc \Ѥ p' + xgb2t.fڢdγŨ%<7?3}N`GΟOoã_aL~^yS>`6_z_{ƽm#JHB!Wiclʋ;Vݬ(l~9ᑞ-0iu*›w$^:yu$.ƦNRQPP=Iq{/'trعŬZ)YLʅ=Ф+u,R  EidȫkXzM/ڄȣ5B! :t~Y> t>r<?2aY6Fxp*9xjgŃaj*d/dlT}#;  ^ޚ^qq;Xm6<>szqlج؝NlUZqqKY23ȻԸ)-%ڗ:ɀW"tZN?@TTK:TPUdB!B_ʙnNSslI> v9'Y=r9"@Yq#U&Aӧ3X漀nE z$C.[OQb+Σi*^7ik'ŎTp;O'xi,ݕ]ݒib?#ec{}K:MݭӞGEAq٩ HB!BOo%ŅؕԵxZ~m,o΢p$ ,(E??ロꛇrul$ԉ˯xn.}[MZCaoBXL*'{VNbnw8=[zaJ{FO));e7Ňٵ#wH6-px=۾Ix)΂^NB!B_ ](=AF:UW|HIPg`Y8'k53U^]"B:ڗ h53XjLV\r|9g;;oo+\xiACQv7|&~oǚ|L*[L!B!$UPhpt&Kc#!.c}ӣGigi&.%;#ܺQ)TM7mAتWy֤c&[h<̦eroxbͼ QVPȐ/sCB!/((,{i:m|nr㵖iDn\\;K}o>գiqRz|' ӄެUt(Y4(@҇Œ@p}:[ysxWMZ B!WuTs+DxNqDM㙶75ĥy : &~NDjhE*6%z\if'⛟'qt :^JpP (Y Kx|o%?|OA-pEB!8}.qn.mBQzbɾo<_/K˺^IZGv,lGZ] ۙUTp:618/~kzK^7uu'#VbCj&-[ a[A!776{t'hL^v B!Ǔ ͍QbEnӽS 6 T·f wt([vSD6::(<~R_Vv ldRrana'r46w3QP΍]Ru \ЕvѾs" v\BDB3֪!Nd!z1g>A\!Ѐ\(B!?"bC}O9b]D޴^AFve3\rc_UUk.Oc*|DS@~/wshG]r'NT5tieClٷi7dZOTLQ匧ƴ[pu櫢UKB!B_-t&7MUA# 5\q}+jZVMuݻ&?U(5.Ԋ@YB!S"_ʪv}x ?f*#o0;f~VSogqi.r1kNO;1YB!'(I /w%"B!e L A&B!B!BŸB!B B!B!$ !B!'B!BŸB!B B!B!$ !B!'B!B!BHB!B!O!B!?!B!‡(^D ︆F(HMvy.v ^FawkϖljAciPI_q~zp8] mashuTÆIaL~fwnGAk4W6oAJG:X4f>AO 1Nv+NEG>]SwR0ԵV.SUiuZ }}ōF7Z;'ijti*/Z ]^ [AoԣEQCׅ>|ۉQwmCS{yǸ{7By=8vFrt{^Baiϟ_/啃x|FxUZFԬW*n'N<*5:ˉKbkꜦpWMwpjmǫaS7CErV0h;V<}e VA_{QpjFSrp!}^WS8N\:=cߋJ^GQ7qQmqpQupE`@רn}4:L5~.Wڎ^'Rk1uha#Pf7zF(:⯮bt~,/lY>K0zbtm/M[2Fc|][K?8zc>{6xoemn_D4rb**m>) I̕r.p_&}MV2 CJXƯ΅fߤD=EG桥8t"Ofr3#_^:Wͱo1c5lLb ;7s WAv5.W(B9ϼ- tgm'Il#&r3R ~)[s%׀EL3]^gwt7Gy`L~Mc[>"L=G6㭒uh(>דI|"i s9}/|4hsПW#R07b֠ Fi s?8{+ ]u2~ه؏1fgS՟‘k)hR/$jhl UMa< G.N$$dǞЕ8~[-Y_Hg9Ȅf*͊'pxzmŭ+Y9Cr[H A0p>F|4_yu? CecSq3ڞZ悋ѷ#:f|6.((hZ&=1'0zwu6?e(]MNLEOy90"N9@8]t\Øfd^vJÉkhU &L_kj}q~DBNtVm!LC;3^jdsG1s.F^C#@t޿W(/3蕗xY׾ ϵDo\LZn_ͤ gyg4t)'u[!ٝv.(1}r -lQX5olו_.GB {/ x7CSQъ%6v6}Z+ݗEˣd~m>e;X\y8^Nw_&ANnAq1[ͱ7>vDgTJ寕K>c5'2p7+)G rD>;1xc:Hmzoųy7LWm+['Y׼oɲѯi-b,*$l@`~ ѯd%ʊ518mVmGʞrO]D| /KFgߢ!kGv؆m(6@fb4ļoc?NVuxmG3*؛gi.ӞþNbC=u[Q}ՠOa\P*_PȉSg8[#U||Vzd+(Y97Y7]q%a+̙5teا 8ybmEy6ĹMKf妃\EZ7rA||쫨0{&[sMkݙl,/]S^z,KwRH&)C+r V<:l".Y:;Hq*[t>uVQ~-_9\ynN7<$dtvnpo_׋iZxY e0jؕ$6F~RN>Bx hJF#fOy`<@I#YG ajp O}i[Kăqbʽ%ڳ0'q>l {DZ--Nb{YG-|niTjYn r/ܘ١-6ݚr( F(If^6o~X+LlRH{Ф6mٶs5S]޳1Bb*=)rb hb^lJR^z/3tz7o.NS?"%LbE+3Ҵ-nޢra15~c׋XA4-(JUb#CKoԁP(sxwn [7<ٕu.ei^?1&ql݋uQX,ؼBXSȪXb_AQ9-{7NMȺSx:ڐQAf*ءTu4Dy\7y{GmH*$nk9wd#qdtO:#`?2oAIp܁u:5xV"(3)SAN2b^WҴ֝q˯ ;(?y5lÅ ,)iɀ`Sԝ&LFJ YuL8cs.sF4]Fɣ3?р^?ckh*޽m$Z&#zd*YD&#FXb'9u˾OSO%oW2>8jE 5@XgWVĥwϡ8S]K|2 oW SZr (f 0=! v-yS¹~K:E{gsXSb0F %7Ӭ6V½> ܪv,m)Eɹc%VItȎ?8h 1ф<gJ]F={mtlPhpVaETHQǑk=7QX\ 2kz諵Q{ F2[/f e3,jIE`*y`4b0E1T<-xV,DpX ɭT8a4c4>RM=>gek,Z? ՝:8&*>wOPR'oc9$ Ue34|9몦ԝͥ 3>3KFߏcؐB^te-:Ύ}W9d:>L`nMS}i|=ը'=Qk sro "ɥb4k@h ?}Q".D]q3tW>tgt{8l_9]̼K{p1e^'P\ hQˊ&=vY[ߌG|\m1H-v0mJe-h6pS㈯ƚrNNXI̸A>їRcI9kVʳY}ɉǂjae!%-43sѕ3( dF (PZӉĦk],bNe}Cev}w}W0O+-[,6/懓cA(#ϡ[D]jugٔAvTc\7HL%'-]k?hz;+0T0^ p,iKeG$Ҹ#e%*H~ahw.UeI&hTV%È$bS9IMN!Ś iJC&;ez8acBVbmBoqppMQ^ר5zs,! Dsn޸6%AYx9ac%Hlj14BVzii_~JY1b`#Ԣc@n_ʍKY4p6V_jńXTd&>%Kh;:zk$Bjze9餦gQtr=M̘&PhF ޙN`J j_ĠO࠾.=QǂZ~Ȏ㷵g\9cSq,8ؕm{\Pi$?A0]q%?6&=l6IN!Yc ?m.\Bc#quQ?,{(OJ{̜m [1X\aق2Ô"ʉ Q)F%$\78q0'BP2V'3QDxWk+MƵ U:l}ᡳZZM9Rԕ{Z^7Szvlr!NdPbWNΆp&b0k~B.Σ7.:xc }^*f} ʧbgVN:q5#T8f7) U dť7?zmzӪcPMtr3X?k2cڰ+~q嘏?5]177ncc@R-ԵCps-7I:ۇfs\6hA;gDNeNd18N@cMhf2si&)=y"*B4l$%#-,Fc>1jfLyP{~ۛqVVfE_P'XbjȮDhIi7|!A1wKE4#%4ess4d =F@fU~ҁ//ggc_,Y.Q]"6fyqOXûûJѫp3bѓK\ YtFŻ/S9}wsN0,Nɢf$VzԤħa!+6n0<?pMLUĄ>+z9?,$bW +@C9(XuXhB/aЂV ڳ/ĵ~ՅX~gǽET Igyjx_Ş=,&e^mJeAv,/w'Q̓KqE4^ ([)֬ǣe]loV/Зظo &D]ZávY0t.:v>mN#S`>g!ȶX,zAuǪƒSA쾶< 5-WB_7;5M#Dl\V߸ ׁtTZ^n#x>aԐq 0wvj I?[d>o* by*J':eHH$)&/-eо㆕K'ܹLWMbB JӃg%bڭψe@Q)K`1G%*:fgЎxǐ 2F@qusck>LLCA~V&>;ǻ0{鼊Ͻ ^{1wgdՁݝ{L\9RJ'뉇e  J%M}O|:} ܑ݋ Wx8"\ SZc'YQ Px#/Ԯ[D\SaΨ4 &n:ɜGm<Ń-k՚cAMfM7ʓQu3q1mֳ"Z2석y7yd_%/7i1f{1ǿ1̬c9߻r&#WnbIˆt LUa9J)ĶRH~f,cZRTi4P2kj**Z(`܊Dy<u7?Hv&5 B4|\nuNy<?"츁?Nlm>+hȭo@^PAhƬ 3/+mFFwU5j0V[r[ C]\=!o@UfPa02yL5>Lv(<"Z̘EYAyExch@7~J & C&|{ u]'2)OBjiő&Ysv :߳֯ϢimMiYW WckU [křĵ{,鎰3=u&ip7 ~r %=&fLj@w`+ƿI|Q nB ;HYk'SmX<) E l3W,"5Fk;F<{s^zI7byg3A8ܿ5vN w gphW<o[أq3&K~ .)1?]ǎMS}rx >& vJd ֞2byyͽ)+HM̂okWE_PKǸ$ZLUg]?bflFܹ ǑmE>OkW$Pۺm[e̤%]9?t^-̼ņqĭ7?("SP:ݲgDF֏HG뇊uE@.ww2}AZvF䠯RSӼsk̶sSH4wDŽRͤixBN,H1g ʟh1GVE@t= f[d ~,wA@Ow?nچgr|ca>9챱.~Pw2VбN0MGDbiuZ4p|E̷/{hW&c[݊,p Ӫ[ n$`*-~;8q+I+PBiÝt_X}ɸûjJ:5cʐO$&qn|̓w2붌n} o])7˴?W&L+DYhXF9"Yy7 ԫzqKB@IO#V%'|PL~o GC]":;6I,Xs6݀5YTѨ |vi4 u7ZТ OZ <E)U: %\R.g=GNੈ:Wl['N}Xt&g(i>憗v  QVՑDlBݿI+aw-w2ueԴ"2d2~EYԂWwr:YG@=:,fڛ,~W-*eT(Q-EK厈[0s5^U# Gcsװ؞/ߴfE|-{WD}~jC[CV2 u^@yLZfei›*ͲFx{AB3'g03LzLQ^.E@vn>Z}aY*9Wjf(f}Yz< F&y9(XU~:PŌ`ФlR)֙,ްvic'78Pl1_Gv^LĶQhPVך23}F <ԓ\ .YD- ;'j E}Gptc^[w-~ݸc=x?ũ`|y3V]F0 \r^{Ntxw 7oZR2i7V奧LAʰ(Ɵ&:Ygn.e EǦV-Pq?"wb۝T IXh2JH 2EY-frh-dHM08Nvb< $\Qc3m!mbd*oGۃrjw}ӡgn 87[5 +l"w}?0_nax;]>Kcٞ\\G&J2Xp._"} =mʌyC *Z+R)x\Nn^;pچU;-Q}_\[fjcM,X,MY2AYol2P!Bf]7tk0\K$N ~IEfrd_boZT<@I:t;%J0EEbEŘ6|2#M|2gwżwgFbq~MC2!G0g) ёU=(6MH#?mvۣA(?>dr{\ XP„e |Ч6\Eki=n1kۇV/g_Ljjy+z@x)̞9rh8>IjȌii\[IOܩM6Ovֵ̠H<|2)5 IDAT,-#l(~yh#dn6hA&k ~Mx)y|sEĤ*ТPdk"Q'෩sNe *9#fOd}W3 oo"2s1/HѭBNͣc9r+tR&FP51Uie[ pf݅+\Quy\3nUK  KEh+"1AAXwcˋ x.^<Ѹ6^+m%$#1{Y>kΠv.#*H8΄=X[6ό9h<'V"x&m~:9f!>8XUv *Rϟ%4(dB]yѸ܏\\faa,׫#6-Thkxb⛉"}#P6fIL]S?NG?ljbD~pk<CZጓ9trWn' 1p<ntP3|c!-*'{P9!^r*Y*pIIqێ\2S󉤅舾o/;O{_k]Ex0W?{| t3ǸtvdV&Es)=Vlw׫kL jbI' E dgeK ZI_gIw>w8-~яyѹ[c~_ĉםLSFjF SWc =.&C!gOn|ǘnP߽v8=OcOgr.KZHVj<jsg8њvwce+%uyE{0[clh"7|S\}~{y7`4{ߗj`(a=33ԝ_ sb))CdSڝq;kO6w{~=Ys3uw7~zUOh(oB_ͪ {^z7-|}WU`\Yq%jau'u^ {.ƢqlB-~ yqc&0֫Cm=J }#ܹ'0c ~^A|T844R~$˸[UsI->&I\1xC^4||@_JmתMJYQSJc@ L$$Du{X-8m;#ܻ xiϒ$UYEAi}.3Wq.`?"cڌ>J5(rdDqLm/c;#'@ų=#?lJ]IHB,2P-s&)' \ S;ե+Jd2=g廍qwmOpnjܾyS?0'>~&1cf}1o1CS?Np pƚY7LQ4GN6nv3-l׳=brvB%wNwty\t+q ܎;̌k8<0jtSvXJDrlH?mK+yMJ-sYV\c`:%z6~3yqH~Ne]iuw-iĂ}z3t!8_/ȡQrsJ|F!T>x)7 m)M8g|&Sk9 t,Z⫶ "̚b]W,xqiӣ;.r5o ]%b2ys*P-~^ZձnW+Y֢im*?>G+ ءjñ]-z=,[GG&vEa-CV ų ^*/{ao+Օ]Q9OަW |9űZ' QKƢ8WDs]YA*vΏRhcuK,!/y.>_ $~K4 Y0oU5qKz;c&/-mT ҡ K7mcZ@eeK)kGX[jss֝w$Nmt.t%!ݟ9O0&yXE\ҩOdiGn[y·?, {_ ƚ:0R."̛/b`!ˤ$-}t+7∦J[q1Y9r}Y݈0-T;ԺN.]/ID߾ɤ^e\,V^䧾Ba_ Q.`Ԝ#b-q"蒏1tϸ dth#:Q{[uhUc^(w:}*hAkP+| E:S9y;}ߗ/fobI0{><>qQY?*yI7(PѭK/jLYB)Z~94ݙ+[60bV tϚ~]hXK $q!o|NV{6 'Lz9"K0k1#8nFn8K WqEϵ=?0sͯ8$:4XF!ې7hw#iXYBQ{>4t6K%>f EM݅uELEf0iP+3S8} i+h/=]Qlڛ1KtU f d*ĦQnR!RChYz}>3f%2B #y Xa&rone⯿cǚo`Vb(3 (-ِώJ:zO<ݍ(6>K燕3+P?+f;R8Km x2۶펿 -D7-Dey\89.x+z#7i7E80m@=O[_\MGDb&r3Vƭo=N_ `Aނ5-Aaʤqθ;W,^y9&3fJX)k,֓41N [3ڦ.V5Lw 25xk'4޴9nxPUG;_‚[u\ISq5-ڕfE J{2@iw'xE{< D<֢!ljwC{W1Jkdw&d%,C@@LvG)(pkLOHԸbS钣GO&a.eAp l"Jcd* ! ;󭯥RwQϡeP8>GP]~h$[$W#`[!]e({Zw~ 0O]Ag18 |]k]@%.V6n3gB:f̷5ݽqiRCVZ ,D=-i`M]l챩DΖ?ؐai+V]rJ5m k炵\@e+6Hޚ{&p2M,LIHt~Q4l1/o{+Ks<Dc ~uژD>JW?G!P@tc@6:h ):Ad +Si ʥ._C^ϝ;b1{܉{\ֵ۴"]]jpy/+jMO͂C&S`^L[`Vh.>K1 m m`wQZj(+d}8w#9߀hՁah92ڼ lk3ps[ZD z-0Od2 Mv3wDM{1YsXjBڷCmrkGJs1C[:'Jo: DjzK€\z}ޅI ϡK5h.?R6a_xwP]b蹐,|4sb!D 'fԤf̛@0g:r8v#:˪ۨغ y0KXb4vVDMW;x 3#iL2$=\|uvbԳyԮtv;𪈎OkzvL?IKkO'?i xAF1~;xATD{a;ag}>>/_gҔi ŏh_MNI<7 ɸFdPdzoF] Ao%$$$$$$$$$$$$OBBBBBBBBBBBBBR$$$$$$$$$$$$$$OBBBBBBBBBBBBBR$$$$$$$$$$$$$$OBBBBBBBBBBBBBR$$$$$$$$$$$$$$OBBBBBBBBBBBBBR$$$$$$$$$$$$$OBBBBBBBBBBBBBR$$$$$$$$$$$$$ʟ(őYd2C^^^3NGLL ZY~~>111LgYYYaXJ_wINN.W۷o^l6Knnn3@LL EEE `0>!66\,==۷o#b鳤$˕->>[,bcc.}f4V%&&^_,//6 ..\9RRRHHH(WRRR?;soִ={k9YYY߿ᕫ*WG-U|r*!!'W)))U^^is\\=ƒ3GEs_\*119Wst\*==Tr땫933g{.֞ru\\]{ sUt98x`מrUt).Wŭ=%媴k䪴u\21c'vQ7zb6m29r'6sL,O?7tzb?;rվ}{ozbyyy0ƍĒ `V\ڵf߾}آE `RSS=~'W/֭Wza p|Xzz=ر[fLbb'6qD\ :Դl+W{y=\.Svm{b0ӦM `֯_mٲÞٳ `233=/^0`ۼK.1O~gO,99fݻ `-Y&%%=zL~~'/.]xgϞ橧7|edd̝;;x̶mӨQ#O>O>^袋|L2KHH0Yn'uVzbs5ľk=榛n+ 2ħN=KII1Yd'gݻw{b˖-?O^}Us饗zn3 Z{W_ԉٳgԉ-[xbׯSNSWz!sz=-Z0O4iOXf'}vXOl޼y>uoՠA_5Gݺu3/O5jOM_h'o>]vyb+V0IJJ~o:x=wyyǽra S'f͚9rfӦMƍ `=͘1çN|gr^kϣ>j.\kμ>?~'v1UVyb;w4ٿ'pB4Olȑ>u3^{W:3x`\}>5}W&LiӦWzmz=ժU3~O>}OM߰a'yf>k,:_`\+W:u2oO;vOM_b'S/^SG_4W]uWnOԉ#Fyyb0۷o֮]S'&OS'{=ӬY33>Wׯo>#\M:7?|ġC<9sj>k-5G_~yW|O?S'.]S'-]ԧ3'W˽q-'x'WÇs:du~?0~W\}ᇦA^z}畫MߧO<٧]֔Ŷm[7|b>m>Ҕs\fϞ=^_4ZrrrLLLWLOO7111^ ޱc̞={&ȑ#^Ŭm5N޽kc3111^ 33xm f^ M\\ٻw"xA"\XevU LLLl𦦦QBBٳg8>U` _nٳgR[nnns{U/Q*0WE\"Q\m sUnE ba~*UsZZOK *##g{NJJѣG}r{VUVVORRR|rC\=U9*.W޽{}ruSkϹLkOa=*SsT\W' sU\(sB\ġCJ]'.~>DisU:q?N6WeM?:Q\Yu5:qjԉ\ݞՑ#GJ]ϦN.WgZ{JSK['Y6isӻhڴؾ}S#@N""""""@͟?Q'""""""jDDDDDDD͟5""""""ODDDD^! IDATDD5""""""ry{)fdO*GqfYX5oN۹hMe73rO?' m#nH۶uM*Ԉܼ$oQ5""""";ӑ%#Dz}<*Y.\.'mHj8.,?pQχ4rzL2EA;w_ђo4&2bTևƑޞt=iԵW5 f?S6Ewݷ >';|Ĝv lA\uk?noe5!9,}*VŐ.l܍Dm4'v:.ӷPŦcWEDDDu]?raC~A=nOwhx<vMg,uCRر{?1aaDJThA~ߓ7V#sh )CPMW4Ed*e N,ezaD;>~4eop)X9 %4{lƝ]/&a/Ls*""""EW<W}}`,?Og}l֮\Ei<Z L^6Udߕt2=n8[:,v B#"q8.iDT%.Ӡ\`J+%otjx|?3v5_KӶau/rRPP@f]nʹtAI""""rakll~ذlCv:C eu2VnK{œ en7מy?3kZ7jXI\!eaVo 5ż)8ʸͪq1{^i5һS=Rp N) , u)XmZ3DDDDu1rٷs{_M°l̵[c{ݑ݂7b u~?0?|s!$>w6ߞSIcӚiL|;7EO7%g$-Ëv? 3׉ffzq'_*UiZ*~g[|ѲsMeLr]p}fjreI$sa8q&〰y{KnTy'71yX^\:ՋîcrS+lܗ74&4ݴe <:i}?5]⸶EiM^|; Y@꺔F>䷂`B]_~]/8$=+pAzJO<Ϫ1ȟȮсap%˼U_G_unR25R"‰Le/ۨQ;S&eR?~.fϤ<35zΜL־؃G3O3lnidep9L'mQp'G խJX!7{?BVu X&,H69))2g̝#Z̋443-3US'5\0\~|p}Ox7C71o!6ꁅM@ԯ?,iM;u7+~{IW1p@/j`a5h͠-7eciSue {iG||2K&Œre(NUGA.ouq|,XïCs6<ڭ6srfGx>|6THH9 I;YraZ9DDDD+LƄY0Г:@|3X>.ur;R_W巹m}wc*}2+u4!~.MHKsc#n{'C^}N`7NM歷2+Fwsl3ë'v8ۃ7iO15zG-yt/%wӻgK+2gʅ@vv~x?|êQ52 bؾfe*zk@wN `Y9,Z_cy4A=66η DoqGR,デ^}=^0pZ* =8]֐Xx 7;ش}fvv؉ḽTA5+EcR7vmi^i0-t[coTC/q] 9y۫ ٬lnZǕv3yMUB=`'VsZ~>?ƃ77\xhdck Kz|ʤ%;}Z;A@W6oE?ⓅXFE݈^2~{ڰm{Zd)җEӏZN픨Pm/ c޿I¹}ԍ(Ӊ[* ZM?Nazt^6c[+'&ѵaNU=sD֠5ZdίԊJߎb)8GӲO7F놈7&~w;PRΌ\9@GޝŅ3a[lxů ,2NF-hչV >'7F5Yʧy8f퇣5i^376b9U3n[˲H?˞Osl+n|\Դ5|o|TGW8c,[y/t5Gl;R)f'0GmZ4n8&/j\gk+h'8Izmb̙_'7gԋ7Qf{I5ke`m9C1 оp[aEv4\jDDDDDp8q9NxkIMYoN'w+k  rp:N Cy5g+rJo].?=F AݗKE~rL%40y_7|9q={A9ŏ[`$+r-O€TbB^a gΆXT!8߿ 9}3 :ӓcs<9w>{׍g}t~k,eݎ{edcMJP/?FkZQO":3 {:w-/ /&kEGӆp<@3Z5?HzD:[֬'6 4¹c ABrNaB!K ,]S y @7%^q 2H:>*G 殘ςqO>";)uW 7Y}JwQt_Vn8U رF.ÍMVL6s`}x0{?`PIb[1ᵗeEgJʔ +9" F"H˺%1c T [60#6_u="µcE(t𧈈5vu¯zu6 _̱aoPQ- ^b"l^rkphY%8R=O|KBNBj\ʋKgSC}jsSqkH][n{U:С%\c v_e̩-ˢQ|Z"BωrԼYڛ?UiPڿmdvk\C>(_5+= -q ]KژO8}5IS&f~ 'yQO:F?i]&CJ٤7M'6+-(rcVp*׬a͟vعt+wUJiohxI;@:uu_6vmHh9//`]<Чat0Y6isӻhڴYhKX67 ۩]1SXޏDVay_#+f)5<~ [Y0'j,1X63s}=˲:t.!C>ym7ޗa v19u)6zsJ` 8i*OふѣFEL*~Z[?vX6lnG>¿cwpQ9/fŐ}ϗjcmL<g?˲HY/'T|zUMO$35ݟа0n-qIVEh?:N߀-q###3ODd\hyno?_qbה=|6z]N$~GGIF`H$! .wndADDi eQzʢ4""""""jDDDDDDD͟5""""""ODDDDDD?Q'"""""ODDDDDD?Q'""""""jDDDDDD;g0n6Mc 2`ȅtE[A&{fƒlBhjʃȅL9YBǞrK][s0v%#ǭ!n޴3wHbtcvN ޯ̬|;=_C=Xv5nN G­wĘ_F#9 )v2.JVbQl֕>FFeX9QkW.w9 g ;3ǰ5ّDʯ߳/*;vptFߊ_Vb*FR? `D`U{NOe4 Gp;d[J vK1xY-.e۝)W. cmQɌoKKV_Kh$AXGYFb.ίxUBK2صt2 7ܛjCttN߫JO)u w ~, fb#q[@cEDDDD|\4eB`Yc{viV`/Yĥ&ޠ%ͳ{߱&ۆͲQ;y+fAJ'ZpԠeٰބXv?"+T:ȕqKyganZZDSqp8aC/൧S3/n, !5=j^9_; Kd,]7]K0uܮC -aaa%׶'#ו*Ia̕wE{*W ??;d6gɗp\լW4ȪY_r3ؓޯeQ?YAs_B@kҩv?Mӛo}͊Q _$RUMHiD {m̬#n0_Z}DDDDDJEg1 wɭ͟ifEf!勶 YYdG۵55RPaWN^M[Sk-0^M1I `٢ED"([fEܶ^%;a/c~EFT&T͟q8j*wgaO`xď$@&NNҦa/Rƕ6e"w4Nt]4EѺKG \MڡuԪڞ;hy(Gx|G:ʵκT:;>O|θw<0OjR1c:j_V*N;i?2-b>=5 :ЯmWkáU3~2f:SX>c?qƑȊ_095ϽGODDDDoq[(6]{2/IZRSIywr$X5GA>uPdϟgLbK^TP-S:wז "n2;pj^RkҪIEߛ)W*a;cɃVEv #쌏u`OB :wH`lef G?q3חr%B~QtlӉnS66H!04+wvξvgHt,HLegrzV @Ik9?ۙjDDDDDv,+N>Ϸ7 IDAT]%ZhUO˦TQ=cjէVXב5z(ƕ 5aϫqgmbuj *4hz^VLcc}MxכxT:EVqF7DaY.r P%}%vlRc|:a+W^ӎrv>u"""""Eg+G7ˍKh1"U'Tl؁G.[ϝS>$\G ;wR8Ⳅ̉5a"vZ6 m8\V>b,*eP[>7,dϬv-5"""""Dz Hw٨_zw 撞}Yy |&6l;ʠvQ,YvBC(yn?}P5ЯKe9VYw;lt#MvtnzM6jrԲl6]ODDDD7n,31ƍ^8v7N9 On 76ͷ4}9噶o=E=Q㧝z"""""3,ˆGY 4 ɕlv{{,2N yx"d""""""5""""""ODDDDDD?Q'""""""jDDDDDDD͟?Q'""""""jDDDDDDOS """"",Y^%nԢkזTvkwa,R-]V.uV,]rag+=;7'<ػ-sng경8êqyۖԈW'"""""l^;nKœrKŁ\t~\Ls6maFp؃٭mV&hf deԯG" ͟C3M&ips5pxsŮY8T['ރ47S'"""""r\9<9ͩp:z<%p;cXٳ3nDM]);o|1v[U =Rƻ/qUD(v[&LQ=-3mGafazV?oKg߶kr# no3naɦD/\VvsՋt~N@6. K1;v`JT4uv0sҞ6'n9DpB##;?3n2w CjJh&̕ڝXߖ_;9COi#qV i.=LiZo8(Р l젴,)P'""""">pb0*s\N,DJӮS‡dqt?;^Oѕ7s37҇y)Fpt8g97DRj:֧Qp|j:Gc00` ~[U95"""""i晗F;)kS߽L2-b>D-v 99ILʘK# 7N|{y&'=ӝ͛YRoGѝ|V`$" H:$d'$~'^՜ODDDDD>i֮3\%M^(y/z34>2ɑt&&[ўS{\2VMЭy{.WV.Y1\wSu?۹o MJ ѼN._.خODDDDD6yo9Y'W_BbI-zpxֆ>=3|S4O{~#q#^g]Aa|NuD`?X[o%&&OvI)۩Biywa5]Zf DHZ˜ٓYYV>GPд1;p9ϮS'"""""&w3?ޔ~,KqcN<&=2@Vί)8MuPNKh@ Wx+N&M%* gѤ?߇=jbE9Kl˗zYr\<;-/R8άnոjgnW'r5TAY`\2SbX#m^,T5\.iٹϲj}PȅΪt<=[SP%isĄѤqGzg_G{ԲH:g[Y]p/'c>̮bhZXܲlضScىTU#X>doJK`ጙͥwzr6?+,Јޘ|?_ f| n׌%f4n.^s]peX' ;HUbbRzFh\_~E #_k+נJٷp֧G:n76m DDDDDDlraNy 'Ni.)"3߅P8a'Kw6B,'+v.,C>K07+\g#$2d5}6GH(FPHxʕO0N7 ٱqТ+aOc (B"ӎW[2i-yvƦODDDDD|5Xto96#"""""ϧODDDDDD͟5""""""ODDDDDD?Q'""""""jDDDDDD?Q'""""""|t:y7o'Omݺ-\/ :u?3;nW_}3fxb<ӬY;vc޽ݻׯɞʕ+ygĦN믿ľ ~m&L0x`,Y≥1`vҷo_= 6O͙3_~|^s0zh\K̝;'`ƍX\\}0`ŋy(((Ə;#16l#Fkƴi<\}G5+W/2gIJy'Y~'O߾}vAIKKĖ.]r5qD~m\}|^z7_r5h V\%''ӯ_?v۷~q1Olڵ>1c*.Ow_~p8xYp'ٺu'vaѣG=͛73p@233= /x=?8>cFr1df͚SOn:O,11}rOl׮]ߟTOl<{b'O7W_}W_}=L<geXjj*g׮]ׯغuxꩧf͚Ő!Cr5rH>9z矽r /0|:1p@6o9rħNlٲzՉ ԉczO?.W_}3gz駟fڵ>ub߾}XLL '%%[b +o_ԉz'zj,]ԫNߟ;wԉOl>ubټ^5j}O3fOM}Dњ^X':m۶ͧN,ZȧN7Czmϟ9~O>}OM_zO(ZSWZSӧMVlM6lO?~OXxOؾ}'vA:a:1w\:1zh?ԉ9sԉ 6ԉ5}ǎ 0N,YħNL0N 6o+W:SNg5hXfO>}:W[>3\ :ԫ։ubӦM<^ub޼y>5?O|rxb >ubΝ>ubٲe>ubҤI[^/>|OM2e3h VXብпbbbN['֮]S'fΜ+|>uweر>ub>5}˖->uȑ#>uL5| W^yR~։˗3h \M27|k{>|8_~O4iOM_lOM/Z'ʯ0Ɛ5NĻnި"55kCu:{eYDl6qdffz-ZRSS>qnRRR|QtQ,\nXŨkSǑ^8Sq…h/\XR\Qq7G.TsU sU M\.Wst8OrUXNGJJ6Spx}:]BCCK۞iii>g??KiqsT9*n{..Wnϧ=Giru8 מS砠 9:S rUa*tSsU|e\ﵧk>*i9u{ٞO]{N7GY\}֞|trU窸\qJՙ樤q:G<8\}թ5=<<^Z'[{>iמ>Wŭ=nՉ_Kp;:5W%}G=5W\=g[Ӌ\\wԒ>Wg=Wqu\sY{\'4߿]tkϩ- #MvtnzM6ӾP۷1u3N8ascwST֮’¸y4SҴ-fոjO x鎎4R'폙?n5f}=޵+-#'ƚUKyxy<ݽŮiZ#R[Û? xó^??e2z8kʆQ6g |:gy ύ4./u3c|_;1ixڕoAOBREJR C^dwhl[7ƎdgfӉ `p>0Xb~᭼޼y5ԍF$"""""/']ތ5+_ү.&!a8j+_{fo6ʃxvB&>LJ6WAc? ") <7}שJЉ;֬@ܑC|2щk执` Ŀѕ{3<~81r cNs6:@HX'N>`p:8 =w3֏իz|@{^6YjfJTAgHv4~2T n\d°UM)2<:}2I&aGAZ[T]ZzVVkբjq/ȾC3&=lC{y?;y2sl~\^bC༑9n&p-\9zx!!%5QԌ=. o[>Rhru?[ t-ϧAIgRoe3tqɷN gC,:.=YY[V"i~o?rjX M&aaJ&]ϕ}sHDDDDDKB.{\9xfN)hR ,']Xr}d'/a;N?w{LuJa+Xqt;.?_xM}ɓ2&f k̜d}=Htৈgw8IHlDξ*Ïe,;#*Fr^gi̸rƥ}˛T^ăw̎??Ocpqz1_6%svA}fJCP5|;s(}/_ e18ݮ7cHlfoȆm0WkYA-y ?///m\_u_ñ'&wt=Z-_}O8uT Wq[VWt:#lkm+d uIbƒmODDDDDOaB`K !~ϣ?s1L靆&a%Ei;t߱_N\oL$=kYvk]1xFby ̘r-w^4 wR'fͤӓu{ƹ3mh (DDDDDSVS^<~kظegY8-^)2B͔T5p{$tL\ Y+Vjڳ7ϰm$2)z"XA'pA3tjcm_ӰEt܄ټn-|†-}gGDDDDDqk֬f_;QP8;F9CVޑ/:{!zL֠ayMN"r.)>3"""""g&QODDDDDD""""""ş(DDDDDDD'""""""?ş(DDDDDDD'""""""?QODDDDDD""""""Qqq4&5VSrmkIOXSA')ޭ HYU1 K%#щq@Zj6ɩ]mje΄dR݇܋i:hSWOueZJ>$b3~wՆ%w& QYQG(f+x,"n OB )>QlIl`8\0:^p;S ۚ-+7W'i 9)W_PmeeU 7p߄!'s,M˘\r 'w\0#5؆ 6~2+}!042n{ cm¢O?͓ڞGX+}1X  '2pXRp]_/ϭ6po~ذ9V COq|Jh:^_.&mי+κߞ^H^Gܜ8j;Vak"""""WU- i¯^${m-ZV? o.^N)'bn'A) ]˕wrE>$!)qlw2?rÈtXy6?3z`/0v @QvP (~<_1>~/Ѝ.Y<>0cQ{a&O,-e{B&ְpG }#FLO`3'_'i+;wU3`Zb&Gd{b1jzfvL LjkX\A녪*>p3r*gK"""""BU׼eם֋Dokb8QI.W̿WT2F?? ekBaXϹ/6kg=а):´8vPWwWˬOgbWʍdiI~;Hubsu9{;28_ (FPKx0w>d9==3wU5ŔXj+Ѥ ; ԡ?ڄ-,B4ztR ŇlotsT4~̇wlVlaO!Hw4. %>HgjjPe!>%^W3YS%٤I%3')d%xXY[NY`so9Uy7}JΠwLJ>'NM|=m#T"g?~ýϜ tOOi} 5QHeG]iY(FW*}ZxXǑ7TS80˚R=s'QM$>t """"r̲6Ol &{B6CFHm?ƨ*-"0?/]l@و$33%"}-ΰӱ93^j6TRYd&0cJy˙m :gukc) uDD 41KK揧q] TISM$o@~N;QI)V7p}uURVلO@su:'wWIDDDDXpK+^ &8dDbQ\sÎ?4)_E[aN[ٺsž"y-l} G}DDDDD9a<ٌ=TҚZ N88 0##1v{ >}Ͻ}R0@YMݍu큖X3klcF 0-YSG̰paf >W Ec쬮WgQfawa5b2J>.: C,z#Ҿr,Zvlr| ,Bvr۝vҲaFEGkܪ)4'dN-TŞ#IcD+^èl.A\.BUP&3TGyc42G lYeN^QEfB"Øӆ=;.HL?o7n x~;{!ُ?GEFGR (.1  };qԁĹ?ڏ 멮/ǕDzh 4KA]SDDDD;yL4IyGpMn|9ټ7rb-30=@j>^Vl[ͪ=㢡 B'zp:$1p,(k ל[WdɎٽξ ʧb{:[9deΞ?q+򵼻̴I^NJ{Ţ4[qzNŚj z-]gMio&Udv0L(1uc7IDDDDg߹%47GehΡbI.}\?ɭ&g0f\|︆&\:d7_94cDƆN@{kQ0ct5~r9WK;!i21WC&Ix6 !~/i#͹;H|wcoyl\|OG#͖i**z1їء5Ք?_#2b=n#==։7`m2= Dxρ Sy˂ /{ƔM6]cG{~5p _@ʐ${5,]@$exssb^!ebê69^P@!,j e}&q[ ,]_ V-dIc&s\ϳ[f5n~6NHD[S=: >%sqğ """""r sس;1[ϛuB+?cs40?ş(DDDDDDD'""""""?QODDDDDD""""""QšM """""?D1v.68`eDabc ˁ9VY4Qzko{)̛>7;61bKo gW1IX+^`#uu3fW=""""""+˭0hxwv Ɖ=Sy.["q3_\u9 {1hGzKx9C{l/ ^y7SFl ?;ItODG7`i1Oezqhm,#vh?ar-14qz<ĵ>T\^Cх35C;E#Zie̺0'9ܼoSi kk4yIpgl>%ߓiϢԬ}ta?&+ , hHU%k C'"""""rX&-ul|qΡ1jfp88g?Q~2XRFk)&tOݡ9zz_vsf5'7^pcr=fPv&֮J(7 e{N< ١i$JJ=tTyt#&V}s ݍeqC9S cBxv ΛƏdV˳? """"""mƟ+>#&t'. qalculate-qt-5.5.1/data/qalculate.icns000066400000000000000000014566501475705355700177240ustar00rootroot00000000000000icns]ic07%hPNG  IHDR>asRGBDeXIfMM*iHw$IDATx fU{vvDhBP@YfT$iqB۠ iiG#WU1T0XT@d)Xz/w{J|̓'Os3sޢ ,0 ,0 ,0 ,0 ,0 5[`h3myc=ᆵ9`xxxlm 4 &߉ cVKOmog#İ1l0Q Mo@-=6d\KCԄ&Ƈ&ƌ7jMEf_cxx1|||􏛆&8>ve>^=rM=L7m om`;N~%Gs,Wϭ/syPDQB#b  bX -k]w-e&a Y to>|Μ9gO4upW00Uk|g_cz, }tq/a>k}u2{k2Ӂ<]yՉbؕ{w< @I@kkslԟ;޵;_;mWnKFLKm gڑHU|ezȂrq-M>iun#ܹs 07Cڳ3<#f9v 0͔cRZ#!)zryl$6#_?זcOnVpO~k_ڝgKmWO=y*; 8 ywe e@$ZW)=vγf #0tՍk5 t2n-ocMwt,3L*E?ӼӼ[?F@wvOr#)HLp1g6*`o+ "}|9kZM$Պ7##^=fjSMSO-^WVjs>O9/6mg l)>®=F|>R`7 &3b ;ӟTw8Co|~si4SYV"f;!Got8ery8JNSư'SRbh~` :I[s75Ip:c۳cҥm>ߥ2p6)bSݖIq$͡B]d9\fH#66}{MhttwƛLP:FV{]x-P4tvdg֚0#ğYM-|жehѴZg P t`jƴQ)-$pvY_hdQ)J7@^f#oo@h46p=SB;؏kWn-  s'Jr$IT :I;ao[})[:\dM7M2BS?̯!f#T0 nO3'o4VN4 =ҙc%yOqX Nrx_gJc0QUO2p&{{V}z`:tOu}Q)c \v7u&Gٔ= xik׮-yNl6ap16:C\GbضhŇq A@oE K)#`R01񣣨 g4hju~\h(>"*e;\Bb+ aUQuGE9ovGȪ׮vt?Q\k8lGf%;s~n<#<Ҷs|2a1]JpJjMt*VNM9)(Vy-} (+~\sM{^/0[ÈVFixXÅ5'i缠ih'rDԨmu֖3<2w^51,'IyttD99ځc nǬANg6f˙gxm@}my=y?}G qۮU*3ϴddH^DboZP #WMU81fCN[é-IO $M_'f :ƃ? /,|ɼo U"! 2Ku e CWEDv\VeI-%9 m}pӒkoV#4 {w }ö~rʯ 3yW~ō7ޘW鉎>,C'gN,w-NHRΕ6)` Y cI {'QY]4؁5YߝO8i^p 7]vӝ6z*c`g "9̀<)O;<4R0.kr-W)Ǎ!?S\ЧbS1,,[wQ&tU0N{mPO !8紤f=s< ~3Sn+_JyG/VXѭZ#~LЌa^ f7Gە q$&LIyҳhy?=y?Kc.ݶɨލq>~}ݨٹ߬ ϵIfpl0ggg+j1aC>re/Yq`7sdO Ê2 g< X=)-\)!fYEl>;$Y:DU<ɿH2aW`UgUn>ܶXf4؍7[x 䐪]&xp;AZC[(zDw$hQ| F5'<|uKN2$nSUc%wj^ӟF_rgU"?Wќjߊk cuF^N'вhl:[3*=٦<(,84taj Ӕz3@=[[ ְG1>߀!K2^CaZ>I8ϥ#ax>5._a#9 k>6L $RԱD1Ur^q@.)5Y窶Nc ,rHw\Ͱ1Y8@}I8yrZ}+aK’L@`qaߵ^fڷ4x̀r>Cʨ uW3/ҭ4֝I %YNmvXbӭh]̡O7\2, eT6i) I(:I&uX2ey qNvF_?[72(y _X|Cށpn'K5,ZTI-d v6F+>?ZXeS64`V;{ONgT7 sLd(LNJɜ4)B&p-''[iKޅM>9Fod^q, D/PUnHڏWuTb0h3 ZT829=@xG#z4*\CcVP*jg^ VwU~|O`_3ͳi;XKWTo~Ad*陙CӴhMLd[>nkQҗtwo^+x PtҞC&߄οJj@A,%Cьn!D㏺t9߰'4rtS)cӒ7]%`=h{r:%=˵3zG׹kz7-q~HE @bWkeeRYvm tʸ `bC4 &7Fkip¢)[k>o# p05m`P7f6 (8ixP Fo¡ʵXh2[iЁ3@ot/})L>Pɠ |rDI ӒyF΄s沩vŋo^Pc8Lg^y}IrkWV2IV7qQ# Cob=SҔHVy;N-f\mg_k?2:So]otG?QS=\QOɥ< q\rqїi<'Ȉt*Pd.Y Qs0L턑C/fz%-[A]wP.k:O:iv) @jY,&/u(@ϳs:rY\@pI^قCN Q}Z%>m-_O~q)O)>_SԨSd4;w)ԪN3I#ə'`qפc6u`Kv:+@!}Mh1Z Ѩ}s.o|=4< g 1j&ŦSrI&} V =`5c>f]q{ s},5ԧ_O>G>I $O|:@[G kvђh;VC>a9R ,8R%\F[Z3/m4jrp_K ${'gSԋCn*sZK ":Oupy f]s>2`3Z{*~LpÑ{~ީ牟*p ?3xTn m~\N PBtORj mpmg%W<};@cd}d7d n?lWu5! ] $ LJ9!N2 <&#U|p3kthrĦƗQ0tZ?27dyMv49U=w%,sHJ HV:6R2ďVo&Rhz @w6ُ5g^fO _|q?Q q7zZn9Bn`ƶ^\Lu pNKNUhӖS) |_{ӝ_ɍQeW^yvm6[`YKQYId4wȓHTyb$j|w-g 6FhC0 89\mjβ C* Ygб$gN?0z*)6q *]vwXӤK?5kݽ[k1gxkcs #|@`p2pDP?᠝uZe\?oZy/g\#h% QU.]o?DZǛ^gYß>biȃ`V9G%uq0L~W_5Lx#L]k};>GFW5g,я@Dp0~ rx[,Rv L#o '%#s,.[iysN_{dcCA.뮴;y5,0֛@ԏK@EeL׭))Z^{ ڵkWEWz끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z끮z`=03u_|.'a{gffeOse/= F[b93RիXUe]׍GVYpfA&)ł L ExiRK\Bc%Z,XŌ[ՂJ=эyۜ52MA]>mQ0_l-~nB Lƽ3=xgG^xmnqeoWzfѻ_;}>;hsPg]ye'sfY&[sg#~,zTf\IV) -#}n+hKswpڅX+Yeʗ41zIvZ]լ)y^v0 ؓ2DLP·@ :LmALV R+0ǣd-^tQ 9{mi&U+Z-}:?= ûiK?<#EW o*:ڗGhӑ'Ԡ(A9mGIecې,a)$6\nvޑyvx;=-]wOGa$`k'{: HXDeAAVReju9ou8~(o[h/&~V~!5'd0}o󲎮X )7B tT %'0roxdE80) RH~Ιhu^ߞT/w.^-++9]{׊@ؓ+RݢWh%4$n$)Q/܉1(d:l`*€, #:yrΧiܮoD+5hu><#9pS)ȃp9T :n{]c"!M;q䧁#)|sv& f[kF#w9Y`v+9;Sv]{c-` fp~PvDJ-]hu:R;AŻND%̫wtmq.C}5zxo"cw)?^o[+v*ja{ A鱝ԏNHu;Sxu9>?y>. |d0q}tt=pU@]z+z!䷰^`я~[#ZS1;OVמ@NNH%ϓ68PMca2KAӦk|@PyK"k i;T@~7 fr(Tz1^;ٻl{Efmt졇ЭWt$DTJ$\ UӀ@. UyRKtAa un+q3  F<{va~Ap%uyc^k]=`BROR-"9o=.AJyFu{iM]&II 9oofzgmVE7ِ~LtXUuDU#JF`,tz5>A9M2sONq <' C{/i|Y@;~weu@3[,p#@@rA Q<=At)iWhGI}VirV <]Ңn?@|CΟ v_3pA{'>o;e/1)G[nX^{-Kco.8xDqa{w뮻rK/~Te;w\'ғc-?pۙfǎ]tђ _=yk {@Zq?l.7e o _ >OrJ2䊆 J;ˎqOTmE4]9w1f!%‘N*կNܞ6|;7NԆAA.y0ׁqp&AQV( ]4Z0B)q2{4pVu}M;?]H 6 =F+s -%ܞ(t[48#M1O\l|{]XD{pq 'X,_op ]w'|l3'GG=0JdOg~KR*b"8 |1Z*jl4()6"XOpE{ֹ}j):` 0yHxC^3;&K]l&XL.}(.bG?*)q̀:Ǩ??XT#?(S~$ AU(7v^ޭ= !7 Nahݶl)CljJVhXj/m̬;~q_kLL,m6mYvMϹ+w&?Ɲc3¨GlMy_<)9眡Ӭ3 (%O0ZPiJdh[;͠?ňT~o 5`E/?mn/m+Vxu^rfs;NrgQ30V^WO|"?.{x{3<-^O{}..R6mT|#)nVnkI")3H4#+\MGdN= SRO=8 6T.؄9;/q,}iI?"\#SG-H/IaS˩2fAM#9x!8xqG)K_R{w~?oӟ?op{w!|Ƨ)mE A"O RrDM_)LG<@/1F`OG!mkȶB73k8"4~ gZ)$W_ C)lfSlٲ~*$`mVKGK/4'[t/اf9K"L$P BW%$Ne= ?aBlX?t]l#'h@UVA=I+μI ,tl˯Tw7Mn1~,.UaQ#,Àrqf2 ?p9.q4 <۶ l@%7 ,A@NՋ#|ĐqO6۠}yݍMBbgn# NRۻ)x5'PCRɧEˁL{J~DOTvOKy4Ӟx%U_:baF>ys^n5#:K+*DL$걛 x$.\Y \ JSG4ZBp6" z)~tZ"dbu zh"=CvpXug͹МF* .ry?W ~-p#S&8}x$CHF7hb1.8mLl*u~9V4M04ha۴к=s5uP˼8_֣uY+wQ-|Erq䟷HE'8u+[_ eX0Lk0c 8uO80q`uGBG||1H r[% xH o 3Ycv~s$g/~]wQ~:rFxP9i*/FGt`#NVtKs:?*x$o% /]DuK^NsLv ]\+_j6 rfOkL2U;Du5'.=50 K@e3v#>¡QEj[L獾C~$L>Ђ.&RW'y}uT 뵷mr?]3s~/t P9S,M_pkw><%υ^X\pS=͋)Xt>0"#)P%T UZ|dЫaRy9Jso [p[?qЌdڔhM 8틙d?_Ek0Ggt˓DIC8^H nPQ[ɤ=x'9}VGhuW!Sm8.[_31Hir`̮0Ye_|kG;d;}:g~q@h)8(!.$I \V Qu#Ju~K{Oa 9| o62heTӚ- \sΩfQ` }`ⴔ0J('&>xsxHN4x%[{epa/rS ݲ/ꤓm-ğC+8h`Nʁ8zU0%'Wۄ|?DI9 wpOZAgTz݂ ks\\JWQ_s 38 i͔k3>4.SJ<8cGGOId2@ G;Qc# sVAOKAt-N] w] e!#tߒ|pP݀;(mm5Mns߯adskogs76QeMoJvxi,H;'t6YB8Jo Rw~デ%#}.h@ ؊M'AǝtyyfV̀gzMpbu~l_;k r 8=7H[pUH8 %Xzu,$ҠەAd;0+]O`%Xok#$ýϠ#ho6HKX3~4h7|HdJţyC$ޓp`W퓬%cx&Q9&57&ndNض^s b]$rhTU$ S\%+}Y@C ]0ZdE/3Jǣxf:c!fn*NrVqB w#ϓ*ǩ +h"mq@mSЫ\&8dos& `9bVVvlEuڐ#^5JQG5zu$~HT D<S0 [L9^AǯgqLPZt%T)U\H 0uHJ`;{uB'[x}!y0( ;JlJNPugYK+jnW׾8}{Y'YSG~OB2ao'z/ ?"л_<1Hh *A1O6;Q@pO=)G0X7;/zrAa&mZ^_姾*0qߵv@"˨dx@X N*ǂApi,!?w!%y%] ˒' V0g+:䷠ۗlN\8B^&'?g ''7~_ 4V̮%=8IA| 8({OH4hJ:-݀h.`KiE0m TD3-HMo+W4U}Exƽ@1M{ Xf ɩ䉴8Jj+*{i ϲY 6Wv+Ho[ i1S Yz؃@qo / <VJ_KG{7>%(4H %A46I{Sp&I0ɕLtH0ǡ9=R{-`v8A!Ѐe_5*9巠e4je0z~~vzTn[n@ׂ\D jjۤ 1R`˶HFN*mB9֏Y~ H(M8( `n5gY-7W)G:'9 X!-6&ax@MJSuH.E1kŐ\ArZ$OPe.*WB-T[6 ϗ'ڄU"G>Clm Y_ԞoNCF&%/yIAПgWBL?<5!ﻍ hcWB\ ӌBKdi$Qs\-} fAeW[ alUpefK@LIGT:q} <`w1o0d/S?mFb@w41dJ*B#y.@`ȣ|:3 JGU7?|\hm>|C0*ÆnݰaC񖷼D??4j ]C lIB$!^@d׋ďRe Օ0g\""JsXg>ovّ-QՉ}ٰAs9>!n>쳋;olLr!xF<G?Zl߾}ީ3ǿE/ɘ$eL4VwJȌ$_M]?vQ/|K 'Y`7MO(N>⤓NN~w܅?=_ߋ7n,N;4' _OyZٶN9.;5}GIzaƍ?\꫋|+h,9GydwX~}c؇sI |0o+{$[9>azE&SG >,qթ=ue&9'):$d^4*êL1/8}j8PU͟X}JKlp;OO K^>X4[gr)k^O~xW/_|qS_p mo{[/ 3)aۡ{Fr:)ID x_BhbԲK0$ezD@ꅋԝl*'m`f5@&~Ocג#nozB4q+*K4XmWUbO =g*+vxEnpʗ%%h{1?Yo}[ u=d'нKUl?˜?`")^g4 hـTde{;d=̞!.?-(%geۤ#GƮBo./ٛZʶkv@Gq]'SԸ&C/"sqXc= |E7#CYDխZ]t@ݵsJ_Ez{?x t@ -j>4,%!RM4PLhh5VT] ^_3%|!<-zV_嚔xK~Aγ##H8nJ`6Fe\Cw|leH@j`I^{ci\GӇN R^zU@A yҏ hv5@'8肒\^`>-~&&#`'@ǝ|⏦(I,fFꋀ:">on0\,9÷&N?tg}ʨ0dx5`9Up:)jG]ã/V{4^ ]r:!𣺟`%\FU fuH͎^MQ0&>pPAhC|t$G3Ӣ Zz=$F,};C*uP6 K 40"G e)P$:p`g@c]VGrOEia y z.I/;e_գOCUDu3U3t:3$đ_0¶wJGzV6ħXV S _oIf}]sF _٦O睖8TSGwd.Aյ - Qil.Tf"hFw QHĪ0X[$i3"fVcmEkWASCbhG& o`׃J7ɫY*4@ +IU>(B- 'Y!Pa>|J*B!s9g?j'I%r,dt_~NbD!'CXΑhEhj$mUgtdaؠֺFWh~:ɯAfvدrHRSHPRމHD@:R {l s%gJ '[.pv$' @9o|Q$X|E!Z#yj V- % 9lR> t`CBdFxYeOXN WHtjv  T"Zk ғ2qeq M*Iĉb`~py:䩎Z#᫄rHq2* 䯪v51r)WK^H}`cao׍m`Ե&$ H|JzJ%ßh|IQd `aHunCPvz},}E0k= X׮uݷ=A<Ă9p%"0U_9Om`C'>wZVf4$d{Ǣj0H(탒PAT'Oji]p?s_Bg2;j:w±7?D#:o$GN%𦎦qw ^Ij~~R2 rs܉R[`s V=QP  -9şqa#3Vf67#<,E}6`r'"0H]ԃ9.^+md=q)9ͅ/s%]qML6fchg"`>ܓ:IT.AO [ xb$$feB]zf$v"'|dN SA:Ns g-؄nt3{x ]r r`3&iX3JJ *Y*9J%)pܳ,.5!O 6QkP_h`Xl :3|Lɤ扭Q v~.?_[#vS1CGA:E/I3RK2n6˓>-RRjDp?""ӱi2H5 )ha# >3L E$K/Gy|ϓT Jޤm?dw伌l2-pD @0k33e~$9 >}i7AjD+/l\&V/l [ h~}% ɉJr9c7neN?ظqc^{{g{p͛{-n⪫*nFvTsB-: E?kB ffQ?5Sx5C9}PG#2BkH9l$*I;/c%(%M.H˾HoLn24TzG]uQ#bÆ K{w@pW]tKR#uO8 yu$TD:鄁A@:y{FzmM]jߛnZRGnuG^!/lt+}o ٴCz-{A8u+uOh&nsBo$^| )OHi`YM{,Q]%8Ӕ>*.3qoAMv R!{#`;˫<1)7nj}W\xe] |]wsOwgd#Y< O'|rg XHR׾8ㆶOZ| _(.҂q/xmVqci>kإbA u sv Rq 8?#+MY*)#̬JqIMF4~f؁? 5S-Q׆n2Xj!vZqIK_*:bǎy9*r'?^bceF駟^}<*xΔ3VO(_n_=e DM!X40#o-s.!H[cͪml /M¶vW~ ЇoqPĴ .O7{2|#)n喁.; p`Xaַuൃam;9lʥP*( N GJu] <%e|!\J~No0BA@p(a-78gw DlZ5`kĉQBWz(˖-[<9faz/*o~vm(O$Woʡ5%|UCy. i^Gu^SAhㅠ<X;1+ ᷠt)l2 { V>N_5O|~^mK o:;_%_?SҤĈp(i ?'IDATj$ٖ :s}\T;<$@H$Ցd100$''$ J5X~Or n]b$~ g}/G?ћdi+CБW1wpknʸǵf.NKN_Pb9TOW(6J~5Lr#9CrYr+uخft㥕S\eYɣ?p5׌6gRz$e+C%= @#3r|QJ+m'̐9k Py $!ɞ^s>@<9\WIrW8}I~lĻ+lXqs1㴐5>X/1K%_K72ޞ1UL~FW'oMZlՊ3~[8巒G^m@[ H$l @l\U'`$HOF}&+sx˶YZ*}x-aVp ?kӵzI$J26 !GN)g4Ԗh0uH (=+I%5|嫴.~<  ~[I y^_j>Ж3xx$$L% ҈H!R -mV ДJ .jI'hJO#9M \m\AtQ}lh }жFA+@$L#׿VQO2,'A$MJ(+ S0SMzׂ}.D34Y hoGǤW;Aҟ<6K_(˚\^h $<0u +]2,aETG[+tr2p0DMIF"( \D+ U G: \oZ7ᇋP{. *IAc[[i :l-I.y2T/$ėE)AM2Sdȼ3ff<=h:=D)@x[Ѩ2/#8&،NMP iz@ǭNPrS2Y\Vm=0K6XȂNЯde+D'RWP\_[[Aty+Hz}6Vr~ Wq,֣_;zvxͭ>~qN]xim{IГMI$BtuRU&E=!:6=xĴ9UF4Q'>ѿ;L?^&8ⲓ"H"`$sAÏzh@BRMko✖>d v&'L+aX;JVP~ wOj_fXlw B|[XDJxrW7U7HOAEq!"% Sb%PiI6**ISm h wtX{J ">d̚e85RZlpo#֏zg7|P?,C٦V>;O45]d]AE) ,O.d^UsuK`+|p[~6%t{GA [cg3fI{ҮηK0c@hPǑ|?zիA "?Ro)ajShx)A\$9YS |ࣕO0J`/ˎ@oĬ>:0UB}ZXFTah49D}H^z9*˿<<C?.袥BO abd"RH0-Ѓ?Ap% 0ǫ䉤[DC*R{jtIgR|X)`mNCVbU{O'~Ҍrn}h[x*DG{A p<:m6 ~~[&WiVEm!?S8-L@Ԓ(@_{]'~cr"A뭡\/쾺 pqdOףuy'IK$yؓ _=SK@30 ÅKm`6"@EI$+\W3g?[|s+&y-8,].c"4`qeBbirت`B&;tK {2:{z>qef }&{xQ0'w<@EaKĎ[^fGO߅qECWA ҄D` FVs܉V.@ǭ ܶeq܈ h}}%(%6f .J2p)ݶػmOݗӠ6""#72=Mv=Àh+q[ h:nKB]2ys |]|d1λշ1l`ZyxRr0X>%Ѐ" +W}2 w{m7]| hA,`Awn|?x{0_j?73 <(EhGdkӂ:9-C׹ pPl ( E0z֒-}Lowو4Z6.rmGu0mmcrv4q߶eVǃX6<f̔M)uWBЕ*‡S"A(q6).f-u(*םƣ?望S/M8sq>_ˁBE.<ͷi2oD? R A{%p ^j]j\.}udP'\u9r] @MmC졝i <m9k Ayz].nO_6n'nڥ&7#V^a8o/~{4w& Ńþy<ΗfW0ɀ0`2׻+q6J~<9^v^ai_0d:~,1MѕY{񠮞s40؆O Yq>[  0id T#yZ`tT/[JiQ \RtdJoI#g-yÙ0)Z9/mlp[߄z%{x?o9:ՖV8>zO n~ٞ 8PȺOL go){"[[I¤{=n :n sY<9>=۷^+֌qoL]} ++ J/ȏܤGI3fD@rI2Kk|ViDO9z]8du;a*aj2Qà,mWexztLy6_y?ޕ8WS$P\R8ˊ yo:n̂4 de+ t̋Xm.7 ;V_߿S1QrBnNY lqqR42R5ၞ< bG5tRCvr޳~ɾ_ޤaB -q@OdE=\!\uXA$N)˒|P93.9!9O :N{h ia[{yw]vQVIM }6koLy6 רN<  Z6=9D)$ht$U /ADP<#$}BenKAPB,5ZϻU"GY vW,gݕf{Gv`! I ˨H0ǽgbW})eM 2 *Y4xa3\(\yXj}k|ƛ|֟qVCc {C/n.Oy]i~7ū[#OY?Ҍ@](;bR]$<<[*|”sw'  %K6C4 79'^f9~qŐ*ev/v=>{Fv]VxA)e攠N2GSA xi;m(p]NFסO9=Wmp\Wm'^Gᆵ}Ee}e l&p ?/q})+v`Xۑow8[3 mFS+k{p\dJq<0Ru A[%P٫z &sx~/[oW_?;ums^۪V$R'1`pNo~xf_>lpm[Yg$CN |`0" GQ>ǫZ$q Ք[<@db1.pz.;{o׮~M G~?byՕ:Q ,L`ǝwyϥ^5{Vڽvm`we =ԛ[\iŋ+)]f2>!e0LJI6 ,{ݗ|?M^guJ|E =o(y{u|f3[m0zW+\@l?m`O^d'?,N0n{wۏ7\?v_4_{ w]{`jS0`&]lݻk~'x/` 6F==:lagy -57k { ~8V: ɏkdk0AhKWۉ쭏G,l-??_B^gQzp8X`Gb2Hd 2@`WKOkf ṂA=֎qop=@) J*6s)lQ ,i_۬sݾy֛o~+.g_x=imuI>_óffk_)M_! $:I@ l;lp2ldl`.n6PE]7s8kiR""6Y GB#PqDG{ Cv=<\03;gqoo¶}>eot˶M7]{-7]庛|~vIpnVғZ4.HcfpMUU|Ѣ*A)HNKy@^<{`P҉CʂJzk[>{vƀO@@DנABI_ߦݰŪPuPKsHRЕ@%9ymq /;{?A JzpQus_WdmpA-P( @ !$ c@$U:ӧp{սwժUU>>M%#d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d&G`a29<^ˎcoc]^^>F;¶V߻h݆/ٶ껬\B+[~p/ƧsmRmqW|Vdj$;t<=ܪnggXmxyD,ˆr Ex; A^0hrHG67h!tZtmgt fay*fHcڼiُ! G{F ~p̹Yt7mo6חoiMf 77lyyz3ŅE3[^\oy{v|cz KX)LBY2͏菞ba8&X>ŒMۉc[3y)c ~glp+olt.&4;6哳S]Gqv%s,?Q;%gg^QZ*`lk-FA/y mA[4 .]kNݗ/8MΣSpRˇ߱qd|xk{kVltU|777-ɣ~贏<}[>2]b& ~'ù<%#O\I;]$o Itա@c!/.[ˢQNѕ W›ՎL]f[ {%u~{P,~To:X=Yj, l&)so>p,/?}oOև ߏ"` TKmmY2S#T[P"tolI_wAsyLˇNwO]wJ:㟕OI/Y2GhCn{{hs_h]?1 &6W_}E6)1XK~wKLIHK/ XDWEBȶ _8Xs/XK֙ eᡳn옥HVg7˿YfqE/k÷X^~u76~WBaE /]n4 1KF`"3ɟx z|~n WHa$$ *DMc.H_0tLoQ@ocە/7憿Ǟođ}KJam{d6"\d3~xoRIힾ?gK.ctc6 J"g'{cF͡Aҿbe̳O._1}N }ޙ۶_} ov&`u6K/tq{bg-kM,xdjI2=?-~<+Β_kZY+#4mV}gyE?+YD ʡ^r%GWOK4<_1ZٸHv%ܿ%THB e`m:/#))tZgkחo}>/_7|'/C\Ot Ӷqϋwd65HJ`o YFBaSnK”SnѪ,2(o>,,x?U6σ8`_߻/%ѧ9R7KF`K" 9 6#/Cp[ho2~j\ן q yLr7Ƽ*zLةBy?#f+7!؄R傽o#|]ɜJdlXXX- x_WZ u_~t$~j-9L`4kVh{픾ӿ+^ySsïS\H79qY> T,u}w=f"Oo"^/H?[ė RyAC>=fo|o e"dٺ,=gϞ=oJufOm0z q"X6[u#W Ż=ə 7/s~?Uqcգ:dqdO5on+}gYW>a;E@X 01"{5x~ nDTz MӦY*w Q.O?햕"|Z{HuYHÿv_r׏>+n"kuA*n%߶xdσb[E(|9.z] %"ᢱ.*1k(? @%ހJ‚( F,9aL!8"Ht {J kͿv |_q)!,ۚ#q'Z"8UĿ%D@_[6ߒ=U.㯽oW *_AudD;NRYshqeٸN*e}+[~ٱ1oO_[~7&#qq5-iKiuHֺ+t\Gwy$)ϊ=(]Ɯ _C9a؏\q *Ͳa'xccէFGْ=_I̦HĞlʰ3@nb*E'TÕD}AĀHEz,á8@ nы}d8qDkxBH!h!k/DWN c5˺" uoDN;mrHkV24?y3{bp0laZ/9diT ҏwa$t#&q8wP¦fU`pq>?}wc#|=WJ .nv-,= ^zoMXm˲@n@MK/32d6?<hZ9{}}pߟ&h3'h͖=,Y+0  <:RHVgD[JuV;m?ORu⫌@^Xe1LSm6b[a%k{ .- maPpAw O+ΤOT714`$Q)u_5nAWZh- -,H F _8簅 Fw=E kW_|a.kCݘxF`$-%vD 27 !+>_; ^WAz_zb(]ᴅ]E>(h[ ,0tV~߽aψLFgaAr~$3=G>Y$D/3 CGOTEm?+ Q83/M]8_EMr{*0Ztq@ېtxk"_z99e-ZO??v(Of 81gd5F|WKrVK.SXʁ;mYF4-,gޣ0 Eb-X@(E֕:AMҗ~k ٨?_hǪ.B7 [_6"(ψ@.fj}/~xՖhF`&9qj {q*^c%"ڝј=߇PL:N[ɺo8<j};Mc'kGVcʑqBV׺zKq _?]wAfʓ}^bᬣP'\L Lmyg5#0x·# Uݛ!|faiWg)H?)42̊dv* avA}'0poඎ.?" fZ'y%@ f> .y?;f1X' qFIފ?Od|#B+4taG ^**k5.t ;*}n E}K#Kqh8nK꣆RW%Otָtҽw;!X.2gz0& + WxPC'8Bޓw FTJ@PACmvl簰j[䥦ոE~N]-cxsO(hAW4K/lqR'@Qf[6g-#0(2I74mZsK &p %#ք?+%լn RPNղEaMY%ᴋX{w#UtK@ԅ^x6)5%x7,Wx'2La5jDlYhu_ߵZb i-Ƨ)L *i񊀻R V+m)tĮ}JQxr0~ ëY<餓^jwgIJF`>"@"S2ĝyGpD4%z4Xj-tfԸ;FA &  W<_]NwAsEc)fCX%`i0aN':pͻZ4tDiɌC$ 5%,? (~e0"lC&dK :6 Sl .ƚQDm2\& V`vqPt z?ߢQB=$㿰#K|sK.!;X71iSb)Jh݌ity̡ (RIS:k <4yk,l&%Z AsێPPP`sO/|J__X\wPz{ާ]..y`&IN1#ōKڃM R bZ['ZpH }}]bvZ   {5*}% t.cq(˧7~яYf ێX8묳vq5}T;*Y='ğ 0Q]veh)>l`Cl}.pe1!/}zap~k+a s9>%rb# ;w\bvA)%G "y3&/}PMr5dIʇЏa|fڱ%1 _|yޱGB:##@RA>MN1cڜYH}咸I&wū2ЂwuUWP#^Zw0<M x|6rka^qShUiڰ5}/}>|\\?$nWÙ,:{ HKJp>.;M>2O4ǵoя<+q}EJ? bB #(<{*Xx}۹qaliϲ]vqh:鞻8fXQ6?6~,ȯŀ h@"z/Y`IPZ4~_8m e;XG:j\<5 #x X G?[qDӠ u{oNs>% ςGEJ*pr  N}&(^>'Es q A 'tPV($K1 5Nۤ"_5.Z6|߂ "+V`{#Y_\'޸' 9e^Ѐ/y/>l yzc/|:_ :)^>:X(>S,t|FJFХ6o+P|cBwӜv=4,v ATkXI#$o? ˇkoly'@9E{σ "^uL# ảK{hWVݮvUָ78,^ V۠8 ~]1f#̲!17 7WFlѷUxS~źݱWvqV՞]vW*Y2;7m&ԙ-zvM>wN b4!@#Q6/kx$UkMI7x+ol q AA :^Q^}Q-CY..=]TתU(~?|qz9=ۑc[ӝn?LRF`E faOxmU-vBoDl h Q,܉]KDJ6ozyvSѱ}ޏ)kk5>xVX-C n};f="N@v@_ >fVJ쿾& WUxhm4Evuq&:IcĄ8AIk|}xj5.W{q\x1=Ὥy]I 'O%##@e&, NĆt#iŁ\|P4JRyՈueBOPðƲ}I~FV\؛qK4VǼ?cwjs~1pC3TG|nwۉKKKOꀥ#[v+uD3}MD<Ncc Mxmx.[#B! b6gfE6g|: ZK}4Na+}UfhۇRm_Q;e`1BȒCez=,eqՓ}@y`Ɋtc@C- N]4f@/0j{k\\}{2+W}]"8iOXE~З̟v7(8ߩ Ȇ1AdgK[6_ y Xbi6m5ZG[ii-4 _<5>?|Ц5Y#'}t86o+p~k)/߷hpc'rN{F<}\U4Idbzp.L*qJ@⫃y wVԸhIzx'BS`& 3K?|?@J=ݾOd;]; X^uY}CV$iN{UҮimނ-5_Jg< oy[ΫWF`",zτ?Hefj:4 NE{'/=!/=XI_~#.pvO+j_r+;K^v ׷_v .Z-׫zSˮY#x(߳o<[ʍ+p-gOf'GF`DI'~ 'kr ԏ VxФ(4ԐQ~~(/\6 .>T3?vhq6/`q{`L>$5),>?u=I.Bb LQѳ"l[jiNk GuGz'G4m5E}&tO_MW?kpYvV}=QǙʏqܜ98gn;>Mx ;[<:>e>$yh~y"5J8W]hNd|]|F)@lBָ4pVOGf'e}5ok!k\kt?#RQT߲U7۵#rUɏ#9[裏~$ck[@FG?뷊"8|Iƒ~I.e  [M_ 8i~ݨgxHXj!/KL8}/ioȉŇ9bZ cqՉj,(ބp)ыG<l9?'p^bfY9mƱۜz͉'ifϞ=u]\{??7W_}o'm;8#h׾|Yk]/[痹?D9I^];Ek|mZ;Ȗ}ةָ!۬Q %%(Q?bc%,`_]?VIX[_ [jvOO]nsmy]0~^E d9:si>Ooʊ Gy}K_|__w+!]z ۷oŮoo|+ i!d+K6y: 2WFp~*3xUXl̂ b#ORzA'*b;Uon7 #̄ئFgpUDr|b͞</+duFo߾wCs4 ַ=y PN:yC_/Wk;/ys7Vd|OEa|lo{WjmN&_p*Jn*Vdӟgo^> ?swMU#m9.;C=~̼97%<d%*_W__lna."%Sc g+X# u鿆#va_C]Gny[0l<1,'A%?VKW5=OnvCSNins4_7݇ _ }Y{؞g~g0iQ Vj#(ՍdJ*;o[0t cCf&: ?A(1/gyYŲ81l0o ǯVڽ߼o8fs54<~-ny8p سͻR9>Ϧ&:㹉y*|h(K:kyNz$qId~@˭)ߧN5Dg@ ra7Ӣ&Te`g/>Du} T9 2.uY6p<-mK5я~t,7xc|+|OcF~{#af,x౏}증+>wYͮd*gOT 3F۩S-bBO͏{}{e_ck'Eht D]P׸ j.Sw}w+I*Gg옓g;\uUV/}K'> 1ɟw?O7ysm[w =Q.OԦ'WQfo =ܘrvd_8Qd"#+B\%&t 3^\xWNQs:}𥎍pcUd-0zqo_f8@h4DNlL>< _OB2W3 קH?.\=a14Oǘ|`;8?>Z}g-X& ;# z+9 IC|pN_/Wxh/XQ\+2`q51v mzu7͜AлE ̝jd=(O܁ kDW  QXlD{zֳ7~`#wcWOٳa-96%LOϓqR5-p>|'8i3Ӂ^ʙeik@Š`FAf-}u 2}x8IIc-C0G:{򥯅[ }mkٟu[x81[_5}{^eoC;|_^ro/m']mF{W}ҿ\ .醦"\PtA)7[=6s_w <\x;\{?2e;- ?› M{ݼe/[~@l^6v4?s~_ך>g~>x, j+x"g"ٙ'?{&e IA : W3QG,Ig萘)ϸ+nM`Pŏ_}:k0|^^؄OkwjXx!wmwGY 3>({@b0flHtSg}J§>j퉗 W)ZϷߧ12T$u岟8!w OÃ6!0^5$ J@+L_\1U]+ E@o3P`p zݤ4 ?h5w0{ qGnDY[}UD71a)a5`Ka8˶7{\_omoEgߟ3+y_|PɿkGmSJфGàf<ɘB Sm[w6 eU"` A }S݁˜fSOp}IhdX!s69?bA&ŷDZp¨ P{;R߳LA 7C  nؚzUo߾UyL7U !"+AnIU7H%':1m0knea[MdCp'h'@LEi1k8qeUAƮijᇯl[ (Q/܉.ivaչI6 0TXeF^ⳚotM߼=ss)]tX}1PM$n,EHO֨ 'Z94tk\/E `}Pʧt l4WiָqC}q ע4 _Z\R^%~\( A9%v_% A.]]g{Z xGCp (T\%k#ЀlAGwS_@l/g@Ȱ@wI6 lgxypO1yo ~Y_K?QkHhI\| z27By A)P44-tBָCh/6_n{j<&З^}q)<5]A/LQ-dٚlsw]{cF6AEsUk+>YV&z捄o$&Β@ʀ}Yz~6a\t]cvnpm ?Ag bmWoġ򿕗lJKy%_qw_踙'1 H?zەHqAyXh kih xn߾}=?=qcm|͏,@m<~'Z$A{4x;"XjEі+^u =CABi( }`Y-O}jݽMz}{{t}'ahY,κ~6 ۟f~dyxlǿl@p`Fp(GX ;4h[?5h Vq^q)Vt3^s;/: `<,LW8܈7b8?G>rF񦿍Y1;Ie+\((ci1w|"W9[ayx~gX#0pku{p)N`Bx~czoAxuLπ qO]E @=7Ð[L&}9>Oq~5IX_m$HY\$* 'f:yo7A8T"pPt8! xFBmGvx$]3aEҷ9F[hCЍMv{Z7 ʐ >G1Djݝ8?c_^ ͺ =Ő\b*q^Th.)<9H| Xe5 } ggBgH?YP}0ll/ 6z -XpVGW!=m<]Nvj 8? [='1e8QP yX s1Yٲlq6A@^s;ar~//IؘD"iJl<ӜqH0@J2-A*S,@IDATNjB9[MJoW~X%wT:V"EP A EP:_קlaj>HTc@g$DbaQ5kqƋ~Y|Cָ$ ;*}^X1H`pp}aݹ8F/75OM@”荤DZs{d&mA~5>.ChWv;]]4`o_&V!NsWP\ED)&zjRװ8 ::|.6Mm> {_?^n,)(Fma>(yO  Ы?T"N3 h Sׇ}s|XG/-,kt z.!w54ַ6Ĉ׾#Cb̼+i?A"eD+rBLJj*͐qaKol(i㍅H]trJtn y])(T5W삾'ct౺H-4`-kRjo@%aA(:!(Tz6AݾF Oy |jYrؘ Qጿ-Y }3,,|̏|ӟ^3խuHG@t+Qjc&-2U2Q3;W[({ $':z ĈE[N鰯?߬o @+0;z;cD{f$n|,e,-Z 83J*\C[Ȅ ^AM ; w+s  E 6؟mW;^B9)q߂pv7m/C_`OUP8e??[zr씟b}!Ɋ в۟&pXv Q\. 5I9Ra 4;`Lot 4{ ŁF {2u/8BwohyJ3f 7|sk7ֶZ™gZ[gH U:S9;_k~0ھ0X,dz>o,/@mѤd@h%G$p'EI≦X@޷W[jp9O!ӊ{աٓG ٗRz,.!'M}8i1S>- pi5~xپVf&dͤ'ۗO~ 9{|$x- Hb,Qg&48|IA-nឈ ꣟I.JNl7:'ԅּ$Xf4" txe6|Pe ~sЏ!w`?԰Ȳ`SѤIguּi[q,1I86RF0DG :P JJ=^t9yVQB(yet]ubD/mSoC^洊n]:I?1u|5C_GMHyơExz_tgZ'vJ|&+ְLqyr Z {\Q@Z*`4>lB ĚJN[<-SV3^?w׬OoLJtǫո4G. qT &̍#vYfn3v 'm2L|LؼgC{@Ł 2VJդA}tvP* uN;IhN*cb,p}NDD\hXB'iuL'I8@fiqe ̋/Yn z 'а}___)|rJ_Ľ\g_b_4^x`}@WB&T%hN =H,N"/\E*{@ ̰g⦰ O3 {M[qП_gʨ u?Og !> I؜oTɫɕp&MŁvٴ; ˣ$[ڥ:T=@=($H7=-$BO7Or&[e?GߡF p$;o{6}C7wpݩD"YF"*oA%@ riV H xhKSm,fL1[GPkՇ,:("{e9}[Co jOdR;|द;NY" ûDe zbOg${Ph@^ IpA+>/ÀQi xʴh_k:kpۋ?wb1 XE8SśdV#{\}+^\s5?uYuglu5O6Gr?&K.qDix̵l Vd뉴 yx! 3COmpMJ7-/V(GM;`ݷ띠MI[w4 F+8xm߂[U!/F|LEѹ^xasEM _BWm'>mbbt *=AXRaNvW TncWP"TTZp)8mQjj ]Q6j"cNx!%PZaL/nA"q^'5dl &\lxO}?x䇀o DouqI8&N(޻Ą> P@Zw 1 ָ]y ˺5(1w 9, WpQ:W_ 5gtEE1(5t` :< 6oGbmGuN88ֶx%R~c,Fd(O?M<@b=Tz"yiau oZB;<[l_'f }]V %XäcOg7F7w9Pc+c!p}{ .{T{UI%mm5zKj$iRdgB'n@obVtQﳨj."[W /g:\MOP4GC99 0E0j`nj6OON4yZYy`ZtO'aS?*܃hےiMJJq47>d[6S/+nu,f:j}f1 q/]> kDž EVp^Á>࣯(W8, gMr<7cat`-lU/5ߢR0i;2C_y ;_<ٷoDꪫ&^pZ7E|xLI@l\0l7k[`BD|5NJk\Q\@`2W0J?S}L17F߅}mߵ5.{jk\#:1-巠lmhuն>ߍIvύ/"^r%Mz{ۼmo'A#U#|&:0ZM\e,O"i~[k$* gM;ݴEg&\d$ڤ=O|][/$F;qCrؒ+n!6Q6Q.Ȥ9ܱt4-w~7 !" {6#1qc4ZB@I`lea _T9[O`&-4ގX|aWˇFI8g[bLwh ʉm+{` P'6l- pV I(\Dttl6%r/d> # ־V5O_N>V&{2p8?mF⾭=ch#ַNlE\ciN9YTI'Լ/l~~lJ@# »Nk4 e7g {1Gpk6wsnk[-F/}i?%򎃧?'ܪ_<#pY۲Qm [mmГ<|MO `?_~wFve |yX } D{x?mk!|`##Ȧ+;Ob鴜*` AOi58i N΃ f/}Mϓ䑭6PDmqVSocMjxAm|\}kl'Xj~Et Hott7x 8{)Oy]z׆t!7nwk~G~dDG?om++4lI>FClWn>@wj;lP?Q7I[_h*JO>6{\wu-m`ri@ۼ|NX(}X]`)>k. xi??ِ>Pr嗯[׭ ǏwwgFT(40=Yhnͯ(oP3B?"x` 8E:GЛ>~+~]wu:),]?A؈ 1@`4EM@. %=PjAt.u{p׻޵|n^5|ʵ^|_^;g4mկ֤Ǖnm,>Ƅ |D.cm :n.۩mlָ( 1! - 2foQJk_s=ٔWs0\^ Ox˜>4) qĺ=f*|ˁM}q-7xA2I:q᱅J̯[aW &|7hGz,7U[b|4:nm/ۀۍ4/_ة~'K`q%>.VACg0q7)8|?7u>ƒw?Y;F^#+_Ar~iw .lx^NH#;ٻLL%'P&۠YPi's:mj$.-A+)k떖'oFh-SJݧ ߂E'm0-8 4JM#Fhco׮.}>y]`~519q)_sr󤒛nГMU"E3v -L ' B˷)^pv=2#Aږwq0ebyen^K;3{67|s\q??6˯={x?3ƄgÛYx4?O5ixNa5嬳o9h?x;4?>oW|$iǂ,EI#fLiEgШr:4H,مQent/+K27:HJ$\uvxO;.)=t`H|3~ַ_Moz߿e= N:\=,X<[lnW~΂S0/1' x3 9Ϫ\IK0,\AN*Ag@ov]c[võ oX=}X_b rhcF1G683'@JO_?u Nh%Iwq /-}?_ϕ~BZ}>>i<ͩg˿@]L_4ַjĕ.-u.ӕI&^?O|2K2Y56<+.BcHw~KNEֺ^o,x[H?Y`;h,BSX8gP/?t?{ m8NOzғ>zMG?ڿw饗w5apAzPS%8[U+&g"xaO_/XǿR͕$EZ) Ҝ(8u6ێ[, sh ԓd5vZx cWк5VqcHEQ==h hk*y3y`[h΃dUoAX]C-6:@ :cǞᗼƐty~fK~~}_j۷Z&>,l7{Bv'I8STD"SEWxG ܪIdpU`ɸw٧MS>}$K?ǤA7zCk+v{%i@a$f#W.eU)W 1^J\Pǿ=4fwe,~?J.kl%Mk}[?6K nup#h"!,HaH$yjFFqhn୶Ke,vUB(:\,~8ݒyB UIH+i/6˂|5*"}t ,>UmS w Kƃӹ]O׻dŏA{uOwĊh F Zw߶ow6 6?X;{OOK[]tlÇ"]I*lWzv)~x(^t|@p$ǐf_caKgOf_L?A/軳qTw?hv#EJ6)\8DQƒRz6CJمofuy{޳%&omlI_C;c:Opl?/`t1*9O m$O_ѧ;KZGN$~FCR:_"1.d`SJMy;?E#c_cjUTF;Q0bK{w\l1̻~k|;4Wz3nΡ8ggR^mLcI.2a:j<42[}D is@<(Crtl>#k\V袉g%(^xq?q@Xq05Lɜá`'?M;;uFW_}u|`Rg鋌[8+?Cdɤ(\!(A\n˗cʕo.nr'wMFF%߷R8`-^R&ZC1آ2"` '2`[~ oxF9ςg5oHAxaw62l:o7+>]xj\|bEiP-뼶} t~ww]PA`cqmW6:ΈwmU<p~o~o3<:~BjE@B ["yM%YdHL vM~E!dFpMqYXI-C+J;%,V x(]y 5W{%F+G,C|ӚaQaj^)4!7e= *MN+745^ڽÁ3jQP^oV: z)SG_d{TQJ82bs?f\le5}sW~۽͂뿞Oe= dYpI ģIDl~F+tA ) THbF)1]hV+pFۜ&*RqZ@a݄Mmj+0@\@pȂT/ }1qDz =s3 MW+|yJ;o|yի^?_+u*W<#pkoO'Jot}_D~'|o w>IzSPc5 [B\Tj[]Zdkj0ľNb@88ADC@86@ }d#H+ӎ\5-Z_Ee㵢 V;rpQ#ێK>;2?5^{Eov}M~|3 =Toۨ}~kN9唆Ap-&#i+Fmz~y./4FR_54ietì~A^diӤڀ?r7[h?sV}ft0|_)?{t[Vw" p!B4WSx#Lbʼ)|J՛o1)RV&o[4D#*4JsȭAn tM7};~1kͽ}k9g1c9k1em_OWΪpj >~CT~,3b;6~Eyjt| ༞r{yCVm<d]EpW%ͅ{ҸHWyv \8?):bmx}L fg1_ѨcJASu>@&>T(FxlSOO龀Ut{=s}0#ٮ7k29uJZ8/Fb<ʇ31꾿A; 3ۡ G|q%8^\d*vɄp47 V2i8~҉"u]_=á@O*/#|${g3nbKJqOᆼݢ8l,[-Ͼ â!$ dv1oOMl+%I ^4բu\n)g`}Ds6U Ha40[/f;u{}}J=4= v *Vid lO.4^6UE ۢmRbXpRhohaHn>{X?giux$&Ry <gT3TFƋJ.` 6%9ؑ Lp'V*MqMeXe`1lG&&d+S f}s~Y]J dG9<@,S"lT%]8W}u6~x^DJHtBm+`؜R J~ʯ =X"-ȱY 炀[ؑa 7N i/o}8-k!m'شgmП/הWg*#̻?󬍢/+GQakH_xz4ϵkDB?"Vu |a vc.YG7b̀|zk_9v(_Hc -/x)5GpW$4]_|xJr'l]*bo. nl+Q!P!@b6|:(pi; S}wvǛIT~“ڧsf=p<@P'\3:g-{>\.B\EPRh4 FGd&r\{?C>O+Skj>Cm1{y{{:s#)1Гi9C'oT6 8JUƁl>zzkN ۹NǂaM>^ZtVv϶mǜa0w*yA/Yw3Lh48蚅.m6nOG% Vj7L?Vx 1>N޴fÁð^cpy{j]d& W@2*%oպ80A1mN˿MG:gwr:ʠӄd _X$!tǏb<A >*X][hwUP32->6M S^?\(q`\G8)Ǚa6DZү,d"0r2=C dssbt&]ٜIp%:㾀l֢ƾ;hzbwUǁpǴcU/{wG偊m}Hsx`&REyTf}C?>ZygͲYۤO aA^p 셨dv2p`Vp!4ctzo{JN}`lW 2l0'{iv^97`h<}D$=Uf)4Ǹ]7Z0Y6w\ z@_wF&vPt 2e7D$~,!z}A^ncOcƀ-nO[2_ny e`l k|yxf_9#` -Nar&MM"\0uKb}t,"4\w1Ni* [Qt+67e<c3*dOo޲@)Cwws up[ο YKK_S*gdcΰ/<{==Ч]H7MA^O%0NJ$c:*A/"bڣjԖ΋iuO}0v3aOkV$}'Ol?i>71Tb ͂hj8>_h?R0 u~r3O^7{  #ܸ@PԙR|F`(Q2Gì}&lɲS4/0i!}Ʀ> lq7wZ|lu.X?G?F?[Zl`K!8:(g\];8'4i#+n} ,x `zՀ _gj2h}שc2ljli'm‰6ϴ mφ~WclŌWh_xL}9dp-E2Ѽ1?E3 #즬=pXd®E@$IB:2* 趁CD{!S S1ֺAWL͂ZRMmK ^AƁi4g?pC7n4=nk}0Y6w>ς]42u^NȅA! 7T,3 ]YFivuT&n+Cl-4G( }Vl&18kz 'L&ϙDqOdڝ]m8#>+6v6O/9ox ^1ҿ/Ӕ[n(%u<¦}Vx998aNqtt$0d9spnѿ%wf8guHYG RTZ`=,j~ Oz(M lU69(PF*fޡCM 6pY}1Jdǟ?ql l=2(L3R9LB[z CyIihJ))mBl(F$>z/(wMwԶWroUN2vf40 *G53>|9ү}{xL =ު^X2j(5^A5!Zpߍ-v^P(8 d[m+ u"cr`+.; vcX(-iT?m_s/ g= Ha/e=S <FFɳl+~Uqhi- c}-P蔐+k_ a&i_c!3_C7F >5M>:y~`׭8HWp^NWWo ?6n|[H@[<{' `orn}vS1.M -s>Z|wz;ߥwcn]SzGO\W<{xʙ{wII~L0i %HEMɿ@$cx,N@j}ìvǯd!0m/f;uCxSvLY˺s _ 8p[ ViiEhm Y~6mu_#ẋVsN=@%vsmxs,[=p| M}@AWAA ÚrЕ$d-H^˛` dOG:SInCi T&&^J dG9=I<&%}Ҽ\褮OmA!xh7v 0MhS󤿒>m[80ZBQG-µYwKwm5tGzo]m?c?L7׵hgsx_s޺@E4\ <`!?R`Z[-vș,<*k3a;nGCRqv:-CR<._v] *JXJi4eƭ?z_6]_|x@I#8CB?3Dc@?tk Ad ,#fsё2P}v?X eUd(֐!+kc#acfMK:|3u5~0k)/2}1Lb(ⷀY [ż&%̝0fRIS!6qÐodg©{!~pA}шH.ܻeh5nyP}%;UaӔ4l=px I ՑnlDB\W"G6/b@¯Hp=VfS[͉ .b9CCoUUˠ19 &@ t?>.屳lf3aK|qGCMq"[yp<8]_{{y@*ybě/c'@p!Z8@)siq! wg@F7=g1CjADUZbP|bX-@-ydʉs`s-޼%k9#<^gx Y.h) 1PFlr!B7tT/!OîJz3]Pdo_dް/=<T/bߥfLyM e,n𣏯 *IS)}A;Yl% 6uC&nu1vWm`I:HXϸq\/qǧ_uzn|~p$9Vؑ/!.*)='Yd\&퐔uURMR&X3vCZ|BE+Q`T=X8(wK*8(jU՘XLqtDhgg㹀W6)AD_uM 3 ˳g&P"`D=ˎmЧ-*QAh@/&5>4>Kl }xvPǟKt\_{{`Ȕ _'؜@m/ȎFz aK$\qn񡡈CMR]ڌ7 Z zC.*ځjE;z&~`&"}{z?rWw*)))c$kE3u4KQ/4Ehl D~е]Fb3hvH07'\{MLB촛&nOB`-Սȴ?r?\؋՞i/f:qCy Knrp"տ3JD(@Gr\gN'tkP2igڋ荏~.AiLYlLEޟП Y74Q0nS_ Ʊ\ '?汜JׁQذnhsh 9R{y 6'lXADfS^  KoDo@K U!G΢\4 W荗O|Q7y\fBcB1o5AT mĊr=q Ǝقuûe\w,/6}d/DM =+k S+Q?B] ;UQyาG D-@۝6 Eȣ`iH_x{{z@ n| (t=P2CA&jG 3 gu1-(,6]}"WG'oC.y>.5ξgz3 >9x$L#P~a|LC[+} !l0JhJ` f'ƟR^ʛzGwmy8v }QP4%g>Cc4dI =]ŻOFuִLfO#`}[h!\Rg`T e &;lH=PΤ3wC?ǁpUmV||nm1"x\ ޣS'i9 Z/Ƽ z`&x|u0(cCM KNp >dX_BD/1ydqg8_W)>nX$Zh(qefbf$sw~DO@>]J-e2FC%KM198zؤ`[W ᪁t[*}w|3>їǔ‘EU%vUS;T. %]9ux /9# 69kj|?Wx3p@RXdiImY7RSʳOye~^)&DŽ\b$uoܖ=+ۥHW8k{ S(tĹB0  x#ـ4ُZ35nOZ}?xƳ2%j[,<QRcV֩%-a๜txz1̏Ε.."! ΥsxllHstxL[|휷[G=HnuǸ!(q!%,4q/0{!Ӈ=pu<{}3P_px]uGP nd\+;p`JPHcOIݱy?Gx?&pEx_Jŧ!sسf"׷"*2ǠP*7|V?Z #6 P}wc(}5AӀ 4+([\[vmhA~ t8<G0 kwy` HG<9sŴkؒsn{5 ^-f6Y "07npQ̉wle :z9Rđu; vӶZ6IYlnGRwORh1PK'W<]%`~R&;P[zג¶10&o 5z=p= v>0kk{6\kie1/ z8f|z8(=JWɘd~c Fc|0sAG2?ZP,rL_S޸ax xO:Ɣd.v_v|KY0V;bsDY _^ ." ?uY ;WBxei@)X}2`6w9Ӏ0'lRO=LOۧSiT~ZkS{SÍ|feo9?EȃcqKL3-fə|tu:wvh߰9nL\ 7݁ QzvTQz2Q&ﻸ 6 ,팪ILtcOַ=X~vlj~oWCjsG<=AoY<򗿼W{]wݵ?WKg~d'IKpFl?rI6AUqc<%5[j G~Ӑ6P6 :C"LDX^nlhT#Vjt^LH}ٴ~FEU%F04B7M֕!}k5Ԗ.friu:nSӟ-"H¿p!ew޹G?G>2l_xH =[!A~,_9+ȑk$Z"+qb=!n2|̟48hF!96'[ж~-Z"SKό:~cY|<)گUJG>=yWn;~]=p[y0/9s8'q?apK&B(\g7pKd2I E_fjņ vWR6rfkG[|%fnvO?__ ,%-S9y8gNKP㛾雴qVo{Vx;VZe()e#1)TjTr3xq /8 ? L "ЅiIl2d[U}ؔP. թ b!!O5~y@f۔>~Cc~`X>J}yJO{ӎ?՛fm\%<Jt7>HCS. N''IBތ ((SH`HGSj֥3pAkHv>R\$GfA6Mؓ݉7Xpu@S+ M=}g.q_]"C{Svf_fa6Ȓq2{ ߰.}}o;xZt\9ǭ?g^|CZMoZI41m,7ȾI8n&=?׼f4\<4)3< O| &E] UhY hqU>,eT=<:ZF$`8Fڶ8}._{ :937q_45l:0x}IKi;Zg,f_E_!3 lkz+_Ko/Bő37a-| y _Z>^4(8J2HRzR}v^]4Û=d5-M`Ao<ݯᗅ"ёuٞm]ן}k!z<̱'9;y;V_ͯOOgj <7p9yկ~[.mܽd:&̅E#v;ՃW/ |zth%V'XRp*/6L 9LI;I1~U- sT`h,7fé~dQXiR)Sz l_ c֙6/0?'{%??]Wq;o~p/d)ȏ؏uEq"Q#HV?$e RۀPzI gB/%k(œۀ-n6'z`$heZ6>~|Ou;諃v NZ|#g[#f Q,83=5Z6a801DPvğa%mM:BNqY?0bb~D3^g+s O1ѿ 9xg2*yd /ɟɽ~@@$Ga7Qg3d3Z&td:Pܢ),mDǤ*ۂPZ=*ꗳdgAԙ|`nJHcn-mkX.9j@}yF; `[˳ w*ݹK}_"o=aNRP~ 0R26=9gb"Q 3UGI0d22$% Zc$A'4 'a򍴒e5خW1T]coOOqsB y~W.1=׾琼"\ o%ܧp;[[Q1[Y 'e-/ R mJTAM: YCEC>`lj+( T$CtG!8̆-(\(0fہC!s i3lS?>vD~7y? &=g^/|W ^E|s{>$ŵ+{]?J!&  -qvA.ʨ}׺ ? &CLQkA"A%h34!*Q)mPPŠ>m [S)1tUiux܆| 1a&i` ?9uh"s&=''׽u{ XS3;aI <[@Wx;I*$($H.|E+~u Q WwAa(1V/4XDclxKw짒0*$VD*@R0t 506A|R|we_=~@$H8O|cx߸zw9ٴ ?LOyCu;e,>B$'>J 뇀@c@b"'\1uCrF?R] ,As"oe?KE ! - i3$mT҇,Ec-qұBT>.`(D>3r[*9.J*E_|~~펯StT~gvዧ>%cK֜+ƾҪ83S1ED')]( r[u!mB7o٨$nɗmh0Z@6d ' 1>r*2 fM3@{V{FM_%5`W_n I?+ʍ$ZZ$?]އ.*YA)Q,/tA#9"_ŨUB6<в_Y& ;68[;d[[ONJ;g.͌\>s_G>.??Z^:U?y7|u@%~\9>^z$2c dm<(}&D $is4nЭv`M-5LJ,TI ,CqS{hVX=6g?LkuU}9_05%KZԧyssK(w:cGf_h==Yz/x%:W2AdA-|vyP%`XC=]羝`wq_ [_wީ>  me!FO}X]pf]֯qW(˷> `F3=={[|`SK.g>󙽇WboǮtO'TBW.(O[B EUp5 >C G)~ \p[7vo~j0@PBo]Y[4f֏,tp= OlA_I:6Lٗ&X>p^<.!1OK_d}}ް*{o;I5 D宂3dR 3?`|Wzpt [) jԔ6C?-nW*.t{*D:P!fHAxGm?R{ss;V`m( _~] :g=;ΝmmӲϚo}Ar<ߏڑdb%@^%|N!*hj9"@!/h>V6&v3f6!((,6:;d CQت YxZYgSPzcxøCY@!2.h,ɛ$}~A7{Yz뭧o's'G}2 I>=*GPnI4 CU&;V0bn04P314O lq`mb!OD0>m*hļ.2~mcoorƯK_҃9F%2u/gb" z(YўM,p'8G> R1mK~nG%6O!'{+4feX㖾Z:]npj.H656 T̲Ru}UzrԳ8w86gsxﳟz椀}{O-%!?&>^$LPY@ (qw] = lCf4j @6%øDR.{pS_53]6bq-r𒗼DkC]z׾*f'Àx1/_sn1dƃ|@ʥ-LU_@k@HW*[\ 0;YK ! >M- \iư:i@&  |>Z\# :07h5MŊ Azq@ _.`8hڏ&뱼=Ȱ_Dϱ)wgB˷d$I2sG>I|NC?@RPyidM( pÁ!&`nȃs->6h 9ٗ/uӷJ\=|򓟼z8 я~to=sT fb%3DbKxФr- BӭR&`ˎ2} Tn`&ޤ˕σ0٧1C[fExڰ{RǟΘ78ct1 i]T(`y}ss_6g1+ro=Ǧ 2ҜL1yW G,kcLϘ[Z*F l,X-R 1!B+Ķ⾀'e]Rs064!&~5 _'zncعe xmd˼ Q{>GdQv[;$io$seSϬTgg)e3qÔ<&Lډ;z x}xO,(ucx?yڣ);mG7>Pp~mZXg<'2<}~ү CLq鈏~'"u_L14?TNh^P8%W'*| Xd$՞ nZt h.%2/&U${|(TO6/n>3wA8ԁ;g0l|C'GlC{]~O| }=G$b K=~$z`LҌ ,y偄gI#yipl=u"z\HV'y6=DY2AlVkǟ38,Ϻ,f3)Qx=u>w?_=]}K_:cP[Nct*ӾL,tEB9RK\db{("S3_o&\&mH9ҴgݚA]foFƹqiحǟs~Y^csow<0C_Cm [z| ?s%dⴞgl_i2A&,5؈=՞}5b94` }҂d/BO>Z|Of-12+#m}uhO;G>>ݜ;ג)yHq96:|35ŞGƴqрa>Jgh~Y01(cQ)1RŤYFʘ3bߨmzcݒp.Û,,iG?z@:P~xЃl( >ɜ@P$LbK u 82Ys-fR"LezIn5xS+ĈCc OZy([l]Y(i]үJ=Lgg%F< !^V/~qá DIDO@΄Np~Jm$Gxv\B6,v ?d9;;\jLs-f03oc1U$H_<%hDb\$ ,#Fqmnp,'%tfً5bHa I2?U\ߺ̏G8g7|ޯ~a˵q(?,mD^ ;tLqUȭX$/ 0 @H|ϼ-zdOGnƂ`b퇨X8sb&~C%t͒ZeuBd"y#?_+в!}$t +u%9Q|ł. tDQoo9L mD+CW6 NZۮ>ݼַ!?__p̷,f0)ش߱8簣;6G[GH*omDƒ_ .x-'$i-NZ Jؐم@q,|7ߟ6"ͺC_ or st? KZ4DcVQK֍ zȹ&tJY~@|ue؅&, x୨]@HY@8 [{R'pzNr0 y'C`ѮQvp@xkBtʠ;j L|\|XmR&cla{?lr,'`$B ֡"Jyu\ٿ%dhL#ỳP{MYA:d\UMgk F\45N Bc! ZoplklcNĆ؟IO6^r ͽ,f 0 $C$CMsz .(jHU?Fc4T]@#lB|NN'h5QŘ!F,B-Ԩdc L|y!zM(PǟrK>0{Ytwr`A뮻7+Q C"V%KΦqX|/?q*èҔ?.#KH 9%Xx$!{Td/<A5O.6SKM '{x}ҍ7,!<H[L9+yH[{2oU2NRT\8#SaF66,HiH~F3|(RkD9*nйH:(/q0+I7!z ?in*4PAUUi)Xi%0k{y/HQI|:q/&, b&P ~8<+fNt$z?0}߿ ۼ<| 2# +`r>QAړZwT,f[gB;>ѿ.f7Qeˑc51h5 l6-Y 79ˑK>֎ ~豏}A]!([ym_t\88y3`|EUHl ȱE@DN=s@8O}S !}l8:y]K^4[ZA[R! %X0@,}5!mB5Lڝ0䡛 &ZEtbGl@IDAT\Id}aO48`kBM|>sYG>QzԊ8}W|YDvm[&y{$r g,+$A}0 :6`y;!=½SځOY%R {}]4MN09iRWk4vY}X.fys+򗿼gu WA.\pV ~Hf$?]FiVɍ3BFG q* <-M[(^<[<[AgdJ̾4p56Ka3~w ѥwW6([<[p_7c`Zg_`"*c0|P q{*?~3st H3>c#!bȓu; !!<ܖ07ۧЬ@J6}. 1zS/A>Gx*W}{d]A0u88p&s ߪck@x4·s/.d/tD}{A ;DSgB'`4'EP8ЊX =nabN6БE=|'`r-c 'm{ueYKcKn! A Q5J@mEP5|hưPza<ؖ:>~._=U]-C||U^WnENi2󮒹R#"r|/;D%7ȖhW7x$,}֫V4FH6ثD83)JLN#eW'~4?5/eApPZ$Z_8oE- hq3|#gwp'?{'>ZWqJLjDcg'vjY'ea>Cd8 oɥlʕU+۬c!8c5 /va;y>E @\LRG.;yil;K3񌳰/IOz_|[޲LBm$6)?\D \08Pld2:-j 8«?,:,C*7aʅёkhM,&M!k;A89]LY=9Z}x'3E崃yssZ֭|<~-g«[I+o+aCt+)7F`퀠9ɶwS[ZwؓvcZrb+1cSzЁ)(hp1ƎR>hXx/Y-E.8~~k~:kk2oAˈ+(5bڈsJLN[|#Nؗ` 4p%Nabǟ%~⳩?OWwDLԭ~צ3_Yfr^z(\&(:X2fu_pL>]Rk^@hQ Ӷɡnܔh|xr_+c<>?n8xҙܴUۜ2+< Oz$/~ʯ[~~ٱmwR'=T"p1 Y8,iKl 0D 7{>LKuiF`Ipe;uh"0kuOf ˜k!W}W]7Їa9K.cܨ9, :\0)ʙr^ohM#^7 2m ⁀FJm R@t4pe?w3K(KXt=|q r1xX.z 𲗽l=xw^j^=R()_ '`LX, y Z>Q-TMl`(ӂͰ$#t؂\|o_")}6PFZO\{yOjKXh͓2#;c?g, ~-?7ysAl{)%o!gq3w OS]-B_M Nare᫿HcPx)>}Cɜvg@9*Wsz i( "Q.}S.0طm=W7|.cx+efC?l  ZU]\Lz!J_ ݦU<} eIOvKU/H"A1J?Z ߎQ̮F eA[%F?r6}~*a//k.XX<)O9иS?S+ry}&}4Y-$q#+h\!1 oOT3b&|Bp%ׂbk23_`ج [KfDi*;6j}B/T[@yo\syju:~ȥӹ=aۿ<&3wxTE!&;@ɐAU*,8|H!: _P|&[ Jt'=ǁ~̴JC P|(?7Ҭ1j򇸡Tx쫴5a? 寂S9 9nzc4h~ƦwÜ_`PR%.dn.g&Ɉ_74Os3d8~~H^W/N3bITUg %řZQ xÛI3U/-8|lCUPDI8nqF|?0ϲ@m` ZqAc-qJ@J{08qjL6?|Nb/OD,/}jSrݿwz_=ux]ߵzSz&8?Ini̙dUE}}'+^D3)P@%d>ghJwIVCp hB'5+Sf!yFYS#;b0e>S3Fqt yIj49f0q>sۇAdp+s_G*{U/ g>ɟ?3|۷}ۙI_:g ʑH?$D>\Jz*P;3_r[MhJlE!f6c w7;)@솥>;&;iu $2-F|_>OlȟѶsߥ>s^>(s_0 Lcp]Q[^Wx啯|l_ij 3 ~g~fۿg[$c~$]$q+OU i?%LA$X|F}B~UIJ+LDD߰@si CCJ؍.siBb'ւ3F4ǟ88dSMYξ8Շ?aTUs[qJUdz_k~[3-9R5 :<&HɃ/HEy; $ْUn VUh^۔$Cp2-}`b<0Оz܆@Z,s'wÜxٮ{IWx6af_q{ps/=n.rG~GV|MC=78~W??~]?鰌_$BBjR~vk` ¾R Jչ!A@bn$`ڣCThq]1ǎ)<ҁm8"oH nW VI4p ⴩?H_6D8/]2XCxle$|wuٯvv~}^JL}s/;F-{V߿S[@W5ک%L$}~Zz_ | dIj(";(xRIZCF yGVed1 ^ Za'.+p)g}4P]w8B83=%<|dwsu-G'a%/t?OG<]q֏}-\g1+~{K?x%MWUqZI/e"oijq`H!ԉl@7t2M|˂Ⱦ'pcC6kS3egm@m;PM}O|W=ݷk>[a@lXXV63:Mv0$2c{{!X*28W.7X# rxZ'8+oxɥ[neMMzH,?b;8g}! Hl KZ~ Ǟ;I-]2,DxKV"dWtp[OOjߦ+چOOy㙶O'OMOMSxS)IS})_O^U~}_ /6,0[!0uRGp~.s)$/؏tַ{?~_bmy{Vmvj2~}[[VqEL*HozӛV~Ů\Vż}3)c9"yAYy]#ksJ!O kb8 4R܉4];GֽY4)miYlƢɞڃɝ?u;ü{Bxu}>(r*pe N¥ׇh~JWc*rR}˿.iDsU\>/\D2'}ٚ:@[RĪݐX衊iQu4Ĝye /yEhaeڄkFAr !??;y=VC[|*,Eg8d=}f[ϋq;'^~zqГ_r]^Ѓ‡>m?TiKJtyZ>cAOWv@0'+$蟖*N@g_OJRV!_ېw} a$:Q-ѠA6]2`Q`(2a'-\_ԟRS%;LHҒ/~A̰֠y`wr1 A7rWu{/z}ٟ ɏ|}~bj]2>qI_yqLr! *prR/w[$h.mж-ɠh/=yx Ͳʴ4bܨOvB3텣ĥg(;/6Nv*}陙şo8Ӿkʏ>Dҗċf]G?+\rl !|\e=Q"ONF-s~9؜i?vJTB<-zrd|`6"}PCР\4Ll Z~=4y @mE)m- |}z܆k Y a1f0Y}+0~(T60~ r&U[,r?t>v?ӯo抷]ͲRpW %>8|([ K>HM\G 0Wby>F-XK \r"bncMoʯw75rJbIs S-z/< ;!Ǜ_$;~ږ89t  ARe-g{~+򔧬ԧg]WjWSUkr&z2#هUaP2V[5'JChzH%Zx9pƝd ee[T|'Gzt۽mCˇv8IЋ^;N|k:bȢ6_[7?|){y3ҟ$*v7Bb5'Wt  %Ht*Y@Jڒ%ec-9|wkE_52i77.? ٗ@ʵw |6X%;̏FOxF#h=Tic߻=ɗTk5䓇})?TN1Ti#/23}/iomV',/nu^ޠz..,:n,;{603C`fvs\Gĸw$Z M7hz-I%* p7[KGa.~a )WثC̳[Z|˵ՎF۴:Ziqys !i$!! UJAEN\%_\T%WRʀyMbR!@@"U!HBh!Khfw~:}ιܙ;3޽իWw{^ݽ9(tiUeF~T:уmD^Z*CǷ<<$Im5 CTO` u֘@i'~A?ᮾk?/X^d_&mѲ|(m8o'QTm3âV!OuG=@#_-6")/H\qηT>li|xʾ5#ks SXЬ*PѶrէ]d ;әHZ;aHDU9OV"*1u*DdPOVJ':IJ8L/}As 7?wCV)^&}{K{Qu8X݊2/ŠQ^q꧁IP3\y#]AwZAGƻT\O(Yf_C׮hO<4*k}Ϧ gA.*FO)Dω;>}}%珏ASci@B.}s\pɋ/^[Ҥ^ :ؠ)ܹC Rݾ寲3Iw |0"Bzv:A0"\{=j?ۿz#ߵ+IZdrxì0-3:o֭[ΞO"1![2/灹fWXD%cdee%v݉*N>yو|A#)Z!b/+r`^fSA>\>Or7a(<Af5J(z|I{QF[9GHT(u+zkOvEQF;{ /åoR5N$`Z&thDbN쨉L>vg1I`-W_ 84W"tݴ+ ·m6lC" e:IJLCE^鱈+|C/x'OgOȷ2:I6{La/;+I4] 0c#EttбYCx&6p'hVjDU.0`/ցQc[}MDU٪OKL6={ȏ\g j]&n"laBF-Ԗ Zbkw'َmerI[¸ac D<GJh_2%5t5( JdK[VMoˮh_yHJk+-oӇG6>Ak|Ht-,k:^o5݆XyJ;6qٳw}yӦM7Zm<߼/Y;`&0viz@oh(yuGeقD`7}l }/f[~\'n@19&!4cNyifȣ/;췇RK#9JGUycOylCgfL㈓>9e˖lZ{֐ J!Gg)yKD&g玾'RI+]h7ʜ^J7!8oE'yD`r' O-҅F^yQ~:~?@G~}FǯpLM C' wG25 I.f-3DgKQx8#F^& ;s,&8Z0:^SZ5VdCʬTzPD'@h-WTvD]#p8]8o v54n t:}"*3!X c P A[$sl'8"F82\1:LQw3A.|ZBiwc ZZQYnj+4R=wo솳0Y8 :\y:u бgo߾k)%M=62_q8N(]xPg21I1ȏuEU#W5 &=tď_͌$ QlɅ/0*!?=kR>u?0~5yfWigbr^FZs3t[v"C+w[\јMҠWCbf5\{Y\V3Q2ljNe#:H}eo>y?Lve+jZi?tfo}]v=}С/LK'f; AqН9In=ƦVeiwPOd8Tr 5+-vT=Jkj&S:!fv08&Fg NఊO~?*:|zDy@/iL pxx6#AHɏ-usфQx'C9w31R& fWǣnV^*hT2"⡑wlrgc%r - kM 0Gt;G=Oj4[Ln~m|-W$z)5_VN7ՈʑP٪j]6"_y, B#ߕw@̠dΖH @aE vy?%6Ei<:RΟᄏbD`!`wF7VFql ,VM12'°LJ+}FE^׍dωCGEV[ʩD% &rD _b^׮%WȌc*z8 :~nnm>U7^\ܢɰ;_LKN/5'gu5^JUH(6mT_u]{S몾50t2}'t>?qlG}g-yqki~,MP~(8x=` j(ɣQ5sR͡oyT`^uoҤ6gAq]?pX4k!H\pĦ4 N9PأO٧X5aԴdp-t_AŌdx3$SOzrffdvO)}cf6*iVݎ@pBiPI(Ы= Y Fmݜ+ Nޮ2}#3d1#/$K?$Z_z}|p%80 qn|"n͛7V94!:p +PffaٸlO1'XblhPv%I|@̞^Iy( ^ކP&9U beC)\TylϗG?}C5z`dgԂ-(ٟqAp{>~ԩ8;1Pue["zB@!#ث|(SzȀ̈FY-5iQ=!euiB'g$sG&h?g xg7,}O>xmy?zv {N \I9-6ڊg39g?NK2Өfu-3U[ƣ:T]u:NO!q:#ā]Q-"OY^wC Xi=gϳn9,.#.w-|fgghyK^N>\"0=L/z y `%@(j#he!Q&*=ђXb@>Qx/ҒP*iUE/euÎ_g׆<87b @D޲&bg9rUW=mx㕱52SaٟskPuP./&oeA @]N4ҏ+5y6I)߄4_@w#u2ŽvG]4a;4"@';p>uM76WFp] sz  >(mP>l8FƟ1-]"䎩~W#N؎WdP }ӕ{b386 ^Bi'WG*zvhklA JOW_l{6_WWSG#_ekۿԾq+G/2[= ph_&ٽ{o}.=GwNL&k' 8Kw'3&/}?PMS*.#@Ur'0 /p{a̡o̿u+|e ]v翹9XnY G_ \IuX'w;]m?o.R]⅖λgh[7Rx:j|FK#baݶ0Xe]٨CȲnc X\P'щg*~϶;k3I㺓nN0sܹs= mnı*k+gxs=^Vht+qG\y7ar;C&%9Km"s14+{^,ykyŁR>2!:KZpuvzu^fV^Fn?c[Syۏ_;+W{e.{6>S{m_%'`XfˌzPp^P+o_!Ɂ(QVk&fj G<)|9^@K1cRN lJě]0Q{U1/Lk+B_?6,3(29mUu ݯET\~G7affj)$Mz]Ҭ9x.zp]pqs[j5#^%1<2gzʮ2W*iӕޣ4QK,jK苦"iǰ}Oq40&E-/Sk@*yLqk|wsl۳sd/KtPc]Dȷ7'/yBUx"Z(_\,28gS+<(Ne V[vXh-g %Pny ;:`w;%dR`—:llxVy\%ԉQ"+ JEԿgN y? Ÿ3v寱qsr A=^{~;4&1WՂ;u?w/NL|b` 8 =@lp8t( ?Wy6—K=g5 oXcYE:LGQd~0$_<û>K2IDATXrz+jIPבG*>Rioo۪|a98vH&30N㴢Ç}\p&?fƾ7Uga\o?`_d9;Cg +t C8 @y]q̩+K_{ɱȟh}t=W]{p~=oku/'+BD@Ti^){,ԩS} _=y/_ꤕD`2x .:At:Z'%Ae yuzCV?ԇԶ8,˰:IJy/2bk'O-Շ?=C~?_?>Gwxj D`}סFFE+qQ!ͼ oxk^i#@pq[_Sh/iB/:\.< \|@xm}|AjuG9ֹ-o|{>z׻{]8߷8|JӪ_x/υASN_f&8v<>N$^կon6(!(0x~y%N_ yx4L5m:6}-r+~RW_pL.%jG|d_†sj/7IS9t\p+t4QPFE9aM 4Q`q7sM!XQqrmigm`W-r;Pxh;+sQ)v&P\oʫPF 뻼 x{֞la8oq8zr+:ͰtJK}&rTiL|`tƾI7o ~c #n`%{F̉k\2@2i9)AV{r֡<]dlWmyo\cs{K߼أ G*Fu@ߥ`23\</T8vGM4d`}|7dWlbW~:rO8~ß4r;ai\aڦx]ZjWݠn,c`Lƕ.qR[qT?p趓|cݪ&R~@9~:t1V9ZYG;3`2Rt0 &ϼU{|+޾X-QmFD`bufj90/Nx&N[3&|9]?caETW @1mpXIxij?/<}z[~o>p ڲ_+|W^DMa(WJ[M{P&rPj2@\&H뮻n_b[ >ߕ!XvX"_HԵJ8|}xWP5a@{PxVc^6L8:N=O8]hy|[ZjSy=?[>ѮеÓ4Md{EA@E1F" ̡8q&k"ч$@[~[o}k56\m`K8sSN ԉĀ  8^dbn8B[dO:!(H_-jcl_83Gӏlxq4C;nkŏUZ-Kg>%@@w%(*hv" @KIA4N ߸k_[_җvnGqɟa"? ^V +Mc+=.;saW|&6C U@˹C ҅zhNEIh^+^j/bNM&&/7ڼ9 q@~]չC7g @G< z,6K\pȖ OM1x0֞T/:,Z6xnq̹N[8}xn'?}ȁGv<2ԜUÎvU?=N㗝eDt%*/(C}؄@H5 (!Rܾ` z{pu7o& d:(\mWd*x;x}:Un]0KF=lœZgZo`eot|[`Px;Nb<tcAYk˒ !+4 %6\P cafBEl WAEDs6[X\DDh..,n0ygO/lX<}fag͟>yɹcO=3;w'xn߱v<,EIG\ًʙsQ&=>F<9CEȖC %U@VBGtrr[S(W|)J|m&;6OՊ$pR2EuD tŏ U~%XW īB3h{ sLӄ`yW-CqSi!ϐ9(K)|9Kx؉ye7I)a#`a"T:q9&RQOL |/T6,ңnjD`C(vq&~R<`<"/YU@Qؗ:0'+}9?FyQa)K20d[bplist00 X$versionY$archiverT$topX$objects_NSKeyedArchiver Troot U$null WNS.keysZNS.objectsV$classTname_assetcatalog-referenceTicon  !"Z$classnameX$classes\NSDictionary!#XNSObject$)27ILQS[ahp{$om,ic12gPNG  IHDR@@iqsRGBDeXIfMM*i@@FQB IDATx[iTX)XH$eb )RPLdcC!Hb lb0W,ذvk&UuyoLP~U]]_uu~=xꁧx_$}֬YTjf"d3vzqTR_NUr-bbdpfX`8{u/s?EKQ3g΋l{hZ}U]KTTEIT԰J׵Q#?ɱ =Bٳg>JX&/6uP ѤV(9x7aZm Lͦ~-^S_\Y?a/8Cegk7~ ]9 /d?>ZlzABq,GҚ2R>$fΜ975ޖIئξqdQgs@r9Y߰ah޼yS޽JĉiѢEԿHy$HEL)a4"Q(ߎf/ָ{vd2"555ѴiӨo߾r޼y/^؉m3kNQ9*МE.p0O퓨zNH%<#ryڹsӒ%Khh8hƌtMZ|99N?X5 qX2뜵WGY'QHyX;8Yh0H4 ùD Çi߾}:vݿ?pƃ8h,a_`N Am(9E8#^"y2wJg˖-[Ω!ex<:E.23sqqPiX vZa P:w~'/ڎOjPw3k])r:iJ .(/.\ +KAҐuZq[ѫɮ^W0!&(z=i24e :ԧ[u%or88IYz'kYm yd4hy/n )au=[nO)nmcܹsԩST]]M6l @8k4a9wӦMRw9bt: ^CXaB}FRVRUx.\fzƋJbf7nHG˗ԇM":q0 x"ٌ-&eZ?rA k,*^Y3ϵb/(M+%-uf6b SHtP*%B+1-*<7a:TqYHo"pz4BKk`vmwZe&V }2̑ ·迨#\AM+k뉛үm G׷ ׄ&Ċ@s ҡɆMr`=vk?@pӰSkXk(ʀm6,_Xڂ.&z+Aa9ÙN@o&i?yіOH3 @Y?Ej9zk'Jȱ'K'=ddH U`j(!0,w61q&cPCj?dCrq;yyxJ׮]#,l9慟Iy2"=sQd s8G .ă++KЫW/zW{CF&"oիWith9990b 5I(px8;DZ8f[YNA[+WR=htʕ7pժUb Znݺu+ pCɢˇ<m.m,D6<&6G[ R>}f^.]*Kr9 q3`6/<رc>>,UxI!2ڋxss 0肻 xCM:zV w#qccxH-٤s p'z2Ϧm&S;3n8?eg= ff:6pe5NC+8d?HD́ڀ:)=RMЅjf\p nKqq ! ۘc_:Mqmm9Hwy1zy1ne^}.K)Y9 :+]]v-g84i+/L jT6=829ȸj"2@Ho\۪[^,,M>R.?~\*'>HA7n8⏫hǎ[q :f0Ȇ Ă|Ap: @AQՎa 6 #@lsԩ/iƏ/JYD(ŒM:S.{hAh%xSX]9}/{oMK l8޽Tr<}YJPB @8&0PH^d57dc:6|Dx~wҥ@~ޟ@Vhj΀\rΔVb~x3]LizŲ q{Jmr0 Daºshg/PJ)¾d-it5*O NM"J"95#;Fzzq@X_0gXY>AA̼Ͱn.iPkLL6'N]_GL$3"/nS ;}sqrCFaUc!ţ`Pl6%JcZ!9qvݬnH%rL?;{m_&۲H ttdmm[:luvc6^؋ 40䥮F)g^.!бQMV6D&d6f >B@ (8 y8up ɪ"B 1< HyK&xV( Ko9e3m C,{zjv8`wJIENDB`infoGbplist00 X$versionY$archiverT$topX$objects_NSKeyedArchiver Troot U$null WNS.keysZNS.objectsV$classTname_assetcatalog-reference]icon_32x32@2x  !"Z$classnameX$classes\NSDictionary!#XNSObject$)27ILQS[ahp{$}ic10rPNG  IHDR+sRGBDeXIfMM*i@IDATx mWytߗ@HBz#AG6 rLx&eOyHb3L%Nbc^gp0g\vI%1L a\HJMl#٧Ou{׽{^[Z>g}szmLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL` LVy !0{_>qȑ󶶶Ŷ9L!x:n-BW:Y{W:d2x-*va_Ct!>$GlY^ٷ,GemlYj[6]g-RW [U:LX<FKlGeH35`׮m[?$neNOHҋ̬۷Xqp+laD+[te$hy֏LAVp˃])]^6xBAB-LJ_U8 $ַ[@?0ܚ%o?M?h}BiXESaQ(t/?~xߌJvBa;NLE&(2Fudҟ C"hw2اᅴA }_}[cAtk/ȱڷ6m}?@ tPAJߞaeЍ~kߞ>?_?}[O< &>{˧?7C 1s a'wkz?=W"y!1_:}]x9x|&*@L11 ͚/]:Ûi.z]$=XھLלܑOb260ok 9\u { 6U%WN:uM*ωتrM`WYR V|)R|GQ4 Pʷ+Lbj4 '}?M[YzB6Ȉ$!v'ZL7{CmL>/JDRߢnsƓ^'(5;tӆU2Ҍ}GE/q}8' >ӓϜ:5yWt&`@rx&`=nǎ{I,\_ϋ"[Y3XUoy4ޑ"Ҍ%ȟdyΣN\ZgN`|&~Fw/<~]y_9LkbH?w0Xh26|d&`з0 SϓE@θ Va3|:?~bc<u@hOA۰e&ȣ-hjJQP>jd @?KWfʣ{ܕ?M j[<#z׶N$TOğr'kŸkp28d&pL.<St/Ɔ`LvD྇^F3gp=?Gv~|ZYts"+W@ɠ4}rue tJ7PIELt#f2A1c(`6kYHpg2f=~r }5fq}bsm6&kxΧrbyo&p-L`}EC8w;0Nx1f8 ?-eB?N!.g; Ƴ Sے _ё/= m ʃB"cƂlU K@ݶ׺S_ 8!#ikYڵ,rMsNomn\u7{W;|l&;{b&C}-qm]f0&`&,#1H "'fDYh@'dvHuDx*,iY;K!ڀ4rXUZ/FWET˖1|Ø䷾r7>b@{I)7NqXusٟ8ǧ~p<~03B-qvW8O#E0x3h}Xe(u;Ap ̓tŝDBp dț7rIuwj[<$q=}omX|{L,{Yj͘ T"m}}XSKb&`&pF fؗOK<,#J <a|p>Z򢬻I_#5>%ȅOxM } Y|)qUۤHp,}ݾpd WI‰!jyR[?Q&ߜnԀUlPs܇g_>2s EJvtS&&'O,4ě?ݭWn&pC` ݑ]ܣ Cf5??iKҖS4Ȁ&u7 0}?rT0O"uٳj |OHV|/ +ȅ,ZPmS4 ߐHm/꫏p'Ic}1f0OPp_O?~z{g&;՞3XuN_تCMP'_\ TGz2КY/v}iC~ϊt$^° /;m@*h*}Q'D¸caLX!<~ ̇}8Gu7~: ^7ۋ .oGy} S<0D7GRG' D;~ڈrY=P&"  ?v s(mQB(ȉÅINSېHj I}⮯.?9TnN~|;wOmm~KG^oJ\Tۏ&` .1ؖoܸ++EB0@@7x@G'' I=Ə\ƿUndIɧdnq@"_S`FHnN墀km{Xb2n^vy+$ҜY|[xCD ,C7e[Hn^W]o?S}sȫ L@| 3W Gc^,3O >=7HjA/0){%U,pxB܁>fo tGTtHeo0쾿lޟ.'N_{[ݕmvF awfk+Xu^cJ9P<~0I@`T>~@y%QWyj"N7 ੾Q 6moip2HatN}Q;ZmEx翹ίEZ4Ǜ[[+/~/rnSE&<|ؖWBݺ ML8sXk_z ke@#Ă_yv*V[B,+&gUmH$Sy7fJN f{YS ;~YMZGL(Pd8(DH%p6Dq.5lwi?q@>ÿ'rL}_}lO^> .&U౛@^!=~3508\x%$9\ @~lOȲYMˀzxn}|gIxn-쵿{v[[t~ۿownuZǍ_?=J-:JwF8'_ <⋱N&`&p G#6`2Z_/릁jBwb6?/ N֍=oȓr3G'sle5֔ha_Əd 4|ҋ_־xՏ9(s ڲO gZ?3C־?j}d+@0N&?3{DP'˝Y,>:_ٚ{_|Qb0N&R{Wjkyk.:u;c`r\LL`?5 P@cw4J|gm,,dߣ _=dPZ.Op mqҵvoaSEmy]z9\@[qPѶ=Ҿjy ۜAisr>?ߵ.] :x s2U!~7n\qƢ󿍁_*8ML&P̻7~rAv4qg-Ѧk[ .8l` Ӣoskz"rG:ܑsgvžZ [p:\mwma~??;]N^mաU8|pE8a'xU?30WPƧ#/4?S3e;?Qk<  {{B\o!lՅ;?oa>xH1'=|O?_l2A'} tɓ=z'c10G&`&Ћv#=C,a_q5hAa<>W 7gD]4vYG- 9À۽U6iX3*7 ~X>S_Sz8_?Փ֟o3_ xǰgs6']7JT H 8;}'1L$pߧ_4!?6(+ v+_Vc1\@dJc:nFq&9Rl5}1.x2{=Y^-=϶Z˶}LkQ]6YcD:Zg2[^*ݪ ($ዾ(C`_FI?,&q7S!i&@iĎKhS|q@zAh[x7׎_[u Ǖ0؟L|}s!PYNӕ'YsLvAOWT?{($>^/8&#o ! ylWz }[1̀t,Guu`3?-;e!QD$s [K2qc زfJ谕za_ɯdW_ =~;qH=t0 l}s^<̫HO>u~{/ʝ.*˪ ?9qf )'wuכ666>YV10Oa/s$nyj3DgMտ,GN$$c -ݥ<Ͼ8$ ٷA@^s/>I6c<\uşkb H>" N2J@str7KAaҙ&`&`;&O X{ cݞ nɂ_#(o,|Pt5fa2MeGqگkܯ'W&~W+^Zy2`&`{@?5,_i[!db%>MgUt )дY=o<~kw h]nM 7a@<̃]Oߥ-v[?:.FK7W7'?,A=~1I9ً'ί?HS ˜g4k?>K_}_ xp2FWK[G08#  i<*B-$QEX}_ %#"d(' h$>{u ҧȜ @yYduгcW%I3#dE~ i~>o?1MNAoZXB积'||E;龔ܬ'_+ǩ ]WVM3xN&3&w};"蠃t0C@ eI Ox+d62+6Ϗ :DLyݭJ;*~،@XS Oˠ*tg%(Zga7f~џ}X/r?$>NjQi߷~!OXC憺?(d|Z/%KkWu|=s.^1nt{닰syo爀'9fG h>Nn ?xQKg },X챠 ,RJu3?Oegi>걽(GSMj̺1/ʋbQ^>f aSu]QCmmA{F/7tt|s_-z}|۵I%3{89&g)ߕBvmמ8qg89LIjf9FUZK[;A =ZM{Q|>,)lӾjKQ'C1e_?"i%a9_tĖ}O [Hys\9mM?:V.!Lk KwǢCѡ eܶ v+Xrq֏O?G~?Wc^Уҧ8(zGZ8wd"AA|?R^Z *RbEG* =/c ke2H_s"gp_CC2y^3/K^6+kGт^XgޛY P:BKnf hQu]o/a10o :K1I <Ϗ|RЭj(MOYF|aG*ƍq*Q@=[6ny %2eM8,MQ|;3NǔPEci >|.$? 4vb/?OB"O{8+Yiʍ=ߌaLL@",kP%ih!!2W*B~)G}'633b`RAC[##%XP~4c2z?}.7A_X;tz^")çd#v  3rYHY,dyjFq\YXQ^_Ox~\|y$.A'8+4Jcn@=&7x_sk:&`&`g~#QFPQiQG@0'X޽+4MR78@]z@cpL#Ȭ }9U8a%3/2Ӱ`Ww = w쇧gVs5}P] _zjr~BI6Ӈ&dg@=&r /G{:vLL}B^7,Q3 w,MUΛȌ<d!Sx`=!F> ّ{|%p_3Tm(WA ri_Iy~'2? Yܶ~7c=ϒggmA7ng}Ɵo?ƏS>_ C83.G h9馛. (.g %&?㗷JAzT/ #,e "Ta:dhȷ V֋:HлHST6t$(\CEƯ Uξ1ZW=_0< /NUU'k]%?e\`H倂E{s=:~>l Z(G&pk _K'˰89 #+^|q8; c[@d0E0ƓeLY}jaAeȢʨ[]w@Wcb#Ogb,lCmH@# =If=>{__l?$6,Mu0!>0e]ee?此?.\)?Ktc ]wy7 %K5F@/b'O|_0iy&`&`g js1 qق2 cE}V;=s7 r}GGz-u*osd%I-|yrϹϧAgVI8|%\ȓ?گ?2]\s-xZW =b'&0N@/^?ѣ&$7w "/> n]P(\"naJd#afJN'/gf;Y/lr:Ut?R+fp:!o&Kۗ3zB:4-$_HF^Cw$p % ^c7߮w]OIG-Q8{ҎzѢ;_tر߉; TP2^3Et˺( ȋy&IH7 2?@G(Yl'CX>"Ƒc>!P"vX. 7틬Fž_%VэHѶXX;_>[Ebd{JO)N;+bEyw`cc_G%&d&`&?ŧ#=l JwQex /cWiӈ72"_Oj'#mE;!E>tuTX¾;hKI҂ )g {M/vh5n/ L#tH$0L>k9⃎]S^3IƁڂή%ԭI/=~q N?^y/+J%ǮF\aHAND/BxA= MXHm9(^ bʫ<~ܯNp'<ԃEvQGJlqȺ\,gOɨ6.6$Iy ?ګ ,x fCS` Ij'Ls._ΟmwI[qelם>\~2L[M`|`\u^ 'zS/t 9&O{H4%- iCo90>|/Z7+sex<\g@"5y^vɉ'~3 1f<00sM@h#8>Wb;bEV = G1@$REOI_r/5оtHlU&X>GɢI:JcEe(-sS$VI&QmBBJKm'Xqa]CHnd(Y/9hKd)uնdPRRH:lKY]~D|__[vD:"'x||qs!ANn ._ LL umUB72`,:$6 >h Wa7&ì}q:alG,Į]3~ $"NHYׅ[ڤmpP=${r:.dq]'CaHa:!i_d]wU*dy5J`㪒U99+[Ћ_"?vW|,Lo7w ~ [/Om0 KT|$8*AGd:6F%7hu,0Dd"Fb=miW N,YLC9dV'CoHlHُ߭9}"dd1 xg(Sy"02z[V>e(A0u萵rn }nRdw,Jv8Jzة]IXJҍaP')J݈L%NQl׼DpTj"i{Y$B'ą]s/EmeŠ lG71;c30؟cRf+x/+tz?/Ǜ2%*lM_?d(P4xXUbTbtHDy0mчj8~eP ty4A[sdcQ;tt %Ra6;4־1m{ۜI$OU{Cwх{n]^#2L`{= /6;.i@IDAT5LL^!8`&(͢S0PC_ȧP'BC"0R @"$%l!c˿,3붠diy]*(I=Yj~*#ۮ I*1m)\\]C6qWd=gLH3 nOѫu2&uz6^=zɓ'PPQML`;,'8xi6^@ .vX#'Է=ODu6lry 8N: %#I-n0 .|Ė]H X;%26.ɩ-'{usoiƵe '#cT J'o拎;?wakc00@ BOr 12Mq`H02I1tdOxa>C4(B2AV4E/$:M|i4":wyœJ.?;[2+c8 SqCK4~4:+XuvCgi.픆BdY_/\dH&."(>$oK5R/ {`wYp:|bc*l7vyIFQ): m EYVd 9]b!c 1w .WzS_Ǐ[Hs6Y\k\7|Lf|HZvM>d㟼oٻ"ћIN&0K7f8g@r]w#Ls̹&`&`BRY|0_/^ψ-; Πw)`0_xmY,CR$땾Oe =C[أ {zu]Tֳ%}j?h/XK,:6>NER#ɝأAE;ؐ$CT,F<IZF$CR$v})cCа9hcПcŞ^#>zisO,I(Y rzƉ;gY {g0჆@:םot:}WcC00H3*$V%A# },L1. ?}~--vT46tpo, mtTQ8l0$6KnHq1 $(e$>d=:Y}ٝ]=yž;I֍4#(yI?EsPP9_ qdYEgjG8wiC'Y/E2CW.3?+&M%C\"UT"ȶѝOkgzR㖌i&JRCQ&Yc~-9!^:3cWש(hgadN. ʃe_ 9!^:3cWש(]0flS[/5< U|K_<'{%"PL`o2Yhrre|yML _ F@|Tep[-ұg].Φ2ȪA5CVC_J$e'Cl!ke[ic"A-9A$Lα9:ɱhKyl ݊ϿAN_q/?PL|`;x_y _e&`&`6d%ЌbfAlH 7XV֚S0_P &hk3cuΑ ѲD$LLsA},V$uPȇAW"+EN.FZzGzK],%Wyy9}B"d3sdH햰}9 $պקӗN?dy|`O7x(rrUWDX<6+i~as͙jIaϼ9zW} a'G~}{a!Rpu; X`|ۿ-^߼&`&`>U >߯3C*R >9Xlsс76j9T쑯ZWtՓDЕ3^M1TD;۵2ֳݞ|V9s 7EcxssfY]vW)^MmH$<~ʝE@/?9raJ008iZ$z@#QV6hY7aA( y]x nDeE1-(msZߴl+s+I|6ԟVO+Xwj>^P^z=_eS/@rlǼ<_ dS2P];ߐL7o}NQ  >ez +_[{LL`5 cxd_ OH'/\f"[e~L̽<dKʇڀuEʬ }^yPVזYCdSچfj -Zko#G')I{c>Ӌ>p'Z_N+Bw]{>yK^MǏʊ $ov3.rFE;<S/d2| gp5_\DNZ[-%TB(~G:̔z%^;ל|AbF8<&H.'~睐z :H'YQ/E:0?s=~ss߾yT  8sXGOoNocl00CFoc{JXI6ׂV}fZ^5yˀ_M@I6hG^EU&HnqI9&Ju efXټA2ejWmtY,̱B Hy4ܫ 27COÙ3~T_QSR^$ᡵ/2u\GxW`Q7Y&=J&P_|ѣ~dL9|Â37-=W9֌ݟ+&|SiYʃ^3U32ʴGS{dTIFCR7d#YrF*dwd:էM Gcи%:g?19#}AL>\ %9ip }~xōjC&`&`< y78sA`! P)+I3q$c=]ۊ_w֯tG`vkk% 3HGBvH]R/dIH[P5SHKr?PvBR$5< wkd#ruy3Ca?xXO}Tʊ}zJ|пǟ|>G<ļ~3Ӟs߻CI7i]8(\N8E_X&`&`@Eqr0QX l:{t5'-s]-e=rd(%_ .Ž 4?*7,iucGvj uFOͼյLgH[RH1׺c]pe@ҎPl.[Ty90]?QIm?QARdLڥۃT7p {'&>20X%ûz.K<:. /걃O@FS|^Ȍ<%Ed6^zmSj{^j -I cj_eJuYEiq hx d Y4-VY־Co? 4)㇂!u&qkNo:2"YzGe&`&O%F;%a=mbQ'3#,l}).[sY~l6Dʵ>omHlNoǵڷڃiYV>־z;=}Ծ[:zomcG[iYV>־z;=}Ծ[:zomcG[󠷩؟qG??!So!Н8d'.ğ{Ə4>40X!x5xw D`Ҁz!ǧ^M7oǨ[|aEQd)αbdi$<UY28ةI50c_}hۇ= k}jlh}RMN*+]FeTs=` N>+? /9?a)CJ7^O~q㎟  qR]+X=BxkaX>g%=ƯhQ9d(?n/?IwtVI2 I`6n%QΣƒJzH,/Y~TDݱ CΦ/dK" wȷ;JЯ ja >R+_PiP:$`+'GמDp}@K8D'.ZHm[n9?LL` 7$z>5Xaʸ=v\ca rB3n,@ah{*>c.`=$my >@Vv5(TPq?4dmo!DV9JZAqt(v ?u'ԢCbC?$뾡NR/u>zI5ZWywp6"_Iʠ.*|I-O/+׮\lېtA%-.\Ǐj00X\8; X*,+f+snI͇zZ<_Ae'26H- 9mBrơC;MAI=l%YŨ_R>'|CP$-ȱ uiCvY%Rd$T*3q?:Z-v%=<5pyWl8>:$q_CFlQX! ;=N.Z$H]~_LLVM_xZv]hC&; >+(%8%lWQmdB{HY *4BJ t$<^ 6bP;JIw&j .77 2 %Y"_ 6`4aCsIZґ tqWX#y:=qs$*~ȑ#s9LV֑ Az.P/FS߭Mמ>$qPMqva$ ʾl0%tuż*c?9丁5nAgԯgOY)Ҷ:ț׿>i'Y c Hq{>%?]^CWxi D/ˡa!LΎ/sfMc&`&6#G fPA=;8R:o8Dn&M6 ˭pMRM:D]^ h_$t$֕jg4>FܡZd_Uʅ=^e^ɠTAE_5+4z̵V.zt ?C} :&d(s&&Q&I>I;UR\%ɕt9R*MOh)B;pNb.J]>\3Ab$<A/ dkk:@ȃqH$5$6J־j8f?ղ>4'6HGɱY3Iهk&Hl}Ͽ5dO+s^]shyw}H.Q-u~nOð|b+|]wq|M8h+6u}O ,UD1$\zWW|cOUV}IB7Jw8.}V yx}-F'[{> 8犤l0$u2zʯ$I^! e tKi~%g' Nęِ,L7].魷z{,nLL,{S>/+`}OQ0z'|? ezBm$aˢu.FCg!J4!_ye$GGة!Ix>Zy7Hl(Hr'[X:- ۧ=X+:ƊqKNcuurS/Ι՝OO^{r}j]"dj}Bq S{~,Ot:!O ر`ΒfXj@ fÍ̋ Q](;揶%Ikܒpv$o1U'z9TvsHNN:\! YJ&ُD9Ek%_Nkq2[@{8r:O@#$?:~G`&`&pؒ9>џlszK( C@KfvO*%AQrE"Dz R .eS~[c["/j <~E%vWnk]Ⱦ-o˧?78l:85cD@jE@Ȃm'NEd&`&`#1/çHXe<~261E찠 |qz/ayuv3tHlHqyIcU})o^/ hG}QI}cNs si, 6m^'{ӣ{ϕ"PmhRtFO6(W]u񍍍cl00 .r]} @cA,J' -î8H{<)rv尩Sk_IgWˁ|C>˖}n8ӱH- o{ڷ8߼ތ.oG+k/[זX yOk{"PWZl@7YG\tk}u=i~ @OA7w.,H+;Yy2?JoBCͅZ2;EG‚3 78:@cԾړE#YV/'_ϲK>tNG6uetu iY%)tVym{\Tl䷖u_/_hgLW^^/G6mݝ/c-_$sLW9Ïl$O}|?/Iӕ׶:-*`r썗]/}a3 nsh֞W ~=3 .Di鿿K00Kc _/0Z<}x" -Cra[~,A~qC!DM).Ip!>IT,Y]yGR|0/dy-Y벯j]t%*oez=ZGDRmԲms1|CW{wZVI귲ms? }^j۫\m?tʫu΃$YWNKj[mcuʕWOI֑7ɷc'<ȃT꫚e;tL;$Y\D_-/\RY5VZ"OE+CEu+p}pAtJe4[jي<"Ir,X$u D!憪]-[\ߡ":]m1ٿ. Íe>]ihr m|rId2^HIg;'1|>h>X6* IuZmG)ũΟF#.+DAEw9UԸs,Yz>=C{Aks?Aq SYPzM<5.OfgR^iFeA ;*Wxd2f!͝}O@}Ђ?ITI:n·C"_$#_]BcRuY6]] @&lCyDGO .ݵMa[x_qHp F_C0w^RW EC8Adk}U>p-"׀g+Hωcxmx$V*P_ O?5+v""eȯMU> {ss 3@F #^|g cFA+>uQ:~:jnkaEp}ǿUq+_M:[ FP Q/>5T'8#_zǨ޺kt\vRA=~VaY߂A3lS#@ D{oTpqȱ3c௡m[DC9_d>ul6.2goS0X&p[=tZD8y2cI'xn셖p =}W;؛cSN99x`s'zw[~vTI]b,>ye| VwY'F#ʑ$6\hR@#F|~cWbh?6xTHu?h淧/`lfnebzNkGW^k{i7ӉOͣE /KvIjxĩ%1#WV /зs993Ig#vikfkD뢋.j7\pAsy5{n^Sj>Z 9zEꢻ򾪳]~6K%U-OSqG,?-A9rH||KbCbZ4-%.BM@yO͵vkAko? 9!o}E?40OP""?l1}x!N%u*y_pZٖ? X'8D+'~G~??{!~kvaO˼妛nj'>v|}_cSO=/|y|Cjҕ'QyVceğY'ؗJ]d, duUઌ>k;\ Ex+?Խkx7۟yl}CwP߼xm[GHs䖧<?fh1G`я1aF_i/guuJ {{ڤroy{[nk'jJbpm5o}[lթo #K>s`$ܐH e\<P{䮖;nuQHY *)AJܻт"wȇmgFPC 坭쵬ts[S'9t~Qpw]C}.mMw3z;Z}@&e`dؔn޹m˒p+GmIH:oo <ͳO}jo@7!` .X (FtsHڻ$}(E&alD堥zoT!g'eVSK@,A[Q6ho F}ޠ?U?A{~6Eσ ~q|Lz>';}Oo/|6= 2 2lG(W1p=soඥ;,$yCG> ?B}MkW{qt^?ӟtv˗xEsoٴu /,mrou7]zܿM}5>#y ClIdg*PXCf.XQZ_NyաZ\a}pu{nDnz{P96W7 ~3>_ύ_׃㺻,rSAPpL`g'm}K[<=aMHwrx8?^׍ս-/\ړ4on~~a9ěDGrP,k~hUjKB/ [K$%ajօ(CT,eAs_~ax8d#p>T7G|C }n"7o1iO/4[LHbڪ݅=gSeŒfF7?1iG7\rߥL[y)˿lQ5OySÇͯۍ\,Cf8)Op ExU{=/\(he\AM3R~hGH1|80VFAeHU'fԣc"[3ۣv".0v V㒝xgՒoZt~ەCoZ}Dm%;K9묳A8D^O}C[/]|_ܜ~[liq|=ۿ]\(9=I{O=!M8|OYYBh ކ ;Ȼ cE GuQ-^*j`C>@>@`MRPlK%D;w=y "SQ`?_c!!<;i^h9m> V "6<,#@^Y,7n&_1G`mm_=Γ~^ _Yxݼ-o Y |~rl9y2]w5,@I@Yv0+6qFh}gB˲O~?T<¯2xw,n&6 7 ưJUEsHCTμNzÎlW8 jSH;kL_z^I\}s E??Do>ͿI;sp!@gWN$:ga;r,f?weśhF`؅#?G=9iLO{Ӛ=׾BE 8%oX]~'J|XZg OK8*9=O@_QlpkAwAAOgn&~g(%hL{CTW @+@/`  R1 F3V[ouy5%V> ?Z}\g$ZaD`<9hik R]Cv/d?κS_u&54#+}HۓG>keG+K`T?_ \򗿼9Gi@^i/G:K瓧+ox|RA;ya*b!%Q(tB')B*+| ^M( ݂QW 7A>/cbEX*|0|&WⱃԼS$JpK[;=() [׭jwm%#03$ Oxȏ;{`͝w޹kI8Ѧ>;߽䤒v`5O}iEGY /y~[Y+f "En:_"}~ܠu0{{+}!cjm ګx mkjkb@ h>r32|sS{>ҹN'8$ZA ?t[4>{beA:aHXos-KF$o/`pE^DwkP3/e/{َ$9beAOVKl <@ZvY],Y1x~q;u>n,V?޳$Wp8kMVې2dwG-C_k{Vm@Z佺\&lj%[S3 QEnAIJH]~jL;Qs X@IDAT)ƧDD nՔoqo/x!" im%@^WhM@{G̉+'=I"?~.Kw#^ 5vZy\39HToD$2qO= E4pR%+Hxu?sSrW>qtawj'Ni+qtÃ\vtmF1 W{dG0I Sr ~GҬ-9 ^J㫝ȅ(gK^?}rCݶn]#g[zd?:s4F֑5,w^]ֲkΙg3y\s)fM__ Ř~phZ{-> 5z0_Xmxq`N+zJ?33^Mj,p$c񷊤5qU*Gٛ&/ nqlT_UW~$rݰLm>`>nN׿7f0ZОz#u#H&S:Z,8{@M]wuW\Y\jwwZҜV? yշ=M|,~Ӆdbq8hƤX,:9_b m2;w5zy.MpVK :4Mr)k|n>4^z馄nk/6_򗛯|+7{mkz?&MbmI屏}l󒗼dWk)YpJQx$y8RU-\\m .*W⣍Z`Nt|E[C$qx+V<ߵUxC-8nsó^l( =?s~"^LceSI]jRÿqM"4V?ڎ○dV\}tnhnFncz[>#|3~n_@\uUctoO8~v|O㎩mLr#@3"0^IQ;꾛$wK~8I顱x 5S_PvB'zw(,+R& E}8k84 㟴'hR:} Il$"&Hqe//nV<c e>Uw~R:dԸ,rډ| UA,c@^kτ_Hv9p߻WnkdB@?ySض(NwÝu.4"--Yxn'}ԋSG}hׇGD=Qi)$^M0G]jd-D) |Ag#&]DXsuۿ ?~?fSS.8"d1jemmqd\hrS'<޿_W7${< 0G=U1 .o؟cyo7d",c&>|H#9'.UtՁHAj_CRZy9(╽&%IyuA q!Cp(?/mGx|s3Y pLQ&%Iy{Aq)}~ Nwk>hgՅD$"3u˟S*wO ?O~7ou/CͿ '>qXO>ypAdP/,ceJ#I;jađ'^ *=շdo;hКAMx Ώ6s,8Uj\Ea,[k}:~LsZ Oeg]H3"01ek\]˒ß7M~.17+Ҝwyct|Q= ̝{k%@ >jMވ. Ԑ - [Bm,PC܉cHy]9/|A~mq6j\u)P5DvP_q 6W_()6R?A(8Q/Nd?Be$4Ըh O1 RO\]˒G> ]tQsi%/|?11:6%UlUp-QJrnq钧8.(-e[w2u_CǃùD""Oltm©[d&&4ӊ۴ Gi4XAwqP zܫ>׹ z0@翘mdV1g)|͒9_=@ٰ%vVV/|ٹ?yf@fKXz(8@>)}+F/L|ғt>}_ .X޺{(u,㌀x$ `|B,Y5+ Wp*.Rx^t!QچN5_XכYCcqy EuƢĄ9b<)#RjG:gG)Uce<sRrix'>qc@`,=cx^93O>ϖGqG(曛Çч>?ȋj_4}s~yYG^(=y#<яnvww˯emo[*At: $ ӣ$7]w1k񤵻u&W,iaq*1^̆JHJVD r8LXf)$h;{cGH.{0rߌO_Ɛ7;Cn|#5qV$6"1D/x\q0r6/~=8?ә߯~x =9s܆e> 6FG) '5*<d]o臋O(@sIojBxC5YHKN`loh+8Q%ñȱV~cPֲqq8A0tx yxڦsUEzCCEc{НzL'xb>nh2w۹S=/pw|^ټe/k5=^GGͫ^mwygw??h/Y65Tl "@Rk%OZ^/at_5nCΒZ7. Ď":.{QjuS|ָ18 A@Qj:lmI ualvGl^]mq4ǁl터~$|u׸6D=/c+b q3 Jz׸ n?auߣNjN-[Y]\?{ُDaGkyCW 8n]^ʶo8<~a-{Hjm7/}KÇ8[om^W4z${sN:)t6u]Ǯ$%% ۤ;U"p_<:q?y t? G\,`n=a@ PO =Pp`wyEL}j>f[~p(=| ꄋXO (p'n=+zpnQ5WO5v@6^Cs⿓`so?ioz1G 1_b{.i_`e #[{V}lg +8\Jk:j1Fxˣ Am [,6e0Nrws̯nBx=1U)#zlE[TƱN%\BIM4@EY#0 {\L( H5km2b2,:CmCs.Բl.؋}RsRՕ;~ Թ;Łz o*fh2*|n>솦Txс^_(‹o=TΉߝ3ݫ&geAFsACֱCkz*fvjx~,+DO|b[y '4˿6bp;?_}FO?oݷ|;C<ށq- !޿&zh~kX|-wK:X+OeQ V#?U$q'Iy s:.:v׫߫ΡUIH ?Wx(Q C Vq(t+)U{;թ?7@J-D?|c>@?_خ /| 7hg>w~w6$fٝ`QOC:gkA`u9??فcЋՐR TH\ыlqj 3]~:jևɶ=%h(N_=C>0 [f#/cA+1r9bix97P4WN{_?EQVo%P dOIkkky`<}cx7|қ/=hNw'NMo7a6Wd/Z~%ӂIrԗ۬p}K9;*Z aSugXE]Aakm7U^q5:Þp⢷j,5.wta ooWQuhx1q1B5 cNx aX#"6G /ls0A ,;":?y*;7wqdž9#|(-Givy|/Vag$[|7ӃG`LNͯo |%/yI\D߬[nڝ(mc,/T )9`k/ }]:JոRn/PvᅄT7↬Nuq쓜v-"]e9@;5NE@6xQ{U!8 9ZX}3\fK,, wA S?al9c,/d u;#/(ٮ5^e Z@COlN/8'e3e ͚ P}>|x{SGҋ]뮻niK5{6??inᆡyؒxn4ě [ݓ(F, wN#^\trIJl (Z|)X;MC~9^1  y 84 (XM+58W!MsYf#edX!/;@ t}|1PRM+5/Pz4Y 6W xɌp-˘"/:嬜xyKb;<<?Ux\yj;CІd9#p< Hme¸^@c,~|:Z_hc' I{0}/nbv͈+E:8ЂTd M`4&d=-Aڧ΋5>}:"#;'XAPG DŽXWpJe[|(Ċ"uj+#T ǧ뵝C1_9_s ƽ q>)"(sŠ iYO$+ܗT(F"7&O 9̮pO}r:* ~;V' 5^~`Z 4.tBN2]4 ۩p7oUŢg}R㊧w]Ic nn2|߷v. !̲%~zR8nN$9#ԧ>7 .hW66$y_:th=^W#1AF`#@m4$>_-Xǒw$Msޅ\}: LQʱAKMO{a Yrc]_Tv))utܪ(@߄"hqm-:݂vqRAExsYAǍGv;p7va6qм8bhZ^_ge3eL ii b"s=84>ԿYYzVҿkom '#AC 89v}_h͊B%%_+,NB.3'XȄX㝗hvCAG]S Թ,4ĤGH=خ5j3g}qLG8lcX%: ]cktA}] k<>AK}qO8*ik52V P_ =Nk 9-L2nGuPE]@ ָ he_(1@[vQ%ݤ9м E;7jD{دg?⊳.##p׎Ç/G _=2Ox7Cqb돴2>A3::@QZZ1buO)Yָx$~D\e6xYۨqBM4/hmjR6xCgh_~'\~:5xbƛdB/ b-}q A2ux_ۨqBnY/wOvPhT=K#,3ib'Q xBl5nB)IFT Ix;eix.~%΂ڻ)5FA_eNx<@x+9m_oe߅6fx,3ci(Af~{"^2+m߽w7t(xtsMIeܑ&. ̪PzY+G`*u8/¡BT@Cȭ.7l8?>M\yQNt4찅a8[mrB+x0~}f @^>^'|6s*:o_|1H5͋^O^Xꫯn.̟zni%C'CH?$UvXp nxܬ|by?6?XJ:B |Q~_pt `tmj?PmD|XpdW*?vg38IH9 Bca1\$^rG`/m buQ5Oh$S_yWm10#|3ͤP'v N]=i;l8>JƌF܉o?g1Jrm]Z?%`t+~AN+2:%ꏺX;҉mq!p$F pb-qۿ j |- ^ G`mGЍbS_g׸ԸlcL|V]^»ȀKTW=} n X`O]"Wĕ*37Bc,K@^XB1 ryi|kfUF`GM><s|5k^殻Ig[2a!,nwUr]OCo(+_$uhPΠ,0[o?S>lu/HЩ.Е\lx]C ',p!;ˠflTvސ~౰z c`i1Cr14$ b{ABUz NXݧ'HsIL%Nh:Jm u ihRviuC!^{hq%*G? O ,Z'>({e5 <;'bTyZI^<7'V(wee@`S!|Fq[7YODrK0ӽ.~|A8K<#"3Xz.u}x3ж75)"/#A]fŮD/c:\+w~ѤRmh'HVLsM'S+~Q"xBK$uU| g+bHHC'+Y/Eř*^~S QQx[ oA9]}z36-6F `O1UOM S`^xͳ կ~u>%2"g:GrLO l2&%dRmU)WI1Vx)`Wp)B8/ *+r _\@XK"][czݱ": ~C&WnKھj`oJ\BOTPR_6JeQ7%&6|,cJNxn2]B_TWexv 6aɬLW}gxۿ'"%~#=A?o߾ @DvsrG=܉P?o.Z>4W_}ɗXJJ/.]zq E],̱H~tf-tx|Ko6 FŎqN Z0p| __8u- Ĥ@p?^[+L3lA @PDNd? I>AIJ1b0~ʸ XY5g}ٮ 9b<{OLL,#>Gʞr?^Y(I/c@d/?h>9_QHv_SX?a--y`i0\O;_{3I|ͣ_|q/'oAF`N;fW_|ZEV$M-z%RRB{8 (c/pB$ 8U-4>ѮHf Wk+C?ƘZ@[0t ~!_祍 Ϝ O@ 5H"`xӗZZlOXĎ/ѫ}C<$ZYVxdEs`68ꤵcjUǃ-ⷶܕ4PE„ɒYXOb׿!d,3,|m6VK/mʆ_XxEٓ/#0+ME$$`4{O!5q$v_4b͞}Y?2+V[3[+N_3u[H)tO:<ժ-YF0Thހ\H \>Z߫@$Ql.Ax 8R]x/CHT퉧E46V׸Psx+F .oʹE`8 SOoZ;2;{osM7}s.la_浯}'' %cF`_g 6/[z>`;`| ȲZ 3TI-dU;/ӰwȢ+pIPF ,8]lxG7ra/tEtS_jC@-]צ݂lt-Oq|G|u7x)n~ՇAu`؈bE?9x-g[ 8@:-s%֓y晼0#KF`OE`,_8}o~vOU6vDFWKĝ)5?gG<_'S.x) CV!VqWPw}CW *{]#h`% j |Ū4G Hr`TdC`X^g/"1bZc;}L8!| >B9btƸ?R}t'A$ܖm z dhN>|"dInkoD$y3'ea퉍yM Y\ aAtzXs?x <"d a>׽5xؒ~jk!-<_mʠ}=d}S˞:i7anyCl??qX0:49K6O}Nڷj`%E /,)]eUF`wEԕҲ7=ܳSM?3.%7ZE]Űi+bR嘯"õ % n= Yh6HQunp?ѢQ l9~#mEzGh쇤|‡g?ԇ-T7x2} MI?cE7Άr1.~o}3# 3R6tEh~lhD;l/혖~cko:F;1>~W]r>8Jza׀i=[db?>V7V~on":`K(OgG[FO9K?Z?sڊ/j`YKVđb0?^qETc7?qkY~ E74hnc6{S:S::"Y})_ॅϒҝ0G#U1s& % vQB'ow/^蔎_v{/(BN<~lQdULZ,L,DOhh~hZԴW<5.} >:в&A5WƑb_p`k;Rj\CXԸ |udG_o_sz0P,)y`I/fОEmTOz3kvw]ͭz R2#0(ƕX]sstG}jF [6iʐh⩡5^Ըl,}mx.ݲ /ʐh⩡5^Ըl,}mx.ݲ /ʐh⩡5^Ըl,}mx.ݲ /ʐh⩡5^Ըl,}mx.ݲ /ʐh⩡5^Ըlڤ}ͺ9߆m b[Y[et0#g"WҼ3} ݽ A -$8nav԰QV\Hj饳YxXGR2<s6PmQ6׸Q/w.\~p`We˰AjWUz LM=ܠs2 ǯ}k\ 2@~.\ *T[Ծ5zKf`jlWc@ƧjOG /l~LEcoBcb|_mnvΣO?nʾn)QÅE}\nNs& V:,v0x;.mRtzC3X.Fmg#~2]C?h5i" !Qvaׯ%}?xN,WubMK|")0z5#"0|mزdvWV'P/~"M@IDAToj14ċA%a;3& S+cq>AY]p} qtLŤn!:œg,J/Qsb/:tn5CN>"jZ[=Vն:x)6ozӛvzx@/jXxc!sIBIcxGghFk} g2aFB6)5NddxQ'uq,D<YwW[5>xQc,/-j5^kqIK+h7YǘP܈Nk(uոP[Q}=P4 )6Ce>udXǛ}1n$~l4Q6+y3"_([F[:8d p逸 Db k ~K˫O:c Cث(J6˿~`n? !N-`%ܢu]OQk=۟TDza|{Up!,tl犍b(uTG0< ۓPCXj+hN(|c:Aj|(5ߞ-8:ں7js276XP]X۶L6i@; **|skQFwsT>3I|ݪ9bP^-wEC'ځ~q,=,RI o>0>l-@#h; c~l0ם>F)@k#p8b nJm=K^}3NwҞ u,!T>FR5\.q{kƦH`^X^Gl6̓(Ӣ=#G4c{ o}ks=g#Plg~OKpVb=<R0{IiSFF+s; x:~tڅkRRuR?-A ]R>F4 ݸƤrEdeyߎ/0J)gX 9cf8L; r^Ҽ&x;v?)vqnOyhCC<=7pC~p/?ۺ"i}w=IZGF2CPT}i\"V`|Gm/{͠㟿@]q [C;806:{%C$7G숃oD]|_]Tq =?ߡï04A5nCL0 `+e &KF`E`Lt(#@쳠[(ݏ<$Z˅|q`՘cظ%`Ǡ+!s(Y*5']GJA: EK/ W}Q[t+mۊ̳'9jamlKf5}씹ЎN/pxlXh 6Uk .8ϞC{gmGw?r6vF hOښ5eR2)]oFo}~͎XR[]@'-GX$Rh܁K=gk|ȧctSxounl2c2{rz'<+/iqD{nix≣#lE|Z>[ZNa T,?GB9l,챐< b;5^[`#ʯ'l.66%>Kf|ո}^:'A"&*xA `98 /B/Ku"nVtP O~p=1tl) | 3+!vxOm VOЭ$We~VX -҅XCTI=:נJ| Ļb g//XyP?uj y7lV:e Xy\z_",֎W˩z4 /loW̄ݮW&B\83Z賽{$&O}O8R&G=z>'p} Wwİ;cXxD"^''Ysq%v/hu W' Xq 4(z,q8av9oe'apy ˋT˧r VOfLNRK_Rs.˶Ƨ=خMv=e[IгSBޡ/ '&˗ *IS~PDc#GLպM A+ɹĽ&p ľ @|.~-m6 e~ѼvC~]\+QH95R&VO6煀.vJ& ~Ck?>' ߗdX9CPŢAt;cKI";hG-![Fe Á^Mz)ƒZ0Mm@Ƕ /0/XfSLkp9֍-`/eO[A`A"XL5W5y_q}ˎ@^X^Ow܏8y."0vi'<7Mgu.iM0R}lq| &_(+d̟'&>3;@[Іhծ\_ ֋ucqmS`;tI z{nzmA?88l!ώp`Dl9s9brfm@^s¾6_P4E^x .e$?hU2R%?j/P2}$}Z}9KŮ[F[صh[sXZ3cE_z8"hhv +xK}"уӜ+|~ W=6~ ]_`CtKtI?*ۂo T[G]]]A/olk\8ƋtI?*ۂo`!v |& :%('_ހ6׸{mD .G%x[Dj`Wh [+h|E 8nsmkE^m7 T[G]]A/oluk\sۿrtru2 oi2n\]`dd,zko|.2E]\s5t!mg6=,?}im[n2*͎m1x s_XrD|1iU?x㮃K G-L s.khGcU^SpˢN \ݐp& syѣR;bG}/2n")>վa{eƦ|Ә%&S;%-PRzգM<$ ^@nii|l@ M@yj,dI(c'&.6-%EV)n}׏HQQ`CszaΖ IÓjك8e^~osѩ zC}~ t<۟Ϙ` Wc㣂N-$CS=sp͉IdB^XrTf%K.dC`7Fxs _wP T }΢WZ;2Qp-}qiZhmAC?Nt"CP4QB4Gx]46']~T vc%{Aƫ5M,ǿ69\Wf=q^E`Vlih쳒!d?h/lα2;=^ Hě/DPBϮzùH`4[X'-$ʾ " H}u?9Xɺ< ,r'ĖbLˮOimK%3[\Cr.ڛ|E㿜{y9܆Sz!,w[L62ǠN'ٽ>}H;np1biAHû.|_H{1vuvLgɽ%$ZA#x @9Z\P+瘿KH=AscЧVon_ZdaVBs{˛a|gFA>PCtxhyre`Zy9,iK@vR>h`vlfoFK/t>͌'AuRvagLN#y6Z䀋 /4@ E$+)I} ?d6`#^A7 \ukO#8ώď? @BrR*4>Y pmlGк?u1cȇ`5?Xmǯ^ƥG83l "ԡF U/XCCMwlYWO+כ@+ =y`CA;Փd}{` =̲2=-mY` a?*0a=gq\Y z؜bh'iAɻm1ݽu%>\gn Xlm,utۆ|P  >!?81h/:Gl-NtcA?$_?ȂTf{4,"93p>3ͽWmbIt3"0Й:#vR ݝ=A3٪=O#q[zg#*쟄; kUb X;x\0ԞaKW2؀9h$Z.Q|ܴ#N6r"zgEVmӢ94x\PTwXldz %_.kU}c1_dN;rsrhc/6&w48fO,+8|+."p 74wR{~[i<#>}"$W8@Z΂ś-T UPivŽH,<0VAS=1WW7qsB$\JRFM~ X^F{mn{O, ҁM@3X}*9,XYM[49#%IRO7"aYGFOL-Qa)`u;8\@6-8qF&XCx _ /#x'_tካ`K%XQg4!xd1iMLY,1_עl$YW&+3{!ce]Bm#r$ؔ>+%S+C2:v6{.Rc;cݠHƿv`O0~R2Es}N"VL8 G-q ߊ@hh7x96O}NmMu Hf߉ 'Eܳ4oewqи,>Ν6+<3/lK7O,[|`]lb<ŵW,ʠSHH!$`>v-H\y⣅ r>;zHl@Pzg".p v7Y7K"]eGW,*&@ǍWco-/h*0)c6ѬVh.R᭼폸 x ֱW4x@`$_,qj ^=1#E-dƿ}MJ^QgM$#tgTgOfDjBVBJj`TJ4| =t6G0SI lud/C}Y|sdm,~b}3J9PE %W @&lNW|.$D,* \93¹ $8ش;GM|48]H6DZ>W)yQ LEfs뭷p)ͅ^i4#(=g} -x'Y_ 9BFsр/g1LU[O\ 8gi@zA NָWIT]<@Zmwj@hK~XN쓨v}lzLcXp [.{`ۍ`~L%1b (3>Iw> o_v=cx!w~Hc>^,Yo}ǚj'g߃˪~x=@74ͥBs!FTHbY$x QW)j%2G*&11r)K4P EӨMriPh~;w9g?9Ϙ5ss3Ǻm䀩q*Ÿ(Gwlj1(Ə'$Տ:ؾbY֏ i{cc0gn/&_3?b2^?'ԶD ؂rPE`l.V\ GT/zūE呏|_(R`n-1@[pM ij~7&B`Y+tl;7Ʋ^'egeK[(@.{\86|YmU!(ȿB2qLZVBq>Y@{\3Hq}2O(`f<7̌'Foz6:#s(2CE"ꫯ^D XtG_oҷ1d3ԚX{<`J|w>Ó4|<`?ʑE 6<@)c!U9X;$ m$ Q& SBBe) iD݄HVYXU n-HQګ-]L=} gݵϨ'm;wp5#qb.bHXZ' qNL("W뻾kqQ7Ml]LR 6h_ИF]kX]'V2pxɤGqoE"1SO.5 PԦ?سO(yQ0vg"wh^@ vLc_Cu₱V3@1QqG<}?cl P55fgmNsc㹾GUCaW:ȯmGݕdֹRH"b9yp{{q-=u`qRm]y>v VSBpA[ Cb/ }-= ^':Aq%cg ~ 8#6G`~n^V1iOXEo5cvC|C>ov^rثCEkL꓋vhTK%fPԞW]N|7,}f[ 3D]PZɀNoANU7 )XEak74h+8ucgGoRo+b1/b1Ea;)!XoP co'dX771w3wm`1]da}R^G 3x9DLRt$,^ۑǚ-m\gIWY/GY- rqAhְn:+>GmGQjڐvR-+`?~k~a-Ay>74۲~eמj?__IL'fBo#TO.0"PaDy On"^z|"p[#'m뮥ZU6FIn鏥agڏEɽ~85pj tHCQ&SN y{hE`%#i$'y~/%‚?I)J:@YG >;H>vK0p"}cdS1A'ۂCG ~mE_䞻,a>%]|G,6'8v7Gk1oTFNn{k{v@/< O'@8rV;_(wx~/q肇z !T,'g=YGAJEF \0/"Z#qhAM[dbJc)7%S^dG6ӼH0Ky%7O:$~YKkG1>kJ⛿$ !xZHYJӒ׬GIęjDQqyoȼZ+| D$Kk|"/zkS]DÍ?~&8>)k;D W^y^qp0R8j92ei1iUN.# 2|u_.h'Nt&VᱏQz`n`L`$0tOcR-'vek~t~G6>\ٞLjLlڟ cלL"Y5wzamX@tBs{.ǥ"pa#ԧ>u+^Yi8w!N\|}޹+* D V)Yd]sDŽkԯݶ؄hc/N3^pg*㛲 GlD6O)z"%>7`m5{tUH6pCV4i MQ0~bqp'% ^Xǟb[_iFu ƞvڙmH{Q?c7>mMgVatScYv߮L&h":*DAlJ0IXew/B*eVe{=ᴙV4VñA룘FlHM5L>8E/oh85ugwgXP,҇Tx35qn} E@ēX2alEBYDJ@b"  >| ^7o[nկ~o+~y JEHF$,`Ucr/%kHUyeJz4>,O^ER' TW#G &d[߼޾ n62%}ͽp!8P6[[oU|޷jwZ>.;oꛎA n>HIZU#+}Am`5֎~nޟa?g4nx"#kqȘϱya?Z%0u`t#0E>>x31:uj~Ë^;N[wc ,%m)˜[)&/e "@TEve,jU"<_h? eZ']łM<8,&ڒdd1=JYoɺe6݆ԣ˰ǡ<ޤ{= M6LzWt/LX?!}Jt}Ç8*-IKU xT ].>u&5lhZIiUcװU o1`dB12ȵ]D%'J8jE+oͳj+_#(w#I_\}n;e"p" iN]W9rL"$1K$LF `2dt13Oy왆xIiJjI0NNp+bG%X"{b63L}NT85/j:f!*Fc{^ޮyoxoqESpԩapRNv޹G=/p^;Ϸ7InяZd65=sLd mJT)i%p]4JI h5iyrחOQgnif-Mk-_= B~duCN"4{jl#&ӄA2T1(y'>T{N:{`/ObQ'ev'w~w9[ouxի^Qv]1]@?pE4I=+;Q:]($"=>hɑWZ"я>Lse"p^#+F@:@1LCY+ Ip~UiqTZU%`&Ta+!{ƭQuI{k6El0mmS͟m~n$mҟL΢k",M^;cK57ۑr nCPg(Yͧ?{~|N4ŧv37;?[VeD6^?~"TG.g?gy?;N-g?xꪫO|rV*,I庯550M.A;U7-as>fd|GeC^]ԯMO-WSҔSݾo>Ǚ 6fj)1ќ⎞5nO_mZSl=6=PK퀱;4@_obR1s+ܺ5o|g*'}gb9z P\Fs?×,fMJ%5 ΀IG 9MmR)^ӢI3\P cNwRf?IGꆿ6քpQ WRGU3ʽm{l?c11%_wƑ{e9޴Ivo}&aڝ|J_WHQRzc?j/ec8ݴO]JRz/;'Eɓ _K%o-/d:k++. zC?u,(<~kiwy\-5_0&͖d59 ,k( V ޼)-ħL,9 z+4° 俽kmV]NK,cLw˜~TgĉCy U @'@]]vޅ7}7 ^{o oxVrKx u]\uKc?!Ʉ%)I]5@g,Z9y$5d IHdBzܞgOieUBt0p4hm ɏxJd[S$6_=>gvQpx.9'{[M= RT܁goXL!P]F<#UMnǿS^DN,#Fp$ <o݄+_ʭX{ϪJhp$, 'צ\ZvrAƮtCb\  ,q|N(]PƗ&g E5oeĂ8T8tN `@kGm ȗb{[Uz}oz [kAab0u`t=G`|4"pe /x K.rwoΧPfmBϲVx[t{9>P 0dW^_$:Ғ5npusE9fu@p;t{=YnÑ_nh 1E]=mvV[6anz"8WgLǽ.^+4 /{<۞ްWF"-#TUOG0ǿJ{mvzI>}w=hk ~oyk9 pDaWk8rЗϲ[D5!8aǢn| Ęx&ybOC~4ǝ qzFŸ>/>a`N]R&^6&Hl;/2m^Z=황ޗJ?t?3qqL6|FO|ΰ6>CGz_yʋi~ 0!:|?}۳n-gj}N#aH׻s72"%e| ԖE<+rkWwwx6/e΋yJED˵LսNnǘK3[Zlo/Ic '~LN7~P.\ߴͲ}{<- L<<_lLlP~-< 79Xo@Ez|k#mu$^wNPxT5|X\;+w,%}g?[sm /˷$]{6UnCW*XIQI[M,; ]'vpy}B@'bM|AbOjc#}8-FAgK`Q,(MWٌ!zzmlfoyҨ߲ɠ1JO_q+(+5L/ɵdKͺƿw潎-W~xpD <9ꪭ|뮻?bW6GDK|+k!sU2& m7%TJa 2C8B7'AGF#@l(*0%a/pUG 6}YߤKi@;j8_-u_ϘlQa+e1`kkr`n#Pw6kXd-*EXzz/=yr{ ,=__8>f+ @,B_ ӏ%'|ڋtK_Sk= 2 L> _[~H0cQI2N8޴ߴn뛠|k6RXT)%m&MB}vZ17i:j\s0q$ .> ߰nK^2pBmBV:Go_]E-< =w8$dxY!A΢bx@.aq8LF:"p.[j<oN^ Zlo`d~MA/jqp\ ~8XX8Ϲ2e 81_,'=i,3_[;s?sû*wCAe?RXt|?l ɸү٧\ #J jXd*tZݔG 1% aqәV7\d)Hn?/nsǮiPS#5ct~7^kk59dbs'8ՙn#PWw[MaL+XXl./|mּgSNm{ T;ҭ\"<.bQML__\(ş~/HQ^.TwtSِͥ+XN 4n?0S{zI?c` M{ S~҉~qpR3ŖVX8xnjzr<<- *?AP8[_p U*G*>|~V>-·ݚv]1]@?y^@0½-AeN:hˏ hH)^W$GBxA'+4(Lsڎ7ÑMtLd/'_<=W}w{pn/ V3ā/12cw3{lcېxǁaj"P' CXN_'g_Ki3pW]=~E`=,xI6Nĭ?%Sr+P3:З L^减\=ٌI-:Cޒ{=m _XD)om5Oi3|@i+aͿM@~b?>q$>ϱZԏxip*#PatEEફl~pui.{_p}_vd֡p RLzb}9} #͟ y~ KX6.yG"P' CED໿NlS\|> ?:+bkolC\zЃWU8*#+ԒhSt ,VqeǢ:eX0+Oy5Ҩ[K])nLtN<'\Ɓ1!zhg*sn֗͗ F?w֞hy5k_j uFRXrKKrn^ݭϑvyG|3//W?oo??=|=)%F@mK.lI4Fp^,ye\Iv.`|(ul% ( ң}ShdxbL6:Yh,A7ubGcT4j59tǛG |,jP]pE8SNT*ˌWy6;^';oKr}^ԧ>u>x0--nP8E V^;nW ud>Yed5yJZfM$,,AS-`ZM ױڵ-lǠ_[xl I[ S_B UM ?Z\z^d1V8]?&Qg3B6Hڬ;qcՐq :^\0vOmɒze;v]8$~[·M^ y{v·;mÏzԣBą=qw|wl?}/ld,⑊ֱfd= cŹ8y݀gO9#bV q9h1Rr :`|bh LcF"94l,nHӷk?P_π_x/qǿޗw`7q/#o/uJ|3[Vs18d:}Lg8DqܟS봝O5Vb1Ts0lxWvl/.l@f\z ^ɓng>E/zpXB2.1G<礛E|gRDtfH2}5d_'A>e$O>BrMPCvRՓ3qaqæo|bvOC7|Mjf㮟ù?_t?osoh&s{h 7[?zs8_tԷ=۫G}EFoۏrV2y ' sc}u/}h_b8z>x?%_[9Q"2hi\zB$6d@]?E$u dq }/wC -uOmEZ4e<]&V6?׾;>ɯ>]_cŅ>T;@atE`_U_{׷̼3*u#Ȯ\hb}kcHp 8og8 C>w|񎈻UW* \WM4AQgtsB9ijR7N^Q,+c&F3 =рQwǀb6Hj{__!\),*9~iL:eEhY?ǙSG ۽AE"'{OzėX/\J}_K.%GqDI4>' H2&A#M _7&H6b((kz{G p~ _>#i8/|l:†l4( |)A/KWZ|zA>@pvZc_vlWk3q <<,"u",#|䁝a?G?6N|}Z0vfx5\3.__\(ʱkRR7y%2Sr$za;#Ō?h8D7z@$'@F;@0?>~pyJm!Ve7j{|l&֙>&~jƂ Άvk{3jA@<5t̎WhUHH;@ъ"_'Bey<{:ҡW]uՁ Sہ[_*7H̕$!d cOuP%s&pf<΋:Ic ^HWB'*n6_6ЦlP_fI'l=>EKteEhQ[W{n/o5r>o{8dRʄRp_X@ /| <;o}[?(NpԩSóPG _G&K9q%뱘".6~d@)N @ud <8qg8V}AqRBQ$)?~6k~@[1Ďt5(ӁQ[Bp? y`Kn/ߣ(:^ɆNC0RgAÇjD4/} o=z@񥾫0nsXc'ƕ!CN EU:(G*τ}p{Bh9p ?w"tW;(\Eߊc.b%~=%,0# Z$D(tF4Nx=j0~e'OhT$yMڎ]-QϞ6p?kC1/}z|OʞFJ98Vqc0#GU:(G*sa{؁qÿ~ԧ>u`]3.V=׶_c@kc;'yl#u'}+q1DGaU0t@S]$UMb-3`(O0 hH+̽#.lr)g=h!hU@@a*\Hl:ym[m eo3>6\mQNj;}b vT` 4o pcMLjA76}…Ħm[m eo3v5.~"P'.XhKqE`O|r[5wɓ'?3᠏߆}cMrm 6(o認TtW!iz݂ݿO:y?SƂ<% !otb< ɂtGTk(S1?>u|[{ƀQ&Bӎ lj?"Nݰ8|"tLBg#TĤ? tDQ8u`}PT=ycnߦtMn#(w;+<x2|F?X(\džɿX24p]Ň>O `L7%DQ4(!3쟸?/eFj f_#v'.?('f_\c=#gxDCCmmY 8i9k9@}c3B ޙgvj7up].s sK+}C?|?=y[L'$~Ec^v* s| zc;E"ě\`H$[//aC/ 7A4J_m(=7鿽lA( 9ȅҐh M}[U#*/ǡqsX&y<*c[{W+Wa?gBb ojb݊St簷!~w .!mPX`x_?|ɗ|U~U^ɼ,cwk*hMyC2+:?'?,OO۩{__;F8k?\uU9p -]if)M 2Ru*S sԤPb-@%u%xI[M6LUjT 6v(5|ЁڍM>ބ뎆$oF'mKŎ53,Ct,Wk6u a0W('螓5cJ 9{DN,+ʑ/|xӟ>y5p7kfj51x~(Mz_>r-=Ґxx[rcɯ 8H["@[s޹HiPI|K0?}> h3 9N8$~xЭ} ƀǗz82Mo2-!01 g{AobL36j{3xųu@ڣ?~s ļOLjCmlndWL@fY_ݰm]N\]_ ?<)Oۿ}ҿ.z/_o''m|}k_,;0|f~7 >?4AًF SX.z,Yُ+D2 g9% y >uSph;)\(NWqMWV7az)$M386+69ml qCѦlwHYj6ckУq45/Ve1r(D~$p'+bxӛ4/|u<xφG=Q $=3<=pwqQE7'JG}dpF"x 8dHV'W~X $7Ҙ2CrvK'6!v$/<_41IVٛ Lx64>"#dʿ ՎzƑmjFXd|$~b4< aNd[\_djt5x+>ĽR"Pw,'ʏEG ?W_'67 ;?u=/;\Ї>ԓ YD_+Ç?a=C^{?Myk^3|ۈq@[%}Zs5b؍&-FbXVñ1lIOs/Q/;zjzbh$H/"ȅySZ)-FhmMk#AFOJ:~N]5͎eЦ>?_8g|3IYVkj3Ӵv:g>~؅+>'~@ޗSNW ˿<֘^6??1, ޞ/Nz3sՌC~J[[ߦ^mD8G@dOrX| t _(%DztoApNj##/E9wHsP  CУIQ-X}aO|,Kd+p2BiAI& .[~ǜgcp9>yirvuGV94‚c㟎]R"q)^C_?\wuhqQk 6[QRG[A͜7Kf L{Ɉ`~fU5>8g q0j c(N+gTMs߸HyYFT[ O y.~I)쑠-#?]C~`Im&y l= m'˜]W- jY皖 6r;%L%<5dHoG`߫ĽG~~~74oQGqO{Y /^C)s hKј2ؾ u{/:ܖIZYEF~Wԏxn(\Rtq:֏$#}Mya\}'2nJRfp1 zGQ-g5OHMi7gW3C%H:'qBGeD&Ef֢.O)k bqh ~B1!^ 1OV< On@Z?EH(1vj=Kc8WbH#lVX q/8xqofl#k:k`51 (hJuAs+9diʡcef›0SwɧGa[2_4|S~j𡓍$7'_oylw.Nԁioj?Zp^ҭjKlڮ$S6 z|n!j㠸ӏgu{ !NcDHl-q8L㨍 T6ش]==0TYNrUbW`5nޗMmxŰ+*:U# 80uYG#L,MqO5{sڿ9(f{SƢeob3 F?7{,-V,'ʏEFผgx!]wݵ8)]?v>>Q8yp>}MWL,{7/ xQl]6逎se%0'l)nm K p'ۏem}MKUZf_'3(5=֡"Ǔy~12"P'B#p~"菆1ƸeG܉=r/J_r`Zru{`>a`"4'48*uY֐zl}Bآ4ǺZ^3ۃnZ>vmTб0㖟ù=d?z>^C}L8 S {ڦcWBUnc۶Ei=9CiW;wC}{MvN٫^ݦ .#u`P^,4"~G?_5|8͸vm^PR??8U\Ș\i焞[.7jخ{ac[J4x|@Ѣ\ϥ=py|T`~Ur@}Q :(MCqYWC6v<4>Q}N9ޟQǑ:$=3N5kDm:(G曗ھ>lr8w1sdxk_{v#N/ſ8Q"mH2n$ &LH(М>5hʳ;&g§fivPDI}K}ڀ%oon2$}2jO͸8:Ptm[«@N%vKOvE#)Ieͯ@cנp5#9ժ,%u`)=Q~,6c'+Gb)zw, _"p6 SMy|zN56}2E?=豘D2sA:c'>%H9gM_^K hS0-&?vvPZ݆0c֞›jt E Nmx7HjF?FǽFU6sx6Op3\9ǩ=N4s"0E9YDN,'ʏF~뷎ԋո*Lb~p1]c?s?7.z_wuЇzr"ɶoS/@~)l_jKM$ x_7W{aߏ&PDE в@}>p(0k2=) _V%ߵ@v^_5y;cQrRY̔%Qm:(?^;Fb?}Poo{wlz?U*'ʣHI$Bk3hp ?2%d$dJh)7t+䷩ (!v?ɗ3op 9(gjm6{< K<~mcJ?+sB{Cƶa$8(^]̉>~im8@"P' #_]>Tbx#5y͢R{αKE r%FJz˜$L)Wl=?p.s3۠jz%IFw CBW:& տeS[}^gⓎMBIhOAtƶ p}hYAVYW<1Mϋa*ˉ@XN_' >Ob=?J C|^WyPxU oO1TGHXxr;s%LIr=4 {f9I_>+FIܡNjz|M+mI†"0 hDC1ؠ)-)F< &6l Hn URjcc(AMjʐ)^ o#x3&PF%11,>fh،OMq<}&"m >9w^<mx?"WeA reWՋso|^O}jqE7Ÿ~w ??:+3!5ٿ5(7clPUIm+,ZS 6KZ[gõjB4a=h&0=?gPS56<SXJQk(%0HX2nFv{fsq_~MM;o]w5Op 7ܗ/꫇'?;m%xK_Zti/o$|ww\tM_JBIHc:7Fc7/g ԒX/-!hoه\eR#~̊Q~IRnA bcm z7 oq mNx€ɳt~6jg~st "^—:~(/P~~Aω?.ҝx\&Ar#eR\/哧* 11OonW\ 68"HRp>'J"v; BQkUd?ijA5C`H*c}:UFGNVgc8ǶS+Ev?'?ZP,[賕@HQW(rp3a҅N/.#P'v}d#[}G>|f.__\xs7p%)l֋.\זs b!=-9aK(QuJ9@kwT֪5}T`;z~9Zݶ[CA1h76#m ߾2}Տ4A}YJ4ӌARZyXjRj׾GGClGe?b )9[ ,NzM >7""P' Q?O}W~_C n'1mv>g __p(ooNyh8P`jM%m;ZE0s /Q]P:soN%(1!}*?*" T`䙎ۿm2/%_>6V rQ7~1$2)^AsOh[<[W"0&;?;8J: gZCaw5H. E4qrwYǿt@s"LƊIߓ9s^K/*G( 5_5×~'z#׿uEyN>vxӞ6|}p$Sʻ~AaFߝPY@9^=I<@Wcc^T2?Hک$ghaUǽƉÆO4;pB-.K[_-2$ 9&YtPOV7 [;g g8]1!Yx?Oå1L79~ivUm;_u$ ʅ@p"[z/N:5<G __0.3Ƅw[}z}n??PUZXL_pu yc}<\q{>&?:vO|l@IIǗKI֪Txm>mӒ-j8 UOy@xs:0;a6iB)iC4D1.aWOޜ4lt & C-(&V6'WcFnhëWj56!feb c5ǿ//}cш_馛$M+}|WLK_H\Rr})_(f -qw& Px?s _|TX6(R-!r6q"c?/ǢAmZQe>xbk)-wm}B/3[ I[ J3Jc3Et| !jC' ^L*4lǶp 9~@; O g'woU{'uD(T᭱.?#'pLvi/XDN,'ʏ@E"Pb֏urͤtKeawb8ܶ/$Ǭ րR|HS?H'H5\<EIJ}JD V6/YIJz@IDAT̜CRAIƐB۪(g| ZwkP?">'Z3 Wt:ğ\DtY4'ra-~X$Zgq6 E)iaԚWH,A_T$~6eJu-$cV*Gg-m)+ UmZǁ7?U:(g*@E"pcU|6NݷU 3L69aGGIEP93~$SNxO8){c"%@#QY:FT~`@E6 jӍ=N@dS]i!ʮN4[' aگAnoZcqO5qfom:^(*@E"pd8_GΒY)k$'3-!ő phinv-PpE" z*@I5rP`һC`~1vƅmO~y|OӕRG؜Ф$یNhժg;CKߏ<__MDz3SۅDN,#ʍ@E"PnH=-u f&lOU@plɱdě&;*uxzݼ|8mdkO%ɩ} (%M8O 8k1dnf ` ȝMɟ1I܆& }]gm|џc o tY?>XTp"PT*]SMWo3bN/u$g >=2[ޑK|u_hG tu,tpI)d㣵$.d4Xitp9y 7;9aޘDp'io1ׇoҍBdkiT7HBg o/1ڄ6Xq tcinx?rUYVT*Dk2ߎOtZ6O@Forݮ,NΗ;P=/i- d4 X[@7ZJ7My9sz_Hju|D&f&hc=e0b/kR(եcq3j|TVI_qQ} Ł A65k:PƴV"P' BE"PTv%|y~zA_:ZԶ aq0xS>zcO|{_幻D> 8 Ƕfj?Om81G~IŤV+GO6Z3{̱Ilh=;7OT3F*c~gm5< EyRT*CFI.4LQĔ9A9> ]"K(myOO% ( |g'i zSK'M)PIKo?\RO4nk| W*@E`wp-Yer,ftd(v9j0?iv8a)X ӋUЌZ$ΞBXO L" ћЗ%b)6c?u4ko!Zwg)66aZHcvYݼ7Iz<_8)2"P'EE"PT5N>e9S+$S{}/`&ޑt)?.W@ icI?M'bDQ}"hCŲ@ʚvzn^l}G.Ɍ鮋l֝6To~+[O?` ?Ҕqj?X/ZgcC[g:>͝ƿM@fuw}|>a7n}sy3Ud5U:(W*@E"pȴc+\efD%z!R G~I]y,mp!1[Ǜczs]< Îx٫T*"@Bςٷf.rـP|?jCe*p}Izh*Ae_j/y~%iTsWv[>ֶM2iIE'T"M6OFj"P;<2Ϸbm g ~UqEN.e"PT*;s''x^i|u[2SkjAZ1<wG -@|sd/1t7˗͆H&&S8>$-}sTۊ@EZsGsBۍg8dZgK@(?*@E"8;N+& f Oy@@QJ{L۸THZkQiYC|"7֑dy $70C<K6xHXH Y'3+{zfNwܓSy&ӓ=Nlw8k+Ϙ4>- euoz\[޾Mdۏx=oc| c:OB o< @Aœ|~vF?Fя>ȠP?L ]Xȗ/o[@J^YiRzNMsˆIG{']}`=y pú'-_zμ 3am3lN@8aHA  #y~۪+\Ǧ`MY -}qu?ƣomek}< 7z`NjwmȂ@xma V~G a@A < ,֫* X'A d@judo#UM}y xT|Vch.r|4os[:c2>剹747,%%kv{}{l/zWx CdC7AFA  n"Tr ȇ>~`)M(!aR{#o{ro[XϴF8xqR۸o\AWu77\tDu/Zok~G]uW-|#<x3bA S ܉#N%*GbbtD^g1["s9ᆁ v_ Wx]ZyLPu쌉VM=Jg6>J4S9>u_ruL6Vo٭:LLcZ k޴m YuVtފwߊ% <@A>FqWybzG%%v9I|fl#hAmMm8Ɛcg8eڷSO^"(MCIOo]ט݈N@x~clkz?bك}BevM+SI 'a@A <(Qj[b].vul9$[2Iyz6kn'TsgS'5]y gCag k׽׽55t%ZxhcvAW;VЕKb=m:畿N}>g @C!Kzڕ'dW~ļMݣz j呸:a'bIs}Gr>hgg<Ӻ2|{k]Еe_ Gso?Zg/?A`]+窳C]+?o_Gڬ-Ug: G?JLrg @Bꟛ`q[z3CD(By tȹZ۸+w X̔ΚttY]ʻ9h{1 vwIe_$A \ uzQ5]Vgu̕lݿUgw=:+ߜC@  @x8(1QPOsRU?U%${> У^ #n؛ f Ka||`8鄒yUI+Y}+Li0lkUw{o~׿8k2u- S@A wT2۴p Qe ZYfzso thOk'Ɯdj{L ^oo ]GgЧ#O?  spm[ija ͤhzA!|WQ_JbϾ(튺g_C2J.I{t*/{{<1nvx8e9׌8pA  N@猳FTN$g*QCpLPS_^;k_Wo]X8H zS JORRMͭ5Agc<_qjo@e,ytq/ߕJ;Q-j{j9F@H%TXkt˵oAj̑^ik^`G/!eЦN iA G`]3^_yZvq}tnN;b'#O>> ?Y7fIتdI)_Ks>zgiMKCy_N/: px5j8ۻGwpA F`]1c&#lk^|ݿ}hF< @8xH¼baOZ%7U>oFA9LS2z)?z5eM[Co,Q{#Jo]z-ʫʣbBR!=*$ЊN_W]/kO8HfLo g@AIb(ؑR b,;od>*K&*۾ e/T?skZ5-&b"]QykQ7Tgrx AO1q9$hz}b﫯 ׮7Ϲ=Qx PA  ΂dOGAoCoSDگ#4 ?_Z!G0yRp ?7k+#ES( бv˰ڣLҝZǑt4yiг?ݤIvx މ\V(j+ֿb=_7L5Ϟ? Yd @A i3|ũI!.^+IS'1zt܃'%5}/oԑ.46G&U8Kޱ12ɹf\[_(*A Vׂy}Cfծ9Mυ@8H4A  LO[(\U(YK(& !Oj4?xF{堚!shv[-(,þnab$.h59(; 'w3M< njp 15׿ @щgW;sE$\8ɁHA   XեEV5*iJY"BdHI{E4Ͱ[ۭJ@ٺֈdm=G`@c \*im(c5g۔#Ѷc9Wwi ۨ:ӂ@w[\x>ˮ k^kZ{6z`> $3lA g"dت+O "S>}B/>$v?T{x3y@|Fh 7;DUOM r+x4 e؎A4QcAI_+G^l9 iA \E {]k]=n> x8  E/D *k}Q/j.{öG]9@ RbI0btZxJ̸խ~ uKcH~b2y!-cxXЭku>`VXϵ5>amv·\Dơ9spϨA   kF|NrOu%96o QwfK _6>L4&顩ǟ"`Ipu E\HhJs`ʹ.([D k~bk1v*c|(Ӡ:qqqZCL,ן=_k}ڹ sD@A!8'zH@5x]R_ AJVcqAlK>6*i|~Y^I9#!169KB@Sj\=ưu_@ EIo$@A <%ig?&'HBO)>;IL>@PwYJylh9nlڟX?bҀc[h0 މ[Z_o8ׯt{1 a@A (A\o :e! Yc_.r2RfBWn6H·z!ga/כ'`խ8[cYb8@ܭy/u6(0RbWٓxή8t*A G(yaZS_ :pAv@n<d @@Ip '*$E┴:B%l/T7xڗn* $5.(qSP<+L' QOJ0 Ph+8xD}v|Vα:Av 1u_ko$ zA[\j|h/_ynCs9 $ PΌ" YVĕWvƼ6H2p s}m b[O5.o>L#ql[B`bqؕ޵χz=G?c|wr=nw VoSc.öo/%c>m>tc5yJֲk91+_ǻs k_u׿u\j*؞n=`#O?  @N[dgkMdŢS  Xɬk<I;[}~(u|Zt׿6.ZζM͵ϸm~:&O`鹍`x1CeϙݟjΘqw; }_' 8N8nxuhXZ֍WacD|aO A   DD%lX2__Fگ4K&H>/% 5uaڦoPfu?LΛW66} j3&9w8(u۴D+Sxe#m12mzmu-|wmLPj{%48gsq|v>>Sy0Ϝ[eA o<@Ax؏bO@hg8 #a=qLOao'3VyJd EuNkƱ٠Dzc'!bMw_uG+=|,<teݛ5XPZ|l>o}5o cBI4g)Gn~t}I2m|M9Vmڅ"Ƴso cBI4]p c]?iB ox$ @A9r6$⵫b_r>["##; ;Mk]E7*SAtO t)؛mL5F=g9XV82< BpzuF.EyQ286Pt廟13~衵M{Z??A > dm> 3fA '#\kYtq(pH*JީĤ=&J^Jg\^P 'Ro}&jpTnЬ;Cl[cxz=0'*n,d^cs^ dwUo @5^;>9|3&<{Sbss8'@'?z󂶣g"D?c @x",LY-!z1p$%%nu "M?!H9b=4Gy 6Slւ7uMPe0-`<ߦoL8rě ~b%{-ڰ.<(x1n ?Ơ2o -Lr7HW^Z5|=;EL!OG 7~@A #| 7rl=m9_:[oՇoesO^?\3$rq kk6ߛ~s716kqG4rig @C!HɽMKN‘QT(_xC7j sT`ljesNz`qpo @A  }6 y&?2.R`ox_~_Q F@c<@ 2]4lkݰ8==(ɵfv8GgWvpgtfMO( Z6[1)N0_hd#57Mt<x4/ #߅C>ҸA諃 o'_e]z/~h&БRu 5RAe;omxh. 0vxmCVw>(`K@rˍ- B{{nr䮿=ke@n<d @B@dH -U˻7*T]~`௟?p@<>0Z?BrO5]: +@w;j7àjo&JFﰴ{<+FA".5a>֭A׭2m3"׾vwamS猪[6ƿRBRRm!c`d(ŪcBnb(==O?n^B9ƦGa SSݺh{`,y -B?tۦG\ D-?翯Y WH%Z_C\-PDYsj=/Aۂ}4a"Lxp5eT-j ]+3B5CgV.ߨY׿y)vr!! @x,k`z"LQL2T3_DWNW7R|-okw0$%PVBQ۽)-{*g::[coc& OACN_=|BzZXY^tl8OFg#>? `\ lxMO|]o0脛ottF}[}_ҕҏڴ8CP\Us|Zpz]Ϊ<_/Y//.crˍE>O6ݝ798;s=XelErc 5|AW_GW #9K A  Tv/cc͉SO졤Ѓ5^!wGP>n%k=7wE NFQ F"v}LFٸD1`]mSx=t׏}Z2lF-0ZmOKEjs㤩}>\%/o]\gA 7r$GA "/GQZT{&p*PQ@'|S>6Aw=J7x}Ãy_ 7"7`@(;kRtcY{8n?ǺhM2jǛ,?}/a ;층.w͛B{{T_ѿv{as?&6ǿ8Ar?iB 7u<MA  0rJ[R7 EOiۯ3)JoAGB L C9 S6$rk(ġ킜|탎ذE}<*-|;EH!lb_boS2ư~7;~@އGAcz_9h+_xw>񤛛ll`Lជ@n<@Ai8'F dާm8D??#񳾟Ê7 }A3N۵b*]vU?b7 =v'>W)mWOpf):>V[iJڴy_/s׼jMAV/ccz_-Ӏ8`cߴwGS/g:yfsr4" @x~ d %}.A66+/mo Ԏ?,_a\:97<4(UR@fq'2 oF8ZA(Ts,;n/u%Zgp$ 9'R9"Ag,?}_G%G"D;c @8z%]gA^q$ z$픘I2_(xW(%|D@ ,j֌E _CN7#dTA@T6=d LYR>˂70`-7߈l'0N`T?ךMiV09ytTsks:+d˼{Ⱦ_= D@Aa0\k&*P 2zߙ=ӅW4|%'_;(%MF}Jp( {*|Q6 Xok\ 펿">X({n?T G]u^,kOֿO~l^f@A  TY~=wP:-Pc.D(<^hWH٥ #Q ͼ)mr 2eеtϮAW˸8{:qunzp~-';rEYS`Cw_q,l9gSQe{ ;g%1 @DII+c3E!$ք4;Rit3k~V?Dž\|c XV54ЕՆ|u_3.x7Z;y=V98" 2G$ze>E^rBm=)[z$)7@ݬk׷}s72,syhеL]ƊmO-,cg.YS55ebﵞ/d>"0>5 @A <(Oh9QfM̌ډ3)x)WSA\SHL6GUDxPmsmwJ-bAs|)\ (R\BG3]i/3 9}35-ڗ+^?VL{,yxg @@_Eb[E*(WLQ:ˢdkmE͛ ,=s4+eeKVa[MQ6l1,Vw9a{ڗ5#/NZ8E=oķ:+K=oFQ@A <?~~eN J3)gѯf*۫h 9]8L_~)Ejt`ѫy]L귃u+azw>3"q4E~;XG{xgzWs^=S\΅\% @AIY?}gT_OT) wO?2R 9eQY嗓i,4OS$#+.}\JnK!H{ #͹s@IDAT@sb6Ř+/”oyȀo.mx6枷[0.T GnJ7=oSZa ]y@ܔo{ަo~'uO.@AߪƯ`0__ӿ^7 TC8nV @A#E,A   _ݞEix:kw<>hak}!]ykݣ#x_}-gWwZ}l5ƕqW+>nqw϶[c\wWw]} D@A$^l>?3{sQo*ާG$<osj_]ŪWM7:W+ɛ]3ʿi5ƕcJYpʿiFc0ykʿi5ƕcJYpʿiFc0ykʿi5ƕcJR:\ 6 ߇L| ?kDŻo y'UW [7 8`'z-s]ks^:k?cr 5c;t<;Ρ3ruA /mb>!>P|+޲SnD>s:ZvG][vkѵny/D]0\i;|҂@A .dF"׮@͒Z{}CO+ty[7 /X-Þ-{xM6vk*뷷9@]oЕ;2t sEAiw:.k+߲ok:w 㸃{t=+ncoT󕷟!c_,ibޢ1_[6q}0n)GW{ A  d*sv2ي^ٗ [<6nC"^n"MI.*Y&#֜z)|֎9qv:]֍}oW]xеl}Ͼi7j, $>MѳSSuPof{r,G"q @x0ȷ]#Wb߯#tϤ Qj ̾aj:~tx/el~=Ŷs!jV@=\t$E=P" ln5!Qg`u؃x2d+x[ i/_gL5l6~ a@A <P|et?u#dyLJW4 1w7^KR2 ;g(c.Rzi5_4! PP }aXMiAkw ՗m*s{=TM/=8(7U&^G.gZg[i>n`cO9?ct?[!: @8HT@F|xMI+ԦNRQ5mPH9ziI?^noW+?NAW:8ŸÜ@{t9z/|a٥N{kg]+M2u4P{k_y:ZzeWG?_!"; @8 ?~4`&:Nfz,dJbZ}/;h:[J@7 mJ1u\119况uU-Vٜ-{?]y^]eG  CD:MAcVُ&|79y91Z& im]+^(4-v, 9 BBA  hy_K1GL*+D>HkxͿ(6WazͿ3X<>@r*rޫF%xv4?pznCo?̬ b]2:!#ap*o]is/>O0.sXҦ4/r 8H4A  LYe7FGȄ#ao%q.YBM6>EgYC~Vכ3fGe.9i4W@t=Vec70[ybS.{iW=tcqykur>pB2uil.N jݕcOZ}J8ɁHA  |I_ ,NVSwjuxl(XE>TЩ1QEKRF#tdqP2?- kwЮnqmgт?0sscz-b/q*w ΡۻYƥ)+9CA  x:3k/Jv+sieqJX;uOAI Qd}_3JF?)[k8'DgĨ1Bh[)pPoJvGɏ1 lSh*:5q!̀lY1e! ڿ#?q^>]@x<{܂ʢz^o?1-c@Վ3xoS 0$ @A0׫]5L4q/~8>B΁@8qHA  ^wϤ:ȘW_هtz~e$ze63YOBh'ա/֞1r E~ d<6MabHZDž$"O? @x<忓.]!>:~ *qD6M@{= ei1q[4eNX>HVE3~Í2֥X í+: ec_]l/r߰=|,ͱwJCniY6Em̿|'9<] 6e׿υs 8" S@2J菪J@}9_?S zLNUτ3\?A9X:S0@+I5]{B&\CԹy?'d= d'48&\|BT3w`sM5cC3E0d7s'F}.BO[uv.r\# @x J`nd].<7C**KAiQ*EPC=;>eqB3U͂@G[xΝGu>9u"3EY @A) zxu 5swW.]A+Ҡo ԫ qG 3 0;8PӔx;^1@A  T,PnwTU w}KT]>M\|*,aS"t]ѧip?WT=pÐ @A <>1!Z &JJ4?wڏ<>xXl <(T9by[~OMDFzE1s=.%\ 6h[T̘ڦ'ԙH9%-]4>@n| @~֯AvU;XXhwiʋ=M80X 7'/xxUM=]A2PVc˖8079No6TE#^7MKy4'̀Ah _7K?alrG  @x]iU K?+CdVQ$2(*`/2{Q sXsS2v7f`Q->lepfXx$ۅM̟,f[2$eSwCG̿q M_&-?N_DYϸA  3+aC'v|JyDK9?hD h_. JPx$cޑ@AE%sAet3Q-Y'C͌](kA@*|wP_yͱv*w_; "(Sg;_rk eepwOG 7~@A #0jKU*PhVUz/'/| yv}8Q>}ߝ7s úR9 sD@A TS QPuD1n}9_)0i]+r: n5zhtZ X7 ֛AG[7exO3ccAntqC,nxkA?ϗYy>ws{\k?7N0g@ 8QH A  y4=}2-AHYW!w.) dL.S/P_.cz2EC`q JPzLtE8>(sǿUFR, !?Б̃^;AW޺%^e }u8z^V~\p]Fwe>x.= S@9 VLqb,JY%ϥ/C6_чW&n,He}53hZFA˚ْ"|} 1vV*۲ p#=^ѿ7^9cQ7GW5A \C?O_FX_dZ0n8`"3y6}oS Ÿ@A < N*PD]"+  \P]LD}ӀjL%S]$]r@J&% 1X!3ȰS rc[|A:F h _;ufKOv㳯\p%Eu|y D@Aq0ke?}$(d}GO_E+Ѳ.r~_1P2po5Cvmr(t?nJ0FX;@Q]<_:`}cQ Go{AO9|ud,A  ק^|"/|(, 9`nYY% WTrղ뚚ʈtIU~ <5GQ<ǣÖ# pMWKt9%p ޔy>g =aJzlQꇦŃ7 ,-w 5 kxPBg77xl}zZQ~h?3l@W~ 3o͢z7#(/3b O>}S3A;mFHzަO/<-w"\W@{ަĠăBӯ #ۓ @$ @D * .Y"b4+N!YKW11Y/P;%+:xo܁OqkvvJC$/YCJZOpS18 ă4Æ ^เkƵu?|LOvE:z u?_$ȸ g.WBX bU9HVס./H?BocP qK ;ȡ zMI1emO.(nH@;_Q0m,׿w<x /$ZiA  >(;`O?CTԿd;;$`tH`[i5l׈k_H `e+*V{y [Tc-&z"{'-#5+b=zWgFMCJP3nA:ro9,YDQ B~$ D~ی¸&X.ɤKhQ.olMUĖjJdiV: J`B k'"Vgh)~ZJ"M|QCr|9 %㽦 _l_|{C?X=%aFA !z^j%zr|?DI1,n~_;_Q\~l7Oqmp@Rih3b5E*1KTqzBm^]{ߣ+ۅ~uPfX6Dsa@xvwXn+p;Fg#>K9BZA OE'M*3~]@GG[oחՠ VKgFŠwXc'p C/ >\ԫx/87׾?1 D~}`/ .s| PGq(0/𺷼py=µk-!?zr GC~^A |@bH|3CR(ܭyxE}2@W>OWPY7d/EDž6}ͳoyhiiAMvWXB(`ݼtOg{r,Gb<%@A 0$~v7_ĥ? hLI)+?~mj1\"OZ2 <ּGO@cyQ0v]ܭ<#pQ?ƃT98~إ zׄ%WHM@׎s_Q(FQwF8AL A  t^HL'NOf]_G j|3>LWZi("&̓m rվ1s햀c9dc"a{?tՎg**Ϻh]MMe5BṚ?oD~ QF8AY{t@A/ toJ ]) ?m|9}Aw :ZpZ&-MbUq90}{t廻<3 po Afn( @8/u/>QJ#Aot-b_,>~} 3,:FYk3y`Iv|8ϻuVzW^2ǹ5>Z.x8^`7KGkF# o"RW}^}H)5PC5 TH_׿zi\d% @nPee|MYfj9T0 "1[)~Z.Ut:7uǠE{cUØ_m-~[~ koL͟6R6 ruԙOG t?%& ߎ t㷐>w[|F)ao \&o+`1Og_mn}sT|y0'OAWG_Kmnõ>1(D {tqAɲkwȾ@Wjg #5u(]}8rϕcݿxؘ?{]+M25K7 <bNvS!A  F"Wո z%n|{Ӑ+|C7 '-SA,CAckS r?]iq?6MvW=cq±VLJeU>-!%5k˭~v"{*Tվ@A =TQ_8HԷLk}3H>X5n+ooz.)@oAS{ s"qo5oqc=G<,7xgzo< poq5]pڙ  g, DI*GcYPV[y y${]7 o8k\ ?fP'1lPp3Z}1mgڒǔ{|HIxi.p|׺['K]pO;pÑ`@A <J%i~SUuW W~_[.fKp^G=.(c+i;X|oA1ZRn%ñT;?Zb %PV ^j뜮9{:k៌@k:q; @~ DB5'(CA7E-dA3OA%CWy<ꕉǰOXU~oNAW~yuCپwe9Gڗ4 Ak~EPAlϳyЕ٘u+?0o4О)1{[uȗOS9pQԂh~6g#Ax?h @G@O3qME8 )ߪ =B]rȜ_^`7 ~%}4U/){p-Ţŭ5̏!06S)L =/S;zW=$-#ׁ}_هf >Lt k#J A  8ijwԱs׷-Q EBin3C3w{\ŗ*!>յg]l{GKi ,Cl- ={-7PdmA໬_y+9|r1K @8z_E,xڊKi z@ J,#!-RI |`P͂o/#d+7(tcw(Iy[`br %#Ѿ 4U\ɻ?oϱ Am^Y׳>WAqo, e%ji߾ilO@n`t(Zm+ 7C@O+qyǷd\g JԵxM闷zNj }*3.?L=+]c{OZ@6ySj[>1kR󯡏꛱h藣}/_uA/O{W_:w̿ᜟG~k0L+lՙֺnX}Xg;f3oJ{O]sx.@n<珌2WG@A kQD)Y.yYH+nOua؟GHR|3t!63XRQd$=kRڢkPrw 5[w,V|h>KilB98}ymEX&5| ӺÒ5?S HX㟶W,?xo[: A  y> s|AK _B*{4IP ;v wU xOE&8$ï@yc=|GPoQs2d=dD TDҤ eb)?hD$eE E*#!$L2 dtK̷_?rfy>yNٻ{ݫZ{^I:)1eW0g~2YPI Hݴ"d?)`?sS9(%'JZ (Ɓ=||y v Pu Cv,@Aj]n!{JTħ^|C9|~8_)^*Cksg>J.xPS#~"'P.'4adJF JHd`lKɽ#/U˫rk]v+YCA0T(I;d$ztCi|;:L( z GS;p&6 .N ˗/o^oͫ^͟3fhg?u䩂eڎ2w}??s=X  P3.9 eJ5ダX'(G\, HN,w h5Y/8nM9̀9 ^ lO&YyJr_ؒu9Oo.Q Z\Jgr-k?c)_nK`uinGui?swY7F^8t ,EۣgӇ{IK^y<>׽ul?gZ C=sR9NBǑer 6.W;xvt { ] ɾ|eˏ3W> z8 Kz(K%@dy,"Nl+lA4:4ɛ<YgO.CsLu/_W<~_`W#J< +i'mNVگݼWgjwܱjm_ zA=ņI.? @=¯4"+ I@(wSnR?:T,?#:LD9BxG=^9u s"+$Ta -)#MƔL3hXG\[^Lyf3$?g;w?< e:'c{ *h0 >AW|W㯓7oy[??|֯ \'gCO_i 䃦Tk0&/W09 δQm D.~@&-Ӆ ?>Bx%P2GhUnM#'CnU2OY o3S(!oV饺=PbTK~gu="=:ve)%öغ待O8u}+!]mM:(;$W }ky{ލcj;g>i1Wz:Sp'GP3Mgɫ\Hkrr '"\Jc!"~CTcIN~u ~1Q:@K at Le[#gw22&- E}Ywi9۟~bGt456=ՃaBsEzSv;_{mkZ#lAree&97^l_KNWW??77|KS{`RagM˜^ْЍADxK  vK.2;UyZʜQxvNLdW4vN#Iɑd 8L˲;/ŸIuy+!ғt,L.MݒM9z@/l@Xߡ~y7}[[7wu׍VZśw|b>몳#T/,#'SD+1S̉u& 6+"@r @j>E ېZS/UR$gW\ϟXzdn3XOdf%䟏>L9ٻ)_L|?S`Қ?"C>{ʬ`; "\,O2w۷By"}i@/G=rti<|7|E{o,~M777Ky衇oX[pa=@. GJD~AEVĕП{<Cb ̆!)A-~O OqK}TW䚿px!QP4D*ye */v&O>̂t72{WtJ> YM*9cgI̓@g!@=86~jtt:zUw`}zlJ{x++7]ߥ⮛~ _7s1yC7߼B^a`#;7/{sd˛ۼ}<#-F@̋ɪa=Bg YՂk[g@o@S]ńR>J $&23:GaOE3 UoPx@B~׿ۿyGOd׽Ny_Z _ͯگm S{"k# 3PkEI.R*냀 +3@Y0dk0MK*x,a|dV)AG~d2 FoEm Â_K uW(`1 `_%~P_D~?XN|ꬽ[z` 0O hx;o{6/k" ?q<3yM?Cmw߽ox6|+㺹jh|{߫ѩ===Ax|ǹ"\`.i\"/GOP29;,>ԯ38yah˚*3$w%ĺuG? lYuMv{Lhh<?l:y?IgBOA|"k'nt l`vwGx3skH>'>Yc >W`-ɟ7fZs<#zC\r+Цpa).TTs,95h'ϋ"*/ՇCqLl)NsjB;X XB+‡w-MIZ!, ky(9< t1{?S7ߴyo}Wyx̓;1h1Z[ƤrQ=pwo}K_R=\_|__'b8G_/e\G;?V}^? dҕ?G~Ϲ%ָCPqD?1:S|̥EYLE( $}Km)q߶L OwKKy]I3NO3{#tG-_zbC 3O=' ;N,KWy^!) !Gwa8jnR{`<ַu7XzD;+7] NR鉀Ȉ4JU aMP+A7MG?ܒDy2X#JP.HY?IJ&;Tu~Ov7,-`/wssO:Spo:/<ه@/G草5&v<~`Otg|Ц\?7bu'v'O\־0='yLjuQ83e O$xfQϡc#6$O驁Y\@sKceWj5E"/ ]U/A*m!>dߢ:Qr[A?_0'/CCuSˠvN:s5x35xlm('U7X۷}o~ n+~=|6_paootxy;;6_5_O\;@nҋiU^f^MRC*2X\P`l_v+ud™**+|?mn TO9}feU]zIfRSbpB}&>#'#3BfuvOtϽhlU_>|< gLM|=b?L$t'˧ӡDLtNw8t}wwҿ/l~~js=\`o}ݷ m||_ovj 3@hb܅gSh**XDpYJ>#2yc@)'yɻԕIu'mrTz@GZ,#V04XUU0},(}ֱ{q׿_}9{|:)2<'c4<zU>=Ք䁿x4a2Ї>ٟ woĘ}߿=-}w x|̏ aΗYsRr&wE|d] zU\~N4##>|HpO0AkD_|l\%$j֖k<r &yQiʌ|GA5\-w1G?+xn:=3.?5\$8P|V|(qܩ=ԇ蘰*s p!:~k ͛ͧ?^x: zyx)%BM'RLzƮq"91IT>KCy5ł{>-@#eӼ}o||4 &Hokcsl5p>v_+Ӽ@ׁ&ǿiWi [ӭnm?7 g?ͿwnsԎ5*}{4oF!?_c?co!Mi+m$b|" 0*y09eWߟx)\ȋy|ڀl`,d!5 Ky. $/qg=Sw`y#\E<>7bۅv.9O_Js._[}IKJЖ~{ Gۡ {zݳw]>S ׽=TP_?#.CyVS^#k@/.ϧ UmK s2~c'NJu__ybNBO[z &r-C|Cx;?Ih,o3wk?O9/e-ͺ۾%yF|# 쇹gʹ};FrO}6yCZk׿A[^LH|)'w>(1{Ԥ2RxN&zM l:Pb\@ӈ[&[4DvZ퇜. `: RZpw\jL3$=OjHfOe@. on'cgb[n'%euۿ|Nh&|{k[/qp<#wjE՜ؼ}; I?OOfG~GIF]$@|&=FP.Tsb{RhzM ƒ0T4C0i^JOX6ӄi{pYb/[T"mMؚ9 #'ڪ"?\bۺc{^xktgẉGoz–G o85І2!Mp7f{6pW(fZ~<EFDʀA%h2ơ,0vu8e )6109ܵNxr+K (FZZm】N 0vu8e )6ln:y?.<28g43Lj噈3Rxvp 끻{?3;ovG?=߮[gg#}D X+P#AHÇQ^ȩuY$zryL43I(g91 RfAkl2بaq$ZZXdQsZK !]awlh{sq#76չ`׿۟>~ eEsʾNw ҫ N3n<[(7vj</uZz0ms;H/^Wl?[oy{jEWڬa൯}櫬_L/wΚt G8|NV 6d#~~Ŀͭ"'2IimL+Xܤc>à`9i8k n_ʒps=!Hކ^K*ͮ@꿳!#Px?#ˏOd\oCP"Cli?S6PZCN]oÔVRx$> ugr]zP^~7_5 j'NaҐr yPi=uCR) 7_͏؏m㎃VV~Aq?P呪nַθx o3A#͗Ħ +y(;/18y|c@S%pG) ( `T+s{#]6 2=>p]%D. bs=Cp7Ո:kSԓ 6 A}/Dp c,iSB?>?9ָ?B2㩘LJ-q>vw^W=' G6_ͣ>zk_c~XmB@L= ׄcMء뀽p=S퉗i?_BaƖFPw8).H&bmppz~pCڀ@\^_Wg~g6LhJBcdô+<(~?*=Ll7ȯ Ԇw?g?xʻ 0vY*|n^ҔCz=cj\j?5w ( O<h?˗/ܖ6y"L: y?_)<Р_=<- j(-2K5Q|@02SB OuF12 "'NzTu&<~G1DB:RM)u:]f#WEQdCv~ ? ?yĻM2uӏrHQXu7Ʈ՟Eår+~L/ǽaH>/5yѪW8^XO[Ȓ$锵2ڜk<὆F?Я!/2=ܳUT_UF\'rCAsgkgye2KjZ|@Eᚇ;MH5_ ]6F`|/h@_& ' R,JNGb^Pɯ\IMX\ף$GH#M Q6t= e'G x.|z|@$D}[H!ǿ<׻xV>S F/>Ois_^zoc*mmQU3~@Z}Oi:0c, Y ]_Ѕ-dQfNax3_'/P0  cU~- Bʉ&l82$'P$ 4O/C?}nP1[I:y܊9wk@/%ʎXѬ kswnD3B||'4֐{gs:xw3hsb)1Oa,GHL%+v(СXt_M%w=Q4 @PW`9] c[|6/S!T%ʓ,}KܑвIWA0Bf{_}3G…jjHa$;ݍ|>Fl]*!oAp˶>厄m{hF8ܺ'm@/V7M-7nGp/n~~h3'*U3t&&<|]>aA^bT.@*㐔w R|1'ܲ)z]@{vt.iɠ}( "oYPr:6mNp(8K#5OImS uw}b+Ctx!(pĝ#84_ )i͸'K!ru%{ޭ=q _TUT~6VaKq~}7֐[e7:],Ow&psw&wXib(We yZ@ (Ҫ d8m7OM![ u5Hn'(3_؇&&yme#nQl-CoC3#4 - "kogwk7,:],|T)s殺5U6+%5̻ =13~A@:o%E ʪDjbZe %dUWMGAhF8N/a8ɓ؍);h{G҈mbRRXҊ"%m] ~nuͪ? d-ecxqX30<"^8pQ_77Fy{6=*li#Ng?ͯʯx4w~wVqf`R5= mީ~MS~~6tb7o !X:tO#7i_JPdY*/-ZˎK:s}Β#αM#Dx@8GwWn8qg6Fj{ǟ]ї =&GH :_z`% 1Q?kT1Ѩܓ՚IOWt}o5 *a6".̭:]69=tb;t+<=1Ui?j ^pĝG %wAmq\dUl_w[6\zv|ƛG|*LG?qNW]wݵy|>Voy@k2M` .GخģJ);&㕯 WD?qE+dmC˦!2_p(|+s #_ R~I&}M7ySB.a4 V, kGKp-lm<)!T6b]m0Bjcx_]ψ[u il#Tnź}*m>vw*[<#n։-^XW{`υ볬-:CScί} kIo}[Wӷj{]nWE4 @Bse\h삦@) \1╦* cKY8i)$lڊV+d6dI@m2*#ܱ7ʊP ~R D6aV_ᗂJqP68| &n#_4ux7|qw!}P69 ]Jq.Q[@\m%Ŷ^)+@/10%VVfXsUxӛ޴ 5O|Ok0mx5֐^SkhgjCMpL99QiB9`\4!CBH4i& !Ec#aܑ_T DUyU&[Z4w;2B&ԁd(t-٫\.Ce ^M Za%/#O_Fr_cQc^F sV/~O<=&a|@<,-]34ކ,xH.:sò৮ky@Un,,FuM5LLw&˭ &0D2mBƶ&~ud¦FΙvϙ<)ZDяcmNܷ'L+ ֝ǬR=ɪ&OT"|)"}5y(0o?p>4">aY#>0@nM/d;&߶ggI#m:ykVd#P|]jpg}O?{íΈo$4}Gܼ p: Fva÷1H8t:o6ϩ'<~3Ot: ($)wpNd.5Y4?旓s֩s|5ᖜ=4|1 >O $_0OKR^i3di3v@v*4+?.y-~'o_>u&/쳝Gكqhm!$m-xQ|#n{Bx .]/ƫI!Yh>#Mx׿۟I?~o~m8y#{= W!Nu+媊5 O> نcߛlt(!x~7GڈOvnwC!zՖ%vw5lvZz`=m!KbYaev9{x;z%}7}ZLi;D\y2H{ES? s&}LQaF%TדQ pE8TIOKyk8|gQQ3)kC]oCH[nzV$<:vOW~c3:Ji{/~v4CHl5yu{j/kCv(}O|onӆ't槱5'[н nGK*n)2HrT:1Lɰh`n!lp`cr*.Ӷ gq qǾI8lE{?,z!? ӏؗݿnZ͍^@q̏8^ڗ5}v7p%p32W끷-'\՗W fȚ>x뭷nyWG''9Ag A+8y )S~(R xPʲ9A'@JO~˜׉u<ˀw Qɣ*Y>+(6T"sS-w۰2\oC 5d3eh~4{ɮ@/9tŒ3Fnm7q5&<ë >G>|}? 4JuC{@ ~j\j}hlXP@IDAT%06EAU׮og܂&/d6e6Jrjl.{|swnz衋 RÜF3H1 \|"*3AO]>u9>=Ȣdb_l&..lQһU9'1o\}uKO*g)?jp?۶_]o_~urML?}"n]uyh:=qu:i$&o~bNqࢣ;9dT#@ 96&9Q&HGif(\,,\NOPk] Fh[pq ^XG;LVĉ'B5{/~++Wc}׏5!k[Yb$VՈ)iʕ[Lc&|@) W-.'ц5$k9޸tih2 G}[>m6p`|ȚpUH#G(Pς #N9W,;y_Fڈ:FO;uwg\85dfpZ׵>N@%14XYmX[;GsG<ϾRK} gf„b?jUͿ|G1Y"\Մ1/3Rr,l'.B %{7`ArMۖ6c=s>Vڞ,#>\\s)GC1mGۻ+8}'s]x6>I_5nH_`$ǽuWwN4]KrV'ӧ0G)pDZVU׼59)84Q W$~e%p=2AM f<4or3TA\&JV cYJ߬+D_sRobFw8Gg{2\fER^ h7yU!7amxի^y _"'?ӆG/M_ -@NAcZk9N: =tT<ϧ$ fhbY0gEsAxdNqm8GG2r~ W 1CV+_=_Sԧ>y'dRr>vZN⫾Nܜ)ٰ"BKbȋ#/Ozaec.ixpWwSVN<=M!!nQPN !ɃiuBSFk2;]~(䃄6^?9#ZlL1f]ʚ7m?$yOW3KyN9RwNt_,}FCwht'Vegpt=%ၵ\ۣI_6<(;~ /})8)|W21׶7`~]3 070 f@&N1z  ssfr;p=04iұ>3eX6tԟu:ކalw_޵a>n{_jt[]^8pQl=g=kWzUVnL|]U)U51pw yc`_<5LJZ!'<ψ=,32NI5^5 ؞[NAψ3CKyձ2ڜk p|Ahc7UUXUsm Xi1'S*&I(9" _ [GyL~b ^$<ޣ\$ /"PU'\&a.a3H̬0dL٧OtO;%wc/zgg[̧t;p(<x W#8-Y[6lX[%7R3$04]w] &ˑ+ ⮶&AW *Ș畔g R4%nPA^@cWAp.dxWl ^Ja3dX#$_+_Lβ K k3hHco]٧skǟ.f i@0e 1mBL977'l+_gR.{F vR]9-$/&~;! p?y- U0X[9);! ?>PMn@? ȆC .ZS<5\W]zOPv2MN9xرk^,2DpxdS](ߑg} 9ne-&&) f[…6G]wuwq+hx_#kJ8{[ڟɟc4@u{`H 'xLϝ>y&s~`G N*;lbۼGJAjŀ'u$mbUXw%?tIyWK1]tN>۸/m@6!|F^Ic={Ik^mv@6!vZz` 0#jit-X^XK8kppZ9-e0$R4MW+ \'^,H&ږ1 |5qZ})0Zxs2{9S6\DPD|en Ɓ9 .Bݾ%Q%:р/yP~U~y8 ljc v7ዺ,rX=vh@!T;pU؛uGuym=@@>wUV`|K_:{Tv y*֝y@=%b;Bs` ҂9O})AI4r`-˦=.e;rYʃnZjd}!2GܶmuFۖ{ޣg-cgϣ~zw>zN_1:^=cmw~D7~X\4puilA0C/C|<%rs?I#/"kԖA^Hy' nrJLK0}[IfmNu9L5f;duTJuBd{4ʉ.>O.j7@?_X{ͽpE;zjk/W] ^ ʏ`(tM3 oz*BD<-0ೣDH@IWz)@6DOŚt<35$80sF?%'2@%/ ?밯7훭e%ް,)>v>5_s翍3կp6h ΑvGϗs6zz`mA lg.@s֍KdA7ՕxR~+^ZN3PeBe2Q\(pWc/Y'h XLڤT2oǿ8L˴ KwfOxڃԁC3/I{Whz%q%]rGxcA ?:S9̾_`t<_?us1LW7@?_XW>c[Urי3;%M~6ﴧ)oB ecg`nx$a< 82pe9eO!4s06dM[;B3-u; Eu8%&/8YV^XMS!k{?nkk[Ϩz^!fg @;%M\Ӿ{E|ǿ9ۧ<i3;4Yz` }ZEmŎv@nh偵-m;ʶ4PVL;QɿNxss)>a )^335- 9wJ\NēTtQVhu.dG=T"\kRˎu2qȱ tnc->Z@/{tE&x7_8.zek[|YzVr=|FWPO~!`f#C?|$]S އ#STRytC}5i-&ɀYcgeJ'dlǀ" % -nH`-EVɁ!z5I`fpAbg aY/1GP6TyR2 ®3|H L4! kM~t1wd8-5vh+΁8sД5.Ѧ b #@"͐iMw@05ӋB; P_ q@%+A#W0re8g$MK"NGT HrS܉r.wUג.۫NIw]nu=J4xƢyzOJt:ҍpXW:O>:ڠy`m BE]ޙ(ͩ|L|:!W3q?G'ДP ~ pV@ ,ˈ Z| ܁+=Vм`1}q czG{\̇)Nv53|dS{XS*k3Ub y`_L~t(WD w ]x@/HJ+e!dGvrY0$h`“W^X1~ʔK{~2\&tX%y*<l6u/p 3Fh,`R BG?k3r+_y|L'q?ԥuxm9s&mAΰ*)?!c xcnIĚs9)Yb'< {o)IIk==ϘNďv*nh'+>@ }}KB v?frqLɗI黐WK *eU_~ P.UƐQr ?>UN翹aޭFMO_#x`4 m8fn&Hrx+shV:Xr)ޛ5 -c]@|Lds2lL Po(pλed+,OHަЃ~@#nDCAsq c0Rؕς' S8tǽ6DX== nn< w}/s&?3is(<1'L^\;5Ui[- <+(|o8bl@jBXǁ'R`1S"<.ʣ 4)#d=]V2Mb:/͐HzR~e 6-J^\]rз9ztҾ|t"ixp 8O Yl9OxQm][xG//D>ԕ;BA=C"/cW~ŐUɎ?DN`3%({d@vJDBAiا P-cٓ?OtGdmgZ/c={tnn (n|q,8eT<`KLۊ{hvm+VvX+=Y]cS!i8WD](Ƃ|3  vWD4UiƤX+My&b[Ap4OdM,O.YP̪I0T'yG4ԕL|-ʮm. /X},E)yel \\E}as>> ~~JS?SUIJ}x, v@X6m %]A&{쪒G;vO72ڜ<@9,.^u85X<]'81LSn  cmdiMxS88+Aĝ}A+:oKٔyKܳ+%c:I : xNa| a&-ٲ1u=R!#8pӀ/۰n]e!n7wV 4`FkC|U[neU61ھrYfiItבdbSSn♪[Y8J~B;gL#p8};jvOˎѢR$)Ys]fȃ'ȋ'1?wZ2(^'@N%%"y% >ZwY'4Х<ɺJ ,_p˴eJl8{CC?pkx}T}1x8ۼKs&,JV촨^Å?یmx/FbWF _;{V6PXbГO>җt(WSx@w5']FYhh>5/,'*1' Ig2;rѠ @Q>*K2"2@P<pI%/A @|uc'@8 ,N\B]w6g;O5ۿ.8>7q%M +i Boy+Tt=1x-VKBشռ WM#'lsW{g^zl8xcfH9%#ضs)gWQ'x泟m -vYVD;Gu-q袆Xf}Gm{[Pm&3}yǿ):W6 ^XQc`J da4Gū9^dpM?KxkZg?;J=@S2bQ%*V $M,񚀞`@p"@je/Q艿YPO"PҁN@Lڳ;Q^,9HwL6P?2`D{ݶ)3~./T^7lϸt`6z%JfO_X iW>m& ㈉ͨiR;'%eCFͯ Hf +@b̾ 'o ٟݱM{`5MkSl^KhU f!}sWS^XMSiHk v"@w5)0mW)jq |J#Ј\>9!J;/*\mK|M=Rx1`kD]};e%wtR$vC?HxAtf+7M >m&z|}*MqqSypLsMoz Xh'_ jHC4uԘ{P}0~%_~ <Ж)@ `:9CL}S6 .b覉-vDZeā_u_gn"`ȦӶ`KA/OޑpnG[u,Y0vgYX/?b_A |+ %t&@ +j L'V {a`MozB"xo8G5_zM'HL_BeN&4' G:D+(OA,zY$K;d5GC3j/>r]ɢY rdd'Zw_S,lE~>$4ë=]tj6vvOCOm˗7/zы6|uӍ^/!5)l 6!q"$~4q>'*|RK~ Kizmyv ^4>*1SVJؖT( :x 9vQx{e_#$,R:a(!d_AƴWtDxZ'rt~ xxl.bCz}- ^{߿y_^җjZ0Ux@hN=Qs7i/>pq5A&lݖo +ǯd`\p=@Y'`J8x]SeuX@` "HK<Ѫ|reYp8>0;h=ԋϐ֩|[%_xl[~ŧʝ!{__<:6v5ӵ[bu(k{ e/{|^c}?&faS(CwTPTx Pܯ,* 2Bt[Y~K22~=ؾ$!(CxGEJ< H&6$.ہ'v*N줒8.U3SSnj?RԸ;.ElcHRP6XKX"!zO?^wӽ{g{={{ݻwիW^>@mh0lѨ>?:>EF/[S2%ߵt= [7~3.-4p $'vt}#8K%v Iϵt= ^oc=3191z>@H5?L 4_M8|sε9}us6m'*ml'O㎣㮼|ulK=z{- swYۂDd2H4:O dʜN[v(tbB(2\on?8-Jvo(hX_ؐOI"gl0WQFuZٔ1ܨ_3]صRyBXRX9eq,kk4j SYF^?I{7j`0:ju{ȱ?gV\fGcJB ?ω>lsw/Lþ;ަ^Jr|k_N8q}7t&R6_~5N8]PԍgQaZ;wYBjbsg>R˓"0~3eTgubӛlw#FofY–Y:' |5)Uv jmomhOH$9VW噷Ut ] v~;-XE}Q{AM\{NUp_1^fb+KFw*h$緓8|A^wdsx:6'6\O+3Җ}X /}KcU=1]rC6nam/__$.Ɲa_LCNwn??ek E?֍@&_o\0|fߐ{}Q=A1m=lmG&t-o.  =~|__@^?1Yϕ?S<ϞEO5|-Si}h{'T.9tb6k/| Wұ؄{6pl,32[pXd1KƐ2Ђ[mmInԱV?LZQB4< >2CG^&e|nOVAK63,oƂY Z} n"?ɋ$8/'9>9kA]9½ J1&kۨ:[f}Xi\++rN<N|<|ԩK/]5O{Ӻ?PPhy믿~6 Q`ZVHK+68/l[-Ȱr~ ׼У' 66^K}@Iy-5۬nlۨF ?5X2\n*NɄA8L~Ӆ $ h|bDӈ>c<51usSiC`=hSf^><(ꁓ'Ov7xƘwWn-ej< 9֙:{p| •׼kWs—~H= wo>s" ( #V!jpƥ.W ceJQP Wu8D˸co9v` 8Ih!|1~`[q!@j?veZ{=?{AƏ?NIpmy1pQ䛛8jpVp;Rf[OkG7[VhΨ'+7`6ʻ}zp`{!`yhAYF \/ܣ HR@YkIb] }}ATwO)9*}}!c=Tkg?5CJWXw.;s\lp?e/[eJ<ԧ>Wk"EE\DP;,#)C+[뼜,tm ]σpTOCM_Q$%]wu;OW)dok0_ؔ_3jBq8!0D2 mm g<@IE-z@IDAT!J,:([g"&c7_<^{Cٮ#k~hJc~$ 8 ٳc͙l?5v1X(rJ"3,у~K=d=6Ƃ[yc!I~M5$ZBZdKQOXO0J%{V%Cp6`*  DLeg퉚  g3e%ڏ' &|>lT?gk-폨-׋sVb~ɮjt5S|X{LPe-M6./f;`W]u9_gϞ>o s]|$| wE?1>Н9sfvp  7P?wY%w ra8ӢX Pԧ]_0 eO|i5$aEYX4![Ie-.`mH)~Փ=]%[:IU}E *l>ع+Sؤ@CX۷UU?_;yr{8Oӻ2{{ DˆR/JHےm=\k:-.{6!,_Uwv-D4P5#{{2 \S6c}ȄHIg2NAf߹#66lcj`zacT:x衇:+0MoZһ;,9W#[w͇#H*l 8cpr$ CsQj=?hAV:G,G93ZA㼓2BVj ]iҙa;XG)Y};HwC_~`F$<gذT!s~9_U72 G7y-{챵.m2@?8Ã%@pN9xUz!As-9nAWm!/C,uhfN;3P J?I0r-OƂ1B~FK-dO?~ #IaA3a'z3'A\IX墁m&E̼>NF0|( r}@ƛ`{h5koXTW ُ<*BgT'ŖxlT|OOfȏ ҵQ,?]|+u]{^cw@ mHŖ@,9?l"XaADJrɓ!;$OvjPAK.[0.* :J,l_ECA£%:~_`csjKSsWz-K{൯}mw_]H_#$V,غ_z!m&ZA/\0A nc|_uʔEn'g{uLH, ێ|Lh?!x=ZB6CS#~jB’&+ ; x N6LGRݞj?>SGL8)w{ ©9܄H(t׼f) hgȴ2/oj5wךf;=.~.oZY7MTs܎T:Xx[޲7ʏQe=A䁶]}+!Fll Fe 2\Ckߢr /b(?s a s}Wޝl iԜ텭Z/nljfu%u'O\Ҧ`|_X׾]z\.<s).AB5zH_ǯD4\Y6Vp!݄],lo֠Fid DTeWk'v/tU Djp6 ArP&xE7kh x0yT/u-m6NLs$bzĆ89W35|XdoqF30 1'X>q5y/_k`0[_Ubc>jLyn]}_-ƕOnc>`j3:_lxp"1 vdr&*zԍ Xv!ql2-Bq; iZhq"Jpv fqD,/H[AX0nsާlC65~byc-F7C*U!OgKΞ{iF./x꯺??[yk~~ޕ-;o1}tx;{!cH , ˴.4‰(`\eF_"@isQm/7&EFXEqxžHQ 8n>(G'łdݭMmθڕۜqj?ГةA^3j}?pQ6b&?Rd oSC}C*3_aXwi/bw%yXQw뭷^p<@ jva= 5dP߿o-p11MP{"wYnwS w1^F H0lD(?l V/{ 2H!+Gsd7 6݂.x$Mgl~U0W!/6ذJ~8'gĩF={޾;5acmiw__/}i?Tx=_%,hWl<&ÿoԀC o,ymFQkV3#`4_DQrgtf`؎" F%:FU(d9 f\SJe >;1JڬlGI@[C__5bzWp礼`.+|=Pmo7N: *:Lw'Vڤ^WTg)[7M {XB0~\XZ=B h@pp>x88H6E0ʌBu!l$6x#XSmj.Aow]05m{hg:{y~Xc$05^jhݟg=Sf'pw:?D$ ^i@Ɲ__ꮸ֢׼5Ϭj}3YR O/BO[1Z92t8>|iYc.hԀ#$Xq7ezd)#L`F>n?" fL88*mj`I!?^Oo֢d_{+w _•,ExK^bF=;[9ػӟ .i+_%_6xx1.[wiEOzcƞ3*IPF%aW¡=3|u m  [d7O4םwܴvGڌ/:w=$:Dp~js ѯl6Ux_?>jW03'l}xO,du zI`}Ϣ E?"gpeu˿]xz%/wt|;O}S3\Bx7 ,gGC1>9nM:tT=/A[wy{ L^?|@C{+_v?~EO`ENT~z^wd8c߃v;Rܩ%p~v |stUWu_nw}lW*$j^%`p6XRnh\2<{]F=@t`DDd,N!O kLt;=ȀWLBPO<^6qdGhM2-+/&cd %EH xW#Fc?Sdn>s{bWz`2@P}6j.aĉ+wy'DQTr5׬n?Tڲ6[4W7! Zx[e TCrخb!@>m{)Y)2}Uɳ+bߛO$}U X*v(ָV Z<%^`?{$Ղ~6Ug_M@ï4z]TL^],쾭mM~cr\v:1dO]ќɧ@W=wQg ׸\s,?Ͽ[3|[x`oAYO]^A/SDz{6:{l|s:om6W+ x7M_a†k%zRyŲi@s&.j#pnټy!b@]_;A%: D|ކsfdȆ(\9fҠ:gg7oO/E02Om{7_v_ٓgJ ZC*|M>ENvyZ://uo?s?sk^ez`go~wVX_E]zZ=POԡ'Vv/|-X7_}7Was\6;se?Q#?#E{)zRC=Խo-8&XHx=<z[Fl%Q7(a( ^3N06+wMh[[- $؈0x-tS< 3ؘ$A[#8~<:.fIQ 9ukKK#Ӑs3ɶfO'|鞥H;oQ2{=Ts6& 1x1D! 9o41O{Ο,5*s"xrĉs"qۃk{a;vG;U#x>Fu7遯)[.?*~gWB@K4J)8`'OFs$6i?Nv;xAW zmWnw?C)\j`ߡ:M- j`NP6_91w_sM%_|}_ /~񋻟}ӟ>Otw7Mmw;.󖵛dggOĉ$[yY; iP}UOMnÙ3x1qw~:y!# x/<4WK'y=ax΋\D<j`y414 <;x{yo逃rO"OOi*_EQ*ԮDwoy[V jg>CPwP}aWp&UG}~\$i S&`rN;xj#=YLOS-&h8.#!D$'qFP[zoh/7. @U̜[gt 7x]65͏TwֻZ>iAxPz6׿ˤkR?C;}wQer^Ϲwvǻm^5 WU/+< A\.+뮻?x`ymy[w=D* ҀdyaM5|qV.`(S[tOXփ{UQd%/SS;*) $z~n CʸQsv,Bו2>H LeP>g47*JĘ"8h^JGٱk3&fhP' RZ?uOܮGn|ee :_Dx"l=#wrɷ~뷺+¿Wu!}O}Sò s|6{ԜvO}p?G^`eM]-lA=Ʊ_9ņ@< @!u@[euu.ǃU0R2)?l/=8sMJ᱌'μ],@ԓйHAR"5K.i锸_ ]mw1)6 z r10Xd Y ϿϞ1p0yhXӛJ&>gF'#0y&^GNW\p {PF~=iaI{@q뭷 sv凭I=  +]7 ';x gg],CrdGCІ=(&[CFp{yЌH"u<7 Ȟp uc=L85z*iU' PPzhx?G};GVh*n{`П'pJ%;MX [^WoZ~'>gy^ò]Ǐ[}Q?~)͘Üj`{5}@X#4pjrR@td[4-`3clOX_ psx7PEB:Cu&m*5/VцAƔp6bohI,TH^H@;{ǐf4\ػ1b>R75r~ 6F[qD8u}W]uU.$ }'tM?_꡼?'lœc__rpHE\(𜝴X6ݿE`8ϴq sv:f@"j@UЇ8✶a t!8$͞g$A1Z?nQnГoBٚ#qBGu'F,bK3epFWv]<үm[ > ۿަP8fVi :{U9e?6[Qo?r#sww񒗼+xs+2vgotwv乃׽{ӞvrX[`Wb> U[NX $/p(;!#n[F_0v= YneHa+rdIx1}skMӠA9ɖ R9*bZ i>]4Υj+1bOQFϴ(C@[q g6PF|59|cwi1VZ?|k2[=|.F,}ɯ#2k˦@J{v. :H맨ă򀎫׶Sϡ.A*K?.x2roxk/=':XucƞjM;,1(QvXlPL9L |~I}poN1&$hh'!ъgMj~GYҽo=l:՞^dѷ_.XwBx䢭?5h*s&;ItNȴk=lJ)=C[ p>\䍱'pUhSI1mjdg)mu% `TT<1O-LFRyseS|alf _j`Z4tִ3Eȁ}ɟ\iq ݼ QxVww<7XZ&Qņ@Cځt+rC NLmm`V>xGGB7H0jqEd Bqaa!Ld wd>fcWGЪ4pzho i+4os8$k|Ki o_mfC?1%>$i๎FǰƿW.=sןbYZA=P/\w #['wQ/.Z/SR\!kҾ_8w_t QYjw G[Epg>h 6nC.R Qt8 r+=w9.SAI!=Y2/oletKT $NL'hvrpsV6#F9DrU o4$AovߪkkNȩL=N?wD?.&pr+wB,9u%ɍJ ~g;,ƭ8,W^W~WHs՚]v,"P{[ٛFZ4]dahrA!w~QI\̻:A ==$6mj[al`ԯFxqɻ?g#xrS5 v_yAҫzG@O~;*?k`O ^EX-W[`Yke"Vy 9AO@Sf|aro4@#yc>/Vl Hj(&%:'ϘD_!mh͔XfGuKvTmLqЙύ'\h$\m k>htP7Nݓ7ڨ#HsZy6V%j4 4SN}6xr ż'n:/;jO?~|WOz'u??SW*/ ]K@_NG8U$Lp;`2@$Ǹ U?rx!>8MAH?eC@^ yOvMtrhv5N;m[[~:^@[6_,O7}7rܫ1NdJk@mKTjb;h=vmKW<@@S?S~}ݾpmusOɪQ'/6ǘHZD}ݷCWt/yKW _e;ݽX{[*,> EdAT^4 H.n1Y$򼲝&$8@πfٹm׵=+H9#ngݰK.Xf`qa \8ZQg=ȝd0CFo$} oY J?[?ɓ< |I?R&Aj߸mvy_O&=] i/ӎ7f3L[o꠴w[ڕGݬV0,z_\--m?)JK8d'2:(rsLAmHHmOԂ[l$3voYyz9i?wCW>E˼*k*ǸtU5y@5/#hݳsY;nթly`=p__(]i~ݽEts%0J슏 YԺ 煞C_PCRl|#Hp`d"d.A#D|(-=+ )>S>H&yYGU7>W\|oz/]93.{2 |voO_}~}J€_TrBƪ' >ud- H59dQr^Q-Q*6f\ 55g&o!pj>Q9qͷLs17aX"sDxUm̸[ԆY>V8s֗+_p+V\&=@ā)OssY{66sʴ#m T["Cf_ţӼZ>_LCq9;gZM͎82aEh4 D4CU4B|9H$ 踝A% U*2.%.NlX e8MӬqs Q@$R }UƿA/sfp'^/C7=O>ܥ%æ/SM!tZQ/Vت2CӪ̀j?m0;s껟tR|,*by6^C.MGyI{gڅy 2<1QGVI ' ÛI E~ ꢦ7KWjàOִbkO v0pd0$8s lhZ0Jƹ&sv5~$;4g_Pw/EcςQ䴆׳55bL te\GM/y|:Kȓ/~SVq|;.(_p  58}*5A'n;Ϝ9)=p7+kBe>xv!ྨդ>Oߨ^@U)C?oǻ)G20~oJex2T>{L MMxor&f\ ܞf]?@;]y_Oʮj/֗'x> n8qSEUIy`q? ʏ:y Np?l7;su+F녯F/Q' 馛>gO,Q偍A~66ba)2}\y,w9)@ c~{۪{l#y~ 5%观PA8X`T/8u$eOB[?M6579y4[^+8{ӟtrFnt56EAT? C8<7#i*C! d&"G}ɓK -lj`c ;P MK8],ǑmwJo)k"nU@2N>'#$(!)iQ2{-t5VÁj`W:f5,jz~4.x2T0'W9;OynMyN3\T1?tēʀ<:۸ǦO>r+ p@8I4ym ~bMcInQ$B]V+3 B{y8'*Fʸ<M 36~?I8%VTie8TWSor>~"UW uF2 M&c=^偍A@ml*.P2lkr-dUiM Y̲? G4y`8b|XȐAF$fnk>og=}}ך~#@f)Jk@m;P=4y9n_Ky` wAP@,Q|WijFYSAeQ|+QKÝ: "'ߥndj ݴePc@6I(݂;Y` '#kKuRñlCMC_cDs`@1^?N/*Znc>} c~O!%&sL+!xC(3{@Hh[<ȇgl*)>( cx@oA}^8r b};9 2-J)shlǝς\VI uo_6[=09'љ 3CY?4kKkڟ W1Wd삷1<7^FlQ59>A~v&.?u?Yq~APf`Sg?U>im!~F~#yn f*f\\p:h?U?BGV+ a@o0rg-?___G{}ﶓwOxh~~Unm ~[ŋ&vf&W:uTX'0T8 c*an#Or:WO4|=6nV`hēpyڟ GOl:\l#({{PMU;HV Oځ.A-+Xx#ES$Y^u5miuœR%lM0eL pt܊a71Q$NCA! Ӝ>A# ZJPo>3K}H۠AY1xc88 p} fY!0y{Q8р <}ɱP\RGj`h 63>~W'79eQ@mޯo޶C= LbS]|J4DD06՝\Sɸx3 \-r'(9/K:nL[' mi,_z#/*fVCĢeI|6=~GO[{gb\*_j`?Ouɔ'c>zZy`=p7>,J=uW^/Jy$@%,T9h6ph|}@lGOƀա>gE6"zHnt *0D&e_O*jjO6an˶JҗmiWm=mX'҅N|[0nyǁ6 QW T <T>aH!ޖfsO xIYGCYPd/,k%$gݟ 1_ӡ,|mw T]'Ȱ3މ?`.+w}3 hNsN_M^'8%B]1 q-ӟed)[ec9mnAC63-s*eOBo8? MT,cp2/2PgAfCrߌ@1MFd)ifrZƿ,{ sw+oln/7?/BW9oYؿ/T޸~f;{>|"4.g0rM@l77N &$u{]mvPyT)CJ{o^GY;.A,9q翯txԿ7`紱$wm0  zZ{a IPBM\goE N׹lDtJl!/\P|ד\:-Nɕ- g,ɇ/z+8U\BE)pA,%e|\Or\H^W:%W.(EP$ITq AJg01 8>Ti=P+6eI?d<h"oꪫ>{e]3+r@yȢ#$1,\r8u aI0~vZsߐEo[?!ɗ< g8u a}r;7Oi gpjaz`g8M4MIx~E/z7/R@y˼޴exF;RYac#xfċDf>˼exF;RYac灟] %vZ27/1l|MNFW?򑏼guu(B( ]s?Lf1Qp ۙ烈`{ Կ#!\~xW,6oy2x=0$fޕG1fLfG:lLrQSm٪{7!qEsA͛e+muj`-~ߊɓy_wQB( ݌$LOCLOp/kqRΛ>#2nPʘnR'DŽi4YԚu8=j&JAx';ia{FG?l;bfV4p"jX6qࡶcM+>yM80>!:6 >Aǚ$+ =ϯ_8/tQLJ[Z(5*o9yG>'?@!P1wh*IX(^ߣӥO(:X<@&k> ~)K2[m/{xψɌr?H[nay[AooG񇼥Dxʊʏ(ܾQ盽ʼn9Go/cfiEtce]G^3~fr)+*?F88v :6|1mXl6dӊLʺqoa÷1novP:~>u5_X!=6tYLѭ@-lҷKI'N@Ǐ9rȻTh!P@!|>wS6,*wن3XdAmt##{Ďӓd0Jt/$Y VZf+3jt'uZU(98OCeÀf{5wz歏AE[FfJ[ZGh}'NL֞u{iW+ Bا>^Gi;$>eq~2?Sy=;x|]|=&Ik1E%!hCm рyƞP`{{m/t57c)9R{Z 3vw0w߆&&ǼxN،iF8 罏8!㜏v;?^~+]}FJ[ZغǦo>n rǎa B(v/L`,~@=ϧ \ $(TOQC9q=}VVV+ B( @|E0,>ۣѝ|g( B`w"0G8x'1dɖi_Y1.֐LbjLXmjަ &Ĕ Kfj;4AdLmfs2j Eiq| 3?tLɼr2 W: :B <2/skG~UEWc#Yح@-lţ2M ):wu{Ο?|) BMz>|μE#{y!QUX>{:[NdcA&GFI}i}Zz/W'@]{l,m@΃eW,{괡g St P 4?S8HP ;$R bEk|f}6ܫ )s[CGLMtt{}f~)0Lh#fGэ%yfk׏ 1{6msf~c1ϼ̲K_?{1hɼ;lX9|ߏuO4Dr$/tD6AɁJ'N>|W"Ϝ9B( ]Z" EMڪ=O̶lJziXVZyh΍yw. w3{9f^* <`{Ѭ;&92>23:3?gm4}μ̲_(̣Yhgͪcr3/#J/?h3}Fj,<`{Ѭ;&92>g?g,7 =UmZt!P `4U'NHQNXmd{ #T@!&٘fɓT^P <4jڳ彜*\mT.,\22⡶F3vm`d~^l9ϙ̳ ˌ}|X E4r&s1`}d^Yf|>景oe"d~^l9g~0O>-?<T 8cCw6CK PT'j>7*( B`"\PD} C1T^3SWbo|&ifrɼ)+:f&Σ^Qj 49_27e2Oo;n_nS0q2foo@>uݴܦ7:/k>^<;H&JOKWBK^t"P [,hV'QNe۠~"xR!P.E p&EȾ`ݣu91'gL7xHL5;L)?غ@ȩk07oxk]zc]FO766yRs%s?@@U@g&\ &: JL7\#C˃z@\c$,`;GTO5{᳇瀙xaL1Cc+D&vĦۛO@t'SO=ugiw+ B-7YA,Z DIϦ*t e 0.7Zt(8k@2ʘ$3QjmN(:iVp"GHb4Uf^V* uތD!PAg#B8qqdԓ4p602͐\ee}8oF /5zemw=w#!Wp tHu8E0΂'y:yuBO=~]+++SB( @tEԞgZ&ȕ4W`BQ>)%qPpS= J|!˰ 2di?5jvddzgmsc#&V:]Ώu VP M0^ $ߎH}r=FM5_c_8brW e)8DE ZnGl: 3Չ+ZN:kOԬ˒@!P`O}ަQ4*Eᷨ'Y=6?$SCԓez{z,hh[ϧ65{ϪtY4"E3³dt(n&.Ӡ>Qc*x`ƓcoxqDI6PU2T&ұV}x ^Cqe0LG; mQ0mn՞GI:oѩδbC,|*;HH# {ro/[SauNV {vwu;w9(Z@!{`1?MۧJL!L6uJD GH`l}4Uk SְU*Zc2 *@tQ.䒑Cx(LܮɗNr^K_?ΊEhɼ{$qC=عgAyVi#%|sMg3/9Wq7>~1|4g>d~x㱱-g3?V?Y[Fc&^A(MW󍭴]zfۭ:Ntt>UYPKRNF`_zjUÿwD<6;|ɏ(~z_(n^/F99^XL&tOX6[m2xytIj >r{~ 'h__dծhC ˰?9&gm_=4>{c1A/S̖ɇZ6j݆{E+g~j9nM, B0XjG@->R&JPtn,H(]萫agFbQ.CU#4f|OvMJaC6=%؈?Yy+aCfޅO,2'ߪ(] #~p TLj{Q0ؚ7z=7sIn ?cy+)z='w0"{/ǯxz@0l&GLN3540/  Mg8KiCmlԅgAщfY'A-j&fUP77Q TVuG2Z?s t wQ: ,۳dG,?gO]|^AO5ɶ|DpI'x7+xs[+ %j<kemAT5ENqB>$~[#m݉j:AIM>E,ӟA`L[B(vLI~7"$!@fJۆU?³H^hg"IIwP'.pSFyLUDRxoh>Y\}}7~!Q_[{^~.ڹ#5@O?l95EMRO.xܟ~?n5[J;;_խyU&< AE?zWg7AB( ".6kA` GM'Sb+hSF|$oZ}4`uQ_,^y AK1=69e~ꆎ}o^WO?($YTop$ 0FVͶ'}7f^Ozϭ.[[|i;z޶_'v 'lX[(Ϭ SN}pw B(;6glﺚ;K̻5~ >hO/&w ?Y⑅̈́;K mE6wdL8h&5w/6X1Șe~I3졻{_\? r*|x[@=Sx?Ͼvwc2O 'xSwy߿jJZ@!&{ y.w$ %ڻ/T::ylne-sk2$MxtBSB3NZ1ǶO3 O<2E]m4Զ>l{б^UWc'f䢮tsCcxOd9cN /zGO>|O "M[ j`̑'<r~`sVlm (@IDATsH=%* Bf|!OF{I ,`3',U(,i!A xQ+:_irE{Z% O%0 $ywNQFO:b}f^uf k/c1A㍐ÆJeJF6JСa4y3SEk41H6w,M2|[>(}Pebf Cv5uE =rI{c7xjF*@!PlWbOL&qI &xI@ ʎ典kpY,0a AV[ N 856]֋UY?ϒ(z QhNƑq’t^}cCZohF mrc~O~g9 c?U>k&KT/?_]uU__@!ڕp[5yv|(r>bD$УE&աjX jBgO6V$w|a(dQFI},'ysys&c(ꆒ _A8Fi[:rm'«-j("ͅwg.6U[58fO)MXᔃ xF9>}T6$QxU K 梎00@'(3^X\4i{VNׁw~3ft_yh &A+@j`ԑ."u YDB^.-+( B`!mv '3瘼y3ZYSS `.K9(ior c,L n6w/+Z[u/4+3E7 hR_$J&?G(U M?d?m'7zK?o~z{>62³i Fa++ѧ\B( m>KpɈ}F[`xgcҌVh2n Y,/?њI /GZӹ=;g5Vm:6( S>1|l4n2.IiVsCС`+B&C:1 K6|曁*4ʻM 9u#?arSf73|@=.^smk\MygΜYZYY­K_6@!PlaWx&?wI;ο2e15CwJ{ḋ_Ҭ,l܃᪗o5aMf sw3Eh]8s:j/ߍF[gQ˹}(|h>sQn^F2% ]і1YQ9^B2}n̿s :w#sazw :j/ߍzk9sFQb!>I7gDwr-ԷzeϪn^P N j` t]uKyC!,yc7p믿O ފ) B6~Ğr1ٷ3Uğ»"lVֿ| < ])cQ3anpߖ\5ڰP/0bZ⡤^/+Gv}ff:ކ1wXjxg5#7opdod,(ɘld@5'!gG|Zw]+yg_>te j ߲vviJ ;+v@!P Ռ?dp {.ly{B$HO,4J/&b1> *#;X浨̻r-Dx$L}jꕓ: UDGʩW:y,ptcnTm0KͶ">5EG l=j[Xs|;_][]'~qOZg_Z&tU(W.8]eSy}Q~>ß^ x똳@!PlM%>>l[&m灼u~ݣi@˿kno_~OrKfh^88m7d꾬fCثMS\vT6oV`3ǓW{T򛡹N/=?jGa^S =63 v!P ;`n+~ oeǂLe;JV>;-p&Q@!P/w۴8x]#]|rݏ WY$`Oכg)0Y`0!.sڹeh( VݮG-lѦ"$ydcImf>NoWǠQ.7gse9|pXk@+N|]@-좃uUNQ(y۞SN-;vc~=_UB( -/$&v=yz odxROCuRwb1=5@;7pƔ:I%y`p}$oP%ꂾLڒ2Q7~'bdM:N[A!_P`}g [e /̇pX4N??z_4>ϋTj![i7 P (c CM{3Om?k1@!P[o_`N%=~oQo`o-nh90m1|` j8D9zP ͼ+'~oDDhv ~DDM\}Ej@#+fgf2Q 3UApi^iPyhcjn{IGm縣Ⱥ)0ڨ\ߕ}s?'oks௻َr{*Cv1lVQY W&65@R!P[ >=r2?. >>!]ȇ?[GZ~_k a˿|P y-&iΑieMi SeD)$ݗ/_~SN ߖT$ O R!Jmƒ5i}SujT~EݱZ+젣Nj10pӵiLno'3|?~n>?2ԪX]}a+6*8mG|#a֍z eKwEs EB R|m@-lx:^ϴO<_ȶoiQ%, BK-$$4Xt:8m͇_$h.">1cH]fUbyd́-/YmAomD7Fo7n܆aߎc<;U=<ٖ1w;aNj͞~㮲[d^=w>g=ԝEPLDv3l82 $~ݣ>zxũ뮻T* B%\ *}vu`xğ?`mۦk2 x/>Dc{OF~6@ee{DPͤOJds%}3 :$#/j}_ǿE=֖s3l?Cu^?*aE+j`~hbKv#{y7S&Zyq?VmpZ|wz(Ta]"ϙ )1qnlGc֟? F9ǫj3vg8v2 f(^zp++ޜʪLB( KODwޙ%zn'.PK<аq-&cTOEn04=3jb+j)YsL|v#.6odб$ߢ=M Ml]!;Q%?n䦾[h߼-б1`Ws^{>zN) y[ 9tnGvѝLyh+k&5@R!P/oqe8Np ACoRˡϘJc}d|;n>>aLe{uv:vNA㟟K_+%W/ǮۑakW*@ Gl*Ty:ho-"V* B|3Oؼ%|f]y&\E]\晐kR_ hzd,v;7} m-,>nMԄ^&YNw/$o2Mr;nkV^v?\ CC7وbO >N TdV | :~;Xg?c&94~h,2\Vsl^>?r@?kq@T 1R!@Ez3C9{'noU^K B(.<.~˵+KγJ`;oSM ݆&Mxpa1eu+QYSv}@ ?(OES4#,@u B?qKjGB>ލ`*}GOۚ';Mk2^} "h'͜Qz˸OhMd Gk eՆe{D,pcBu]U7e'`c7\&-XB3/[ԡ ck 86ĘFcϙ'MwO#n?6].BDȗj}>zyz?~Çoe7ʠh!PE@OD}rGfdA|L#hgA/>BG|6@ ~"-jɠqFI؇?e1T25>Jy=LI<ԛڷ^p XwH6h7¦=?y_OYU@>G(<>ylB`}j`}|J;A@Sщ&/g<~ԩSxqoE[,Z@!pWUDž%wpI MA~L'wOڭWbmpC{Mo|qQlcu@Qr^Յۼɠ$`w0 |ta D~r@Ѕ cg{;==?v- _  U&i .WSB`@(i1e=OQ}3zk^sJkW( B#͇^9 RM) Xf!łHhqAw'ȇMBf.,gN_Fe\h@a?a>g݊j+5f#jn0F>~{^WȅoPos9W,摏_G Ϗ+oWAB`ZŤ$#d)˟?~ȫ^\s[%vu}!P:`1\!|lC矄}$l|DS̓q-6ւSRa}daK݄Wy >( :d>z3o^Z_w?.3# ߢ >lۗe|O<4Qt_u3C:O1S2(nqLJx[O[6k@T*/ڎxʼnԮXZXCͦ\fϽ?tMhpf+*B( 7EU\=+5xy\-xWeoS-yo,>| M^6 ̤%(>T6EſSPK43jC^mE5 =r>*܂]Yç_O16N3?eUm~Ƶk^pg}?8AC}x=UGT )|*n6W&O?}~%CvbM B(G kx$BoM" ~p/`X00O=H橝;8;Hc\쭤OMc%)=^˽&«o^RBdIH [aa,5:3Ls Ճ9 Tyj26'z ņuȧ-m+xp"ql͟ґkb@wIj`@^15ꔹL泙O8q=;A@!P/*ƅ6D/M tqSW{Mf84QOj~-qM힠B0LU7AܠoizumjE?ɩϓZhNm/a4ǘ?qRK/zCyeϚ@|eLu{J+B6SAMehs~q:뮻MaWcVH- BE Ij9`tdY`܂.U.*m.ˣ<i>\63ה &/1SFv~ڢXFh𒡝jT¤e,:sĀ8mXj)bLhX0tLsp 2t?r?o~lCMt;o%lB`T0qrtI7jrD5#r bo pU B(6^HdvFNoVlEZw]q3-O'O[>>Y zڿOsiF+o4x#cLXh#n|3oz)/KG>|:g TЮ^~Qe¼Y]|*D6 X"QՌ0fK3bIeÇwe_ .{U6.( B`sS"oy˵+Qp݃OGW( La<:%oWAozRd&[؀uhlM&#ʻn^hCUEhDm [X__c$ 䅝6>rO<9RU |{ZxI`ߑ)z:)NO>}K_/ꪫhH+?@!P x S.q7yuN LaT+HjSN6szkV|Ƅ<.h$2)vjgty/0wkx VP 6[1*72)6knХ?}o<__輠_aEg,yhB#P /*8E R%[Hm"| ־pBeP@!0@=_pkviwk` <<_ ; ?{O#6X0 [6*[W"P }2#>Ir}r=?hx߭zJ(T( B !ςtrT7T]Rփx‡ClG&i;MxB J3o O(HS{9m;r1SJ~Qu9&X7&=+'~'~}sϜ1+'-@~'i,/ZxUѹhv̻xEҲJ'ib Bo9JGR@(෠Vf+|]a5Fݾ_ i Q Ąn91L|Im{hx 1[d}nS's ,˶{}|_+{ǿ{<( B@dğg _xA@39j>?4wZyJ^nD-_i.q'H ȳA]=+ݢlv ^4#>Eu1,~9mmρz ?k0'(`Qx m}m& z/nD B`W!E{1"lቴ'KCghMor\X"wx|T\d6Fe ;=%0FY^?oPe|8; Q dn]xUu.+%eCߺ_7h:!Ʈԍ'RT2zr ?Џ|k Q-HȏԪT\8jaY#O,yɡ$]"7N~z) ʯ+d) B` Aɝ~. @B9 D)p{ǎ nrW&sp…FfGG@]=mN0Z)^mSqt0lNi@mOtr.ũ'z/ V{jKu@{Q+O?}ǁ E +'_Jzn~,zj Kd2&7'ye5`dnPe>w/$+!4cCh_e~l/uJA3O;ɿw>>A{7_ *:=վܭUvrUA]g>gמ8zի._ &/ B`!K#B̥1yj2aLun~\ND(o^ii}alWJ<Ͼ5NH5c^'7"ԨWoXax~x(I4r/n/_nfuȻ|'=g9{( k`,G&}LJ6|ͲU*.*pQ-#tEe x<ɒ#e1@!PR@ߦ-4 &.<ʡ,&C}eacQ!^x 6>l&Nq67#6d~N-yۉ:C&oqPlk47Ef/L 3&p n\^m_ݳz'|̇4o- Es/>"@ AfYO*ZW#=ae8&.ӽǎ;y}}&wK_c?xS6(( ݄@,ģ1IKOƂv@IwݾYz `׊xa(h|8f~G6$ًwaK*1*<y]71aCfޅl#Tnc8w_o=x_3|w+W?/ `rS'^hB#P `quA4*#yP񲛢|_'ٯ\=ePB(v+Ln!8\܍W`S!l=!dHdCυx?rYs*/ ^e FvMVnl`DlczWv#ĠWԣ#Rbs{ QVyun_Q:v<sw}yN? l_T~%@.Uźhր.YɮϏI6F{/?վpꫯ~MH/3,Y!P; `*n<υ@!oWI9`:OdZC}M^f6Di :ex2jυoR_BExʎg]b?__S'y%M_<4/>SPROCZB!P f]4k.Cu?F%˶+p=oJ{QcFz|!P;W" OB/p1EAn_B` L٘1Mw~)6:_wok\sͷ=J@!Px@*6w#`ypݎ'r(yQMJ]0ȿ ۻfAʒ܇r=5F.Eyw7kf5 }lnM(6۟o)+$,"m?m_񿼶z g}?>~?ẋW u^ ~l@*T~CA-R!"Wޗ Uy!0f* %M _ ox-5{*ۚHB(/ktyo8VzzG@mzO{uR0O4y g,Jx/`u;pPPJo=]w6l}ڿo=[l}ڿv/Xm=[l}[זO~āwGO~0vt9EL*'_}Q 2JK@\i^fT Qvz9/*SYw_cVB&@)k^PWdD߃xׅYw}Ic>+0oQ>i#d0n}Wx/ 4o Ƿ&=^yZ=䇟_]:|yS.J ~, N!LL+[}nUC 4N3 6o {SV G Ǿp?{-/( B`[!wW3}5<W允\͈7JEhI.﷿S VyDvZs Xz];ᑑhY7 osGɾ'P"Spl1:{~#=+}`Co ;C[djjO*[$ݒMFS*sxm [uG}]jþ-oW^ 6I|) B`! Ah`V6s/֞ )zw[V^ }Q,}3P&v:hЋ^b[T~ϴ_,w1x-*_:,V>xCOvjpZ[s s7ש%;UC[B%FklB` ǫxhr?o!@~~@\k7xۿ+B]B(&,Dnz?0=gMc b7M#VV>a_ 0pO-5 v<̒4Hf[{`LJ$R?"j꟔ nq 1A߾M?r像y5 -9pwjNi -t7X q+JPE  {*ȳ_3C- ꫾ꫯ&P( - Y+AvȴɅ/./6[ S{h\F[(  _ h7-5A;%_P9Xl~m};S?hkr^E- @qC<;r/0M+7fsV>2\xfޛox++jd(*@!R#K`sa#OEo9fQ& PeCNSb^H"~HQ&˙ΥQ{_̱#6@w :fku/kYA6؄Aضf/h"~iQ{-L}I:`O-=q'?t~哇NoC!HjS@t>,Nr4gEIj[j_lϮmjb!0@ژ_tٮC^u()vm7|ͷW/aRB(^0&/ڟf3ݿwR?ɉk_14*mk##:itBN}MtK}=Uc,ҏ<-?}97F< eϾ녒W*v ˙M;2~@2=^~z*d{^zw~W|Wɞ xMkS(.iO0{%8 U Yipl=Xga} =d b ǟB=${4C2k;(m''`0^|4`` 3PҌ?S1;: ?m96;e~|ЌATyh+l%>T?̓WʼdE mpm6-Y<4o2F(m{?-j^y4{lJ{2t׾!p[֮( &[EOHFr(@b6=H` f3f:IͿj5ʐ|+=o{i/ [ԾN?0YOmN^_~OuO'{$y9:=2dg?6C{|B`!mjp!y\捹)+Ge;\U1G[@\K`>ؤy'N17!HPwG+lDO t%d?jiQ{_~QWg|S~t4v}_; 8TyP ԕW@^yD'U}4^)-%se۲7B`1`rta;:DL<7e/E@?#H't}0~]"$>|)%oor+F'AI:-V6VKszuBzA`=]/?tЧ:E2jDIDAT{]^,:%2J@| OTTU5W*=sc\z?z#|%v2 4,S\F?y YzU)#Ǽxئo Ͳ\S'yujJEFKW^w7^*:;m6QJ@!P8z?T.x;𜋐ˇ{=ҏeYPbEOr>㗶c<(w+qc q|5{ifg^S_kf˭WXY[9rKzщpʉ?fxT1J\z%SO~2FNRJyW֮؉ 5;sէB`C[ȺufX.$!.AW^n_n%jm_~o6FE B` [s~#@)~O$VA; W<6}.xrzNx(ׇt7o&b?E $dLLPp]9<|򉧗>șO~|s9d.ѬF{?y\eqj3ǖO=q;_8Sgx3 q(Dъϴ1}=:/Po_G߾܏'_ϋ\\>4G撣`90A%>y 9/9t# m=2y%g}8)Q+7^wu7=Ip=9pm7]ve7W nmE*[l!Plf}Q93'+kWF&B`>)|)8~,/<e#^"JR^zIe#7z+_}՗SWl im.e6I6~.|1{MGSz{^zMmr*˭޿E O^~56UI?{}+$vl\3P|q#v *E X͙0靘-bV_5g}e~={~SʼdE ]@yksHϓ,KzO2үGiJKէ( />Ol'<Ӟ#ȶ ~#6H+kWG&Ǫ, ПS9/RW%7*~?E'~=uH"?/$u\B(v9 XhzyY~fYϓ'n^ʰU/CI糮B۳q%8-3D$E Rػ\7xBjqGq_OQhi֧8k9ydck3ޛ:d\c$@\}?s5qfT˹iZxZ=F=g2c5ǑȾ>W?g˺g6C Wkzqv~Y*kzOV✟ƨő?? ۞E7k?3Nkjm^粶3֞~qu>j=_V~4N87G/;W~f뵞9k-h^5Oc⨽SݿoL^y9ƹ2xt缆)R{j_/'@/gWtݩ՞+ԛO̧̞:'&@<~xA`Z1.mwkGcW{~ @^RJk=sڳu{T| #<ȯE$OZ[qN&5q=*UjOxg5 @=}AY٭8+}78ޏOn#A6_ %pY`vŜ^/}\}=v]GNxEvwԷ[ {ZuFn&f_%~USNsSm՛̚=squu  @^_n-}ߙ#Kt (p7l>.+{v+{%@%p|Ebg+ x8 |ߍݾխ~{NQ#@ |=w[qU[9mF 3c4% Vwkޜo~?G.\  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @VDɓ@6IENDB`infoKbplist00 X$versionY$archiverT$topX$objects_NSKeyedArchiver Troot U$null WNS.keysZNS.objectsV$classTname_assetcatalog-reference_icon_512x512@2x  !"Z$classnameX$classes\NSDictionary!#XNSObject$)27ILQS[ahp{$_=infoGbplist00 X$versionY$archiverT$topX$objects_NSKeyedArchiver Troot U$null WNS.keysZNS.objectsV$classTname_assetcatalog-reference]icon_16x16@2x  !"Z$classnameX$classes\NSDictionary!#XNSObject$)27ILQS[ahp{$ic11PNG  IHDR szzsRGBDeXIfMM*i  bPIDATX WKGy茮1TA0 !Hz-H r[X =$b<T𱘸adw]|8Kf2&9_UuuH@~z{{/B@Ͻ­[q?z—.:t\A3y}C>9 k~oIDm 8n3w_SA*{ܿ0e׀ Y<)g1ҵh(ra :Lx.!o`@)Pgg'ݽ{ZZZnݺE==="\d;Ȯ`2L\daHAXFGG*"#1|E"n$l#pI}677ʼn9 j sc0e,`!%ؚLNJJJ(J͘."\&(NY,̀YpEE͚./Q"/ь1tjjj$fׯ6444h[ yjAǣhlld2455EMMMnl"rk2EY(^ f`aaД ɾ=WFqLlQbw *t@'/q1==-:/})BxQL NcAܗTZǺnڝշא5_kZzGNb_(h dmس+. p\,FT9cޜ{+4p>cZr߳(+ƿ! eePB~3z&Sӝ߽g<?4I? K^d8bҌHO='KYY N)V[_VYIENDB`s$infoKbplist00 X$versionY$archiverT$topX$objects_NSKeyedArchiver Troot U$null WNS.keysZNS.objectsV$classTname_assetcatalog-reference_icon_256x256@2x  !"Z$classnameX$classes\NSDictionary!#XNSObject$)27ILQS[ahp{$ic14PNG  IHDRxsRGBDeXIfMM*i @IDATx mWQ;{wBI! EDA^B@^rn䍊pz<rDP|TPAP%/Ix B[sս{ktY5kTը11id2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2,L&'5#0ݻwh؛ocXVVVY\\<Vo‚n[TPѴO fߞe[gh@?÷D~M7tK䷶j۷~'B?ږ,s߶ _%۾ajIJh>ڂ#=3U~{}jS)tY%_|ҟH~敕Ϭ,,|z'?~1"0mq uQG[|-gr-GڒeEfqam  ĻaHvix\Y/\2yZI|RXh/A|'>//[^ %߷''7폯MʮZiV޿>ySܞL>r3w,--w|ù%#͓vLI$%ۆ-=gtX͢Q4E H'Y.TfӎѪ:j+,~K'0Y-37+޿pWnZ|m 3]e"G9SyxG$i= ~؝{mxM(KDdgQ/c<\&NCի'.ɻ^% eVB4>%,pR#]ie7Y<}M"0y;K/t믿.t#3#e{'["/-hC9/& 4!^'̱911Cg1K?U>= yΏHȬV~ c2+HYӁ6 o>oo*xa7yw%0"}s\+f?ޖGr˝|3#NiKmj'[{%z҂~10(Wd4(#] Y~0f:L]={_0i?jF@vo۵x%~ʖK,K;= F@WHjIvF%i0ڤO\amziz@,?~6f{f5v_/'|Uf;'ۦ+:Cuc$[jln @$yP_( Oro'>Q(PmL8B S(ip2_|}חר֝y=~ }> E]鶜RW&؊W"+d&3ȹV:S74a`8m|BOF́u׾O=ϕ98ݙ &$rmD(_҆F 8nPidmq\.jgԔ&4ڒw9hCLYw 0Zeg3YNmcx:9#cq IƤ(ȪD(w iQA {hkC` +X4/|z{R&y/POIsO<渏]ubUnvh# :WkÝwh m'[x= Y?t/jyt^Q'T_ͶJyrГYOuQj杄<}}}^}os̝1,~}߾Ƕ}~}^mU ?6md9GOnf^쳥  }ThoT&q. wG4Q`w 3fU!5h% G2kP,3͝پ|Zo󀕗}/ʉAXY> o}[`᝭y<*-"Gr wH@r`I Qz ǵ68)4ZokQq}x{ܾBnqz + +Ϻ}}],[sT,<8>b;P/xdSPxoƶg>1!T,Z*t\FxKoLuږn %;ҭ# w\}U?Q'T}z~.72$A?ƺTvM[?? @" CwW}pwd5.].a/8PNZx'"qcLX\k6K"bEG:?uis)?2qϲ9nNZ}{w+l w23%<`WlO?dcn>(zEA +$M@$q8O,/]J?j @M_$tlQbɛL| E{x7^Gw~Zlz+R\?2onpSVDvY2-ۂ7;QU M8-cFhM H\޴LdB8 W! j>_8 V4˼]+K1޻׹:h7:p )Ivy_aP"EOe"e~B`xE٭8#'ưCRUrEg.$ -&7oo>k?|3gfۓsNxnO1hG9D @*̅~gwq|"D[m52"9JoC- $ PpAC]vu͠/ "c)a0HlЀv.[XQ^ԹRgx_po»i:7K}~S/D '";%;ٳc^xR2#p"`1IZJ v%<m$l +>^;P6-Á ]ӜnR^tp ._ 8 ;]]k/ jz +uǸV4ʦbx1O-D%.@ ЅG7lDo7]a u{.Y Vo-〶8on`Jr={w“p  Tj_{;WF?K4#0Kh(/m䉊mOF%AQ+w>CFe:ndAC_B/"s UuҎI BGH50u~K28Z]CXYA/OrNDp͞ ,k@N(cco_{mZhrfiثITZY'uW"ƑUPl#G4TMdi޵{rEtJZ 9pO[0'0%^%k1V ܵgiϋs`Zg CĒ?U$WF`Fў-Y*)gV4s$da`2<7GEl89 >0ӏ֒-~ +h'ME8g&LS|={x/^(K д3Qw5d$5:93*OrV@`&_ p #d:g,8'-BWq1MYM@_gRԶk8z6j/*䩗Nzn ֵ-y*Ed{os`l C,XE Fx?. gŞ ݜ*D^I YI9g ]р5>Ui4T.[9,2bFRj\Hp'ڪ1Ƨ_^4 ʫʂ·۵UҭL6}βWiqʚG@9VH2ذD.*)ȫO J2֝PI@(ȕjV+fc/Iw+`u* KX[q4o0>OVB_ kjYcԤU&;,tFΊXۃThth J Z(5 \@txK{n~,Rr098Ow>{ 'NfKjF`nn,ب ^(mr㴟߷8Am# bRSlۢ) j]cnKVsfvM!(h81i B٘ R-_obbq>KǼ|Q%ʊG:W jO>َ_QR$$2OJS ~.I:84v`O>d,p ݶݠ'DV"t9)Ja k4p 8.AJA8 6Bsp_` J Y ֺ.uJ9wqZWNG @~8͞2-^t`#[ҞFזdi `u Vh`|[蜽g4x>| |- ֲRI|v( bZ=/ARbsdMSi .o (Ah甜D_kuGr踝 ;=Y@0F;. "1ue@Qplj-eVBQjVc}NI6u>?UUl-:şo{q, vow*ngX>{ԝ!yPB,皑<- =brΩdTkW>oAts]J] iEvۣN:j\j3U>oZjw=+yO-9_׽u};vOHwdH<ǀLoӹӭi6f\i%@H]V xFjT{ю`4 lKJNp-HQa(-V_y P~ TX7sKHώ.;}gvސy_k-D+grNZQi%xW)"IA&mR?!& 7tZ&ᥴAȢC/%w|X lm -ᥤ5 _,kin{tmOKA~ ?}=7g Nh?[:sb;]IdvR4@jpmu i$ ҏu#0^7XN[IXbihϏEuE@x'*YْGgL}{nSKڎ,;uPf#_vĎt:#P"/4i? pl6)ն8P:|e.ɶa K)-^W'$9zik/Z z)k*C-~*%^K_& @9{~w\evh6p=2z2=AՎ ]1 q@y**#Wpr.,bBq X=vs}-\ӊ{[^YK#;+YHWnCqR,B%XsjpYco&yq;q@ѻC˒؁nחu&dTnG.[iW Q3h`l52IvXt]l sBA :^űQ\-k[^{]\{\>We+ NR_!KG?gYoN˱e6Y2;81 {b' @l:۫#CKL*HU wqR=$Q- [Ai)X>oGm؆)kk5>xVX-C ߴvK KwzOB# /E" W IB !6-jRƁ5N݄R'Ip֌l1Q>8>9rq/ܱ90Ms&b,mt,# $ :tcL8PgFJ=(xmxx2!8}lCB&ժ&:CW)5uC. 6kpe܏ ".NCYmnSQioF`+"@23Mʶ5֎p&xmcKL--&}t[ 7{%1.ozq H4TmK}֞|}4m٪lz{9 S)(FA s#<Z{P]/zsSHЊi)]jCm8a3?bqSx%\`GjLC:u .xj;5}'>ڱhކiǁ\ BsQ_ ׀U(@;M1P?C 5 U+M߷zANvֺDM6.Aۥ,'<Wԍs wEﳳ%#Goh5@Gd]W Ga KsHK4Z8IUTmZQۚo?jqS.;|~ GF3o[,'2MQI1BOv~ .ÃLQƋ@6Y ռVT5DNh5NZږMf?:%3Il&v׫~Წ?aQ s`Ab|袋NooNgpz jDъ'|^3$>pW']hJL׋OPmY(2苭Z.j>iȬV4~ն-pV-^`KMn4~dV+j{|^|j[\b@7gaSNgZ2WyK{c縯%#"mU?X2 ߥla?dxohjPIF>?74 E\KM4X%&Iq;DpZ '巠b,GoJ;[9=M^;W+~a:l>^o&Vͭo}OlN8~ZٳgOs7_W}g?CmVjN;s|l/7:J%o~?w~j,/oˢ};tuyIi2"[*tYJJȊ&V(.A_oh+!->uLt}|M#(N1Qx]~ׯ^y7/;:aA⃇:c96+?q=u }yXL389W'~'</h򕯬{0+oq[4w]5,//W__u i+v5q`Ɇ?Ad(p5h 秂}ۙ4j56.wގcf{ғL=55Uϰf{3位UV3dĿI5/?aWA.a"0w O,\swn;Hp)syyo\x͹޽ZhHtICPOַy _||O`6K\7]+N:UۡEn7 &5Pp>L=P}ukP*˘#7xXose^ph-%ݖ?~&ڛ뻾ӝp3 W '7p r]:|`?<حg[۸FBF`T1" (1)c B0zc16ݨh9ʘ=A`yHl;ڛ 4t>~&gO@\|{xǴGHΑ_Fw#d!. M5pɵl bmHɴ Q U5Nx̓'hC Bp9HJ1k :>?t=s=O5yk9%Y~xh]ܥF3Modo^W5_'n> ~gv i4C C1UFWdBN݊:,&u Ap{LAxlSE_K+ՐaSqk_:%~^+P}oq/9 ֬V=`ޭIcOC[4/{˚o}[M۶>7]v'MSZ)WKfhFR"P2'B4?J<A? @/5" ^@^ʗ6[P$tlCNtڞr=ڔ!3Z"[PBDDCcC3_{{<( @{ [638x6wuQ~7|mo{fs{kK?<8j6&G tC|``rOo|*KpцH;o?at$4ŝ~ yY+:} ۾;WU 0O?8AXnx|ė?h|᷇?v/b3??egϷms=a9hN7-sq7> `ƊRɁu%>тct-; MU5\>o?(BD׾ź%ϳ `\w[ _*?CYZ >|o-rm7c-O/}iz2ռ{GiHHʽn!@ɄooJW^y&?& AAY% *$~}̊6PK]}ѩQ?v2y>>.Kw˴Odlw׼-o ݿX+7&<\³\uجӞ~=p%/yp=,޻~6?9&*!EwJ@:7 ѻhӃҎGB 5 "3 6i/}p(Š'6mꄠB9L۾~ؙG?oXfwYTۂN6-!p\yx\w6cu۹V'iAsZo}馛z}R9?·/CM.x>??4=ʯJxRsu#X$&?"Au'F< V#918/ɀdۤiEu@[$ t۵ aC,Ά 8u&(l_i |HKcżqf#NRC!@:<x>zȝmgl|_o— 9'y`Z goּo_+3<я~y-ۿ֢np<C~Ú=WA  >֞gmֹ>.&7'ԻjUewgڊtmböl oz,=+~ Skk3{Y htP hnYeh>C6ˇ|;4Ff[1ˢlaeN;m]nj=yvԶR|iA`E$N(xVa2!p-J0d D]@ Fs{p ˩iP:Nhl%vO_X[~M#%` A&ы8M a@Gh ?l:>&+|epyyyJ7^ooz͍@F&Vq`x&e~Ipp;&]o닭ZhH=کsZye$EX袭EP^k;4 8 6-@{P1wOm1 3W"#7Z'2c%BCp+61l.%̚&.ԝW Ƴ"Y`-% OaQ:ar|H- 8^1Yc 0_ME[Kx=5T@`rqemȈ|t)wR)Tԥ,[Kf993lkeuC{6h_ lx-3Θe]Og@5R{e2| Sphphy=U(k P5ZtEO!طIam`mҞ\oAhƣĂ8'G?lKGoQI,Crx4qav0ތ ZvU 6lRg t09Ja*>A|0.}CГ VAoMяO^x5|F k [}?Cv㗎"ǰ }phz?e=2 >OnʓgqDNWTkCADxl4^ a  C0Hoao2bVBmm:l` P,_c豵 GC!oh)<<0 "ao@9_y-gy昊lx;yI@Fn>AE:(O`}GocVum6Y(5F"y;M89 hx? 4+JJH8BNsݦ6\D[dws`l=~FRzg8eӕ.@-bLih~>hKx%\ ؎ɬ+P-[Ok#+(-`CX{am;ç 6pb#ٰ᧜r?0 >qk;xEO}jɑIfP| jfx߶yÖlbj Yj0SIݶ(~x 4`ŶxU0.< j+~OnC1hh-|A zcSm҂Dp]LWtb);v$dA€m0.//{^\0׼fEFŅKXPx 4y7A8P"1qP4nDȕJА䩂 FOD@grQǽ~6 OT6 E :bָ ;KP0p% VNN~Z κ-ڞfOsnKJڷ_ޕ$@IDAT\7 '~vx>4%L"IXvg>5 Y&V HԔ*%h'Y3yࣅ % P80\&qy;vQ¾Z6x'#dY~ G/콥rM0v08lON>k/| W^ټ=tH4~N$ g$[R! w>k}rJ׏.4Z5Ob,S'\k[Դ Ƨ۳>n;>|5G\?}A(5mzt$FAE:ۃ)CAkB7q?VDǼE44$8Ac28ZO`#4W0p ! #Y`zq "\0.khJ( _ȧU|Ӄ]h]k?"\ƾ=Uyp&;KKK ͞m,[2)I= KmyއBc .~HNȕ S;kR.Ch6ʒQmih[W)s}jG}|M#Mxzj6B&볟&רs?Tx\3üj'o}s\sumg)?2)̻ cvFʊD#Ųߟ^$%d5jF.*QR3vKkȟbHw}~l?F_]:wŤ0}hCw@2r`PGvs nC܋qફjwbOvNzہ$pY`db0 *ڤIˀOp>?m zPyBFrF)v+<_>׸8>Tϟmk5?ANg{ {`ތF;MZ|tZ XG('تNbDIJS"::0#iɾ>zG+ZmOO?} ~Kg[1I9۹M~z ƗN#X[1n\bXND_/HF&>j', )M[+A˸0XEv vK{æBroAZIW]^Khx`W"mc$\}͍7޸6ou+~l+@$2({"̷}&!qN7ГYkd$B@[ZkSAh 8paM-52"J@OV-( O GcxX?8:|1ZhN݂~ oA}P6 P~ oA m5&s)cG@X> Ykty HG4Բ%l%Q!juu ˢ='**yZrd,Tf~ұ@D"VPˢ6GMPj5nn;Ck&w}KB.to N _` n?_XY ="|Ppc%F' <&xTCy Qc+vC!Tz@k&Shy)pRiMx h =ǵv~ANA 6E6\_ذ% t|>FF-XZ{|b‚>xMOK,-Lk/.-,)(Dzeأ.GU8KD,e >6IFm$EE٨$ @Ą Wc+@L ́] r[t)F^Zhv@Omӕt ۑڃw>[)_qpy<=h[[;F5C#] -"_nh>O6Ygu)f$>QdUӆBa0Yg XwDȐ|ECl{a-N"f.CFmvZF%uF5Վ=\$>okn3(|Wv,ShFo~ʹxJ">X{2Qc$b0 FvLdQ8qDZ ceVʀ+lmO luߋm:EExފVJ[{ `;#y)=INז-sMݼL ,9hqhN짝&YBƔt4hҬA|' h1@ $D+ 66iƏ (Grz1V#.k/SpuEQ^\VQ;F=8@n[s9ǡysg>znh'͸< 9+*] ]h;<JZ'XpM5>=7VMXE}A@pti5_Z[7fv\{;aH&ABdf`Jܜ5@&>;G=Q͞={)s 6>x!#6mx߾`j2:r!6W՞jo gGT;Je.PItp^*S+֘>5ةn*ۿ,8lC(T_\\9tG)?͡]]tE F 'а|+_٨_->F[Ľjy6CWmA`#0ַt X Eu!&m,\SF` {7(Q²9 h/W#ޯ|:hwۚT}[7NtG6 *y`"ΤH~Zxy_ yZ<3`*t?Wl8^Il H$P-sǁ` _-.Ѿ@;^GIYHE{0dyQavŰ&}6W;ae ǽ{$hx$p"> %x}D'/'GgHL Jq,V68KBjЙ&H;m z N*s"eeS81!ζl C(5o!ۮP?Zo.M5;pNVf1 cImNMKU,}]㪏Ac|.:< Ӳio h.2Jy= E)0|lv~C>SDyX@??'ξKFդmaN;}覷?[֦N%Q2 W0"uL'i`;PDB@M'^U,2֞1 (M$ˆ pmO''/sR!yp;|O|b{60pU͎>l$Y2+-۟p匘W K"WF!lE 5Y`WРc &B(qg)&]zF+JGqn~4d8/`|>u饗Njg? qv:R`Bn, r-oSd#R'1v- '^choIEU@G'XsB7y+Ytx)}~Mad mxIK=XL-R|>>%[skƑ;IVlYnw5\rD<9F'9M'zr1pn=oeԜ@ G8JƓk-A4Yx ʴ]dq " XEv(ڣ.W,%֊?qWjH`zy.pW4~umy[r{a]F3.3*m%G;%הUO( :)w*l})ԙ2#hh.obcPumU6]GNX\#ڸ@ T ǣ ^p H {m?Ion{UW]5e4-ȟ^sh#?牍s ~&jΌ8bm3 Plu踭@! mb`R*@tĥ 8]Q3\RƊ^AIʊPQiku_HKXE3<ޛPvE! tV (ɀ"h #pdO<xVt;<0Q]Jt*``!ԯ@{F~k[:'dੳ2޻Ą> P@j&$#dc  ] y֔ XQ J ]BK'H촁|{V}ۥOxF, HtA 9Y"_;#'6ʙg>󙱺>'o5 E ~9K<Р7&aR&&SK# eN I 7RIJ`tOoO)a}Ŀan`vH}\x?'8æj8/1FIP$"Mٳox33&.@^bVtQo)J 鈭qE3>jX S }GCٗes0P3`zq}OO5{ḱ,[`h_+`֗_.5HB+~8@ zVZE~JXㅳ&9nv>+6>I6W`wPC,//Ol/}is5L /+8u|nCsI9@e*`آS nut Loxk\Փ7XDU6PEi˯@T~9tE \7P,b"#+tmq]ָr%V*,]JI#ۡ'C9zn$=A[y;ټoX'nA#8Glr,Ű7+$?.3 lu`%b:\G])mh❬O_&8pRC  V{ >.TSԜp'Be>-{/!#YO9XͯA_l;GbE/zњmb2O~rm&/,A3x"r% `Oቃd3V 4 s$(1MoPa\l`Nxa+%-=ecpJ6W#p]ok,mŭ}CC^!~e5-Zw<]sca6^OޞI~Ϡ$pn`,ɇV4''D2Je_T͢f{u 'n!@ H֡v'6`e!X:uN߇[|4w'W_=n5Fl1|`}jIm&LOY̷FWS%I V/\"q#`ۨUVS}gڇ|ZQ>='C뱃`<17LEciN9YPI'\~͏ȏL|နDF$I zr0p4x#! ɏʕ@ot}MwըHq&x$)i3a{wN3zkC֨\  ;p+̟? _xMnt@[q/>OoN<}h9s~M0Wړl|jE. ^ Y[֝w Փ/)$btZWD-}jG=:w!۪4 e7g {>2p$'6wSJ׾|_+D?"@|O~rs[ݪU_yFDNsWIJJLN7*-6QYb6I m[}^ (4c؞VTq"ۃ/3T>x/NI?Wk\[jc0'CM=a/}SXF_M,x#gbc߿'?ItZN^52>@DdFw#zktҭL;</d^A i ָgAoJ}NS[lݻ韞xmbFokܯߌrE5FTo7yISj=EEbW|$I1ʐNP;4[Ac22#81Rǀ|@邬.cu :n.[nlָ( *1! - 2foQJk_s>ْWs0ܨ|^q{ܘےIbݏ3| ry`Z?k\ 's x1Nq%HWp zXCB : Zۑ^Am! t(>_$̀[6v0Kv#G\UЙ> M--E <)cgh|_ǁ+_Er~Uw {wƛ H#;`cųw@K Avy۶ N8"#hব^ X״E=y*Dk*V>}^t- 8iI<DoWQj1F4uN}vmO7pO}կ~ui`_n{19q)9o9ɾyRMUtIˆ*R&|  l^%a[]^ASt/ I~ we`KtOk]mI8 }Gj2c<27%ٝuY| ?|y{gOgyq6a#O^R>lAd4o~󛵹# c?JNve ηHVx?c?d ,Rg T.l6Vl.:S@j4ZJWgBȨvVwXU3ᗕ%^$i.: GEO/)='۴cH 0|O~}׾~*L";7M.OouF&Lb.U16ӞW?VLH@>Ac+0z3 964u@'/42ap}V:٠:;z+76hCRI^~Ps* Ck3 = 6!R} mѩ^-m'pBg>s,O2k _v++?Wm imuo?hn}[*Ǚṁ0Asu+]Z,+]+ $#`3Ye8'6hk\lxVBM>ɑ>tҖ5#Y v0w>x*Xڅ;_ p.H_vo #'۰'4G},|w饗;0>y=uR}p>s m`}-L1Lb|/X׼5rk%IdVJ³4gJ1oღր'KZ$Y`V_jfյ8tX0/aQMmGy˾.F /hqitLXv* 't[К7VP~ 0wv~DDN)r%ol>n&]_߃`_o5_=AW8k嵺6ab׽:,8=Oz%Go'#5,@}ȇv$m3/  ,.1it kݧBЕ\i;F/RvtmEWnMĔ7mP-goշCWpM)W F@/%.DdOÜlλ]iqerW6˖sy!y/1VK2WEy{{P%q#B UIH+븩/6ʂ|5*"[Y?mf>`s{ uɊ{<뇇"jb`Ҭk,l ݬkS'Emw6ntH&8KP룔X[J/smu__ox Pwń7 _֐ΡpEǠy#6OmOJ,ut퍞S'ka[@a^6hCu-7eVQnlFo-P-up8OdVR\Qnި#ʰ9fIooV}n[xַ՟jJc_yK^M V7C$gԀgS3W|PK\%#9A賊xѦ`^C;`4&gU7()܉kXqZq;V댂Q>_| ݺYrͺYDm ~Y~Ϳ뿮Sjn?'kh{q\?C`@)\!Y;V^˕M/en F'zEޔF4]jq*N.-}^f wb2=H~2 6=>[Ze9yζ|Uzf9τg-_HA:Y|K0jx|!о X&jC) E0F֥uc❂>?>@Sb*o'ZZ5ǿ/Ѡ`x/QϟW? `go{6*˷6j'>M&1眶_bɓ5\,J>dmeʯ(hi5. k>8A+*€JdWmƆ[x`TpV>hux6०(ٟ]yWnrk_6lm ?+_Jg=4h3mDoM7ݴUΏ^FLKmMPS&>LqV N44ސvZ4Fۆ+;]7劽Yh@ǭJʀ5Ni@+L7:JZzSq~7ܛu_ 5n,{{]1jp[a.Ap@BLpҦ3JE_F`_ ?%__nx~̈́,/__|=mk dPJ JJHl:8x]Pg؄^A4R +AGTQD."R~p(jAg A*ܾ'w=A(JiلVJ _,УD`5aQ i(( 8>cW "=~snd͞; Mj/]S}5/~rktwvV=\ >gY{.m~;?֧˭ %2?8eK3x|烤ו5FYp؊:BUEՅOU+Nh$d3Y O4m tmU?C Pzi~U~+ơWs-") ڞ3|Ż{l9Az'FYgnw?x;K~Ǚ;7 -;{nhIn B#,/b c9p091OƎpa?9†q`2 0D1BPKHhhԒzϹg^|CN:k}ޙ+Wf\ve=ԮRoە_,^W/^-n?L5?[L[|;zǻ+TVsHb}3zZ'=hoW;|A៏EBxDhSt2wRs&#w'U85btm*?XxrRS(I+ڦ}?w~s{b76~Eyjt| ഞ;C9~-oy=G? ~6tШo dsal${e{4UGW0H\'?Y@-8z ~1},6+uPvC)hvDXg UŨ/}mWB :Jc_~Ͽtΰ/f8{=?R&Õ|m92~LzVN,}?W*VBĨwV&lŕ8{ #0: sq%Lj^50Zelʤ#K'ivǟ|% Z=طTsQΠ/f0Ib1l(}5yEqX$2dg[}‡ECfIM-Ehɐ>c^0V6J^ !@ꋽhE_PRHlXޑxC8H+&?ļw}0wl灈^(y?&6D_' GB4ȃAz!e1p@ҞR[Jrré!93(prm?0 >LZ_/z}M'h:?s:f'=K\At \ R+aU|`fhp`>Ҝutcp,] =ɋc{GnkJ3XkGoy|KT>8k$`$W;d\U}sapNW D@Ne|p bO^znoNG?S jϡsnceA-gs @rD[HE/B\EPRh4 FG״d&\{v?C>O+SKj>Cm>{y{{*s#)1Гi9C'oT6 8JUƁl>zzkN ۹NǂaM>^ZtVvϺmǜa0wl*yA/Yw3Lh48蚅+.m6nOG% Vj7LWx w1>N޴fÁð^cpy{j]d& W@2*%oպ80A1mێ˿NGN:'wr:ʠӄd Hp؇=t?v}TA+ L3`w񮵇AVA9hȴT W3`Oz}O >v|<WglG_{w{偊m}HLOAygar} vAy4ɜjZx0Wƫ^6ds%itvVz%{1fp>ʛ^>"|L>~|rem>Iϟ><Q4d Nq|hP cShqo~ `m  ,*$ /) LL+e4n6!Q,XjCQο<]=nǞ[c6e/;w=@(\Tu@m $̾sF>@$[VLhE`jEcWd'^x ^x p`?\`'nJD"k #$fyxo_ Nqp@BtM\hM]&x=\]cas@1Vmcǐ9IBg|x@)xGh$898G0|s9ڣ&5 vld,6'{*Ob J;x Ycvn?w֡;UѠAhZ m90?ǯh3+3n~6 q&D*R+řQ ^B`&PҴR} ,9C  > e&`2)tœn^CEy]>GBϿ+>S{`E`;_$93kA<ܽY0 BϹq (ʢ ]RS:aQ1Jo]32I [>Um$<ì/8zJ=0~Q p?ceBR>Dm$t0@ aSq[A 9ZtuX}O.q]vE a]MM6Ƙ ǀ,PePM( \i+z>V/BT8ǪJY073 9^{`K(ia1)3f‰pXd אCG%hVUAV{Rr=yw;mW 9Q@ ŏwTT6seʸC5A1/,ff +7Pk';c؟uӻvI=[E)g*: % spI1gb, M</h[ ҇q`l`!8:(qu׎VG)x~5sanc?šŦ> db}E\ݵchsO}#u<pi`5GOqgeX 9Z{`Yn\ /}2v"E. o̤bipO5Lw4v]bx%h9Bb07Oň!X[>e2!x$ڍ{z$j|>kY ﶳy}0yVwNqtv`З}wEA(Q6}2 sҬaZv!D c0d:y܆iMR0q`56F}Ҽ" B26J}{ 'Yq=?_`sG="GDc!U.Z(Հj)[LD;S%ģf:L[bZXWTnG@IDATƒR$/,\/f=}<@2_z+ AAN| dGPB \|HhJtI ,%^4QiìQOa L e0vϘS} M0(RΪ>1~5Q䖿_z<%Un8 au_DdY+/!C^SL \В@A2EQ7w\5| A:&ַ+Dպ{*d-&M mQ_3 mo,q>~{(}8G3zJ C>Sx TEiƁ4\ & 6CRR7$SIbS TY!$<ԟ26f= Ƽ:$0S t P}4ԙ`NyI,Ȕb!S=Lq)9 <s`^H JR 8@0nʿ4X)KUky1(d_Fe7 AsGPJ>s(8H`;s£yKl6pꐲ(bW#z*YDf/P8٤ 8,ems76Q 4U̼A"Blfٳhb6ɮ?r9VN]7{`{drQљgv-"rOU,@6 (^ Xzx2gWo«ZAƈ!Z( i ')!W2NuMӾBg8wjo}K}5u8U [= "D?cA~l\52NxRWN_\Oih'cnMZZ|;?}v-I_kCoo͹ޯy;3\ }5 iEeya ڝeJ֑z  Hpy܆@lYm{ҺmsJ9C>3Dn( Sz`*bWMwЎiZv-R|g=3JP<{s㿺rծ{`&hJaJҏR/-CnQeqVCfm{/<<~w9;ǟهLl}0۩weRZE[_hƁRN2mN+Lk-"GkAڥ i$r-<>~#d> rI4:>S[Я@x!x5y1]L<鯤ON,Fd+PQG˦pm ҝj[ #.QWGW[OSMu<ٜ'nu"й~.2&h~n ?|Z<̕teLa.:Ry ̴ T{2W7%wm}blVoL¬iOo<~BfJ C>SxxO&RDc[,-Jb|N_3٩H8aH ɿt\ LOyݷ{q1@? hჾhD$GJR2n(>咍Xn4e6 }0vCRCu$k"+HQ͋X9+9+fոGVs"nোXPP[UU'2(mLエ 28Pef~1'z@~OKy,[) -g_,R|:_Pl\ȖA:"{n}VP0~JnڸI!hH<>av.-"1d49n Ȉ5g,fR-J+8UJOK"%E/ϜpX9q3?}_w[{؛-tvĹ+,ᙁ!+M#3eAC4*ШP@-B.Dbn;$xU)VZ{ /M}8yt(7 y_{`+8*&ՋXy4wqq즄0~^8_T5q;~5A%!bj>/Hv#m4n|D45N 42ւ"Ww4 >CW&=,Ivk3Ua:;}[ %>eP0+X,b\¤úJIk&nHZk!THh?5 ` G[+GuvIYCQ_j7B8:2}3k>,x. "}JPew5D]mpSL왫 ? lgϲ#k0D tTi14ЀƋÍͅҠ0H-TG4,4W8{8dJ̈́JlN\PnѶDdGOTLrPġ&.tIk Fm=!A lmup s=r0fv\D==Q諻{~Ȕ15R(} "FIË e"?.BPS}4OK;$?6Ns=IW/5_xOJ@&br fVdqJCOWm-^\!ox $?)7$kWA >boZ6}:7/vjag!Y;$&)}H €_<#aip'Ayh2Lڧ 3Iv$?MCh^,eg T⟴ǁ>‘k{Q?_˙V`ؕ2d&::-^{!><_AxXOt-%~d ~DA%v{G_ϾNz22z'1yDf3%^m.R=P"㟏n/zrWW~_ɣ:/7w3qy_Z<~;m@ _.CPH\4!aK/{ꁚw&9r9+8}pj$~phf=p oN_W ,--S*{Jy3Ϻo+4;e~<$]^K>$L^z~`mر2H:@G+cѐڹs,gRbd?k1֒Ԍ=-ku|?<:ܖYcmdKg X+FIExZY[+snw= |<3|枇aN+]'.^EB@^Kէll]a+`Ց)p<&9oq::z Ա@X"ǷqCȱQ-.@&{t=L>8:z2깁Mk\qLYTOIݾy?<*@ȩŦ`k& 2Ǒ KWgI YN[7{`w /I?b̞=/g[&c!e`KvͮM->:a휷&9olaiuȕmd:#$xSu/6c]z rR?98j1PKwCEB=xJJ!%ŭw))Kc"vp=Qӫg8/ۍ^<lì-pq"N\7{` ?JIa/sE3} '1d* n}%0i(mqm!Ӯ -3i VKǿ9g Ƨs s,Աl>CtN{ s09:`Վt\ e],;E$\4@Hq&_iBzl tiYYI'#L]*SSXmS~o&l=Kɘd~.1 qܣՋ GznBH9i )o0[~./f?}@<=<aq>^KRի~c]/!AP,ҦMfA %Q ~YZrG>|o-\/*2 + ,Dw#a?a>Oۧnԛuiddz_5ouvB8vp15לbDk@C(=buzm}.,gmΨ:e4N mrUC)}p(3=p 3p"q'3ay@;d`#j `sw-œdmOyS_4#,|?x>wܱg? ^.ǙrLAc9@?*$h#'rm;3A&72gq5D3D3,\/WPmio e6;v6WccFQ?V?<ǟ3֯Nf OYO"ֳxs馛I뮻GGw=8)GZIP'#|{o$za}+ . IGG ,z-#?;W}6͸3m3^K^%/wyx_}qu[nY]ZuŸ:Z<3z_mH^,hɳ iL)(}A2'* 좯$h/1aK10֍+llW8g?yR6S3esŗ}ٗ)si v|W}6nٟoOOZe ()e#1)TjTr3xq /8 ?L "ЅiIl2d[U}4R[Z.5m0@Po Z^>c_Sey쵙{x+`ghG-^k;u9?D?Lum |z1V[{_u_o,nʈ>O\]|7|nگ1f*G2Z\'q?-Ɋw Se!rdQp Ź+)%_pJI–h}!^ }^L~:2 ~i2 ~ eJ>KԾj y5t>ѳϠnl) N6fk^/8޶/nvm'w}vC_,4-g,/^,HM+mo[MoZ|3F#[Tƨ7<4 y֟|8,*zV$T yCD2A;Ap }eui6) D"H.V~ځmnuR)}+m%`]t1xN|&m48j[~ AnjK_xNj:.+bI[~><zߥʽ޻`Rm6bӍ7ި^Wia04A+_ŗ~//+'TsU;.)7;"3z8oVE LI^{Џ9J>YSSgvmET>!;ܺYR41%ܫ̂{k+JTWi,B~&Y3 9 lS,RWW)Tlo~eS$[^{gxK_Վ;e@H7H#!(Ù/dȣ_%TʼnWecd-XIKEmY`MӢ /ho4rY><F< {ύ`> `lWՋ׿[]ԧ>_Esr57~7{tiZRoOt5~Հ5$ y _qί#eÓJruN\bEti)`e/I`h7-װ5(5A)u[WDItuYtC\Ǐʏ3aj.}Xkzů,rs<N[X/\;49[&ڸ{ :mESP<w ('ohAh©CҶ!_rS~)ovGw?2ϝs$ eTļ~6oտ|[?fw~aθp(9q$V+}~o å^[ ??t7KVnx)Ɋ?WS ?Lj;C!ϰ_J$O] P';[lNI&f˴0m}3i(Y#m'I__h-~p/VǷ Vy?GH_<WaשS#˲г N3d@n8hل]Љ0/_֖6`0iM=5l6\zdb<̱ǏwWyyx?W_Bo~z}*~?C?:]-nA!0<"!bLf1p2j&8gbuNM sIJeY<8mѭ.PĨc蛲ɞ>Czr_yc}0[|wO[ms}GoǎþCE@&#_ޚ&(V\a97op?ۘ$jisႆNc,I2dإ,,kЖ76ۑO-ik1RUiMǟ~9LO'g?'&^ը.zv=t}/ac ;;3 UȞ /ѭ/~@`$gpY3{drpXL&J'Yd+4JsOrN0.ۂP[hԕ sV_4 [J>s 07g@i-mtjL>~>Ͽgp/>a?o;y!N}^;r=hY|w~\s;I=5HG$x(_ Tjќ*#>%PPփMՖKJY8}0, \G9 x#10LY } XI渝qX_wd7߼xް8v]o<J؏-x+6__:)-,MmQp1o*]h#H 2`'CPzFP J6% 8Z a6lA.F1@!7 ќcNNdf'*aο0o3?^t??OOO޹W ^E|Ը[e(kW&1xC"LPj0ȱCN(^g˩׺ ? hXP8|)c4I@PYP0!*Q9^%[ږ=CCWVmqz}{=K}0A[.9sЇ>Y,na+=&'T4_JRN&K%Dra-+Z(KgdEFE} `.h; }xii艱83ljO%ۧNC :(O"R0%t 506A|rwy_=~3¿9yVֿ-oYz[aa)yc߻m" yȢ=UZ5d̳ -+ɴeεiBv|ckDTxmgpfF Mط~.'leٟ-Od+*{{O[wu]5_ T4GR/=ɉ1|]6 @B=Zg3/-[:[M!c~ ? t)ue[AZ)"$l"86i CI9]_hy ?_e/[!2Kud Ȃ[0 퐡 X0 GP6km/?Os/xKw@6d ǰ M&;/hm.mN[:c/vfKZB%f C@(LvցaŰݎ-ilwr4CSx??ms x4>~P柱B WWom%{WS?Ý UzN죒L`aِXd0A{H$aV'kCIr _%mxtRN~c.pnG6O!'{H̿x/|y _­|3[뙓rxnm2?̫ I6 $LЙX@ (3rN8g(Cr2p6bG`۷)a#+p2B̓z@6>dEYO?s-m5O9q|#1w{>|+C~0?qūy_u~8`R.od,zZ{!TXaL, e4A8YƢU'W"tX bMgH-Fv[b?gW~kf`ϧ߫E?Wcy޷a/߉}S™)oH <x탑E)A̭D B3Ɩ֏-e՘,@܅P4. yꩇQF|lmĞ](ȟ);MhIȾ[aa/sn.:k/xnӞ-2G?ѭQ{ޝ͋8?L21LHٖ="jɢ3[A$IVA)v 2J!z d[eaTȘfB$eߛT/H5pU0pU *(<+}9GDζ{57<~ky ֳo #4g~%0ƬoVSn<-MUcS[A"aQ,YE l&>aŘouC=jSpz0kF`oމuvgJn~W2xd)oq& R PWØxέu Rj]&hD I6 04OB|#ju"_YhFn7pX,}~NF =1׮?=٘j>f3\0#gSZ9֠O9ɶԗQ.RRG7'E9}mXkGǟ8mO?YM4<}ү ӟ]L~3WOXEOchD'4x~(+΄X$nO7e-dU4Mc$.]& &գ 埴hb#NAHZ%Kǿ<7"SndMC_T=؉e<;؉*wb 7ܰ={$b K=~$z`LҌ ,y偄gI#yipl=u"_V'y6=ӽjACKǟ33/}>=ٙ~v'=q[<1Yw};ѷJ>y[$kyeBd)3#yc)Ll~!$FYn&\&f{9NXuq3rS{coK`OgpWgx~O]tl?|lK1j^.ٶeZdA4N=ܗKd˃A *= J곖1cs )Ƥ8[<)<-ڳy)iL z6i}hǙ =]] ;s'38̷ IK\Wt[Óh̍=)>JgFi)k^Kutr&Oڸ,PpyD-ۗ:<j|ǚ}gp9|oGLewt/t'IJH7_Ned)8yW~l[p eAO'N 4%(v1!802E? ǚcn/?eȀ֓>HvLHwCC{:³5kW~ռ76&JTqIB?_I񗋄Bd(Nm Er,zF!_( _C/ ZoY.ss.\v7U#/pή:_}*–+cW~8y%'q2UI6 О;&f㙐 >A>ٜe@}1j_=QڙUJ|;3 )ڕC*Nj_I2Iȏ.e A,oЇв5NA ࿜`o]b/ K& Vdj'%ka#f 3cn=JnGwzm$08W"I|ɿsp6|X^v"XK$ mS]:OH@X'%|J8Vc)k?oip0UCd}?h+='w,<2L۾@r% t=3iN5${R'W|i{!a(б) +UQ7n8g4 }8R&s`(։KdַE-W?s Od<e;I ph E2ш|=A㪀(!Cg XzΤzWOfMf!S~(MShHWV^ӚǖIn6~%>|,0tD ]=W[]&`$&MdI[0?ϩxWm/1C>ˣIHO4ՒO)`&LMTKcA@Е'g\@og6dj_/͹}L 翱2m`q̤p0s=}O߬E9V:sO_V Nb? 8lFPF<]?|ȶ/;%2 K4A_ƾ$A{,"$Vc0 :_O5_M kykf{gÇqȧ>]cNdr}_,C| M|?-)Myo[, DۄjHO<~V0j~)piYޭ6 N(}Acqu>q7i?fpH|uyCI $"kyoy=#}n Ʒ }pv %"c%wi'mbsCMU<.v xɈxFsi%O/?΋Yhzt*@IDAT`.0'>B:߰?S r]̮͝I~Ǎ¶W2YB3.DcmС.!fۥ;*@gd cӣd0hHYClBtQNbSƛ>WJ;|诏?͜Q \όc K0HcApo`r͡,bN.̪c*DT?y;$x,p-9(ݑ(,M#e~8Bb㾿I mYGېp&(}+*WOذ>[e`oZzq t~K؇02m JOXW0QR( [;,1 [Ymu E<6@^<\LFlj b(|O;YW_cAG뿥 5Os_ ҫ2u0v2>;37%x3 [ֹ B$6)?\GK%wՄ/j<菶ұ:{%*~Z b>*,KLIT$+9lU-^L[|;lI1+9U ѱ*o=@CW*EJ""ptsig<1kH?vUVr7oc Kd+w9N]5\R!NnV:c lk?uZ!cW։|1grk ] uaL>YC`]GW$<{!/y ^ OU8SE Rgat&‚[YטSEnp !|Ɓ-J#"y}r}mVr^ whm\'= >K?x GC{tyBWڃSLs^,8w-7~c}~:ছnWy72^ +7K+n?ƫu.C3eF[*9- l8V.y}>\3_i;IY4xӟcӮ+^cfȽ__>{Nd@ǓJ3U1!%M34[z1ahZo}|ӌj %z 6vJ9Da֖h'sygT E_EWm<1u*3ɳ,<)wsa]CZկ^\kpZMo:p#ex|9>GK,1LfX%di@4rgPޔ3f ؛ GqYsaM(S <-c}`gY>qY ~߸{O(5|kWDZC||% eSҋ7E㇂{Ns"5 C)Ŋ->0Lœ͋ ʴ`3,ҏ.6[a ZޔOT$SH}+=w_Ϲ婜Im Zp؞tfy睋ٟ=pH__yj9e/;_ɟ^~rCIcv.R3Pn?K{Y~Rh@ z>I#L,4|g2~ /g/w(_?Ge,G&apiqfqxggL8t}[kquםZ~k_SO}j?󧒝Rr#,DhU5vqY3}(TW*y[ od{,% *$K5}Z ߎQ̮F eA[%F?Okݜ@Za [wuNc//,FT C,,ngxh_J]ҎAHCsx 7žθUkb˟Iu<#omPVH%t[ PUPx5t-t0ʒ4hoHwխ:AM3%=@w| [_ڿWj뮷L;x >p] oN[<=(Wc~Ծ\z KeWAͱhnO@ϻTO6C@O<@<\yd>dW?;aY|'6\2?8G,~`8s, y3{bcIՒ?W'~x3Yj@<|b (--?8HV|-v $B+"c4h=nCɠHSiOvmeG*ņo^YO$s gRJ8,rq`&OCj(gd KԄ~LNuцeO` >Ô;LϡA#c'uF9/fO/W˿ŏ.>ϝxؼ,O,O?9#ERv ^4E? ;2_r[M-M 3 0 H-54$@* K}9*QXeo@p:@VPZ?_x9FBte &Ɉyrzyk-xu{l_ij o ~z9A2+9OхخV@}2FB>NZ8)D0EClRT0 m$gp`$h7Q %80 å0k1aO,fǏgrbAh+υ1X40/'BϽ:~eq^| ox>Uz5YwNdg>o}9d]>F̽oZ$Uy; >l`ாU ,+|lҦKۤd> R\AW[ċ?06DT_/؅ LOwO>H/{r|=ͻ`"xUw}?C.\>k~D=YUߪ2EէH5}*~b;X$׷20VA@RF:)6_OpPѪJݮ*$J @ 8eh) N/# `Z1'og5àMeBPzǃwcÚ N؜q2.w}w*vgy YN/''wgԎ4/^|w| /?A>ȕ.+| dj(")[7(~-Zt3P.>`2R7 sp}|o{fS>2qhq]Ǚa< G>x׻޵馛O|WR'?o#/۾mY?pɟ e J<ⴒ^IDg>CJ$4($e,[zs}/O+%6ƆNuhDz/ Co,408h[jہj|r>[~{푀>Yp,`AFx\lwnxG?%pIxÎ? N +rnZ|W}R<ɏY_'{!y!Y{9I%^ V#srb51BbHciQN!?ڠP>* ΢H)0ncϺ7gKܭGeTm-4ML_++'2Elìl?'IW#}tn Gz|.$_y{⛾?Iyы^ Uȕw__^k#rj<pNLsOraC2'}ٚ:@[RĪݐX衊iQu4Ĝye /yEhaeڄkFAr !??;y=VC[|*,Eg8d- |4*d++s^`b|C'G3?,<~zqЍ7޸xk^_/ \}W\f?N%H|2^{n=oVO3??&}_?s?xK_/nKTY$?pϏ$}3gYK,;2>qIR{,ǂ@سNa!R܋ !ǢHm"~?H dPOۉ<<fYeZ1n';!Q?qo'3+Sǩ @f,?;}_xӛޤ7/# ~}&Mg~r˂g%Dy_}%l}tO}@aXLM"씸b.fPui:p|RĨI+2f3yZqA4Ɋ lǟ8{u `)s-W&;yx3t6#u'RCt\}A0-gqg ~W*<9L5$,}y/??P lpEbg3|%~ΈcKք]Cq8pF"6NodM~(j n]~1l㗟tl/,.>>frp8>2@;Z3g]Y,6]OsrQBkl!p8 M 8&]ν@6WbEFA'ZC?=۰ `w lq3XG}T3s{/YN,W.5}`G3E0W'=i?[p5J}[懎v;W$%m":a"I0`vxi7H. 8%Eb"C %Q {!ņh3da!>c[ns_<0ƁQA>=|79e5_s3LR=q`SſRZ weݥ+y˿ C,$$?5 ԘHS\GQbk` sQtFϤҵek) .,/f>[bN2Mvs_xZxon7&<6~I펟!>_.=R =C|e~/Wt >/Y8^xԣ g>Rz?߈\?KNVyqbɌdVS~|%|`Zm}Ԝ( I}H"hY%wV_#nSy?0;oaL7ws_w%/y w& -3˹7j 꽲8î(A0i'|x//8ͯ0ȯ L|03tɝyLeد?{Zĸ) n[7ϥQey˵6xR鈮?xctp:g?0q{ٽ.mMWv?Ɲ`HN xMl 89-xVjw-O?7񬍽:hoGm{R{tƾ7!a{/ jHOG',S~[7bTF^d,g_`ǑOY,C1!,coL#]뮻6W`_gv9@:ع&zߑ.kk14ߠAVPĪ5pS$B'[l- mO[yZ6`\cM32lje? ƀ lJTPhHQ5FZJ*F4@R IDQKEh,RK@  ccc =u9^bUEìGFKOc J&~{~-bUEìGJga|I[H[[m&Cڢ)lS4YcJ?=^.Gu5 }v].2/TD۴A#)/g2DNJ}lfXTz:eW'h䫸%F[=sz=0o,c⌗NN~f˜G퇁L鼬n_FAl-}O35;:VF6:Kzn_Pkjq]".c=^djPO6V & y.ny/^dv:L:YwN.c~tKv&tepi`xfuj~q_U.uTE{Yuv꒷x_C7.AESFgTmw$?/%?d~Jpgb L B&'ܥk\n&Tǁs1.vckܹC J!_en+ۍ[v;TjGJJ 7t`T6=ٞ|?jon'tճ_ lY!ƉG!0!\Y EfLqg/ï R\ٴ<՘kw`Dzcee%v)+O%Tyو|W}|k<1Sp>PDST`:kc[N/1j\V+DԞR/؏c|ga#ߩ>FSPC]ͺJ[)ϨؙE_Cy@#N-*%A#!h^}D[}q1 6^G6cb[)"DUh>!MZ}q pl*ggvR\It93tgH2-vޝ:5 6`eYlU; ҀDm͛6J5Vm?-2>r c;mwΛXT8K8 ӓ~#io5n,L={ɓ'??snp)W2E|~I(\m8|]˅zVR`<29nk:T>KCa*_}ԉ4uV_eܢ0_A2[[' ٮ0+-ܔ2v=#OΙtXohsiL?SeSjۅ^OШvu11!`7}C41տqFU{mK&HU6?mmXwT{v"L:ʖ>/??ckI+;wJq/ .S/."ű\d2%b(:qa,H6L6f"/N+ڧF%T_ 'vCK^GȏoeWJ#xN8c싏:ϟ^k!+'+IkBֽ`{~~R\Oݽ뮻SV싽Sb>v}1&.k] ,/k{k' 1^c;?T j KU[_@`lxq-> ]]dpC%%R^ߖeWo :J+uƵ߶#aˏ0Kڀa&R=gb, \ameYw~~UgJC޿Μ[xϧ'Znq:MnPO.5:JX}ن.bonkܟK^;RmR,=}tY˲(0:⌝4K M &Ç?RD (p>\lI}/Soߋ~\ TN#_,߫xxW9UX' A /;췇ARĻvq̑W8՟ȫ{Sl{8n?ħ0[8|-OHڒ &)L3|}d, }WBdr|M^mqB| 0:)҅F^uyծty(>EK' =Qxhɭ.4eKl3 ͻ(۹G~ucOa4D#SN=rgjs0E +FygئfL8oG'X( c7^v݆a ֮L-%s%AfEMㇲQ&*=Q&%Ak#jU[jw}sǴܯ @+m4{ 0;p(.|:6 ꦥR0,/UeMnTúSW<4. Nߨ{eYN /rhСlXB#OH9$}rr3@)[>{&WQDpߍKow 3j}SQyk^T]N6}u0jCGH"[ȏusĹg {?".HwL|V1Jy[\LQ]_S}Qzտ뎞v>ꬄ*U>MFmB8&ڸlڳ^ f˪4s[978U|'s~9ם 0/3f5`0[8x)ѳmp|=% }GePe+ jWZV٨e3#NJu+uST`q,(aNm_A@\׬@կ~ kl`U ؿQx{K {d:^w2jy;ӫT `0U?uu>:~ UAcϥ+5\:?DKÜ:sCf9`8 =0+=؇LCZashWkM>̈́P]ȍ[= AIYL)eՎTu.H{E+^eAQ5jflB bB;.sD AyshV ;JmۤrU5Qt)VǙ“D[ jC> ZCkەƶ=S7UXoȣF &yfx=OGL/: uF!бU&Y~~Ϟ=:g(eJ6"83Y ;#*NzX(v  tNZiQ}R}t{IQruƒ~?u"/?)礜4 +]qCsE':SG5!xp=pXygV+=E8eleo/E'҉2_io?wnӂn ∛*%9 UΝ;߿q"z8!HLٻӴr}%t2谷Z<C0a`LE52(^oOgo 4ЙO%`"5q@= ٳg4L*4ɖ/;d9aS~l njjS*zҧv ]ȫ|qUzeW}%yX\WiU}<ꉢOړR_z|?tďɣ/axF 3swo_ZZ:rD` %qrtE?JCGn9dOTm}!2wU~VcH [^։J}!we0Bd.jmY/]AW{Կ}Zo5p ocސǔ&_~`ho/WC$8a.ΞDp&ԣRM,Z'6@bǢRN ѵov)~ eǙb[n5Jnbrj;끪xўVTJ-Q!]UG6Eai@?IT beC)\Tu;?drNjk@0ho2R&M,QOط~2%3;1~aTD^XNo \S2ԅNKP j04rݿTJG7me"*8LTz]G_8 cƠSVP QLUNL9~Gpy4ys!C6fol??U6TڈDܧ}{)',)Mb%@}ɜ (?T9UQa2ĘztLZ=ZmY=TXIzIkL8o;Qgg4?uH^Xi)$bjNH3*=N/{k_Zc\&vY3O÷n# ^wm7RnQ0J@ ɓ'Om۶}RqUHvpwQxVOl:[q3>yۉ:եwwD@FIӢ(zOx]iTP:Wt-۶G%dN,a; .l=OBk<,F|xT%0ѣ-x//ϕm'ӌ[y`K+\hyo;|D&w;\LtY<# yGYUmCFޅl{7!z~NOG|}M_ 9:F!eЛ;]y3+ 2Kre;۟ * ϟ-l\JPTgȊnG-* j۬6d|_xa^Ww$yڥ>nQLA&#LNil;29֞ņ<^W|]G#_ek ǿ4_}Y+76xd R:Sb{?l+%ؼo߾^{%`ydGmo1CML%V| LF@™cvuiCWQZt<# HRzc?ߌ'l !:~TTڶ&}p#;{El96%˟9|$篻-osx)~DtjK),8p׿N\ hT!փy c9>g,3fWAρ PwvB#?f9c Jgi]{ב/V?#ƈ(Lnsgg~+ݿf}!`yef{q51\g{,cKcqueλho^Rx:j|F+6lZۖv:Uyq[U+?66h^wˋ2$:QLS+ǿCv Î;|g?|:@D<xK_DOSQ=9C/whtwr}g1pgN@"g %Q.Yn{}Օ=kqQXHG>Fumhl7&+h>[/-о|g]G-Iݫ﷏\=LoGB#z"]uW ,y۟GV@'FG"- Z$5ӣD5ՙoUZr%fM`F"~>,J?w߾[e3%l*Lv( Go:~X3[n}dR+X_tG1o`\R8WȑճG.kqD'0>$7oeN}J[NmK?E1߶e./Ş?/KrOa e6Qe?twwԴ[uK.ALZI=;q|رgs-JWw$>]>)-^rOkaEML]Q"/ \2LQTs?t}ߩGT<ۏ8Ο 0*e0 ~yBJѣ<ȷl%A%K1yʟux9qɠz\w(CF$ (/Yk.1:HPO `dK^F3Wpκ RQ$j{Dc6|gl Ehh^h`o_G?㋧qqτ) 25G wڵz̾0NX|"9-Mq8u:IP\ Y˨(/*rˮgo{nUԊ07hw.-G몞.ղE}TϮkԾ!S&𺕺MGɅVn<РXo^}j//c˿㮾uZ@o &E܊T,m޻w ojk⊛U4Xo3ǩ_DYyp<+rq)\Tδ`K_~)/2`GuԌ(*(oӠ~!ZVTE[q;GsuOp클B>Q$m_<}c'_. a/ʼns+ݯs _ LbsṜx@9IzF N^99ofYsKbDJB]Qlyni)Ҧs_;;ރ#{Ұοz_t4A> @:rE*gݻwX0헽eþ7\eJ %rGOתoN VCLZIDAT``9#3,t;a;9綎=gӗ~CW ڶ&˗q;a4V(1IV$iхSk}{>} g_os/h|g \HB6|S>n97E2WcˌyxGvq{Z1(@I[q[WڡIMJ[]DFKIvܫ-#'2ѶזKB~(Yo;wG=pf1Ͱ/?&e01TC9m^G9uYEf:C]'wFm)CQPfq<V%j!Ўd&=͂Zx;0 {rrT$xQF[^aջpXg׻x7-sφ ~~ pL6c3M@"5ZO4HNMxO`eA/EIˎ@yWoۮǝS nixBm|q (3Ԯc>BPfȣ5Qμ1.SV"?ՠa :5c w/;~z) .%-d&C pZIu90upBIQo?Ce %p@@u]q̮k[/ί8U't1hk|i6":k 8sKGt;~7On?`r7~7_[. 45Uв 6@dmk~gM),e~;rg_=@ ʗ-w D&9|ꋇKU`Z5R;R*?[cƎf dpgZR@@Ael\!!xcua'ǎS/ GZVv:Z;̋ u{0u.f{Q9~;~-G`@ ZUeVw^l[_xB p "d+ؾH WFGTI}ܺ ,yny4LP:!l"'ΘC'ID3Eo}~ۻ~99~t 3]4:W/PC\S<-c-%B KlcV8C5h\ho6o~o^}&gJ&FOx=G~oրZ7b[, z9CI pPO T*۽ Ǵߘ7.޴3;ΗO%@;.49x rr1PU > oxͫ^?Mv!%@VpdA]*p)!` *`@{r:q@`0S'm}Tb_S ״w=Pg?x~W9tnrrZcWЗ c;.1c.?-:r9y>@ Xxk_{+_ʿi>Qp]t)pxEܸ9s/:'%@(թK`@ 29q|`9qU/mZ^8pO<}sy PLl" l1Уu @ @T7YP׽uxʂʛb~ʹC'?7L ,[} ~ |-^f9J0|&hOA 8xZ}u:މn\= __\^܁=;c'}w=A@5Tw>r'/j 2"E@se~ ((hiFd;RFo_wu7jKe×X`p/E.P) Wx%`9U;\`t#ơy "ha5N[F~L跧=ӊC6[{my[/lZ:3pq{^™CG;{Сx='k{$FTZ'M}%*](v#vmgten7D@s&'z>6GBy(+\wW_kXp Ɩ`*6㯲A{_JSdWzy{t2tG{n53𹳷x2r8MKW%\kqW.R'B% _h]K@kAɒ5 K /.oZZX\_Z s /-mq3ϝ>xgΜ8#gN<?9đ3ǹ&UxɠPYҖ$mfJ6rݖWY1#LTZeP9~ѫ,ʤMx6هDK.𮛩X#H夣#V7Mt GgT2[ .qL 3egʯD)8cRt+mrh|۶gZvNʘ.i"g4:xU>ꫬ|tUa<2:$ђK4Hikʋ"]Wht#F-UYjê|)@ OA8ʋcWYKѕLD% FH[~X YC9,i˓2dF/<D>")E^[|Ꮺʕ_RF|,K>UZ9*/0,ʕ%_R''!#\NM8-|4^ԕlEF~ %m%OL#f[>*/0:N#%SJ"L ٙ DcHy(E)#|KidID 0FY䩡|KcY䥇/i]gz9 ;&.FFH*$Qybd;0oܹ__s!kѷL3\()OD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HD HujIENDB`ڐk&ic13iӉPNG  IHDR\rfsRGBDeXIfMM*igI@IDATx .Uu[t #9(`(};MЈ&o{Z{WYs5\ժ*6-ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -ж@m -жdZ`f2nƮ[a.~b9dzsmZ>xly|,]S4x-I%!i9ŋ's˥Secg/5Sk#֬Ys+]r!}gffͲ񫍮e-bIU%95$#!ESSiKFqG֑ZY'㎹٭sܶbŊ-&zhnxd(=;n:-s[ngۯ~[Omv'_Mey9Kx}P@E_qG~Ǟh?ɖc 5ݣ /b̟^}`3ŪŊo +gVyJ˛fh1D}z|CI6ڭsۮou76`c (cX)ZnFq l`ON;=eShrmJ-'W=Ӏ*?_iFaD[ˉ u{-(iTKvn~C[~/ 3+3DQ*KܣK+xbMWr)oZjKm'5hgoÀWr/|@5H;@f 6 uta.ia[uadak!٭ڭ~f*eatEp=&z~ǿͦ..U`NSvԏS4 `Ml]] C! `1W춋W]]^>3ݞ=7Z(Vh ?kN|.VӂzR|*98b"z2?XSтK<fkfΎ+E@Vq=dnӝ;~ m~%;Π&xnm놿|ueݖ%1%UG}'|gvmöMchff}33?ƽXdeWE^BmH /%S?pv:H#1 `6gߕ{>tHi,WٲO}Qzԣî?˶48Gs ;9{U#Y\B|ˈEEct0ꪬݒ ˼Eѹ&Fyz̉{?w}ӷ^DS~.vaXWS4=s&Dr8јд/3BǖlQx>Gd}`eeldQ6ќw=/͈L*#ƒ p=s'A;ċi&gyC_~^fZ9 ;mtBz92|GԔ̌I!C2)yd,Ds^)vݞWe']/wZ=LuX90U~7BA`Z 8_]m65hyun$43vJx۠ j7ќH ܯٴ0| y%PʊMg w V_r3Ǒ~T0Ф,%.?Ɍ @6ؖaB0vri1Usܗowrn=XzaHzJ@^Z0% vs/ʩC2xhpLO+G~*ϕdu]SE_?}/5_>,6uo/x6-N :1MIGj"_ŘQu%~.s>+C9([Y2$]GUi / Qz<9ɩ&=]7ڞҦEj!ltָO'#A!u^xVFSlO3>ew;3\ tLF4㬿j8UE58ħ_{3q۴x-p K9't<>D=}%ėLC<bH9K;5}KV*ULW}{kS5X7e|>'PESz?NԏĩcG'f# Jju9Q]ӬF) '#j:9hs^ŇҼRɨy9oY#%;x^С޻\?UO{^a{H *5t^[|J e^1OQd6zsD{}<& xhO{^>ʺJJP^4鰇 :Jfft-|ZnNjB,~k9?oFy*AeU@Ӊ{-sPHu>6ْ*hu?7闎1҅ڒ5"U9ǃY-7匭T#W{{z ‹T2ػ_jGUkx^-~n*PU=x@\QbۢrrY/{+븝+oՊUGme9Xybvsd[ :휽aOcuf ٷ'=#Rߤn/3D$w2x5cNUYhΏOW0;^G&t-Xo:hciR3k_yfc5j ϻxG:NC^Q2Buu6EN#iYf9c?}J'dМW29:ŭ맀}l3kGL8k2&öݡ(֭[W<я.{zׯ/_ݬ^x\p Iabq뭷]tQq.)Q쥘@.0,g'$,9<ə Ɂt=F|pU;f4l).Q@=6 lI{?{lKEƾNG~\E/z%vDʟ B{c`< {`ر.Qg=x^Wv ,GydawEg>)ƍO~ŝwl#r;tё+'de =Qt𩼀[M9;/y>T`'_`PB;yxSSA ެ5f McӿJ\{ytQ<}̯D-[ d󽻐Po HP~& 6o4R'e+:ڔr&=/Q=&|A4]þi0)5"r:x(I%忮_E/ @] Bnzbw:{-ƔTESD 7 ^bZcŃr۶Jp*l۶Ї>J(8_y啹hr94،=}@cq*0=8āHd=xL7dI! nJV*~QT|^()+ؓb]ц54xMXᠩD`jQSv݆6w}/١3U&$_^vxO48eAGyEXPԋ ;wUCK!hww+Vө7Fq"G],TYnC&s_kNTO/oL,~~^,[HړDt=hBhV? Rye|AJԧC|iS{~_:c+&U{]o8:8w\?p~`&EcXvq>){~wA+_ʂz?.ͳaGY(pt3FGO:?\S ;)şrʟ\ j35y F%y @C2# g͛7.ΑH,!׮d9cO*W϶͟%@+>2W~uT{x=_6aghqk)a΋{=T9{*O^\r ?Z: |Xu`5[G U=J ~tknO6Edn3#w}qQ<5jyI-\k|M(}-2 /$D>-Q8:sRTJS$z7eKyxu3e~XC_$o3;[Hp~WwqGfb:4C/;1)|`kJBsލ$KcWT QVDC/8(]ƣUCu4 *+ʚ@h |ƹGx㍋N;)L< v.xr?q>ђ $lk&!ˤS|Ȧt%4HrPTyG OkP)jv"E;S4:|j? ?d :?e|ǖ0ݒCʻcxO:ƻQSRWdPH2b`Qle}̶ V K;bl9ׅ7.K(2`@M_kGiOFch8>]UxM4J'Ke8&~ī"GOL؇z|/CW:k:Ue*+\k39*cYV PU:YrAc y:u މm~2t 2M󈆽4- VJ읔 *QۂQz@fA?Czٷ(ewKJq&tT8 yc˄tR`?SJn3qo⭅&'7fМW u j{77&LT+Ԅz s̠_ 4&mFj2uPsYcͫb pf^ClMSdC+P6>CC߁dīc#^H6M<146dYI_g diU*p $( P^M{WyS*i0A/ɶʣLa2.=C%k\* PJG=ɲ?(caO[}q衇a/d"K*YGAgrz/9:I?P#h9}觘葤،?PTLO4TqR鋇:u-07 N/ G@B ]HDw o/O~7.v#,8㌂$#dfu7iF(~BE1_3(z,x:PSМOي$h=V+ bѻo~"[72{kPi^g2t{QNWjB'ܰ$B|4Wq7ǵ5kw'?Owכy~G{'!Dv\#@~|\6d ': ^nWIdmExZ^%%Qz5jv$3;TL'%u򲊏T`L;Xr=ü]t&6 B)R/G?O۷ow tdz41őm4*f޼FE{'hK4yV3 IV v9yNqꩧz3^Q;BCڇk׮-xy"׸:xu `z5njtLRA IِuG:n6eW4Kv>X5Kl =yYD!Q[V1[K7Mަ7n,>5Oy0ygyzr-Ź;]s֙L}i( ;h4＀$l.z T:L,JxDyWND(eCY e΢?15&kP_vmw.n[V;4K1yL}رc?ù ]>·O?B5~xygAr\Q=;%(#QWʓ'RF.,S2CIuof#xMdKNsl,Pe,WHDpZ6GQ-J/{\\cG~}i{26G.N:8/:OO }Q _Bq7+>w\#q?DQwX$K62 O8fhɇxc֬lx+3ˑ U;8\29BIf]̕T–;,+Q O -UzU zqgYQ_=_bw] 亀2bR~ @8D: =z84l'#Sm N` s1@ (I'rtJe+{)Tြ4,K獳C^ƲtT"9/߆eۈO|gଳβEqs u@.tN╏4CZ'UZgVŋ4# NFԧTх߃hxeg#=Cȵ^ y{>}W|/Yyono+ht~0=ʯSِ= ^ }6IWYh?!㫗QȆ-:j}k2- ~n\|W:[o$ *yxPwW~bQl.aE$hλV]Me} (6ō.|ʯSr}K]e2WXղiӦMyxꎢpuBr!~ѯ::ROqEeCmʎ(FCæ|I^'ʗ,ydfmuĢzDN#EyǺ4Z6@7XvmWG/}Kc qm+E?4nm<`7:1 8aڦhк׊':A)[ ES;˕M/ 겾bs=KVK=c ţ+Q4 (<>-:Gͮ¥dӽ^ht"{x)ݘp+(FcCg 8sp\&uZQ ij$ .fҝ@ y% JȆ+J>K}PqLT6˳ٵx2;#lN∟qI2]j[Mc @Mg?='ez?mSar@xD`&ct/&C͒Mm7<ۑ'^S+TxTQf,/`ؚ3LV&XEn*݀dT{;˛i5Ji<a jB 5 Nh9NK`ny9@;<6} qPWTg,hSd@샋zuq=\*IW٩ŬXX$ m/Q 8!l(̫&F5k [a;!j8@ _ɵP;L!k:!24ցJBC|ִaEeÍ|'곺 l]L[ >:ul:|$ P] zҏdѲH?3#E^ 7NY;gk.Y[| }Vt:ﳁʤ(d|5`t\Uou8SkTul[EnvpOy?2U~ N:t+6 МW mfuX͎^E-ϻ)4FI+Y.tfHU3"ӏ\Z=(A,H|ˡpi.HAA(vdMrH;S(l^hi/{AziyЗCUC/}&j!ڪb\q. qn9Gt8-ncSm% -Uzv$z6}:ﲤ;7{Ξ̓bl?TZ}n}eg4uTz*[ ƳD5~: ܝ2B/Z[tH2E}f{F5^,-]o r+[PR/ ]ilc*&o3B&`<.1PBYs+eGwŏIr&S;4ٺKŶu:_ #W]OJ] ĄYb ttCe5=3`I˾* PO2 &B!efDњ$x7^a.\`LTMw p<\ L(:\<XQ|(m$h|i)HO*cWveY=y)9D6Xz l@LL:3>=pT<]$WltE+(I"'M{ C!eeiHYIƚv^}>0HǨ:h+^@4^mu|"3w}\vh0XT  2k}YKY:⾿Z?Vjky` vpO;:etLCuFf1 ѻWocGKFLfEiGJkI9:0;j(ۄm5e2 9AMҚ0.3@GBAmW[0lt[`଺;UBS0sЬI4":ɽ4n:ꐭB,eRm-Y9_muJ[ ֦ [?jh]zMN'%|4::hҵ!eY%Ԗ4F'-:6kOE\X%}uZO>t<am (=Thg!@~504lf4۾Kº>#RsJ[Ɇ.e9ݹnr:-Ԫހe{Dˌv`.L9K~:~:zD\*1j fOМ51q/K@{de5d!ly*dˉuy1+=юN/ubSv)!o ܷ? )B6 dt:.i8GQ>I5P;LO\LAlR2 ?dA_pv98Rol@v]VK_esЅX9@S|)^:_-=*"Qm7N}+fƺҐM_@꽩C;@G m6Ɯ^5]Hn&m[M6,7H_{(akb ['[<ԝ/U#`c\_nj^\1Y@f]reG=Xvm>{w^{tŦM(+Yd෇YW  G2|nU_@Yld]<mEE@ĩ7i>3~fEb+Sf'^!'>c}OQ7I #c-9я~tf͚j{k|)C*};x!^etx@Ć- NMp AP> Ǣ-Zsgt3x0^ީ[/p;$R%ش:l:G]/,H=͗׼5_\\p4&a\+x\4iC\zy WG/)M-A]RBM}"!D!ЉVJM\h,ِd^}JьRUd߃w).;wq駟^]o+?Cꫯv{_ۯ}cN8V^]<9)N9K/-M)w3AMAYvpQ6/>i-e&Aٹ pS5sɮ/d?17RMꅹ$1 {эF"׿œvmyW\yӆmۊ>Oewb].YY6uUvjn]0uGS0˯ЩnXGl ^tM{2W  %)3 aۯ@d7֙M+^b}*̌Ӎ/~Ŗ-[t&/ۖ>o[LWċP Ĵ:|KR{|Q5u& k +aW1+_/_6yWbj[{e,KxGG>g9b.'?b=u&%O.&_^%'╟J>jI\}Gs;N먆oWDS%V8E߀doӟ oxC_sc؂b%f!z׻z^;W 90 K*e (?h:@": j SuSdF4APxQZ^P={@&h 1GJyݣ>q; m.[{{׷|A?LL9kgqF{ՙDFtL:ptC/:>))IDATQAf|BV#$꼗1vr[^>,!cG9DGYECMpe=poo}k=93#>z.񶷽DzMRPh1 @рɒ麌2^ζD [SO,Ȫb 1 T\4V,;=D]'[tcd<nַ.s&> ȏycBq h?s`^P/dRQŧ|%zJQ`,EAD1fST1Jm&(z,$Qx5Qxe2GqdZm; _? |hN+8:dQͰy<@T>c[\%୼dJsAa"'Bsr]l{¶EhidBs^&_z e9zų5=4ӀVۇ&EG4Ĭzt)tN DwDUNkV+y&۔]Qdi_AsWt=AQ)lXHPD{CuPyϳ~iY܇tO`d뮻+b'=I$Xx-0q:iNn-Qō& /eqD]gR I?~` 6 i" /jSO3n:? bF@_"p0Rhi: rYG 4׽6HFO&(%m% 1&  ;ֿ,x.XZGq%3_bt`G٘Gw{gez@gǃ|0$Fr,N I5=_}p9Ȅ|]a2?gm8[R\V)_IC{-y{KWKu,髮aШhYo˒?J+'mI)'h^ٴQf<iAh ! ֑mVf_4λ4,Nܕ܉Z(DQ/&".uPt#ff`ey.`Гy}$I_%`œW zs᥏?ߌW~ +ќw=b~(Iy\Ked=v+^,{0 &u .%%ƪÃ3[n:oN44,aF檟˱d&\6` 7~y]yg|uAJ(ǯɬ~o"v7# {5}&Z{>˝6 Mg |~dlQ90J]r;3QڴnrHlFXiP HUI͙+>_ȪXh1=s}% s~SYuߢyc-hE=+MfKc03l7\ëQ{p3mE(T~~ytfJ.2YdZutDeG4{}#Oԋ1S4k8c+5[hΗ~)?<숪lTuu:3L⊘vU.y7,xTP8< qJ^t2~::)Q:?y׿.Sr#V.}0؜wkD<4SVsbMv f^,v"_կ~UAS~_tA V\>22di4AQsOw𛞃  #Kv,?ׅ7e'ut|#5kpp'?YɼǛ(v(umMK䒡OR[ '߆Rx)xMꪁx(O 4#8b`i~-xg&~''ѹ1v0Qڨ'/҅ڟlHߊ%paKTvE)C'O4h lcQ./Ixs̯yx/c푉`{5ַž:ꨁMfAFu J#*d:2QZ1Oչ#W2\_OKJWyd)&2` 'PR=> 쥛Y59ަs^fjPmsst?t ]gq6\1EM B#Ku]/TvD) KT`,J#Af#]Q,D]?Օ+{ǃHG148ir(S|JOxvt;Kl+_ثCk'0W]?MEjT - ~ˎ* ̣dD[7. %_{᧗ vf'p%Pꅃ]鸆5>WNŎ`zs(oO/,wK\sM_v8 ::}L)R,,v棓\'N:hef"шCqfnE!~.u)%zVOlE\+o>@:-`@(9{er/O>;P,]w~w:F.1 xgp=hw4T:I<NGChceg~HǬQA Rp'eJDev)1a5jr \ 6? g>?ntO"k_ڞaп|7`Q!;X7oJ:4LmkQ$ 9PI4A"#U6)|ׂMnRz{$ګ E^"D|^"xwQ6a&B .svs쑏`o^ҫ_G^;+{__|.Yc(I]`2b}3GUQm P鈌 ^!QnBAz DC?bWvIw/?ê[m@C eQoQXWM۷<` zN5;8?-<\?O?:ι瞻HyК8O#*4bU()@jF:fMeI J`/y6Rea|7e5z}q#ڡd au@sie2 Wslf{ r!KsO_r- %^o/nqe_]y!87+m?|Yϕ_ЩFMepasRSҍl~-)>|nKj)0^i}~Ц;_K3W=B.R*0vgE|˕~+qώ}s9ŗbגN;¦Iwl;k=Wά ~аҵحYEg(`$-=vI䫤 0dz nZbc=t珘u~Ch_9G:?gh>|_\?voVxK^?BjOet׈]Tg?׿ym3Za Gߴ'yyT\Es0Su:;<;^;X$HPzY8!ksh(/Ah [\?QS9lrC&q #%\r j;p D@v{ _Xp5{_. *-d)C. 񿳃(zбy,Xz<$:<] ?Iw~7%vpD|Hđ2&aš%^4h=p}7}'BLG"Jt|u[oe 7,oܦi|uQS24Svˣ[BI4Jq=$N{Qk.dʡP,@]>BmLV3g.é-[Sf&vH#ګ{,JAQ߱O$HTf;_N{`SqGaCzn\}WNjQm959hj4a~a6:4bnWxٞRgXyo]2y +МW~6xc]z(!-hΫ@^gnn/,@KhA*xh9/.33ԉ9ֹh/@䲜ٽۀoœ_g;_t\DccQV1EO<4~c‹K},&Jm{g%J3{! ԁT_`+/7:L8H`e`yFnjlI yϬ|~7TvE1!_~O?! ѥG&q POkn}mBEN<7缶lsڝH8VO2v`hؒm^_Q9хS$Zn_zQZ+_ϯJoǦ_:ZQS5 PUl >amЇ>EMԧ:W',Uvˁ*2uZחo(j=L/ċVZ^"짛npukO^Wz4m l7u;0ZVza DzY3sQ./KМW(K Ty$LS4sgļspv wGn~_i ЦE3*;D#5jλV݁ꝺz2 ,AƸ~PW`^B't,%y s`JSg|i*PipZVi?r]׳1QV{{VfRf4 )ζ /.(eK1:}E@8tʯӺ>gdPEs[*`#?]A(/+{uPu:n_bi]__mϏ: 7&924 ]n PMXsC5P漗ˣ'@G'ɜ+ќW~UL|o /a䐠gLfYV.sΗ :?J7r_Fu_&&=h0h` ^'?ɻz}(b {~:JrteqDs_>fГ.Xǁ->H$s0< P-6ўʀ(0zL&(v_~w]|l~ԧ)IT)*5gnWqi;iZj:sꖡ\My  s^OsJsdh&4xմ(ǍQPs?ӷ&v> 2:hvmw٫~4_k-t0S #  ;'F3!#9y+(.h x]:>Q0V.dz#o<yR]?{/}C0_S(> n8R7uuldI4Oye̖G '볢\@Ty3/^i;1^=]s-:uLjb49IE>su]e3wg[CNW̮z.5O99ǑQngK/׵Q'eҡȦYq}BIԷ+#6?AHMF֯YZ8Gy7vi1e&`o|51z@ |ŪnM6#:pԚ txXs9I u\RxC l=Sww\߾g8k_?^ml&p=#p?#~nT -~hٖL D7 x:@K \]x5T.L=l @wJ%%'#AR?x5zj{/|s)/Ք_q C^&+s]xuε@W!?]@O݀@ ʘeۘzN;\DVϵb_g]s=gݶuFkyT8[ :o/N b۾8ۉURZ:r Yn@fI:B @cy@SNywDi`2|1=MtІM`z8h|~mW7]sۊmx~)?-5uiKAX'< }4;=8m>HG|?f6,fԓke]3kT}[dp_f N'Mμ 6ƭv \H(.+jءf ]UdKކW%7̿ݶqCW߲må߸gϹJ3ѽ=0әbOLgl+T|FPh[t}k'>#OoA6(Wwl9#?_0a64x 5p(˾ٓ,b6 ѳ{`ǖݱWwO6xGo9۶Ô0.*k[kE-kz@5vGF̊>hVPts|܊#h[e$*òdՒ 8 ES2ǭIlizZ ^DuW<SInszZcHC'΁ ExQsrW4)2GVߖ^Ki|[|rA=O-{K2-N@-/]mCI$k$>xQ l%*'/%|E upEQr勢'JVN.o@?rP-D!z~H U]ê^EzCIy~H4U/\/%)Kbg9dzearS|_[YSϯ=li+aʴh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[mh[F'U?-IENDB`infoKbplist00 X$versionY$archiverT$topX$objects_NSKeyedArchiver Troot U$null WNS.keysZNS.objectsV$classTname_assetcatalog-reference_icon_128x128@2x  !"Z$classnameX$classes\NSDictionary!#XNSObject$)27ILQS[ahp{$qalculate-qt-5.5.1/data/qalculate.ico000066400000000000000000010760761475705355700175420ustar00rootroot00000000000000 (h h&  v  00'00 %n6 ( \(  #!=W')'EgVYW/1z}{[pFΞxm&nxmf&fffzfFfxdzifxsfFwlݖxsfffxs̻"""333?@( / B !!!:Q;R;T>U###;U:V;V;WBZ%%%B[>\E_((()))CaEeMMMNNNOOOQQQSSSTTT)*UUU++VVV+,--.8//-\\\../2/^^^0___32aaa33448ddd6eeeG97fff::<;<<=<<A==>pppssstttNuuuQvvvwwwQT|||^_`ceovy{!SUZZZZX\\\[V*9`oYoT62@@@@DH Al|`}W4,;;;;=PEup4y_4+::::."11117O.eikkkknrrrmjB @(  n&&&(((((()))))))))B`EeEeCaCa>\+eee><;U%%%fff___^^^^^^^^^^^^^^^-``<;UVVVNNNMMMMMMMMMMMMMMM,00000;;UVVVMMMMMM+^_:;TVVV\\\dddNNNMMM+UB[B[B[E_BZ/ Ba ( @ #!@ZY!KNLNQO)^a_1Q|}~ܰ""""i!6ffffffWxxxwfffffffwuffDdfffWwwwwxxfnkfWxxwwkkfWwwwwwxfffffWwwwwwwfmfnfWwwwwxfmfnFWwwwwwwmfnfWwwwwwxfffdfWwwwwwwffffWwfafffffẆwfffffddWwwwwwxC33433WwwwwwcC33333WzwCDC3333WxCN>33WwWwdDKF33UwwwWwxDD6333WwWWwwwF3333UwwwwWXD33D33WuuwWwwDD933WWwwwuxC3k33UwuuwwwC333333WwWwuuuFC33333UuwWWw9d4D333WxxwX/W( @) A0C 9J !C[?]D\$'%@^E]>Y%(&A_&(';[')'B`Ca?cGiEHFFIGGIH ILJs,"%&r0KNL$'x1LOM%(MPN)'NQO(ORP~7)PSQ**QTR+RUSSUS,TVTUWU.&VYW(,)X[Y-.+Z][//2-0\_].1.]`^2/2081_b``ca364beb8cfcdfdB699<ege7:fhf=fig9<gjh::=>>ilj?jmk=knlAlomLFnqoIGpsqqtrrusKsvttwuMuxvwzxx{y[U{~|aY}~]^`abguuy{āȅăˇ¿ܰ ii{#ii``<`<`<`<``7bplllppypywR@Rj99i9,DII>I>EHOHIOR 9999999,EIHIEIHDIIIHJ<<9999*DHIORHIDODDja`<;999999*OOOOOTOOeT~'1 W( @ ;s###'''&&&''')))))))))))))))))))))=\EgEhEhEhEhDgAb@_A_=Z)=p9 zIIIhhhsssvvvzzz}}}Zaaaaaa_]YVLp1) ?v ;GGGnnnfffbbbaaaaaaaaa_____________________1::::;;;;;=BLq- 9YYYaaa^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^/88888888888<84L'''aaa___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.777777777779=@](((eee___jjj^^^^^^^^^^^^.777777777778?Ba'''fff___iii^^^yyy^^^^^^^^^-666666666667@Cb(((fff___^^^uuulll^^^^^^^^^^^^^^^^^^-666666666667@Ca(((fff___^^^^^^^^^^^^dddttt^^^^^^^^^,555555555556?Ca(((fff___^^^^^^^^^^^^^^^^^^^^^^^^,555555555556?Ca(((fff___^^^^^^^^^^^^qqqrrr^^^^^^^^^,444444444445>Ca(((fff___^^^mmm^^^aaa^^^^^^^^^^^^,444444444445>C`(((fff___^^^^^^ggg^^^^^^^^^^^^^^^+3Fu34=C`(((fff___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+3A۰۰۰۰۰۰۰`34=C`(((fff___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*222222222223A?f'FIGGIHt'ILJ&KNLz.'LOM%(MPN&)'NQO*()PSQ,*QTR--RUSSUS'*TVT(UWU),UXV-VYW(+>)/4-50Y\Z33+.-00\_].1]`^2/0^a_3661_b`55`ca3adb4bebA8cfcdfd;699ege7:fhf;9><gjh:==@>ilj<?jmkCknlAlomBEmpnnqoGEIqtrNrusMRsvtYOuxvvywwzxR[x{yUQVz}{U{~||}}~Z[`\_]`bkprxƃɆƋȊɋ¿ =uxxm$xxxxpppppBuppppppBpp:qzzrzz"xxBpBpBpBpBpBBpBBpBpB/[rrrrrrrrrrrr$pBBpBpBppBpBppBppBppBRbrrrrrrrrrrrryrrrr%=ppBpBpBBBBpBpBBpBBpBB8WrrryrrrrryrrzrM ppBpBpBppppBpBppBppBpB,biirrriiririirir_srbuBpBpBppBBBBpBpBBpBBpBMNrr|_rirrsrirriryrrrqxpBpppppBppB5birrrsriiririirriiirypBpBBpBpBBpBMNii_iiiiiiiiiiii_iir|ppBpppBpxpBppBY,NiiriiiiiriiiiiirrrppBpBBBpBpxpBpBYB,Niiisiiiiisiiiiiss_sxpBpBpBpBpBxBpBpBp,biiiiiiiiiiiiiiiiirrpBpBpxBBpBpBpBpBpB,biiiiiiiiiiiiiiiiiisxpBpBppBpBppBpBpB7Nisis^s^isi^^isiii^ixBppBpBBBpBpBpBpBB,Nss^yii^si^sississ^ixpBBpBppBBpBpBpBMb^_i_i^irni_ni^__iisxBBppBpxBBBpBpBpB,Aiiinr|_r|rriisi_nxppxpBppBpBpBpBp,bViir^s^ixpxpBpBpBppBppBpBpBpB:b^sf^i^syxpBpBpBpBpBpBpBBpBpBpB:Ns^^sfV^|xBBpBpBpBBpBBpBppBpBpB,NfZiiVVViisVVs^^n^^s|xppBpBpBppBppuuBpBpBpB7P^^ffsssff^ss^f^^V^^|B=$$=$=$=$$=B$$=$=$=$0>_ffZZZZZZZVZZn^]]sn|B$=$$$=$$=$$=$=$$=$$$$,b[^iZ_ZZZZZZZZ__^^V^|B$=$=$=$$=$$=$$=$=$$=$7b_VVfVV^nB=$=$=$=$$==$=$$=$=$$$-A_^sZssn|B$=$=$$=$=$$B$$$=$$$=$,>[[f_[_VZn B$$=$x=$===$=$=$$0bVVZf]^Z]VfVfVf]V[f]|B$==$=ȗ=$x$$=$$$$,LVVV]Z^V]^fZfZfZ^VVZ|B=$$$=$=B==x=$$=$=$*>]]]^]]fV]V[Z]V[Vff]nB$$==$$=$$$=$$=$=$*>[^^^]^VV^VZV[^ZVfZK|B==$$$=$=$x=$$==$$$$;bVV]VV]VV]V]VV]]VV]snB$$$=$=$=$$$$=$$$=$$0D]]]V]]K]]V]V]]KV]]Zg B=$=$=$$$===$$==$$$-bHKV]VVVVK]V]VVV]VV]n@=$$=$$$$B$$=$$$=$,?H]]]K]]]]]K]H]]]K]]n B$=$$$=px=$=$=$$'CXK]K]HH]K]]K]HK]]Kff=$=$=$=$p$==$$$=$$*D]]]H]]]]H]HH]]]]]K]] ==$=$=$$=$$=$$=$=$=$$$-bXHH]HKH]]]]]HHH]H]fc$=$=$$$=$$==$=$$=$$$=$0>]H]]]]]]]HH]H]]]K]fS=B=$$==$=$$$$$=$$=$=$$'1HgHgHgKXH]]HXHXX]HcO$x$$$=$$=$==$==$=$$=$$->gXAXAXAAg]]H]g]XXH)p=$$$=$$$$$$$$$=$$=$-?HgHgHgHgH]g]fHAH] ppBB=============7Snnnnngcc 6xŽJ  @_/(0`    8 W ###''')))''''''((()))))))))))))))))))))))))))(((=[BbEgEgEgEgEgEgEgEgDdA^AbEd@`:W5NW7 A'''LLLbbbooouuuzzz}}}\acccccccccca_]XQEu4>\  @  K@@@mmmtttlllgggdddbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___39<<<<<<<<<<<<=@BHSMd& E+++hhhfff^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[-366666666666666666@EGgt( 8rVVVbbb^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[-3666666666666666666;5+?j"""^^^aaa^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[-366666666666666666689;V&&&ccc___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[,25555555555555555557B`(((eee___^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[,25555555555555555557>Ca'''fff___^^^^^^^^^www^^^^^^^^^oooaaawww^^^^^^^^^^^^[[[,25555555555555555557?Ca(((fff___^^^^^^^^^^^^^^^^^^^^^^^^nnn^^^^^^^^^^^^^^^[[[,25555555555555555557?Ca(((fff___^^^^^^^^^^^^^^^^^^^^^^^^^^^fff^^^^^^^^^^^^^^^[[[+14444444444444444446>Ca(((fff___^^^^^^^^^nnn^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[+14444444444444444446>Ca(((fff___^^^^^^^^^|||^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[+14444444444444444446>C`(((fff___^^^^^^^^^fff^^^^^^^^^^^^^^^aaa^^^^^^^^^^^^^^^[[[+14444444444444444445>C`(((fff___^^^^^^^^^^^^~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[+03333333333333333334=C`(((fff___^^^^^^^^^^^^dddooo^^^^^^___^^^^^^^^^^^^^^^[[[+03333333333333333334=C`(((fff___^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^[[[+03339UUUUUUUUUUK3334=C`(((fff___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[+0333]3334=C`(((fff___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[+0333Y޷3334=C`(((fff___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[[[*/2222222222222222223>>ہqqqddd___[[[XXXVVVVVVSSSRRRRRRSSSVVVVVVVVVVVVVVVVVVRRR1588888888888==>HVslk*3, RRRnnnƌ̍̍̍̍̍̍̍̍̍̍ʋƆăzp[@E]*#Fx ### B[B[B[B[B[B[B[B[B[B[B[B[B]GbE\>X:Ow%E"(          "$%%'''()))))*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)))))('''%%$"   "%') @444b===BBBEEEEEEGGGIIIJJJJJJJJJKKKLLLKKKKKKKKKLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKn'p'r(s)u)w*y*z+|,~,-..................................................................---,--~-~-|,z*x)u(q'f%}V _5M?)'%"  "',,,L@@@FFFIIIKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKn'p'r(s)u)w*y*z+|,~,-..................................................................................-}+v)i(HgJ'#  $,,,LAAAIIIKKKKKKKKKKKKKKKMMMOOOQQQTTTUUUVVVXXXYYYZZZZZZ[[[[[[]]]]]]]]]]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^11233456778999999999999999999999999999999999999999999999999999999999999999999888877776543310......-s)KoN%  #///RIIIKKKKKKKKKNNNRRRVVVZZZ]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^1123345677899999999999999999999999999999999999999999999999999999999999999999999999999999999998742/...z,P sP#  .EEEMMMKKKNNNTTT[[[^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^1123345677899999999999999999999999999999999999999999999999999999999999999999999999999999999999999973/..w* &/  +++BIIIKKKNNNXXX^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^112334567789999999999999999999999999999999999999999999999999999999999999999999999999999999999999999995/.|,D^D  +++BJJJLLLWWW^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^11233456778999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999994.,@^D  ,IIIMMMZZZ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^112334567789999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997/~-!2.  FFFNNN]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^1123345677899999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998/v+  222QMMM[[[^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^11233456778999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997.L!mT  GGGWWW^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^112334567789999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999994{,  000KOOO^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^112334567789999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999/L$mM  FFFYYY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^1123345677899999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999995r+  NNN^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^1123345677899999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999/  000JVVV^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^11233456778999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999993H$eN  BBB\\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^00123345667888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888886i*  KKK^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^00123345667888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888{,  QQQ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^001233456678888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888880  !XXX^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^001233456678888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888883"  +++<[[[^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^001233456678888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888885@$X@  ;;;_^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^001233456678888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888887]%`  EEE}^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^001233456678888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888n){  LLL^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^001233456678888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888|.  QQQ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^001233456678888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/ž  SSS^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0012334566788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888883Ϋ  UUU^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0012334566788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888882Թ  XXX^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0012334566788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888883  YYY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0012334566788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888885  [[[^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0012334566788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888885  [[[^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0012334566788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888885  ]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777774  \\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777775  ]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777776  ]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777776  ___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777776  ___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ddd^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^rrr___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^eeeppp^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ooo^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^jjj^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^kkk^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|||^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ssshhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^www^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ggg^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^bbb^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^fffyyy^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^aaasss^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//01223455677777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^jjjggg^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^lllfff^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^lllsss^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^bbb^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^fffooo^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^bbb^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^bbb^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^aaavvv^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^lll^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^www^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^iii^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^lll^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^sss^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^qqq^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.//0122344566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^bbb^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^mmm^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ccc^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^mmm^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^uuu^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^______^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ggg^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^{{{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^uuu^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ppp^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ccc^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-.//011233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ccc^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^yyy^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^eee^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ggg^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ppp^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^eee^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^aaa^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|||^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|||^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^zzz^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^aaa___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___hhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^aaa^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^aaa^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^rrr^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhhwww^^^^^^^^^^^^^^^^^^^^^^^^ooo___^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^wwwhhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^rrrggg^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___sss^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```uuuooo^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,-../00122344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//011233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//011233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//011233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//011233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//011233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//011233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//01123333333333333333q3333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,--.//011233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++,--../00122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//01111111111111111o1111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM**+,,-..//011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOOOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMcccTTTMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMccc{{{MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMrrrMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMppp```MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMbbbMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMTTTtttMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMrrrMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMvvvMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMkkkMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMhhhMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmmmYYYMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\\\MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMPPPMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM]]]dddRRRSSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM___MMMMMM|||MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmmmQQQMMMMMMMMMMMMjjjNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM]]]wwwMMMMMMMMMMMMjjjnnnMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMgggrrrYYYMMMMMMMMMMMMMMMMMMMMMMMMjjjMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmmmSSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMuuuxxxMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM```MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMdddMMMMMMMMMMMMMMMMMMMMMMMMvvvMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM))*++,--../00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNRRRMMMMMMMMMMMMMMMMMMMMMMMM]]]MMMMMMMMMMMMMMMMMMMMMMMMMMMNNNUUUMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMYYYMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMyyyMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMfffRRRMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMhhhMMMMMMMMMMMMMMMMMMfffMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMRRRSSSMMMMMMMMMMMM]]]NNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMlllMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNhhhMMMMMMmmmMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM```SSS]]]OOOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWsssMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMyyyRRRMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM())**+,,-../////////////////////////////////////////////////////////////////////////////////////////////////////  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM{{{MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNYYYMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMlllMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMaaaMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMcccMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMYYYTTTMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM```MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMqqqlllMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSSSMMMMMMSSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'(())*++,--.....................................................................................................  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMyyyzzzMMMMMMMMMjjjMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,-----------------------------------------------------------------------------------------------------  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMZZZMMMMMMMMMMMM```MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,-----------------------------------------------------------------------------------------------------  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNSSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,-----------------------------------------------------------------------------------------------------  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWMMMMMMMMMMMMMMMMMM[[[PPPMMMMMMMMMMMMMMMMMMMMM```ppp\\\MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,-----------------------------------------------------------------------------------------------------  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMoooSSSMMMMMMMMMQQQWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,-----------------------------------------------------------------------------------------------------  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMaaaMMMMMMMMMMMMMMMMMMMMMMMMyyyMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------.  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVVVUUUMMMMMMMMMMMMMMMMMMMMMMMMtttMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMsssMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------.  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM___NNNMMMOOOzzzMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------.  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMwwwMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------.  LLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXXXNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNN{{{MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------.  NNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------.  NNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMPPPvvvMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM[[[]]]MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------/  OOOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMQQQooommmMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSSSuuuMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------0  OOOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------1  OOOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM&'(())*++,,----------------------------------------------------------------------------------------------------0  OOOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/  PPPMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3  RRRMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6  SSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7  RRRMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7λ  QQQMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8ȭ  VVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=Ơ  [[[MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,B  ]]]yMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,G}  aaa\NNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/Ga  TTT:UUUMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:X6m=  ___MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,E   dddMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,J  iiiMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Sΰ  pppSSSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%&''(()**++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8R  \\\EeeeMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM%%&&''())**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Mhmmmzuuu|||ڂjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjheگ]׭Tz}C=  LLL/bbbSkkkwqqqtttvvvyyy{{{}}}|||遁􁁁􁁁􂂂jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiiffe޶dݵcв`^ٳ\֣ZГTvJSl9-      ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????qalculate-qt-5.5.1/data/scalable/000077500000000000000000000000001475705355700166205ustar00rootroot00000000000000qalculate-qt-5.5.1/data/scalable/calendars-dark.svg000066400000000000000000000012361475705355700222160ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/calendars.svg000066400000000000000000000012361475705355700212770ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/configure-dark.svg000066400000000000000000000013301475705355700222360ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/configure.svg000066400000000000000000000032151475705355700213230ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/convert-dark.svg000066400000000000000000000104031475705355700217360ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/convert.svg000066400000000000000000000103761475705355700210300ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/document-edit-dark.svg000066400000000000000000000010131475705355700230140ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/document-edit.svg000066400000000000000000000010131475705355700220750ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/document-open-dark.svg000066400000000000000000000006071475705355700230400ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/document-open.svg000066400000000000000000000006071475705355700221210ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/document-save-dark.svg000066400000000000000000000012311475705355700230270ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/document-save.svg000066400000000000000000000025011475705355700221110ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-clear-dark.svg000066400000000000000000000025751475705355700223020ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-clear.svg000066400000000000000000000025671475705355700213640ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-copy-dark.svg000066400000000000000000000010261475705355700221540ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-copy.svg000066400000000000000000000010261475705355700212350ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-delete-dark.svg000066400000000000000000000023371475705355700224520ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-delete.svg000066400000000000000000000023321475705355700215260ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-find-dark.svg000066400000000000000000000026761475705355700221360ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-find.svg000066400000000000000000000026611475705355700212110ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-paste-dark.svg000066400000000000000000000011441475705355700223170ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-paste.svg000066400000000000000000000011441475705355700214000ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-undo-dark.svg000066400000000000000000000025731475705355700221570ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/edit-undo.svg000066400000000000000000000025561475705355700212410ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/function-dark.svg000066400000000000000000000027271475705355700221150ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/function.svg000066400000000000000000000027211475705355700211700ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-back-dark.svg000066400000000000000000000110631475705355700215640ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-back.svg000066400000000000000000000113451475705355700206500ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-down-dark.svg000066400000000000000000000022341475705355700216330ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-down.svg000066400000000000000000000022271475705355700207160ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-forward-dark.svg000066400000000000000000000110111475705355700223210ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-forward.svg000066400000000000000000000112701475705355700214110ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-up-dark.svg000066400000000000000000000022301475705355700213040ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/go-up.svg000066400000000000000000000022251475705355700203710ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/input-dialpad-dark.svg000066400000000000000000000033301475705355700230120ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/input-dialpad.svg000066400000000000000000000033461475705355700221020ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/number-bases-dark.svg000066400000000000000000000101771475705355700226510ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/number-bases.svg000066400000000000000000000103711475705355700217260ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/open-menu-dark.svg000066400000000000000000000007461475705355700221720ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/open-menu.svg000066400000000000000000000022441475705355700212460ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/percentage-dark.svg000066400000000000000000000016641475705355700224040ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/percentage.svg000066400000000000000000000016641475705355700214650ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/plot-dark.svg000066400000000000000000000021371475705355700212410ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/plot.svg000066400000000000000000000021371475705355700203220ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/qalculate-qt.svg000066400000000000000000000221421475705355700217370ustar00rootroot00000000000000 Yaru Icon Theme Template image/svg+xml Yaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu James Yaru Icon Theme Template image/svg+xml apps calculator-app qalculate-qt-5.5.1/data/scalable/rpn-swap-dark.svg000066400000000000000000000053001475705355700220250ustar00rootroot00000000000000 image/svg+xml qalculate-qt-5.5.1/data/scalable/rpn-swap.svg000066400000000000000000000052731475705355700211170ustar00rootroot00000000000000 image/svg+xml qalculate-qt-5.5.1/data/scalable/table-dark.svg000066400000000000000000000027251475705355700213550ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/table.svg000066400000000000000000000027761475705355700204440ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/units-dark.svg000066400000000000000000000045011475705355700214220ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/units.svg000066400000000000000000000047351475705355700205140ustar00rootroot00000000000000 qalculate-qt-5.5.1/data/scalable/warning.svg000066400000000000000000000030011475705355700210000ustar00rootroot00000000000000 qalculate-qt-5.5.1/flags.qrc000066400000000000000000000132341475705355700157470ustar00rootroot00000000000000 data/flags/AED.png data/flags/AFN.png data/flags/ALL.png data/flags/AMD.png data/flags/ANG.png data/flags/AOA.png data/flags/ARS.png data/flags/ATS.png data/flags/AUD.png data/flags/AWG.png data/flags/AZN.png data/flags/BAM.png data/flags/BBD.png data/flags/BDT.png data/flags/BEF.png data/flags/BGN.png data/flags/BHD.png data/flags/BIF.png data/flags/BMD.png data/flags/BND.png data/flags/BOB.png data/flags/BRL.png data/flags/BSD.png data/flags/BTC.png data/flags/BWP.png data/flags/BZD.png data/flags/CAD.png data/flags/CDF.png data/flags/cent.png data/flags/CHF.png data/flags/CLP.png data/flags/CNY.png data/flags/COP.png data/flags/CRC.png data/flags/CUP.png data/flags/CVE.png data/flags/CYP.png data/flags/CZK.png data/flags/DEM.png data/flags/DJF.png data/flags/DKK.png data/flags/DOP.png data/flags/DZD.png data/flags/EEK.png data/flags/EGP.png data/flags/ERN.png data/flags/ESP.png data/flags/ETB.png data/flags/eurocent.png data/flags/EUR.png data/flags/FIM.png data/flags/FJD.png data/flags/FKP.png data/flags/FRF.png data/flags/GBP.png data/flags/GEL.png data/flags/GGP.png data/flags/GHS.png data/flags/GIP.png data/flags/GMD.png data/flags/GNF.png data/flags/GRD.png data/flags/GTQ.png data/flags/GYD.png data/flags/HKD.png data/flags/HNL.png data/flags/HRK.png data/flags/HTG.png data/flags/HUF.png data/flags/IDR.png data/flags/IEP.png data/flags/ILS.png data/flags/INR.png data/flags/IQD.png data/flags/IRR.png data/flags/ISK.png data/flags/ITL.png data/flags/JMD.png data/flags/JOD.png data/flags/JPY.png data/flags/KES.png data/flags/KGS.png data/flags/KHR.png data/flags/KMF.png data/flags/KPW.png data/flags/KRW.png data/flags/KWD.png data/flags/KYD.png data/flags/KZT.png data/flags/LAK.png data/flags/LBP.png data/flags/LKR.png data/flags/LRD.png data/flags/LSL.png data/flags/LTL.png data/flags/LUF.png data/flags/LVL.png data/flags/LYD.png data/flags/MAD.png data/flags/MDL.png data/flags/MGA.png data/flags/MKD.png data/flags/MMK.png data/flags/MNT.png data/flags/MOP.png data/flags/MRO.png data/flags/MRU.png data/flags/MTL.png data/flags/MUR.png data/flags/MWK.png data/flags/MVR.png data/flags/MXN.png data/flags/MYR.png data/flags/MZN.png data/flags/NAD.png data/flags/NGN.png data/flags/NIO.png data/flags/NLG.png data/flags/NOK.png data/flags/NPR.png data/flags/NZD.png data/flags/OMR.png data/flags/PAB.png data/flags/PEN.png data/flags/PGK.png data/flags/PHP.png data/flags/PKR.png data/flags/PLN.png data/flags/PTE.png data/flags/PYG.png data/flags/QAR.png data/flags/RON.png data/flags/RSD.png data/flags/RWF.png data/flags/SAR.png data/flags/SBD.png data/flags/SCR.png data/flags/SDG.png data/flags/SEK.png data/flags/SGD.png data/flags/SIT.png data/flags/SKK.png data/flags/SLL.png data/flags/SOS.png data/flags/SRD.png data/flags/STD.png data/flags/SVC.png data/flags/SYP.png data/flags/SZL.png data/flags/THB.png data/flags/TJS.png data/flags/TMT.png data/flags/TND.png data/flags/TOP.png data/flags/TRY.png data/flags/TTD.png data/flags/TWD.png data/flags/TZS.png data/flags/UAH.png data/flags/UGX.png data/flags/USD.png data/flags/UYU.png data/flags/UZS.png data/flags/VEF.png data/flags/VES.png data/flags/VND.png data/flags/VUV.png data/flags/XAF.png data/flags/XCD.png data/flags/XOF.png data/flags/XPF.png data/flags/YER.png data/flags/ZAR.png data/flags/ZMK.png data/flags/ZMW.png qalculate-qt-5.5.1/icons.qrc000066400000000000000000000116751475705355700157750ustar00rootroot00000000000000 data/scalable/qalculate-qt.svg data/scalable/calendars.svg data/scalable/configure.svg data/scalable/convert.svg data/scalable/document-edit.svg data/scalable/document-open.svg data/scalable/document-save.svg data/scalable/edit-clear.svg data/scalable/edit-copy.svg data/scalable/edit-delete.svg data/scalable/edit-find.svg data/scalable/edit-paste.svg data/scalable/edit-undo.svg data/scalable/go-back.svg data/scalable/go-down.svg data/scalable/go-forward.svg data/scalable/go-up.svg data/scalable/function.svg data/scalable/input-dialpad.svg data/scalable/number-bases.svg data/scalable/open-menu.svg data/scalable/percentage.svg data/scalable/plot.svg data/scalable/rpn-swap.svg data/scalable/table.svg data/scalable/units.svg data/scalable/warning.svg data/scalable/calendars-dark.svg data/scalable/configure-dark.svg data/scalable/convert-dark.svg data/scalable/document-edit-dark.svg data/scalable/document-open-dark.svg data/scalable/document-save-dark.svg data/scalable/edit-clear-dark.svg data/scalable/edit-copy-dark.svg data/scalable/edit-delete-dark.svg data/scalable/edit-find-dark.svg data/scalable/edit-paste-dark.svg data/scalable/edit-undo-dark.svg data/scalable/go-back-dark.svg data/scalable/go-down-dark.svg data/scalable/go-forward-dark.svg data/scalable/go-up-dark.svg data/scalable/function-dark.svg data/scalable/input-dialpad-dark.svg data/scalable/number-bases-dark.svg data/scalable/open-menu-dark.svg data/scalable/percentage-dark.svg data/scalable/plot-dark.svg data/scalable/rpn-swap-dark.svg data/scalable/table-dark.svg data/scalable/units-dark.svg data/scalable/warning.svg data/16/qalculate-qt.png data/22/qalculate-qt.png data/32/qalculate-qt.png data/48/qalculate-qt.png data/64/qalculate-qt.png data/128/qalculate-qt.png qalculate-qt-5.5.1/qalculate-qt.pro000066400000000000000000000103411475705355700172570ustar00rootroot00000000000000VERSION = 5.5.1 isEmpty(PREFIX) { PREFIX = /usr/local } isEmpty(BINDIR) { BINDIR = $$PREFIX/bin } isEmpty(DESKTOP_DIR) { DESKTOP_DIR = $$PREFIX/share/applications } isEmpty(DESKTOP_ICON_DIR) { DESKTOP_ICON_DIR = $$PREFIX/share/icons } unix:!equals(COMPILE_RESOURCES,"yes"):!android:!macx { isEmpty(TRANSLATIONS_DIR) { TRANSLATIONS_DIR = $$PREFIX/share/qalculate-qt/translations } DEFINES += TRANSLATIONS_DIR=\\\"$$TRANSLATIONS_DIR\\\" } isEmpty(MAN_DIR) { MAN_DIR = $$PREFIX/share/man } isEmpty(APPDATA_DIR) { APPDATA_DIR = $$PREFIX/share/metainfo } TEMPLATE = app TARGET = qalculate-qt INCLUDEPATH += src win32: { LIBS += -lqalculate -lxml2 -lmpfr -liconv -lintl -lgmp -licuuc -lcurl CONFIG += c++17 } else { CONFIG += link_pkgconfig macx: { PKGCONFIG += libqalculate gmp mpfr CONFIG += c++11 } else { PKGCONFIG += libqalculate } } CONFIG += qt QT += widgets network MOC_DIR = build OBJECTS_DIR = build HEADERS += src/calendarconversiondialog.h src/csvdialog.h src/dataseteditdialog.h src/datasetsdialog.h src/expressionedit.h src/fpconversiondialog.h src/functioneditdialog.h src/functionsdialog.h src/historyview.h src/itemproxymodel.h src/keypadwidget.h src/matrixwidget.h src/percentagecalculationdialog.h src/periodictabledialog.h src/plotdialog.h src/preferencesdialog.h src/qalculateqtsettings.h src/qalculatewindow.h src/unitsdialog.h src/uniteditdialog.h src/unknowneditdialog.h src/variableeditdialog.h src/variablesdialog.h SOURCES += src/calendarconversiondialog.cpp src/csvdialog.cpp src/dataseteditdialog.cpp src/datasetsdialog.cpp src/expressionedit.cpp src/fpconversiondialog.cpp src/functioneditdialog.cpp src/functionsdialog.cpp src/historyview.cpp src/itemproxymodel.cpp src/keypadwidget.cpp src/main.cpp src/matrixwidget.cpp src/percentagecalculationdialog.cpp src/periodictabledialog.cpp src/plotdialog.cpp src/preferencesdialog.cpp src/qalculateqtsettings.cpp src/qalculatewindow.cpp src/unitsdialog.cpp src/uniteditdialog.cpp src/unknowneditdialog.cpp src/variableeditdialog.cpp src/variablesdialog.cpp LANGUAGES = ca de en es fr nl pt_BR pt_PT ru sl sv zh_CN #parameters: var, prepend, append defineReplace(prependAll) { for(a,$$1):result += $$2$${a}$$3 return($$result) } !win32 { TRANSLATIONS = $$prependAll(LANGUAGES, $$PWD/translations/qalculate-qt_, .ts) TRANSLATIONS_FILES = qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { qmfile = $$shadowed($$tsfile) qmfile ~= s,.ts$,.qm, qmdir = $$dirname(qmfile) exists($$qmdir) { mkpath($$qmdir)|error("Aborting.") } command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile system($$command)|error("Failed to run: $$command") TRANSLATIONS_FILES += $$qmfile } } unix:!equals(COMPILE_RESOURCES,"yes"):!android:!macx { target.path = $$BINDIR qm.files = $$prependAll(LANGUAGES, $$PWD/translations/qalculate-qt_, .qm) qm.path = $$TRANSLATIONS_DIR desktop.files = data/io.github.Qalculate.qalculate-qt.desktop desktop.path = $$DESKTOP_DIR appdata.files = data/io.github.Qalculate.qalculate-qt.metainfo.xml appdata.path = $$APPDATA_DIR appicon16.files = data/16/qalculate-qt.png appicon16.path = $$DESKTOP_ICON_DIR/hicolor/16x16/apps appicon22.files = data/22/qalculate-qt.png appicon22.path = $$DESKTOP_ICON_DIR/hicolor/22x22/apps appicon32.files = data/32/qalculate-qt.png appicon32.path = $$DESKTOP_ICON_DIR/hicolor/32x32/apps appicon64.files = data/64/qalculate-qt.png appicon64.path = $$DESKTOP_ICON_DIR/hicolor/64x64/apps appicon128.files = data/128/qalculate-qt.png appicon128.path = $$DESKTOP_ICON_DIR/hicolor/128x128/apps appiconsvg.files = data/scalable/qalculate-qt.svg appiconsvg.path = $$DESKTOP_ICON_DIR/hicolor/scalable/apps INSTALLS += target desktop appdata qm \ appicon16 appicon22 appicon32 appicon64 appicon128 appiconsvg RESOURCES = icons.qrc flags.qrc } else { RESOURCES = icons.qrc flags.qrc translations.qrc target.path = $$BINDIR desktop.files = data/io.github.Qalculate.qalculate-qt.desktop desktop.path = $$DESKTOP_DIR appicon64.files = data/64/qalculate-qt.png appicon64.path = $$DESKTOP_ICON_DIR/hicolor/64x64/apps INSTALLS += target desktop appicon64 } unix:!android:!macx { man.files = data/qalculate-qt.1 man.path = $$MAN_DIR/man1 INSTALLS += man } macx: ICON = data/qalculate.icns win32: RC_FILE = winicon.rc qalculate-qt-5.5.1/snap/000077500000000000000000000000001475705355700151025ustar00rootroot00000000000000qalculate-qt-5.5.1/snap/gui/000077500000000000000000000000001475705355700156665ustar00rootroot00000000000000qalculate-qt-5.5.1/snap/gui/qalculate.desktop000066400000000000000000000035371475705355700212440ustar00rootroot00000000000000[Desktop Entry] Name=Qalculate! (Qt) GenericName=Calculator GenericName[ca]=Calculadora GenericName[de]=Taschenrechner GenericName[es]=Calculadora GenericName[fr]=Calculatrice GenericName[pt_BR]=Calculadora GenericName[pt_PT]=Calculadora GenericName[ru]=Калькулятор GenericName[sl]=Računalo GenericName[sv]=Kalkylator GenericName[zh_CN]=计算器 Comment=Powerful and easy to use calculator Comment[ca]=Calculadora poderosa i fàcil a usar Comment[de]=Leistungsstarker und einfach zu bedienender Taschenrechner Comment[es]=Calculadora poderosa y fácil de usar Comment[fr]=Une calculatrice puissante et facile d'utilisation Comment[nl]=Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Comment[pt_BR]=Calculadora potente e fácil de usar Comment[pt_PT]=Calculadora poderosa e fácil de usar Comment[ru]=Мощный и простой в использовании калькулятор Comment[sl]=Zmogljivo računalo, preprosto za uporabo Comment[sv]=Kraftfull och användarvänlig miniräknare Comment[zh_CN]=强大而易用的计算器 Exec=qalculate-qt Icon=${SNAP}/meta/gui/qalculate.svg Terminal=false Type=Application StartupNotify=true StartupWMClass=qalculate-qt Categories=Qt;Utility;Calculator;Education;Science;Math; Keywords=calculation;arithmetic;scientific;financial; Keywords[ca]=calculation;arithmetic;scientific;financial; Keywords[de]=Berechnung;Arithmetik;Wissenschaft;Finanzen; Keywords[es]=calculadora;aritmética;científica;financiera; Keywords[fr]=calcul;arithmétique;scientifique;financier; Keywords[pt_BR]=calculadora;aritmética;científica;financeira; Keywords[pt_PT]=calculadora;aritmética;científica;financeira; Keywords[ru]=расчёт;расчет;арифметика;научный;финансовый Keywords[sl]=izračun;aritmetika;znanstveno;finančno;računalo;kalkulator; Keywords[zh_CN]=计算;算术;科学;金融; qalculate-qt-5.5.1/snap/gui/qalculate.svg000066400000000000000000000245461475705355700203750ustar00rootroot00000000000000 Yaru Icon Theme Template image/svg+xml Yaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu James Yaru Icon Theme Template image/svg+xml apps qalculate qalculate-qt-5.5.1/snap/snapcraft.yaml000066400000000000000000000074121475705355700177530ustar00rootroot00000000000000name: qalculate-qt title: Qalculate! (Qt) version: '5.5.1' license: GPL-2.0+ summary: The ultimate desktop calculator description: | Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. grade: stable confinement: strict base: core18 compression: lzo apps: qalc: environment: GNUPLOT_DRIVER_DIR: $SNAP/libexec/gnuplot/5.2 command: desktop-launch qalc extensions: [kde-neon] plugs: [network, home, removable-media] qalculate-qt: environment: GNUPLOT_DRIVER_DIR: $SNAP/libexec/gnuplot/5.2 command: desktop-launch $SNAP/usr/local/bin/qalculate-qt extensions: [kde-neon] plugs: [unity7, gsettings, network, home, removable-media] gnuplot: environment: GNUPLOT_DRIVER_DIR: $SNAP/libexec/gnuplot/5.2 command: desktop-launch gnuplot extensions: [kde-neon] plugs: [unity7, gsettings, home, removable-media] parts: libqalculate: source: https://github.com/Qalculate/libqalculate.git source-tag: v5.5.1 source-depth: 1 plugin: autotools build-environment: - CXXFLAGS: "$CXXFLAGS -fsigned-char" build-packages: - libncurses5-dev - libreadline-dev - libcurl4-gnutls-dev - libicu-dev - libxml2-dev - libgmp-dev - libmpfr-dev - intltool - doxygen stage-packages: - libmpfr6 - libgmp10 override-build: | cat $SNAPCRAFT_STAGE/qalculate-snap/patches/lib/snap-path.patch | patch -p1 ./autogen.sh snapcraftctl build echo Stripping qalc strip $SNAPCRAFT_PART_INSTALL/bin/qalc after: - patches prime: - -include - -lib/pkgconfig - -lib/*.a - -share/doc - -usr/share/doc - -usr/share/lintian qalculate-qt: source: https://github.com/Qalculate/qalculate-qt/releases/download/v5.5.1/qalculate-qt-5.5.1.tar.gz source-checksum: sha512/b656ba130a72a136f28c7c43840776a1f6a6e114032035fca35ceff5a0583686a97dd556f9f58802bc5601560190f506aab4425794cff0358454d41971269aea plugin: qmake build-snaps: - kde-frameworks-5-core18-sdk build-packages: - libgmp-dev - libxml2-dev - qttools5-dev-tools after: - libqalculate - patches prime: - -share/applications gnuplot: source: https://sourceforge.net/projects/gnuplot/files/gnuplot/5.2.8/gnuplot-5.2.8.tar.gz source-checksum: sha512/513dff15236dcb58c3c5471cdaa0713242787dbf30ef860c3f69152cb87c6392e4973caff5eb178707bbb84c78548e806b2920864a37686bce49425fbfdc4e8c plugin: autotools configflags: - --without-gd - --without-libcerf - --without-linux-vga - --without-lua - --with-readline=gnu - --with-qt build-snaps: - kde-frameworks-5-core18-sdk build-packages: - libqt5svg5-dev - qttools5-dev-tools prime: - -share/applications - -share/doc - -share/man override-build: | snapcraftctl build echo Stripping gnuplot strip $SNAPCRAFT_PART_INSTALL/bin/gnuplot strip $SNAPCRAFT_PART_INSTALL/libexec/gnuplot/5.2/gnuplot_x11 strip $SNAPCRAFT_PART_INSTALL/libexec/gnuplot/5.2/gnuplot_qt patches: source: https://github.com/Qalculate/qalculate-snap.git source-depth: 1 plugin: dump organize: "*": qalculate-snap/ prime: - -* qalculate-qt-5.5.1/src/000077500000000000000000000000001475705355700147305ustar00rootroot00000000000000qalculate-qt-5.5.1/src/calendarconversiondialog.cpp000066400000000000000000000155221475705355700225000ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "calendarconversiondialog.h" CalendarConversionDialog::CalendarConversionDialog(QWidget *parent) : QDialog(parent), block_calendar_conversion(false) { setWindowTitle(tr("Calendar Conversion")); QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); CalendarSystem cs; QString str; for(int i = 0; i < 10; i++) { switch(i) { case 0: {str = tr("Gregorian"); cs = CALENDAR_GREGORIAN; break;} case 1: {str = tr("Hebrew"); cs = CALENDAR_HEBREW; break;} case 2: {str = tr("Islamic (Hijri)"); cs = CALENDAR_ISLAMIC; break;} case 3: {str = tr("Persian (Solar Hijri)"); cs = CALENDAR_PERSIAN; break;} case 4: {str = tr("Indian (National)"); cs = CALENDAR_INDIAN; break;} case 5: {str = tr("Chinese"); cs = CALENDAR_CHINESE; break;} case 6: {str = tr("Julian"); cs = CALENDAR_JULIAN; break;} case 7: {str = tr("Revised Julian (Milanković)"); cs = CALENDAR_MILANKOVIC; break;} case 8: {str = tr("Coptic"); cs = CALENDAR_COPTIC; break;} case 9: {str = tr("Ethiopian"); cs = CALENDAR_ETHIOPIAN; break;} } grid->addWidget(new QLabel(str, this), i, 0); if(cs == CALENDAR_CHINESE) { chineseStemCombo = new QComboBox(this); chineseBranchCombo = new QComboBox(this); chineseStemCombo->setProperty("QALCULATE INDEX", i); chineseStemCombo->setProperty("QALCULATE CALENDAR", cs); chineseBranchCombo->setProperty("QALCULATE INDEX", i); chineseBranchCombo->setProperty("QALCULATE CALENDAR", cs); for(int i2 = 1; i2 <= 5; i2++) chineseStemCombo->addItem(QString::fromStdString(chineseStemName(i2 * 2))); for(int i2 = 1; i2 <= 12; i2++) chineseBranchCombo->addItem(QString::fromStdString(chineseBranchName(i2))); grid->addWidget(chineseStemCombo, i, 1); grid->addWidget(chineseBranchCombo, i, 2); connect(chineseStemCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); connect(chineseBranchCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); } else { yearEdit[i] = new QSpinBox(this); yearEdit[i]->setRange(INT_MIN, INT_MAX); yearEdit[i]->setProperty("QALCULATE INDEX", i); yearEdit[i]->setProperty("QALCULATE CALENDAR", cs); yearEdit[i]->setAlignment(Qt::AlignRight); grid->addWidget(yearEdit[i], i, 1, 1, 2); connect(yearEdit[i], SIGNAL(valueChanged(int)), this, SLOT(updateCalendars())); } monthCombo[i] = new QComboBox(this); dayCombo[i] = new QComboBox(this); for(int i2 = 1; i2 <= numberOfMonths(cs); i2++) monthCombo[i]->addItem(QString::fromStdString(monthName(i2, cs))); for(int i2 = 1; i2 <= 31; i2++) dayCombo[i]->addItem(QString::number(i2)); monthCombo[i]->setProperty("QALCULATE INDEX", i); monthCombo[i]->setProperty("QALCULATE CALENDAR", cs); dayCombo[i]->setProperty("QALCULATE INDEX", i); dayCombo[i]->setProperty("QALCULATE CALENDAR", cs); grid->addWidget(monthCombo[i], i, 3); grid->addWidget(dayCombo[i], i, 4); connect(monthCombo[i], SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); connect(dayCombo[i], SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); } box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); } CalendarConversionDialog::~CalendarConversionDialog() {} void CalendarConversionDialog::updateCalendars() { if(block_calendar_conversion) return; block_calendar_conversion = true; int index = sender()->property("QALCULATE INDEX").toInt(); CalendarSystem cs = (CalendarSystem) sender()->property("QALCULATE CALENDAR").toInt(); long int y; if(cs == CALENDAR_CHINESE) { long int cy = chineseStemBranchToCycleYear((chineseStemCombo->currentIndex() * 2) + 1, chineseBranchCombo->currentIndex() + 1); if(cy <= 0) { QMessageBox::critical(this, tr("Error"), tr("The selected Chinese year does not exist.")); block_calendar_conversion = false; return; } y = chineseCycleYearToYear(79, cy); } else { y = yearEdit[index]->value(); } long int m = monthCombo[index]->currentIndex() + 1; long int d = dayCombo[index]->currentIndex() + 1; QalculateDateTime date; if(!calendarToDate(date, y, m, d, cs)) { QMessageBox::critical(this, tr("Error"), tr("Conversion to Gregorian calendar failed.")); block_calendar_conversion = false; return; } QString failed_str; for(int i = 0; i < 10; i++) { switch(i) { case 0: {cs = CALENDAR_GREGORIAN; break;} case 1: {cs = CALENDAR_HEBREW; break;} case 2: {cs = CALENDAR_ISLAMIC; break;} case 3: {cs = CALENDAR_PERSIAN; break;} case 4: {cs = CALENDAR_INDIAN; break;} case 5: {cs = CALENDAR_CHINESE; break;} case 6: {cs = CALENDAR_JULIAN; break;} case 7: {cs = CALENDAR_MILANKOVIC; break;} case 8: {cs = CALENDAR_COPTIC; break;} case 9: {cs = CALENDAR_ETHIOPIAN; break;} } if(dateToCalendar(date, y, m, d, cs) && y <= INT_MAX && y >= INT_MIN && m <= numberOfMonths(cs) && d <= 31) { if(cs == CALENDAR_CHINESE) { long int cy, yc, st, br; chineseYearInfo(y, cy, yc, st, br); chineseStemCombo->setCurrentIndex((st - 1) / 2); chineseBranchCombo->setCurrentIndex(br - 1); } else { yearEdit[i]->setValue(y); } monthCombo[i]->setCurrentIndex(m - 1); dayCombo[i]->setCurrentIndex(d - 1); } else { if(!failed_str.isEmpty()) failed_str += ", "; switch(i) { case 0: {failed_str += tr("Gregorian"); break;} case 1: {failed_str += tr("Hebrew"); break;} case 2: {failed_str += tr("Islamic (Hijri)"); break;} case 3: {failed_str += tr("Persian (Solar Hijri)"); break;} case 4: {failed_str += tr("Indian (National)"); break;} case 5: {failed_str += tr("Chinese"); break;} case 6: {failed_str += tr("Julian"); break;} case 7: {failed_str += tr("Revised Julian (Milanković)"); break;} case 8: {failed_str += tr("Coptic"); break;} case 9: {failed_str += tr("Ethiopian"); break;} } } } if(!failed_str.isEmpty()) QMessageBox::warning(this, tr("Error"), tr("Calendar conversion failed for: %1.").arg(failed_str)); block_calendar_conversion = false; } void CalendarConversionDialog::setDate(QalculateDateTime date) { block_calendar_conversion = true; yearEdit[0]->setValue(date.year()); monthCombo[0]->setCurrentIndex(date.month() - 1); block_calendar_conversion = false; dayCombo[0]->setCurrentIndex(date.day() - 1); } qalculate-qt-5.5.1/src/calendarconversiondialog.h000066400000000000000000000017401475705355700221420ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef CALENDAR_CONVERSION_DIALOG_H #define CALENDAR_CONVERSION_DIALOG_H #include #include class QComboBox; class QSpinBox; class CalendarConversionDialog : public QDialog { Q_OBJECT protected: QSpinBox *yearEdit[10]; QComboBox *monthCombo[10], *dayCombo[10], *chineseStemCombo, *chineseBranchCombo; bool block_calendar_conversion; protected slots: void updateCalendars(); public slots: void setDate(QalculateDateTime date); public: CalendarConversionDialog(QWidget *parent = NULL); virtual ~CalendarConversionDialog(); }; #endif //CALENDAR_CONVERSION_DIALOG_H qalculate-qt-5.5.1/src/csvdialog.cpp000066400000000000000000000211241475705355700174070ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "csvdialog.h" CSVDialog::CSVDialog(bool do_import, QWidget *parent, MathStructure *current_result, KnownVariable *var) : QDialog(parent), b_import(do_import), o_variable(var), m_result(current_result) { setWindowTitle(do_import ? tr("Import CSV File") : tr("Export CSV File")); if(m_result && !m_result->isVector()) m_result = NULL; QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); int r = 0; if(!b_import) { QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); resultButton = new QRadioButton(tr("Current result"), this); group->addButton(resultButton, 0); resultButton->setChecked(m_result && !var); if(!m_result) resultButton->setEnabled(false); grid->addWidget(resultButton, r, 0); r++; variableButton = new QRadioButton(tr("Matrix/vector variable:"), this); group->addButton(variableButton, 1); variableButton->setChecked(!m_result || var); grid->addWidget(variableButton, r, 0); connect(group, SIGNAL(buttonToggled(QAbstractButton*, bool)), this, SLOT(exportTypeToggled(QAbstractButton*, bool))); nameEdit = new QLineEdit(this); if(var) nameEdit->setText(QString::fromStdString(var->name())); grid->addWidget(nameEdit, r, 1); r++; if(var) { nameEdit->hide(); variableButton->hide(); resultButton->hide(); } } grid->addWidget(new QLabel(tr("File:"), this), r, 0); fileEdit = new QLineEdit(this); QAction *action = fileEdit->addAction(LOAD_ICON("document-open"), QLineEdit::TrailingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) fileEdit->setTextMargins(0, 0, 22, 0); # endif #endif connect(action, SIGNAL(triggered()), this, SLOT(onSelectFile())); connect(fileEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFileEdited())); grid->addWidget(fileEdit, r, 1); r++; if(b_import) { grid->addWidget(new QLabel(tr("Import as"), this), r, 0); QHBoxLayout *hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 1); r++; QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); matrixButton = new QRadioButton(tr("matrix"), this); group->addButton(matrixButton); matrixButton->setChecked(true); hbox->addWidget(matrixButton); vectorButton = new QRadioButton(tr("vectors"), this); group->addButton(vectorButton); hbox->addWidget(vectorButton); hbox->addStretch(1); grid->addWidget(new QLabel(tr("Name:"), this), r, 0); nameEdit = new QLineEdit(this); grid->addWidget(nameEdit, r, 1); r++; grid->addWidget(new QLabel(tr("First row:"), this), r, 0); rowSpin = new QSpinBox(this); rowSpin->setRange(1, INT_MAX); rowSpin->setValue(1); grid->addWidget(rowSpin, r, 1); r++; headingsBox = new QCheckBox(tr("Includes headings"), this); headingsBox->setChecked(true); grid->addWidget(headingsBox, r, 1); r++; } grid->addWidget(new QLabel(tr("Delimiter:"), this), r, 0); delimiterCombo = new QComboBox(this); delimiterCombo->addItem(tr("Comma"), ","); delimiterCombo->addItem(tr("Tabulator"), "\t"); delimiterCombo->addItem(tr("Semicolon"), ";"); delimiterCombo->addItem(tr("Space"), " "); delimiterCombo->addItem(tr("Other"), QString()); grid->addWidget(delimiterCombo, r, 1); r++; connect(delimiterCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onDelimiterChanged(int))); delimiterEdit = new QLineEdit(this); delimiterEdit->setEnabled(false); grid->addWidget(delimiterEdit, r, 1); r++; connect(delimiterEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onDelimiterEdited())); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); okButton = buttonBox->button(QDialogButtonBox::Ok); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); fileEdit->setFocus(); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } CSVDialog::~CSVDialog() {} void CSVDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->variableNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(str.trimmed().toStdString()))); } enableDisableOk(); } void CSVDialog::enableDisableOk() { okButton->setEnabled(((!b_import && !variableButton->isChecked()) || !nameEdit->text().trimmed().isEmpty()) && !fileEdit->text().trimmed().isEmpty() && (!delimiterCombo->currentData().toString().isEmpty() || !delimiterEdit->text().isEmpty())); } void CSVDialog::onSelectFile() { QString str; if(b_import) str = QFileDialog::getOpenFileName(this, QString(), fileEdit->text()); else str = QFileDialog::getSaveFileName(this, QString(), fileEdit->text()); if(!str.isEmpty()) { fileEdit->setText(str); enableDisableOk(); } } void CSVDialog::exportTypeToggled(QAbstractButton *w, bool b) { if(!b) return; nameEdit->setEnabled(w == variableButton); enableDisableOk(); } void CSVDialog::onDelimiterEdited() { enableDisableOk(); } void CSVDialog::onFileEdited() { enableDisableOk(); } void CSVDialog::onDelimiterChanged(int i) { delimiterEdit->setEnabled(delimiterCombo->itemData(i).toString().isEmpty()); enableDisableOk(); } bool CSVDialog::importExport() { std::string namestr = nameEdit->text().trimmed().toStdString(); if(b_import) { if(CALCULATOR->variableNameTaken(namestr)) { if(QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } } if(!CALCULATOR->importCSV(fileEdit->text().trimmed().toLocal8Bit().data(), rowSpin->value(), headingsBox->isChecked(), delimiterCombo->currentData().toString().isEmpty() ? delimiterEdit->text().toStdString() : delimiterCombo->currentData().toString().toStdString(), matrixButton->isChecked(), namestr)) { QMessageBox::critical(this, tr("Error"), tr("Could not import from file \n%1").arg(fileEdit->text()), QMessageBox::Ok); settings->displayMessages(this); fileEdit->setFocus(); return false; } } else { const MathStructure *m; if(o_variable) { m = &o_variable->get(); } else if(resultButton->isChecked() && m_result) { m = m_result; } else { Variable *var = CALCULATOR->getActiveVariable(namestr); if(!var || !var->isKnown() || !((KnownVariable*) var)->get().isVector()) { QMessageBox::critical(this, tr("Error"), tr("No matrix or vector variable with the entered name was found."), QMessageBox::Ok); nameEdit->setFocus(); return false; } m = &((KnownVariable*) var)->get(); } CALCULATOR->startControl(600000); if(!CALCULATOR->exportCSV(*m, fileEdit->text().trimmed().toLocal8Bit().data(), delimiterCombo->currentData().toString().isEmpty() ? delimiterEdit->text().toStdString() : delimiterCombo->currentData().toString().toStdString())) { QMessageBox::critical(this, tr("Error"), tr("Could not export to file \n%1").arg(fileEdit->text()), QMessageBox::Ok); settings->displayMessages(this); fileEdit->setFocus(); CALCULATOR->stopControl(); return false; } CALCULATOR->stopControl(); } settings->displayMessages(this); return true; } bool CSVDialog::importCSVFile(QWidget *parent) { CSVDialog *d = new CSVDialog(true, parent); bool b = false; while(d->exec() == QDialog::Accepted) { if(d->importExport()) {b = true; break;} } d->deleteLater(); return b; } bool CSVDialog::exportCSVFile(QWidget *parent, MathStructure *current_result, KnownVariable *var) { CSVDialog *d = new CSVDialog(false, parent, current_result, var); bool b = false; while(d->exec() == QDialog::Accepted) { if(d->importExport()) {b = true; break;} } d->deleteLater(); return b; } qalculate-qt-5.5.1/src/csvdialog.h000066400000000000000000000030161475705355700170540ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef CSV_DIALOG_H #define CSV_DIALOG_H #include #include class QLineEdit; class QRadioButton; class QComboBox; class QCheckBox; class QSpinBox; class QPushButton; class QAbstractButton; class CSVDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *delimiterEdit, *fileEdit; QComboBox *delimiterCombo; QRadioButton *resultButton, *variableButton, *matrixButton, *vectorButton; QPushButton *okButton; QCheckBox *headingsBox; QSpinBox *rowSpin; bool b_import; KnownVariable *o_variable; MathStructure *m_result; public: CSVDialog(bool do_import, QWidget *parent = NULL, MathStructure *current_result = NULL, KnownVariable *var = NULL); virtual ~CSVDialog(); bool importExport(); static bool importCSVFile(QWidget *parent); static bool exportCSVFile(QWidget *parent, MathStructure *current_result = NULL, KnownVariable *var = NULL); protected slots: void onNameEdited(const QString&); void enableDisableOk(); void exportTypeToggled(QAbstractButton*, bool); void onSelectFile(); void onDelimiterEdited(); void onFileEdited(); void onDelimiterChanged(int); }; #endif //CSV_DIALOG_H qalculate-qt-5.5.1/src/dataseteditdialog.cpp000066400000000000000000000671451475705355700211240ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "functioneditdialog.h" #include "dataseteditdialog.h" DataPropertyEditDialog::DataPropertyEditDialog(QWidget *parent) : QDialog(parent) { o_property = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 1, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 1, 1); grid->addWidget(new QLabel(tr("Description:"), this), 2, 0, 1, 2); descriptionEdit = new SmallTextEdit(3, this); grid->addWidget(descriptionEdit, 3, 0, 1, 2); grid->addWidget(new QLabel(tr("Value type:"), this), 4, 0); typeCombo = new QComboBox(this); typeCombo->setEditable(false); typeCombo->addItem(tr("Expression"), PROPERTY_EXPRESSION); typeCombo->addItem(tr("Number"), PROPERTY_NUMBER); typeCombo->addItem(tr("Text"), PROPERTY_STRING); typeCombo->setCurrentIndex(0); grid->addWidget(typeCombo, 4, 1); grid->addWidget(new QLabel(tr("Unit expression:"), this), 5, 0); unitEdit = new MathLineEdit(this, true); grid->addWidget(unitEdit, 5, 1); keyBox = new QCheckBox(tr("Use as key"), this); grid->addWidget(keyBox, 6, 0, 1, 2); caseBox = new QCheckBox(tr("Case sensitive value"), this); grid->addWidget(caseBox, 7, 0, 1, 2); approxBox = new QCheckBox(tr("Approximate value"), this); grid->addWidget(approxBox, 8, 0, 1, 2); bracketsBox = new QCheckBox(tr("Value uses brackets"), this); grid->addWidget(bracketsBox, 9, 0, 1, 2); bracketsBox->hide(); hideBox = new QCheckBox(tr("Hide"), this); grid->addWidget(hideBox, 10, 0, 1, 2); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); nameEdit->setFocus(); typeChanged(0); connect(typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(typeChanged(int))); connect(typeCombo, SIGNAL(activated(int)), this, SLOT(onPropertyChanged())); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPropertyChanged())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onPropertyChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPropertyChanged())); connect(unitEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPropertyChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(caseBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(keyBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(approxBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(bracketsBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } DataPropertyEditDialog::~DataPropertyEditDialog() {} void DataPropertyEditDialog::typeChanged(int i) { keyBox->setEnabled(i != 0); caseBox->setEnabled(i == 2); approxBox->setEnabled(i != 2); bracketsBox->setEnabled(i != 2); unitEdit->setEnabled(i != 2); } void DataPropertyEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(-1, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_property, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onPropertyChanged(); } void DataPropertyEditDialog::onPropertyChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty()); } DataProperty *DataPropertyEditDialog::createProperty(DataSet *ds) { DataProperty *dp = new DataProperty(ds); modifyProperty(dp); return dp; } bool DataPropertyEditDialog::modifyProperty(DataProperty *dp) { dp->setUserModified(true); dp->setTitle(titleEdit->text().trimmed().toStdString()); dp->setUnit(settings->unlocalizeExpression(unitEdit->text().trimmed().toStdString())); dp->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); dp->setHidden(hideBox->isChecked()); dp->setKey(keyBox->isChecked()); dp->setApproximate(approxBox->isChecked()); dp->setCaseSensitive(caseBox->isChecked()); dp->setUsesBrackets(bracketsBox->isChecked()); dp->setPropertyType((PropertyType) typeCombo->currentData().toInt()); if(namesEditDialog) namesEditDialog->modifyNames(dp, nameEdit->text()); else NamesEditDialog::modifyName(dp, nameEdit->text()); return true; } void DataPropertyEditDialog::setProperty(DataProperty *dp) { o_property = dp; name_edited = false; bool read_only = dp->parentSet() && !dp->parentSet()->isLocal(); nameEdit->setText(QString::fromStdString(dp->getName())); if(namesEditDialog) namesEditDialog->setNames(dp, nameEdit->text()); unitEdit->setText(QString::fromStdString(settings->localizeExpression(dp->getUnitString(), true))); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(dp->description())); descriptionEdit->blockSignals(false); typeCombo->setCurrentIndex(typeCombo->findData(dp->propertyType())); titleEdit->setText(QString::fromStdString(dp->title(false))); hideBox->setChecked(dp->isHidden()); keyBox->setChecked(dp->isKey()); approxBox->setChecked(dp->isApproximate()); caseBox->setChecked(dp->isCaseSensitive()); bracketsBox->setChecked(dp->usesBrackets()); descriptionEdit->setReadOnly(read_only); titleEdit->setReadOnly(read_only); okButton->setEnabled(false); nameEdit->setReadOnly(read_only); unitEdit->setReadOnly(read_only); } bool DataPropertyEditDialog::editProperty(QWidget *parent, DataProperty *dp) { DataPropertyEditDialog *d = new DataPropertyEditDialog(parent); d->setWindowTitle(tr("Edit Data Property")); d->setProperty(dp); while(d->exec() == QDialog::Accepted) { if(d->modifyProperty(dp)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } DataProperty *DataPropertyEditDialog::newProperty(QWidget *parent, DataSet *ds) { DataPropertyEditDialog *d = new DataPropertyEditDialog(parent); d->setWindowTitle(tr("Edit Data Property")); DataProperty *dp = NULL; while(d->exec() == QDialog::Accepted) { dp = d->createProperty(ds); if(dp) break; } d->deleteLater(); return dp; } DataSetEditDialog::DataSetEditDialog(QWidget *parent) : QDialog(parent) { o_dataset = NULL; selected_property = NULL; name_edited = false; file_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); box->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); QWidget *w3 = new QWidget(this); tabs->addTab(w1, tr("General")); tabs->addTab(w2, tr("Properties")); tabs->addTab(w3, tr("Function")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 0, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 0, 1); grid->addWidget(new QLabel(tr("Data file:"), this), 1, 0); fileEdit = new QLineEdit(this); grid->addWidget(fileEdit, 1, 1); grid->addWidget(new QLabel(tr("Description:"), this), 2, 0, 1, 2); descriptionEdit = new SmallTextEdit(3, this); grid->addWidget(descriptionEdit, 3, 0, 1, 2); grid->addWidget(new QLabel(tr("Copyright:"), this), 4, 0, 1, 2); copyrightEdit = new SmallTextEdit(3, this); grid->addWidget(copyrightEdit, 5, 0, 1, 2); grid = new QGridLayout(w2); propertiesView = new QTreeWidget(this); propertiesView->setSelectionMode(QAbstractItemView::SingleSelection); propertiesView->setRootIsDecorated(false); propertiesView->setAllColumnsShowFocus(true); propertiesView->setColumnCount(3); propertiesView->header()->setStretchLastSection(false); propertiesView->headerItem()->setText(0, tr("Title")); propertiesView->headerItem()->setText(1, tr("Name")); propertiesView->headerItem()->setText(2, tr("Type")); propertiesView->header()->setSectionResizeMode(0, QHeaderView::Stretch); propertiesView->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); propertiesView->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); grid->addWidget(propertiesView, 0, 0); QHBoxLayout *hbox = new QHBoxLayout(); hbox->addStretch(1); addButton = new QPushButton(tr("Add"), this); hbox->addWidget(addButton); editButton = new QPushButton(tr("Edit"), this); editButton->setEnabled(false); hbox->addWidget(editButton); delButton = new QPushButton(tr("Remove"), this); delButton->setEnabled(false); hbox->addWidget(delButton); grid->addLayout(hbox, 1, 0); grid = new QGridLayout(w3); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Object argument name:"), this), 1, 0); arg1Edit = new QLineEdit(this); grid->addWidget(arg1Edit, 1, 1); grid->addWidget(new QLabel(tr("Property argument name:"), this), 2, 0); arg2Edit = new QLineEdit(this); grid->addWidget(arg2Edit, 2, 1); grid->addWidget(new QLabel(tr("Default property:"), this), 3, 0, Qt::AlignTop); default2Edit = new QLineEdit(this); default2Edit->setText("info"); grid->addWidget(default2Edit, 3, 1, Qt::AlignTop); grid->setRowStretch(3, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); titleEdit->setFocus(); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(fileEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFileEdited(const QString&))); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTitleEdited(const QString&))); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onDatasetChanged())); connect(copyrightEdit, SIGNAL(textChanged()), this, SLOT(onDatasetChanged())); connect(arg1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onDatasetChanged())); connect(arg2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onDatasetChanged())); connect(default2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onDatasetChanged())); connect(addButton, SIGNAL(clicked()), this, SLOT(addProperty())); connect(editButton, SIGNAL(clicked()), this, SLOT(editProperty())); connect(delButton, SIGNAL(clicked()), this, SLOT(delProperty())); connect(propertiesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedPropertyChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(propertiesView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(editProperty())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } DataSetEditDialog::~DataSetEditDialog() { for(size_t i = 0; i < tmp_props.size(); i++) { if(tmp_props[i]) delete tmp_props[i]; } tmp_props.clear(); tmp_props_orig.clear(); } void DataSetEditDialog::selectedPropertyChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { if(!item) { editButton->setEnabled(false); delButton->setEnabled(false); selected_property = NULL; return; } selected_property = (DataProperty*) item->data(0, Qt::UserRole).value(); editButton->setEnabled(true); delButton->setEnabled(!nameEdit->isReadOnly()); } void DataSetEditDialog::setPropertyItemText(QTreeWidgetItem *item, DataProperty *dp) { QString str; switch(dp->propertyType()) { case PROPERTY_STRING: { str += tr("text"); break; } case PROPERTY_NUMBER: { if(dp->isApproximate()) { str += tr("approximate"); str += " "; } str += tr("number"); break; } case PROPERTY_EXPRESSION: { if(dp->isApproximate()) { str += tr("approximate"); str += " "; } str += tr("expression"); break; } } if(dp->isKey()) { str += " ("; str += tr("key"); str += ")"; } item->setText(0, QString::fromStdString(dp->title(false))); item->setText(1, QString::fromStdString(dp->getName())); item->setText(2, str); } void DataSetEditDialog::addProperty() { DataProperty *dp = DataPropertyEditDialog::newProperty(this, o_dataset); if(dp) { tmp_props.push_back(dp); tmp_props_orig.push_back(NULL); QTreeWidgetItem *item = new QTreeWidgetItem(propertiesView); setPropertyItemText(item, dp); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) dp)); propertiesView->clearSelection(); propertiesView->setCurrentItem(item); item->setSelected(true); onDatasetChanged(); } } void DataSetEditDialog::editProperty() { if(!selected_property) return; DataProperty *dp = selected_property; if(DataPropertyEditDialog::editProperty(this, dp)) { QTreeWidgetItem *item = propertiesView->currentItem(); setPropertyItemText(item, dp); onDatasetChanged(); } } void DataSetEditDialog::delProperty() { if(!selected_property || !selected_property->isUserModified()) return; for(size_t i = 0; i < tmp_props.size(); i++) { if(tmp_props[i] == selected_property) { delete tmp_props[i]; if(tmp_props_orig[i]) { tmp_props[i] = NULL; } else { tmp_props.erase(tmp_props.begin() + i); tmp_props_orig.erase(tmp_props_orig.begin() + i); } QTreeWidgetItem *item = propertiesView->currentItem(); if(item) delete item; onDatasetChanged(); break; } } } void DataSetEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_FUNCTION, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_dataset, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); if(!file_edited) fileEdit->setText(nameEdit->text()); name_edited = false; onDatasetChanged(); } void DataSetEditDialog::onFileEdited(const QString&) { file_edited = true; onDatasetChanged(); } void DataSetEditDialog::onTitleEdited(const QString &str) { if(!file_edited) { QString sfile = str.simplified().toLower(); sfile.replace(" ", "_"); fileEdit->setText(sfile); } if(!name_edited && !namesEditDialog) { QString sname = str.simplified().toLower(); sname.replace(" ", "_"); if(!sname.trimmed().isEmpty() && !CALCULATOR->functionNameIsValid(sname.trimmed().toStdString())) { sname = QString::fromStdString(CALCULATOR->convertToValidFunctionName(sname.trimmed().toStdString())); } nameEdit->setText(sname); } onDatasetChanged(); } void DataSetEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->functionNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidFunctionName(str.trimmed().toStdString()))); } onDatasetChanged(); name_edited = true; } void DataSetEditDialog::onDatasetChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty() && !fileEdit->text().trimmed().isEmpty()); } DataSet *DataSetEditDialog::createDataset(MathFunction **replaced_item) { if(replaced_item) *replaced_item = NULL; MathFunction *func = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString())) { func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { *replaced_item = func; } } DataSet *ds_atom = CALCULATOR->getDataSet("atom"); DataSet *ds = new DataSet(ds_atom ? ds_atom->category() : tr("Data Sets").toStdString(), "", fileEdit->text().trimmed().toStdString(), titleEdit->text().trimmed().toStdString(), descriptionEdit->toPlainText().trimmed().toStdString(), true); Argument *arg = ds->getArgumentDefinition(1); if(arg) { if(arg1Edit->text().trimmed().isEmpty()) arg->setName(tr("Object").toStdString()); else arg->setName(arg1Edit->text().trimmed().toStdString()); } arg = ds->getArgumentDefinition(1); if(arg) { if(arg2Edit->text().trimmed().isEmpty()) arg->setName(tr("Property").toStdString()); else arg->setName(arg2Edit->text().trimmed().toStdString()); } ds->setDefaultProperty(default2Edit->text().trimmed().toStdString()); ds->setCopyright(copyrightEdit->toPlainText().trimmed().toStdString()); for(size_t i = 0; i < tmp_props.size();) { if(!tmp_props[i]) { if(tmp_props_orig[i]) ds->delProperty(tmp_props_orig[i]); i++; } else if(tmp_props[i]->isUserModified()) { if(tmp_props_orig[i]) { tmp_props_orig[i]->set(*tmp_props[i]); i++; } else { ds->addProperty(tmp_props[i]); tmp_props.erase(tmp_props.begin() + i); } } else { i++; } } if(namesEditDialog) namesEditDialog->modifyNames(ds, nameEdit->text()); else NamesEditDialog::modifyName(ds, nameEdit->text()); CALCULATOR->addDataSet(ds); ds->loadObjects(); ds->setObjectsLoaded(true); return ds; } bool DataSetEditDialog::modifyDataset(DataSet *ds, MathFunction **replaced_item) { if(replaced_item) *replaced_item = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString(), ds)) { MathFunction *func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { *replaced_item = func; } } if(ds->isLocal()) ds->setDefaultDataFile(fileEdit->text().trimmed().toStdString()); ds->setTitle(titleEdit->text().trimmed().toStdString()); ds->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); Argument *arg = ds->getArgumentDefinition(1); if(arg) { if(arg1Edit->text().trimmed().isEmpty()) arg->setName(tr("Object").toStdString()); else arg->setName(arg1Edit->text().trimmed().toStdString()); } arg = ds->getArgumentDefinition(1); if(arg) { if(arg2Edit->text().trimmed().isEmpty()) arg->setName(tr("Property").toStdString()); else arg->setName(arg2Edit->text().trimmed().toStdString()); } ds->setDefaultProperty(default2Edit->text().trimmed().toStdString()); ds->setCopyright(copyrightEdit->toPlainText().trimmed().toStdString()); for(size_t i = 0; i < tmp_props.size();) { if(!tmp_props[i]) { if(tmp_props_orig[i]) ds->delProperty(tmp_props_orig[i]); i++; } else if(tmp_props[i]->isUserModified()) { if(tmp_props_orig[i]) { tmp_props_orig[i]->set(*tmp_props[i]); i++; } else { ds->addProperty(tmp_props[i]); tmp_props.erase(tmp_props.begin() + i); } } else { i++; } } if(namesEditDialog) namesEditDialog->modifyNames(ds, nameEdit->text()); else NamesEditDialog::modifyName(ds, nameEdit->text()); return true; } void DataSetEditDialog::setDataset(DataSet *ds) { o_dataset = ds; name_edited = false; for(size_t i = 0; i < tmp_props.size(); i++) { if(tmp_props[i]) delete tmp_props[i]; } tmp_props.clear(); tmp_props_orig.clear(); bool read_only = !ds->isLocal(); nameEdit->setText(QString::fromStdString(ds->getName(1).name)); if(namesEditDialog) namesEditDialog->setNames(ds, nameEdit->text()); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(ds->description())); descriptionEdit->blockSignals(false); copyrightEdit->blockSignals(true); copyrightEdit->setPlainText(QString::fromStdString(ds->copyright())); copyrightEdit->blockSignals(false); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); while(dp) { tmp_props.push_back(new DataProperty(*dp)); tmp_props_orig.push_back(dp); dp = ds->getNextProperty(&it); } titleEdit->setText(QString::fromStdString(ds->title(false))); fileEdit->setText(QString::fromStdString(ds->defaultDataFile())); default2Edit->setText(QString::fromStdString(ds->defaultProperty())); Argument *arg = ds->getArgumentDefinition(1); if(arg) arg1Edit->setText(QString::fromStdString(arg->name())); arg = ds->getArgumentDefinition(2); if(arg) arg2Edit->setText(QString::fromStdString(arg->name())); descriptionEdit->setReadOnly(read_only); copyrightEdit->setReadOnly(read_only); arg1Edit->setReadOnly(read_only); arg2Edit->setReadOnly(read_only); default2Edit->setReadOnly(read_only); fileEdit->setReadOnly(read_only); file_edited = true; titleEdit->setReadOnly(read_only); okButton->setEnabled(false); nameEdit->setReadOnly(read_only); addButton->setEnabled(!read_only); editButton->setEnabled(false); delButton->setEnabled(false); selected_property = NULL; propertiesView->clear(); propertiesView->setColumnCount(3); propertiesView->headerItem()->setText(0, tr("Title")); propertiesView->headerItem()->setText(1, tr("Name")); propertiesView->headerItem()->setText(2, tr("Type")); for(size_t i = 0; i < tmp_props.size(); i++) { DataProperty *dp = tmp_props[i]; if(dp) { QTreeWidgetItem *item = new QTreeWidgetItem(propertiesView); setPropertyItemText(item, dp); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) dp)); if(i == 0) item->setSelected(true); } } } bool DataSetEditDialog::editDataset(QWidget *parent, DataSet *ds, MathFunction **replaced_item) { DataSetEditDialog *d = new DataSetEditDialog(parent); d->setWindowTitle(tr("Edit Data Set")); d->setDataset(ds); while(d->exec() == QDialog::Accepted) { if(d->modifyDataset(ds, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } DataSet *DataSetEditDialog::newDataset(QWidget *parent, MathFunction **replaced_item) { DataSetEditDialog *d = new DataSetEditDialog(parent); d->setWindowTitle(tr("New Data Set")); DataSet *ds = NULL; while(d->exec() == QDialog::Accepted) { ds = d->createDataset(replaced_item); if(ds) break; } d->deleteLater(); return ds; } DataObjectEditDialog::DataObjectEditDialog(DataSet *o, QWidget *parent) : QDialog(parent), ds(o) { QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(dp->title())), this), r, 0); QLineEdit *w; if(dp->propertyType() == PROPERTY_EXPRESSION) w = new MathLineEdit(this); else w = new QLineEdit(this); valueEdit << w; grid->addWidget(w, r, 1); connect(w, SIGNAL(textEdited(const QString&)), this, SLOT(onObjectChanged())); grid->addWidget(new QLabel(QString::fromStdString(settings->localizeExpression(dp->getUnitString(), true)), this), r, 2); QComboBox *combo = NULL; if(dp->propertyType() != PROPERTY_STRING) { combo = new QComboBox(this); combo->setEditable(false); combo->addItem(tr("Default")); combo->addItem(tr("Approximate")); combo->addItem(tr("Exact")); combo->setCurrentIndex(0); grid->addWidget(combo, r, 3); connect(combo, SIGNAL(activated(int)), this, SLOT(onObjectChanged())); } approxCombo << combo; r++; dp = ds->getNextProperty(&it); } if(!valueEdit.isEmpty()) valueEdit.at(0)->setFocus(); grid->setColumnStretch(1, 1); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } DataObjectEditDialog::~DataObjectEditDialog() {} void DataObjectEditDialog::onObjectChanged() { okButton->setEnabled(!valueEdit.isEmpty() && !valueEdit.at(0)->isReadOnly()); } void DataObjectEditDialog::setObject(DataObject *obj) { DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { QLineEdit *w = valueEdit.at(r); QComboBox *combo = approxCombo.at(r); int iapprox = -1; w->setReadOnly(!obj->isUserModified()); w->setText(QString::fromStdString(settings->localizeExpression(obj->getProperty(dp, &iapprox)))); if(combo) { combo->setCurrentIndex(iapprox < 0 ? 0 : (iapprox > 0 ? 2 : 1)); } r++; dp = ds->getNextProperty(&it); } okButton->setEnabled(false); } DataObject *DataObjectEditDialog::createObject() { DataPropertyIter it; DataObject *obj = new DataObject(ds); ds->addObject(obj); DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { if(valueEdit.at(r)->text().trimmed().isEmpty()) { obj->eraseProperty(dp); } else { obj->setProperty(dp, settings->unlocalizeExpression(valueEdit.at(r)->text().trimmed().toStdString()), approxCombo.at(r) ? approxCombo.at(r)->currentIndex() - 1 : -1); } r++; dp = ds->getNextProperty(&it); } obj->setUserModified(); return obj; } bool DataObjectEditDialog::modifyObject(DataObject *obj) { DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { if(valueEdit.at(r)->text().trimmed().isEmpty()) { obj->eraseProperty(dp); } else { obj->setProperty(dp, settings->unlocalizeExpression(valueEdit.at(r)->text().trimmed().toStdString()), approxCombo.at(r) ? approxCombo.at(r)->currentIndex() - 1 : -1); } r++; dp = ds->getNextProperty(&it); } obj->setUserModified(); return true; } bool DataObjectEditDialog::editObject(QWidget *parent, DataObject *obj) { DataObjectEditDialog *d = new DataObjectEditDialog(obj->parentSet(), parent); d->setWindowTitle(tr("Edit Data Object")); d->setObject(obj); while(d->exec() == QDialog::Accepted) { if(d->modifyObject(obj)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } DataObject *DataObjectEditDialog::newObject(QWidget *parent, DataSet *o) { DataObjectEditDialog *d = new DataObjectEditDialog(o, parent); d->setWindowTitle(tr("New Data Object")); DataObject *obj = NULL; while(d->exec() == QDialog::Accepted) { obj = d->createObject(); if(obj) break; } d->deleteLater(); return obj; } qalculate-qt-5.5.1/src/dataseteditdialog.h000066400000000000000000000065101475705355700205560ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef DATASETEDIT_DIALOG_H #define DATASETEDIT_DIALOG_H #include #include #include class QLineEdit; class QPlainTextEdit; class QTabWidget; class NamesEditDialog; class QPushButton; class QComboBox; class QCheckBox; class QTreeWidget; class QTreeWidgetItem; class DataSetEditDialog : public QDialog { Q_OBJECT protected: QTabWidget *tabs; QLineEdit *nameEdit, *titleEdit, *fileEdit, *arg1Edit, *arg2Edit, *default2Edit; QPlainTextEdit *descriptionEdit, *copyrightEdit; QTreeWidget *propertiesView; QPushButton *okButton, *addButton, *delButton, *editButton; NamesEditDialog *namesEditDialog; DataSet *o_dataset; std::vector tmp_props; std::vector tmp_props_orig; bool name_edited, file_edited; DataProperty *selected_property = NULL; void setPropertyItemText(QTreeWidgetItem*, DataProperty*); protected slots: void onDatasetChanged(); void onNameEdited(const QString&); void onTitleEdited(const QString&); void onFileEdited(const QString&); void editNames(); void addProperty(); void editProperty(); void delProperty(); void selectedPropertyChanged(QTreeWidgetItem*, QTreeWidgetItem*); public: DataSetEditDialog(QWidget *parent = NULL); virtual ~DataSetEditDialog(); DataSet *createDataset(MathFunction **replaced_item = NULL); bool modifyDataset(DataSet *ds, MathFunction **replaced_item = NULL); void setDataset(DataSet *ds); static bool editDataset(QWidget *parent, DataSet *ds, MathFunction **replaced_item = NULL); static DataSet *newDataset(QWidget *parent, MathFunction **replaced_item = NULL); }; class DataPropertyEditDialog : public QDialog { Q_OBJECT protected: QPushButton *okButton; QLineEdit *nameEdit, *titleEdit, *unitEdit; QComboBox *typeCombo; QPlainTextEdit *descriptionEdit; QCheckBox *hideBox, *approxBox, *bracketsBox, *keyBox, *caseBox; NamesEditDialog *namesEditDialog; DataProperty *o_property; bool name_edited; protected slots: void onPropertyChanged(); void editNames(); void typeChanged(int); public: DataPropertyEditDialog(QWidget *parent = NULL); virtual ~DataPropertyEditDialog(); DataProperty *createProperty(DataSet *ds); bool modifyProperty(DataProperty *dp); void setProperty(DataProperty *dp); static bool editProperty(QWidget *parent, DataProperty *dp); static DataProperty *newProperty(QWidget *parent, DataSet *ds); }; class DataObjectEditDialog : public QDialog { Q_OBJECT protected: QVector valueEdit; QVector approxCombo; QPushButton *okButton; DataSet *ds; protected slots: void onObjectChanged(); public: DataObjectEditDialog(DataSet*, QWidget *parent = NULL); virtual ~DataObjectEditDialog(); DataObject *createObject(); bool modifyObject(DataObject*); void setObject(DataObject*); static bool editObject(QWidget *parent, DataObject*); static DataObject *newObject(QWidget *parent, DataSet*); }; #endif //DATASETEDIT_DIALOG_H qalculate-qt-5.5.1/src/datasetsdialog.cpp000066400000000000000000000372261475705355700204360ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "datasetsdialog.h" #include "dataseteditdialog.h" DataSetsDialog::DataSetsDialog(QWidget *parent) : QDialog(parent, Qt::Window) { selected_dataset = NULL; selected_object = NULL; QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Data Sets")); hsplitter = new QSplitter(Qt::Horizontal, this); topbox->addWidget(hsplitter, 1); vsplitter_l = new QSplitter(Qt::Vertical, this); vsplitter_r = new QSplitter(Qt::Vertical, this); hsplitter->addWidget(vsplitter_l); hsplitter->addWidget(vsplitter_r); QWidget *w = new QWidget(this); QVBoxLayout *box = new QVBoxLayout(w); vsplitter_l->addWidget(w); box->addWidget(new QLabel(tr("Data sets:"))); datasetsView = new QTreeWidget(this); datasetsView->setSelectionMode(QAbstractItemView::SingleSelection); datasetsView->setRootIsDecorated(false); datasetsView->header()->hide(); datasetsView->setColumnCount(1); box->addWidget(datasetsView); QHBoxLayout *hbox = new QHBoxLayout(); hbox->addStretch(1); addDSButton = new QPushButton(tr("New…"), this); hbox->addWidget(addDSButton); editDSButton = new QPushButton(tr("Edit…"), this); editDSButton->setEnabled(false); hbox->addWidget(editDSButton); delDSButton = new QPushButton(tr("Delete"), this); delDSButton->setEnabled(false); hbox->addWidget(delDSButton); box->addLayout(hbox); w = new QWidget(this); box = new QVBoxLayout(w); vsplitter_l->addWidget(w); box->addWidget(new QLabel(tr("Objects:"))); objectsView = new QTreeWidget(this); objectsView->setSelectionMode(QAbstractItemView::SingleSelection); objectsView->setRootIsDecorated(false); objectsView->setAllColumnsShowFocus(true); objectsView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); objectsView->header()->hide(); objectsView->setColumnCount(1); box->addWidget(objectsView); hbox = new QHBoxLayout(); hbox->addStretch(1); addObjButton = new QPushButton(tr("New…"), this); addObjButton->setEnabled(false); hbox->addWidget(addObjButton); editObjButton = new QPushButton(tr("Edit…"), this); editObjButton->setEnabled(false); hbox->addWidget(editObjButton); delObjButton = new QPushButton(tr("Delete"), this); delObjButton->setEnabled(false); hbox->addWidget(delObjButton); box->addLayout(hbox); w = new QWidget(this); box = new QVBoxLayout(w); vsplitter_r->addWidget(w); box->addWidget(new QLabel(tr("Data set description:"))); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); box->addWidget(descriptionView); w = new QWidget(this); box = new QVBoxLayout(w); vsplitter_r->addWidget(w); box->addWidget(new QLabel(tr("Object attributes:"))); propertiesView = new QTreeWidget(this); propertiesView->setSelectionMode(QAbstractItemView::NoSelection); propertiesView->setRootIsDecorated(false); propertiesView->setAllColumnsShowFocus(true); propertiesView->setColumnCount(3); propertiesView->header()->setStretchLastSection(false); propertiesView->headerItem()->setText(0, QString()); propertiesView->headerItem()->setText(1, QString()); propertiesView->headerItem()->setText(2, QString()); propertiesView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); propertiesView->header()->setSectionResizeMode(1, QHeaderView::Stretch); propertiesView->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); propertiesView->header()->hide(); box->addWidget(propertiesView); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); topbox->addWidget(buttonBox); datasetsView->setFocus(); connect(addDSButton, SIGNAL(clicked()), this, SLOT(addDataset())); connect(editDSButton, SIGNAL(clicked()), this, SLOT(editDataset())); connect(delDSButton, SIGNAL(clicked()), this, SLOT(delDataset())); connect(addObjButton, SIGNAL(clicked()), this, SLOT(addObject())); connect(editObjButton, SIGNAL(clicked()), this, SLOT(editObject())); connect(delObjButton, SIGNAL(clicked()), this, SLOT(delObject())); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(datasetsView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedDatasetChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(objectsView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedObjectChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(datasetsView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(editDataset())); connect(objectsView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(editObject())); connect(propertiesView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(propertyDoubleClicked(QTreeWidgetItem*, int))); connect(propertiesView, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(propertyClicked(QTreeWidgetItem*, int))); connect(vsplitter_l, SIGNAL(splitterMoved(int, int)), this, SLOT(vsplitterlMoved(int, int))); connect(vsplitter_r, SIGNAL(splitterMoved(int, int)), this, SLOT(vsplitterrMoved(int, int))); updateDatasets(); if(!settings->datasets_geometry.isEmpty()) restoreGeometry(settings->datasets_geometry); else try_resize(this, 1000, 700); vsplitter_l->setStretchFactor(0, 2); vsplitter_l->setStretchFactor(1, 3); vsplitter_r->setStretchFactor(0, 2); vsplitter_r->setStretchFactor(1, 3); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); if(!settings->datasets_vsplitter_state.isEmpty()) { vsplitter_l->restoreState(settings->datasets_vsplitter_state); vsplitter_r->restoreState(settings->datasets_vsplitter_state); } if(!settings->datasets_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->datasets_hsplitter_state); } DataSetsDialog::~DataSetsDialog() {} void DataSetsDialog::addDataset() { MathFunction *replaced_item = NULL; DataSet *ds = DataSetEditDialog::newDataset(this, &replaced_item); if(ds) { selected_dataset = ds; updateDatasets(); if(ds != replaced_item && !ds->isHidden()) settings->favourite_functions.push_back(ds); emit itemsChanged(); } } void DataSetsDialog::editDataset() { if(!selected_dataset) return; MathFunction *replaced_item = NULL; if(DataSetEditDialog::editDataset(this, selected_dataset, &replaced_item)) { updateDatasets(); emit itemsChanged(); } } void DataSetsDialog::delDataset() { if(!selected_dataset) return; selected_dataset->destroy(); selected_object = NULL; selected_dataset = NULL; updateDatasets(); emit itemsChanged(); } void DataSetsDialog::addObject() { if(!selected_dataset) return; DataObject *o = DataObjectEditDialog::newObject(this, selected_dataset); if(o) { selected_object = o; DataPropertyIter pit; DataProperty *dp = selected_object->parentSet()->getFirstProperty(&pit); QTreeWidgetItem *item = new QTreeWidgetItem(objectsView); for(int i = 0; dp; i++) { if(!dp->isHidden() && dp->isKey()) item->setText(i, QString::fromStdString(selected_object->getPropertyDisplayString(dp))); dp = selected_object->parentSet()->getNextProperty(&pit); } item->setData(0, Qt::UserRole, QVariant::fromValue((void*) selected_object)); objectsView->clearSelection(); objectsView->setCurrentItem(item); item->setSelected(true); selectedObjectChanged(item, NULL); if(objectsView->columnCount() == 1) objectsView->sortItems(0, Qt::AscendingOrder); } } void DataSetsDialog::editObject() { if(!selected_object) return; if(DataObjectEditDialog::editObject(this, selected_object)) { DataPropertyIter pit; DataProperty *dp = selected_object->parentSet()->getFirstProperty(&pit); QTreeWidgetItem *item = objectsView->currentItem(); if(!item) return; for(int i = 0; dp; i++) { if(!dp->isHidden() && dp->isKey()) item->setText(i, QString::fromStdString(selected_object->getPropertyDisplayString(dp))); dp = selected_object->parentSet()->getNextProperty(&pit); } selectedObjectChanged(item, NULL); if(objectsView->columnCount() == 1) objectsView->sortItems(0, Qt::AscendingOrder); } } void DataSetsDialog::delObject() { if(!selected_object) return; QTreeWidgetItem *item = objectsView->currentItem(); if(item) delete item; selected_object->parentSet()->delObject(selected_object); } void DataSetsDialog::vsplitterlMoved(int, int) { vsplitter_r->setSizes(vsplitter_l->sizes()); } void DataSetsDialog::vsplitterrMoved(int, int) { vsplitter_l->setSizes(vsplitter_r->sizes()); } void DataSetsDialog::selectedDatasetChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { objectsView->clear(); if(!item) { objectsView->setColumnCount(1); descriptionView->clear(); selected_dataset = NULL; addObjButton->setEnabled(false); editDSButton->setEnabled(false); delDSButton->setEnabled(false); return; } DataSet *ds = (DataSet*) item->data(0, Qt::UserRole).value(); addObjButton->setEnabled(ds->isLocal()); editDSButton->setEnabled(true); delDSButton->setEnabled(ds->isLocal()); selected_dataset = ds; DataObjectIter it; DataPropertyIter pit; DataProperty *dp; DataObject *o = ds->getFirstObject(&it); dp = ds->getFirstProperty(&pit); int n = 0; while(dp) { if(!dp->isHidden() && dp->isKey()) n++; dp = ds->getNextProperty(&pit); } bool no_key = (n == 0); if(n == 0) n = 1; objectsView->setColumnCount(n); for(int i = 0; i < n; i++) objectsView->headerItem()->setText(i, QString()); n = 0; if(!o) selectedObjectChanged(NULL, NULL); while(o) { dp = ds->getFirstProperty(&pit); QTreeWidgetItem *item = new QTreeWidgetItem(objectsView); for(int i = 0; dp; i++) { if((no_key && i == 0) || (!dp->isHidden() && dp->isKey())) item->setText(i, QString::fromStdString(o->getPropertyDisplayString(dp))); dp = ds->getNextProperty(&pit); } item->setData(0, Qt::UserRole, QVariant::fromValue((void*) o)); n++; if(o == selected_object || (n == 1 && !selected_object)) { objectsView->setCurrentItem(item); item->setSelected(true); selectedObjectChanged(item, NULL); } o = ds->getNextObject(&it); } if(n == 1) objectsView->sortItems(0, Qt::AscendingOrder); QString str; if(!ds->description().empty()) { str = QString::fromStdString(ds->description()); str += "
"; str += "
"; } str += ""; str += tr("Properties"); str += ""; str += "
"; dp = ds->getFirstProperty(&pit); while(dp) { if(!dp->isHidden()) { if(!dp->title(false).empty()) { str += QString::fromStdString(dp->title()); str += ": "; } for(size_t i = 1; i <= dp->countNames(); i++) { if(i > 1) str += ", "; str += QString::fromStdString(dp->getName(i)); } if(dp->isKey()) { str += " ("; str += tr("key"); str += ")"; } str += "
"; if(!dp->description().empty()) { str += ""; str += QString::fromStdString(dp->description()); str += ""; str += "
"; } } dp = ds->getNextProperty(&pit); } str += "
"; str += ""; str += tr("Data Retrieval Function"); str += ""; Argument *arg; Argument default_arg; const ExpressionName *ename = &ds->preferredName(false, true, false, false, &can_display_unicode_string_function, (void*) descriptionView); str += "
"; str += ""; str += QString::fromStdString(ename->formattedName(TYPE_FUNCTION, true, true)); str += ""; int iargs = ds->maxargs(); if(iargs < 0) { iargs = ds->minargs() + 1; if((int) ds->lastArgumentDefinitionIndex() > iargs) iargs = (int) ds->lastArgumentDefinitionIndex(); } str += "("; if(iargs != 0) { for(int i2 = 1; i2 <= iargs; i2++) { if(i2 > ds->minargs()) { str += "["; } if(i2 > 1) { str += QString::fromStdString(CALCULATOR->getComma()); str += " "; } arg = ds->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str += QString::fromStdString(arg->name()); } else { str += tr("argument"); if(i2 > 1 || ds->maxargs() != 1) { str += " "; str += QString::number(i2); } } if(i2 > ds->minargs()) { str += "]"; } } if(ds->maxargs() < 0) { str += QString::fromStdString(CALCULATOR->getComma()); str += " …"; } } str += ")"; for(size_t i2 = 1; i2 <= ds->countNames(); i2++) { if(&ds->getName(i2) != ename) { str += "
"; str += QString::fromStdString(ds->getName(i2).formattedName(TYPE_FUNCTION, true, true)); } } str += "
"; str += "
"; if(!ds->copyright().empty()) { str += "
"; str += QString::fromStdString(ds->copyright()); str += "
"; } descriptionView->setHtml(str); } void DataSetsDialog::selectedObjectChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { propertiesView->clear(); propertiesView->setColumnCount(3); propertiesView->headerItem()->setText(0, QString()); propertiesView->headerItem()->setText(1, QString()); propertiesView->headerItem()->setText(2, QString()); if(!item) { editObjButton->setEnabled(false); delObjButton->setEnabled(false); selected_object = NULL; return; } DataObject *o = (DataObject*) item->data(0, Qt::UserRole).value(); selected_object = o; DataSet *ds = o->parentSet(); editObjButton->setEnabled(true); delObjButton->setEnabled(o->isUserModified()); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); QFont bold_font(font()); bold_font.setWeight(QFont::Bold); while(dp) { if(!dp->isHidden()) { QTreeWidgetItem *item = new QTreeWidgetItem(propertiesView); item->setText(0, QString::fromStdString(dp->title())); item->setText(1, QString::fromStdString(o->getPropertyDisplayString(dp))); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) dp)); item->setFont(0, bold_font); item->setText(2, QString()); item->setIcon(2, LOAD_ICON("edit-paste")); item->setTextAlignment(2, Qt::AlignRight); } dp = ds->getNextProperty(&it); } } void DataSetsDialog::propertyDoubleClicked(QTreeWidgetItem *item, int) { if(!item || !selected_object) return; emit insertPropertyRequest(selected_object, (DataProperty*) item->data(0, Qt::UserRole).value()); } void DataSetsDialog::propertyClicked(QTreeWidgetItem *item, int c) { if(c != 2 || !item || !selected_object) return; emit insertPropertyRequest(selected_object, (DataProperty*) item->data(0, Qt::UserRole).value()); } void DataSetsDialog::updateDatasets() { DataSet *ds = selected_dataset; datasetsView->clear(); datasetsView->header()->hide(); datasetsView->setColumnCount(1); selected_dataset = ds; for(size_t i = 1; ; i++) { ds = CALCULATOR->getDataSet(i); if(!ds) break; QTreeWidgetItem *item = new QTreeWidgetItem(datasetsView, QStringList(QString::fromStdString(ds->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) datasetsView)))); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) ds)); if((!selected_dataset && i == 1) || ds == selected_dataset) { datasetsView->setCurrentItem(item); item->setSelected(true); } } datasetsView->sortItems(0, Qt::AscendingOrder); } void DataSetsDialog::closeEvent(QCloseEvent *e) { settings->datasets_geometry = saveGeometry(); settings->datasets_vsplitter_state = vsplitter_l->saveState(); settings->datasets_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void DataSetsDialog::reject() { settings->datasets_geometry = saveGeometry(); settings->datasets_vsplitter_state = vsplitter_l->saveState(); settings->datasets_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } qalculate-qt-5.5.1/src/datasetsdialog.h000066400000000000000000000032441475705355700200740ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef DATASETS_DIALOG_H #define DATASETS_DIALOG_H #include #include class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QPushButton; class QSplitter; class DataSetsDialog : public QDialog { Q_OBJECT protected: QTreeWidget *datasetsView, *objectsView, *propertiesView; QTextEdit *descriptionView; QPushButton *addDSButton, *delDSButton, *editDSButton, *addObjButton, *delObjButton, *editObjButton; QSplitter *vsplitter_l, *vsplitter_r, *hsplitter; DataSet *selected_dataset; DataObject *selected_object; void closeEvent(QCloseEvent*) override; protected slots: void selectedDatasetChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedObjectChanged(QTreeWidgetItem*, QTreeWidgetItem*); void propertyDoubleClicked(QTreeWidgetItem*, int); void propertyClicked(QTreeWidgetItem*, int); void vsplitterrMoved(int, int); void vsplitterlMoved(int, int); void addDataset(); void editDataset(); void delDataset(); void addObject(); void editObject(); void delObject(); public: DataSetsDialog(QWidget *parent = NULL); virtual ~DataSetsDialog(); void updateDatasets(); public slots: void reject() override; signals: void itemsChanged(); void insertPropertyRequest(DataObject*, DataProperty*); }; #endif //DATASETS_DIALOG_H qalculate-qt-5.5.1/src/expressionedit.cpp000066400000000000000000005234071475705355700205140ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021-2024 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # include #else # include #endif #include #include #include "expressionedit.h" #include "qalculateqtsettings.h" #include "matrixwidget.h" #define ITEM_ROLE (Qt::UserRole + 10) #define TYPE_ROLE (Qt::UserRole + 11) #define MATCH_ROLE (Qt::UserRole + 12) #define IMATCH_ROLE (Qt::UserRole + 13) #include std::unordered_map capitalized_names; class ExpressionTipLabel : public QLabel { public: QBasicTimer hideTimer, expireTimer; QWidget *widget; ExpressionTipLabel(const QString &text, const QPoint &pos, QWidget *w); ~ExpressionTipLabel(); void adjustTooltipScreen(const QPoint &pos); void updateSize(const QPoint &pos); void reuseTip(const QString &text, const QPoint &pos); void hideTip(); void hideTipImmediately(); void restartExpireTimer(); bool placeTip(const QPoint &pos, const QRect &completion_rect = QRect()); protected: void timerEvent(QTimerEvent *e) override; void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; }; ExpressionTipLabel::ExpressionTipLabel(const QString &text, const QPoint &pos, QWidget *w) : QLabel(w, Qt::ToolTip | Qt::BypassGraphicsProxyWidget), widget(w) { setForegroundRole(QPalette::ToolTipText); setBackgroundRole(QPalette::ToolTipBase); setPalette(QToolTip::palette()); setTextFormat(Qt::RichText); ensurePolished(); setMargin(1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0, this)); setFrameStyle(QFrame::NoFrame); setAlignment(Qt::AlignLeft); setIndent(1); setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, 0, this) / 255.0); setMouseTracking(true); reuseTip(text, pos); } void ExpressionTipLabel::restartExpireTimer() { int time = 10000 + 40 * qMax(0, text().length() - 100); expireTimer.start(time, this); hideTimer.stop(); } void ExpressionTipLabel::reuseTip(const QString &text, const QPoint &pos) { int i = text.lastIndexOf(" = "); if(i <= 0) i = text.lastIndexOf(" " SIGN_ALMOST_EQUAL " "); if(!wordWrap() || i <= 0) { setText(text); updateSize(pos); } if(wordWrap() && i > 0) { QString str = text; str.replace(i, 6, "
"); setText(str); updateSize(pos); } restartExpireTimer(); } void ExpressionTipLabel::updateSize(const QPoint &pos) { QFontMetrics fm(font()); QSize extra(1, 0); if(fm.descent() == 2 && fm.ascent() >= 11) ++extra.rheight(); QSize sh = sizeHint(); if(!wordWrap()) { if(pos.x() + sh.width() > widget->mapToGlobal(QPoint(widget->width(), 0)).x()) { setWordWrap(true); sh = sizeHint(); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) } else { # if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QScreen *screen = widget->screen(); # else QScreen *screen = QGuiApplication::screenAt(pos); # endif if(!screen) screen = QGuiApplication::primaryScreen(); if(screen) { const qreal screenWidth = screen->geometry().width(); if(sh.width() > screenWidth) { setWordWrap(true); sh = sizeHint(); } } #endif } } resize(sh + extra); } void ExpressionTipLabel::paintEvent(QPaintEvent *ev) { QStylePainter p(this); QStyleOptionFrame opt; opt.initFrom(this); p.drawPrimitive(QStyle::PE_PanelTipLabel, opt); p.end(); QLabel::paintEvent(ev); } void ExpressionTipLabel::resizeEvent(QResizeEvent *e) { QStyleHintReturnMask frameMask; QStyleOption option; option.initFrom(this); if(style()->styleHint(QStyle::SH_ToolTip_Mask, &option, this, &frameMask)) setMask(frameMask.region); QLabel::resizeEvent(e); } ExpressionTipLabel::~ExpressionTipLabel() {} void ExpressionTipLabel::hideTip() { if(isVisible() && !hideTimer.isActive()) hideTimer.start(300, this); } void ExpressionTipLabel::hideTipImmediately() { hide(); } void ExpressionTipLabel::timerEvent(QTimerEvent *e) { if(e->timerId() == hideTimer.timerId() || e->timerId() == expireTimer.timerId()) { hideTimer.stop(); expireTimer.stop(); hideTipImmediately(); } } bool ExpressionTipLabel::placeTip(const QPoint &pos, const QRect &completion_rect) { QRect screen = get_screen_geometry(widget); QPoint p = pos; p += QPoint(2, 16); if(!completion_rect.isNull() && completion_rect.intersects(QRect(p, this->size()))) { p.rx() -= 16 + this->width(); if(p.x() < screen.x() || completion_rect.intersects(QRect(p, this->size()))) { p = pos; p += QPoint(2, 16); p.setY(widget->window()->mapToGlobal(QPoint(0, 0)).y() - this->height() - 2); if(p.x() + this->width() > screen.x() + screen.width()) p.rx() -= 4 + this->width(); if(p.y() < screen.y() || completion_rect.intersects(QRect(p, this->size()))) { } } } else { if(p.x() + this->width() > screen.x() + screen.width()) p.rx() -= 4 + this->width(); if(p.y() + this->height() > screen.y() + screen.height()) p.ry() -= 24 + this->height(); if(p.y() < screen.y()) p.setY(screen.y()); if(p.x() + this->width() > screen.x() + screen.width()) p.setX(screen.x() + screen.width() - this->width()); if(p.x() < screen.x()) p.setX(screen.x()); if(p.y() + this->height() > screen.y() + screen.height()) p.setY(screen.y() + screen.height() - this->height()); } if(settings->wayland_platform && this->isVisible()) { if(p.y() != this->pos().y() || p.x() < this->pos().x() - 1) { this->hide(); this->move(p); this->show(); } } else { this->move(p); } return true; } bool last_is_operator(std::string str, bool allow_exp) { remove_blank_ends(str); if(str.empty()) return false; if((signed char) str[str.length() - 1] > 0) { if(is_in(OPERATORS "\\" LEFT_PARENTHESIS LEFT_VECTOR_WRAP, str[str.length() - 1]) && (str[str.length() - 1] != '!' || str.length() == 1)) return true; if(allow_exp && is_in(EXP, str[str.length() - 1])) return true; if(str.length() >= 3 && str[str.length() - 1] == 'r' && str[str.length() - 2] == 'o' && str[str.length() - 3] == 'x') return true; } else { if(str.length() >= 3 && (signed char) str[str.length() - 2] < 0) { str = str.substr(str.length() - 3); if(str == "∧" || str == "∨" || str == "⊻" || str == "≤" || str == "≥" || str == "≠" || str == "∠" || str == settings->multiplicationSign() || str == settings->divisionSign() || str == SIGN_MINUS) { return true; } } if(str.length() >= 2) { str = str.substr(str.length() - 2); if(str == "¬" || str == settings->multiplicationSign() || str == settings->divisionSign() || str == SIGN_MINUS) return true; } } return false; } bool contains_imaginary_number(MathStructure &m) { if(m.isNumber() && m.number().hasImaginaryPart()) return true; if(m.isFunction() && m.function()->id() == FUNCTION_ID_CIS) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_imaginary_number(m[i])) return true; } return false; } bool contains_rational_number(MathStructure &m) { if(m.isNumber() && ((m.number().realPartIsRational() && !m.number().realPart().isInteger()) || (m.number().hasImaginaryPart() && m.number().imaginaryPart().isRational() && !m.number().imaginaryPart().isInteger()))) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_rational_number(m[i])) { return i != 1 || !m.isPower() || !m[1].isNumber() || m[1].number().denominatorIsGreaterThan(9) || (m[1].number().numeratorIsGreaterThan(9) && !m[1].number().denominatorIsTwo() && !m[0].representsNonNegative(true)); } } return false; } bool contains_related_unit(const MathStructure &m, Unit *u) { if(m.isUnit()) return u == m.unit() || u->containsRelativeTo(m.unit()) || m.unit()->containsRelativeTo(u); for(size_t i = 0; i < m.size(); i++) { if(contains_related_unit(m[i], u)) return true; } return false; } bool equalsIgnoreCase(const std::string &str1, const std::string &str2, size_t i2, size_t i2_end, size_t minlength) { if(str1.empty() || str2.empty()) return false; size_t l = 0; if(i2_end == std::string::npos) i2_end = str2.length(); for(size_t i1 = 0;; i1++, i2++) { if(i2 >= i2_end) { return i1 >= str1.length(); } if(i1 >= str1.length()) break; if(((signed char) str1[i1] < 0 && i1 + 1 < str1.length()) || ((signed char) str2[i2] < 0 && i2 + 1 < str2.length())) { size_t iu1 = 1, iu2 = 1; size_t n1 = 1, n2 = 1; if((signed char) str1[i1] < 0) { while(iu1 + i1 < str1.length() && (signed char) str1[i1 + iu1] < 0) { if((unsigned char) str1[i1 + iu1] >= 0xC0) n1++; iu1++; } } if((signed char) str2[i2] < 0) { while(iu2 + i2 < str2.length() && (signed char) str2[i2 + iu2] < 0) { if((unsigned char) str2[i2 + iu2] >= 0xC0) { if(n1 == n2) break; n2++; } iu2++; } } if(n1 != n2) return false; bool isequal = (iu1 == iu2); if(isequal) { for(size_t i = 0; i < iu1; i++) { if(str1[i1 + i] != str2[i2 + i]) { isequal = false; break; } } } if(!isequal) { char *gstr1 = utf8_strdown(str1.c_str() + (sizeof(char) * i1), iu1); if(!gstr1) return false; char *gstr2 = utf8_strdown(str2.c_str() + (sizeof(char) * i2), iu2); if(!gstr2) { free(gstr1); return false; } bool b = strcmp(gstr1, gstr2) == 0; free(gstr1); free(gstr2); if(!b) return false; } i1 += iu1 - 1; i2 += iu2 - 1; } else if(str1[i1] != str2[i2] && !((str1[i1] >= 'a' && str1[i1] <= 'z') && str1[i1] - 32 == str2[i2]) && !((str1[i1] <= 'Z' && str1[i1] >= 'A') && str1[i1] + 32 == str2[i2])) { return false; } l++; } return l >= minlength; } bool title_matches(ExpressionItem *item, const std::string &str, size_t minlength) { bool big_A = false; if(minlength > 1 && str.length() == 1) { if(str[0] == 'a' || str[0] == 'x' || str[0] == 'y' || str[0] == 'X' || str[0] == 'Y') return false; big_A = (str[0] == 'A'); } const std::string &title = item->title(true); if(title.empty()) return false; size_t i = 0; while(true) { while(true) { if(i >= title.length()) return false; if(title[i] != ' ') break; i++; } size_t i2 = title.find(' ', i); if(big_A && title[i] == str[0] && ((i2 == std::string::npos && i == title.length() - 1) || i2 - i == 1)) { return true; } else if(!big_A && equalsIgnoreCase(str, title, i, i2, minlength)) { return true; } if(i2 == std::string::npos) break; i = i2 + 1; } return false; } bool name_matches(ExpressionItem *item, const std::string &str) { for(size_t i2 = 1; i2 <= item->countNames(); i2++) { if(item->getName(i2).case_sensitive) { if(str == item->getName(i2).name.substr(0, str.length())) { return true; } } else { if(equalsIgnoreCase(str, item->getName(i2).name, 0, str.length(), 0)) { return true; } std::unordered_map::iterator cap_it = capitalized_names.find(&item->getName(i2)); if(cap_it != capitalized_names.end() && equalsIgnoreCase(str, cap_it->second, 0, str.length(), 0)) { return true; } } } return false; } int name_matches2(ExpressionItem *item, const std::string &str, size_t minlength, size_t *i_match = NULL) { if(minlength > 1 && unicode_length(str) == 1) return 0; bool b_match = false; for(size_t i2 = 1; i2 <= item->countNames(); i2++) { if(equalsIgnoreCase(str, item->getName(i2).name, 0, str.length(), 0)) { if(!item->getName(i2).case_sensitive && item->getName(i2).name.length() == str.length()) { if(i_match) *i_match = i2; return 1; } if(i_match && *i_match == 0) *i_match = i2; b_match = true; } } return b_match ? 2 : 0; } bool country_matches(Unit *u, const std::string &str, size_t minlength) { const std::string &countries = u->countries(); size_t i = 0; while(true) { while(true) { if(i >= countries.length()) return false; if(countries[i] != ' ') break; i++; } size_t i2 = countries.find(',', i); if(equalsIgnoreCase(str, countries, i, i2, minlength)) { return true; } if(i2 == std::string::npos) break; i = i2 + 1; } return false; } int completion_names_match(std::string name, const std::string &str, size_t minlength = 0, size_t *i_match = NULL) { size_t i = 0, n = 0; bool b_match = false; while(true) { size_t i2 = name.find(i == 0 ? " " : "", i); if(equalsIgnoreCase(str, name, i, i2, minlength)) { if((i2 == std::string::npos && name.length() - i == str.length()) || (i2 != std::string::npos && i2 - i == str.length())) { if(i_match) *i_match = n; return 1; } if(i_match && *i_match == 0) *i_match = n + 1; b_match = true; } if(i2 == std::string::npos) break; if(i == 0) { i = i2 + 4; } else { i = name.find("", i2); if(i == std::string::npos) break; i += 3; } n++; } if(i_match && *i_match > 0) *i_match -= 1; return (b_match ? 2 : 0); } class HTMLDelegate : public QStyledItemDelegate { public: void paint(QPainter * painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; void HTMLDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem optionV4 = option; initStyleOption(&optionV4, index); QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style(); QTextDocument doc; doc.setDefaultFont(optionV4.font); doc.setHtml(optionV4.text); /// Painting item without text optionV4.text = QString(); style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter); QAbstractTextDocumentLayout::PaintContext ctx; // Highlighting text if item is selected if(optionV4.state & QStyle::State_Selected) ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText)); QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4); painter->save(); painter->translate(textRect.topLeft()); painter->setClipRect(textRect.translated(-textRect.topLeft())); doc.documentLayout()->draw(painter, ctx); painter->restore(); } QSize HTMLDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem optionV4 = option; initStyleOption(&optionV4, index); QTextDocument doc; doc.setDefaultFont(optionV4.font); doc.setHtml(optionV4.text); return QSize(doc.idealWidth(), doc.size().height() + 4); } struct CompletionData { std::vector pstr; std::vector prefixes; MathStructure *current_from_struct; MathFunction *current_function; int current_function_index; std::vector current_from_units; std::vector current_from_categories; QModelIndex exact_prefix_match; bool exact_match_found, exact_prefix_match_found, editing_to_expression, editing_to_expression1; int to_type, highest_match; Argument *arg; CompletionData() : current_from_struct(NULL), current_function(NULL), current_function_index(0), exact_match_found(false), exact_prefix_match_found(false), editing_to_expression(false), editing_to_expression1(false), to_type(0), highest_match(0), arg(NULL) { } }; ExpressionProxyModel::ExpressionProxyModel(CompletionData *cd, QObject *parent) : QSortFilterProxyModel(parent), cdata(cd) { setSortCaseSensitivity(Qt::CaseInsensitive); setSortLocaleAware(true); setDynamicSortFilter(false); } ExpressionProxyModel::~ExpressionProxyModel() {} bool ExpressionProxyModel::filterAcceptsRow(int source_row, const QModelIndex&) const { if(!cdata->arg && cdata->to_type < 2 && str.empty()) return false; QModelIndex index = sourceModel()->index(source_row, 0); if(!index.isValid()) return false; int p_type = index.data(TYPE_ROLE).toInt(); if(cdata->arg) { return p_type > 2 && p_type < 100; } ExpressionItem *item = NULL; Prefix *prefix = NULL; void *p = index.data(ITEM_ROLE).value(); if(p_type == 1) item = (ExpressionItem*) p; else if(p_type == 2) prefix = (Prefix*) p; int b_match = false; size_t i_match = 0; std::unordered_map::iterator cap_it; if(item && cdata->to_type < 2) { if((cdata->editing_to_expression || !settings->evalops.parse_options.functions_enabled) && item->type() == TYPE_FUNCTION) {} else if(item->type() == TYPE_VARIABLE && (!settings->evalops.parse_options.variables_enabled || (cdata->editing_to_expression && !((Variable*) item)->isKnown()))) {} else if(!settings->evalops.parse_options.units_enabled && item->type() == TYPE_UNIT) {} else { CompositeUnit *cu = NULL; int exp = 0; if(item->type() == TYPE_UNIT && ((Unit*) item)->subtype() == SUBTYPE_COMPOSITE_UNIT) { cu = (CompositeUnit*) item; item = cu->get(1, &exp, &prefix); if(item && prefix) { for(size_t name_i = 1; name_i <= prefix->countNames(); name_i++) { const ExpressionName *ename = &prefix->getName(name_i); if(!ename->name.empty() && ename->name.length() >= str.length() && (ename->abbreviation || str.length() >= 2)) { bool pmatch = true; for(size_t i = 0; i < str.length(); i++) { if(ename->name[i] != str[i]) { pmatch = false; break; } } if(pmatch) { b_match = 2; item = NULL; break; } } } if(item && exp == 1 && cu->countUnits() == 1 && ((Unit*) item)->useWithPrefixesByDefault()) { if(!b_match && settings->enable_completion2 && title_matches(cu, str, settings->completion_min2)) { b_match = 4; } item = NULL; } } } for(size_t name_i = 1; item && name_i <= item->countNames() && !b_match; name_i++) { const ExpressionName *ename = &item->getName(name_i); if(ename && (!cu || ename->abbreviation || str.length() >= 3 || str.length() == ename->name.length())) { if(item->isHidden() && (item->type() != TYPE_UNIT || !((Unit*) item)->isCurrency()) && ename) { b_match = (ename->name == str) ? 1 : 0; } else { for(size_t icap = 0; icap < 2; icap++) { const std::string *namestr; if(icap == 0) { namestr = &ename->name; } else { cap_it = capitalized_names.find(ename); if(cap_it == capitalized_names.end()) break; namestr = &cap_it->second; } for(size_t icmp = 0; icmp <= cdata->prefixes.size(); icmp++) { if(icmp == 1 && (item->type() != TYPE_UNIT || (cu && !prefix) || (!cu && !((Unit*) item)->useWithPrefixesByDefault()))) break; if(cu && prefix) { if(icmp == 0 || prefix != cdata->prefixes[icmp - 1]) continue; } const std::string *cmpstr; if(icmp == 0) cmpstr = &str; else cmpstr = &cdata->pstr[icmp - 1]; if(cmpstr->empty()) break; if(cmpstr->length() <= namestr->length()) { b_match = 2; for(size_t i = 0; i < cmpstr->length(); i++) { if((*namestr)[i] != (*cmpstr)[i]) { b_match = false; break; } } if(b_match && (!cu || (exp == 1 && cu->countUnits() == 1)) && ((!ename->case_sensitive && equalsIgnoreCase(*namestr, *cmpstr)) || (ename->case_sensitive && *namestr == *cmpstr))) b_match = 1; if(b_match) { if(icmp > 0 && !cu) { if(CALCULATOR->getActiveVariable(str.substr(0, namestr->length() + (str.length() - cmpstr->length()))) || CALCULATOR->getActiveFunction(str.substr(0, namestr->length() + (str.length() - cmpstr->length())))) { b_match = false; continue; } prefix = cdata->prefixes[icmp - 1]; i_match = str.length() - cmpstr->length(); } else if(b_match > 1 && !cdata->editing_to_expression && item->isHidden() && str.length() == 1) { b_match = 4; i_match = name_i; } break; } } } if(b_match) break; } } } } if(item && ((!cu && b_match >= 2) || (exp == 1 && cu->countUnits() == 1 && b_match == 2)) && item->countNames() > 1) { for(size_t icmp = 0; icmp <= cdata->prefixes.size() && b_match > 1; icmp++) { if(icmp == 1 && (item->type() != TYPE_UNIT || (cu && !prefix) || (!cu && !((Unit*) item)->useWithPrefixesByDefault()))) break; if(cu && prefix) { if(icmp == 0 || prefix != cdata->prefixes[icmp - 1]) continue; } const std::string *cmpstr; if(icmp == 0) cmpstr = &str; else cmpstr = &cdata->pstr[icmp - 1]; if(cmpstr->empty()) break; for(size_t name_i = 1; name_i <= item->countNames(); name_i++) { cap_it = capitalized_names.find(&item->getName(name_i)); if(item->getName(name_i).name == *cmpstr || (cap_it != capitalized_names.end() && cap_it->second == *cmpstr)) { if(!cu) { if(icmp > 0) prefix = cdata->prefixes[icmp - 1]; else prefix = NULL; } b_match = 1; break; } } } } if(item && !b_match && settings->enable_completion2 && (!item->isHidden() || (item->type() == TYPE_UNIT && str.length() > 1 && ((Unit*) item)->isCurrency()))) { int i_cinm = name_matches2(cu ? cu : item, str, cdata->to_type == 1 ? 1 : settings->completion_min2, &i_match); if(i_cinm == 1) {b_match = 1; i_match = 0;} else if(i_cinm == 2) b_match = 4; else if(title_matches(cu ? cu : item, str, cdata->to_type == 1 ? 1 : settings->completion_min2)) b_match = 4; else if(!cu && item->type() == TYPE_UNIT && ((Unit*) item)->isCurrency() && country_matches((Unit*) item, str, cdata->to_type == 1 ? 1 : settings->completion_min2)) b_match = 5; } if(cu) prefix = NULL; } if(b_match > 1 && ( (cdata->to_type == 1 && (!item || item->type() != TYPE_UNIT)) || ((b_match > 2 || str.length() < 3) && cdata->editing_to_expression && cdata->current_from_struct && !cdata->current_from_struct->isAborted() && item && item->type() == TYPE_UNIT && !contains_related_unit(*cdata->current_from_struct, (Unit*) item) && (!cdata->current_from_struct->isNumber() || !cdata->current_from_struct->number().isReal() || (!prefix && ((Unit*) item)->isSIUnit() && (Unit*) item != CALCULATOR->getRadUnit()))) )) { b_match = 0; i_match = 0; } if(b_match) { QString qstr = index.data(Qt::DisplayRole).toString(); if(!qstr.isEmpty()) { if(qstr[0] == '<') { int i = qstr.indexOf("-) "); if(i > 2) { if(prefix && prefix->longName() == qstr.mid(22, i - 22).toStdString()) { prefix = NULL; } else { qstr = qstr.mid(i + 10); if(!prefix) sourceModel()->setData(index, qstr, Qt::DisplayRole); } } } if(prefix) { if(qstr.isEmpty()) qstr = index.data(Qt::DisplayRole).toString(); qstr.insert(0, "-) "); qstr.insert(0, QString::fromStdString(prefix->longName())); qstr.insert(0, "("); sourceModel()->setData(index, qstr, Qt::DisplayRole); } } if(b_match == 1 && item->type() != TYPE_FUNCTION) { if(prefix) { cdata->exact_prefix_match = index; cdata->exact_prefix_match_found = true; } else { cdata->exact_match_found = true; } } if(b_match > cdata->highest_match) cdata->highest_match = b_match; } } else if(item && cdata->to_type == 4) { if(item->type() == TYPE_UNIT) { for(size_t i = 0; i < cdata->current_from_categories.size(); i++) { if(item->category() == cdata->current_from_categories[i]) { b_match = 6; break; } else if(cdata->current_from_categories[i] == settings->volume_category && (((Unit*) item)->system() != "Imperial" || cdata->current_from_units[i]->system().find("Imperial") != std::string::npos)) { for(size_t i2 = 0; i2 < settings->alternative_volume_categories.size(); i2++) { if(item->category() == settings->alternative_volume_categories[i2]) {b_match = 6; break;} } if(b_match == 6) break; } } if(b_match == 6) { QString qstr = index.data(Qt::DisplayRole).toString(); if(!qstr.isEmpty() && qstr[0] == '<') { int i = qstr.indexOf("-) "); if(i > 2) { qstr = qstr.mid(i + 10); sourceModel()->setData(index, qstr, Qt::DisplayRole); } } } } } else if(item && cdata->to_type == 5) { if(item->type() == TYPE_UNIT && ((Unit*) item)->isCurrency() && (!item->isHidden() || item == CALCULATOR->getLocalCurrency())) b_match = 6; } else if(item && cdata->to_type == 2 && str.empty() && cdata->current_from_struct) { if(item->type() == TYPE_VARIABLE && (item == CALCULATOR->getVariableById(VARIABLE_ID_PERCENT) || item == CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)) && cdata->current_from_struct->isNumber() && !cdata->current_from_struct->isInteger() && !cdata->current_from_struct->number().imaginaryPartIsNonZero()) b_match = 2; } else if(prefix && cdata->to_type < 2) { for(size_t name_i = 1; name_i <= prefix->countNames() && !b_match; name_i++) { const std::string *pname = &prefix->getName(name_i).name; if(!pname->empty() && str.length() <= pname->length()) { b_match = 2; for(size_t i = 0; i < str.length(); i++) { if(str[i] != (*pname)[i]) { b_match = false; break; } } if(b_match && *pname == str) b_match = 1; } } if(cdata->to_type == 1 && b_match > 1) b_match = 0; if(b_match > cdata->highest_match) cdata->highest_match = b_match; else if(b_match == 1 && cdata->highest_match < 2) cdata->highest_match = 2; prefix = NULL; } else if(p_type >= 100 && cdata->editing_to_expression && cdata->editing_to_expression1) { QString qstr = index.data(Qt::DisplayRole).toString(); if(cdata->to_type >= 2 && str.empty()) b_match = 2; else b_match = completion_names_match(qstr.toStdString(), str, settings->completion_min, &i_match); if(b_match > 1) { if(cdata->current_from_struct && str.length() < 3) { if(cdata->current_from_struct->isZero()) { b_match = 0; } else if(p_type >= 100 && p_type < 200) { if(cdata->to_type == 5 || cdata->current_from_struct->containsType(STRUCT_UNIT) <= 0) b_match = 0; } else if((p_type == 294 || (p_type == 292 && cdata->to_type == 4)) && !cdata->current_from_units.empty()) { bool b = false; for(size_t i = 0; i < cdata->current_from_units.size(); i++) { if(cdata->current_from_units[i] == CALCULATOR->getDegUnit()) { b = true; break; } } if(!b) b_match = 0; } else if(p_type > 290 && p_type < 300 && (p_type != 292 || cdata->to_type >= 1)) { if(!cdata->current_from_struct->isNumber() || (p_type > 290 && str.empty() && cdata->current_from_struct->isInteger())) b_match = 0; } else if(p_type >= 200 && p_type <= 290 && (p_type != 200 || cdata->to_type == 1 || cdata->to_type >= 3)) { if(!cdata->current_from_struct->isNumber()) b_match = 0; else if(str.empty() && p_type >= 202 && !cdata->current_from_struct->isInteger()) b_match = 0; } else if(p_type >= 300 && p_type < 400) { if(p_type == 300 || p_type == 302) { if(!contains_rational_number(*cdata->current_from_struct)) b_match = 0; } else if(p_type == 301) { if((!cdata->current_from_struct->isNumber() || cdata->current_from_struct->number().isInteger() || cdata->current_from_struct->number().hasImaginaryPart())) { bool b = false; for(size_t i = 0; i < cdata->current_from_units.size(); i++) { if(cdata->current_from_units[i]->system().find("Imperial") != std::string::npos) { b = true; break; } } if(!b) b_match = 0; } } else { if(!cdata->current_from_struct->isNumber()) b_match = 0; } } else if(p_type >= 400 && p_type < 500) { if(!contains_imaginary_number(*cdata->current_from_struct)) b_match = 0; } else if(p_type >= 500 && p_type < 600) { if(!cdata->current_from_struct->isDateTime()) b_match = 0; } else if(p_type == 600) { if(!cdata->current_from_struct->isInteger() && cdata->current_from_struct->containsType(STRUCT_ADDITION) <= 0) b_match = 0; } else if(p_type == 601) { if(cdata->current_from_struct->containsType(STRUCT_ADDITION) <= 0) b_match = 0; } } if(b_match > cdata->highest_match) cdata->highest_match = b_match; } } if(b_match) { sourceModel()->setData(index, b_match, MATCH_ROLE); sourceModel()->setData(index, (qulonglong) i_match, IMATCH_ROLE); QFont wfont(index.data(Qt::FontRole).value()); if(b_match == 1) wfont.setWeight(QFont::Bold); else wfont.setWeight(QFont::Normal); sourceModel()->setData(index, wfont, Qt::FontRole); } return b_match > 0; } bool ExpressionProxyModel::lessThan(const QModelIndex &index1, const QModelIndex &index2) const { #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) QModelIndex s1 = index1.siblingAtColumn(0); QModelIndex s2 = index2.siblingAtColumn(0); #else QModelIndex s1 = index1.sibling(index1.row(), 0); QModelIndex s2 = index2.sibling(index2.row(), 0); #endif if(s1.isValid() && s2.isValid()) { int i1 = s1.data(MATCH_ROLE).toInt(); int i2 = s2.data(MATCH_ROLE).toInt(); if(i1 < i2) return true; if(i1 > i2) return false; } return QSortFilterProxyModel::lessThan(index1, index2); } void ExpressionProxyModel::setFilter(std::string sfilter) { str = sfilter; invalidateFilter(); } ExpressionEdit::ExpressionEdit(QWidget *parent, QWidget *toolbar) : QPlainTextEdit(parent) { #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif tb = toolbar; cmenu = NULL; fileMenu = NULL; tipLabel = NULL; completionTimer = NULL; toolTipTimer = NULL; completion_blocked = 0; parse_blocked = 0; block_add_to_undo = 0; expression_from_history = false; undo_index = 0; cdata = new CompletionData; history_index = -1; disable_history_arrow_keys = false; block_display_parse = 0; block_text_change = 0; dont_change_index = false; cursor_has_moved = false; expression_has_changed = false; expression_has_changed2 = false; tabbed_index = -1; enable_tab = false; previous_epos = 0; parsed_had_errors = false; parsed_had_warnings = false; parentheses_highlighted = false; setUndoRedoEnabled(false); completionModel = new ExpressionProxyModel(cdata, this); sourceModel = new QStandardItemModel(this); sourceModel->setColumnCount(3); completionModel->setSourceModel(sourceModel); completer = new QCompleter(completionModel, this); completer->setWidget(this); completer->setMaxVisibleItems(20); completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); completer->setModel(completionModel); completionView = new QTableView(); completionView->setSelectionBehavior(QAbstractItemView::SelectRows); completionView->setShowGrid(false); completionView->verticalHeader()->hide(); completionView->horizontalHeader()->hide(); completionView->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); completionView->setSelectionMode(QAbstractItemView::SingleSelection); HTMLDelegate* delegate = new HTMLDelegate(); completionView->setItemDelegateForColumn(0, delegate); completionView->setItemDelegateForColumn(1, delegate); completionView->setItemDelegateForColumn(2, delegate); completer->setPopup(completionView); default_frame = -1; previous_pos = 0; if(settings->completion_delay > 0) { completionTimer = new QTimer(this); completionTimer->setSingleShot(true); connect(completionTimer, SIGNAL(timeout()), this, SLOT(complete())); } if(settings->expression_status_delay > 0) { toolTipTimer = new QTimer(this); toolTipTimer->setSingleShot(true); connect(toolTipTimer, SIGNAL(timeout()), this, SLOT(showCurrentStatus())); } connect(this, SIGNAL(textChanged()), this, SLOT(onTextChanged())); connect(this, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(onCursorPositionChanged())); connect(completer, SIGNAL(activated(const QModelIndex&)), this, SLOT(onCompletionActivated(const QModelIndex&))); connect(completer, SIGNAL(highlighted(const QModelIndex&)), this, SLOT(onCompletionHighlighted(const QModelIndex&))); qApp->installEventFilter(this); } ExpressionEdit::~ExpressionEdit() {} void ExpressionEdit::updateMinimumHeight() { QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) setMinimumHeight(fm.lineSpacing() * 1 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else setMinimumHeight(fm.lineSpacing() * 1 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif } void ExpressionEdit::changeEvent(QEvent *e) { if(e->type() == QEvent::FontChange) updateMinimumHeight(); QPlainTextEdit::changeEvent(e); } bool ExpressionEdit::eventFilter(QObject *o, QEvent *e) { switch(e->type()) { #if defined (Q_OS_QNX) case QEvent::WindowActivate: case QEvent::WindowDeactivate: if(!tipLabel && o == tipLabel) return false; tipLabel->hideTipImmediately(); break; #else case QEvent::WindowActivate: case QEvent::WindowDeactivate: #endif case QEvent::Close: case QEvent::Wheel: if(tipLabel) tipLabel->hideTipImmediately(); break; case QEvent::MouseMove: if(completionView->isVisible()) { if(toolTipTimer) toolTipTimer->stop(); if(tipLabel) tipLabel->hideTip(); } #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) if(tipLabel && tipLabel->isVisible() && QRect(tb->parentWidget()->mapToGlobal(tb->pos()), tb->size()).contains(((QMouseEvent*) e)->globalPosition().toPoint()) && tipLabel->pos().x() + tipLabel->width() > mapToGlobal(QPoint(width(), 0)).x()) tipLabel->hideTipImmediately(); #else if(tipLabel && tipLabel->isVisible() && QRect(tb->parentWidget()->mapToGlobal(tb->pos()), tb->size()).contains(((QMouseEvent*) e)->globalPos()) && tipLabel->pos().x() + tipLabel->width() > mapToGlobal(QPoint(width(), 0)).x()) tipLabel->hideTipImmediately(); #endif break; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: if(tipLabel && o == tipLabel) tipLabel->hideTipImmediately(); break; default: break; } return false; } #define COMPLETION_APPEND_M(x, y, z, m) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ if(m) { \ QFont font = completionView->font(); \ font.setWeight(QFont::Bold); \ item->setData(font, Qt::FontRole); \ } else { \ item->setData(completionView->font(), Qt::FontRole); \ } \ item->setData(QVariant::fromValue((void*) NULL), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(m), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND_2(x, y, y2, z, p) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ item->setData(completionView->font(), Qt::FontRole); \ item->setData(QVariant::fromValue((void*) p), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(0), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ items.append(item); \ item = new QStandardItem(y2); \ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND_C(x, y, z, p) COMPLETION_APPEND_2(x, y, y, z, p) #define COMPLETION_APPEND_T(x, y, z, p, t) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ item->setData(completionView->font(), Qt::FontRole); \ item->setData(QVariant::fromValue((void*) p), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(0), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ if(!t.isEmpty()) item->setData("

" + t + "

", Qt::ToolTipRole);\ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ if(!t.isEmpty()) item->setData("

" + t + "

", Qt::ToolTipRole);\ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND(x, y, z, p) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ item->setData(completionView->font(), Qt::FontRole); \ item->setData(QVariant::fromValue((void*) p), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(0), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND_FLAG(x, y, y2, z, p) if(!QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) {COMPLETION_APPEND_2(x, y, y2, z, p)} \ else if(flagheight <= 0) {COMPLETION_APPEND_2(x, QStringLiteral("%1  ").arg(y).arg(QString::fromStdString(u->referenceName())), QStringLiteral("%1").arg(y2).arg(QString::fromStdString(u->referenceName())), z, p)} \ else {COMPLETION_APPEND_2(x, QStringLiteral("%1  ").arg(y).arg(flagheight).arg(QString::fromStdString(u->referenceName())), QStringLiteral("%1").arg(y2).arg(QString::fromStdString(u->referenceName())), z, p)} #define MAX_COMPLETION_LENGTH_1 25 #define MAX_COMPLETION_LENGTH_2 25 bool ellipsize_completion_names(std::string &str) { if(str.length() < MAX_COMPLETION_LENGTH_1 + 15) return false; size_t l = 0, l_insub = 0, first_i = 0; bool insub = false; for(size_t i = 0; i < str.length(); i++) { if(str[i] == '<') { if(i + 1 == str.length()) break; if(str[i + 1] == 's') {insub = true; l_insub = l;} else if(insub && str[i + 1] == '/') {insub = false; l -= ((l - l_insub) * 6) / 10;} else if(first_i == 0 && str[i + 1] == 'i') first_i = i; i = str.find('>', i + 1); if(i == std::string::npos) break; } else if((signed char) str[i] > 0 || (unsigned char) str[i] >= 0xC0) { if(first_i > 0 && l >= MAX_COMPLETION_LENGTH_1 && (!insub || l - ((l - l_insub) * 6) / 10 >= MAX_COMPLETION_LENGTH_1) && i < str.length() - 2 && str[i + 1] != '<' && str[i + 1] != ')' && str[i + 1] != '(') { str = str.substr(0, i); str += "…"; if(insub) str += ""; str += "
"; return true; } l++; } } return false; } bool name_has_formatting(const ExpressionName *ename) { if(ename->name.length() < 2) return false; if(ename->suffix) return true; if(ename->completion_only || ename->case_sensitive || ename->name.length() <= 4) return false; size_t i = ename->name.find('_'); if(i == std::string::npos) return false; return unicode_length(ename->name, i) >= 3; } std::string format_name(const ExpressionName *ename, int type) { bool was_capitalized = false; std::string name = ename->formattedName(type, true, true, 0, false, false, NULL, &was_capitalized); if(was_capitalized) { if(ename->suffix) { std::string str = name; size_t i = str.find(""); if(i != std::string::npos) { str.erase(str.length() - 6, 6); str.erase(i, 5); char *cap_str = utf8_strup(str.c_str() + sizeof(char) * i); if(cap_str) { str.replace(i, str.length() - i, cap_str); free(cap_str); } } capitalized_names[ename] = str; } else { capitalized_names[ename] = name; } } return name; } void ExpressionEdit::updateCompletion() { sourceModel->clear(); capitalized_names.clear(); std::string str, strs; QString title, title2; QList items; QFont ifont(completionView->font()); QFontMetrics fm(ifont); int flagheight = fm.ascent(); ifont.setStyle(QFont::StyleItalic); for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(f->isActive()) { const ExpressionName *ename, *ename_r; ename_r = &f->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); if(name_has_formatting(ename_r)) str = format_name(ename_r, TYPE_FUNCTION); else str = ename_r->name; str += "()"; for(size_t name_i = 1; name_i <= f->countNames(); name_i++) { ename = &f->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), this))) { str += " "; if(name_has_formatting(ename)) str += format_name(ename, TYPE_FUNCTION); else str += ename->name; str += "()"; } } ellipsize_completion_names(str); COMPLETION_APPEND_T(QString::fromStdString(str), QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, completionView)), 1, f, QString::fromStdString(f->description())) } } for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(v->isActive()) { const ExpressionName *ename, *ename_r; bool b = false; ename_r = &v->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); for(size_t name_i = 1; name_i <= v->countNames(); name_i++) { ename = &v->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), completionView))) { if(!b) { if(name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_VARIABLE); } else { str = ename_r->name; } b = true; } str += " "; if(name_has_formatting(ename)) { str += format_name(ename, TYPE_VARIABLE); } else { str += ename->name; } str += ""; } } if(!b && name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_VARIABLE); b = true; } if(settings->printops.use_unicode_signs && can_display_unicode_string_function("→", completionView)) { size_t pos = 0; if(b) { pos = str.find("_to_"); } else { pos = ename_r->name.find("_to_"); if(pos != std::string::npos) { str = ename_r->name; b = true; } } if(b) { while(pos != std::string::npos) { if((pos == 1 && str[0] == 'm') || (pos > 1 && str[pos - 1] == 'm' && str[pos - 2] == '>')) { str.replace(pos, 4, "-1→"); } else { str.replace(pos, 4, "→"); } pos = str.find("_to_", pos); } } } ellipsize_completion_names(str); if(!v->title(false).empty()) { title = QString::fromStdString(v->title(false)); } else { if(v->isKnown()) { if(((KnownVariable*) v)->isExpression() && !v->isLocal()) { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; title = QString::fromStdString(CALCULATOR->localizeExpression(((KnownVariable*) v)->expression(), pa)); if(title.length() > MAX_COMPLETION_LENGTH_2) {title = title.left(MAX_COMPLETION_LENGTH_2); title += "…";} else if(!((KnownVariable*) v)->unit().empty() && ((KnownVariable*) v)->unit() != "auto") {title += " "; title += QString::fromStdString(((KnownVariable*) v)->unit());} } else { if(((KnownVariable*) v)->get().isMatrix()) { title = tr("matrix"); } else if(((KnownVariable*) v)->get().isVector()) { title = tr("vector"); } else { PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) completionView; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.allow_non_usable = true; po.is_approximate = NULL; title = QString::fromStdString(CALCULATOR->print(((KnownVariable*) v)->get(), MAX_COMPLETION_LENGTH_2, po)); if(title.length() > MAX_COMPLETION_LENGTH_2) {title = title.left(MAX_COMPLETION_LENGTH_2); title += "…";} } } } else { if(((UnknownVariable*) v)->assumptions()) { switch(((UnknownVariable*) v)->assumptions()->sign()) { case ASSUMPTION_SIGN_POSITIVE: {title = tr("positive"); break;} case ASSUMPTION_SIGN_NONPOSITIVE: {title = tr("non-positive"); break;} case ASSUMPTION_SIGN_NEGATIVE: {title = tr("negative"); break;} case ASSUMPTION_SIGN_NONNEGATIVE: {title = tr("non-negative"); break;} case ASSUMPTION_SIGN_NONZERO: {title = tr("non-zero"); break;} default: {} } if(!title.isEmpty() && ((UnknownVariable*) v)->assumptions()->type() != ASSUMPTION_TYPE_NONE) title += " "; switch(((UnknownVariable*) v)->assumptions()->type()) { case ASSUMPTION_TYPE_BOOLEAN: {title += tr("boolean"); break;} case ASSUMPTION_TYPE_INTEGER: {title += tr("integer"); break;} case ASSUMPTION_TYPE_RATIONAL: {title += tr("rational"); break;} case ASSUMPTION_TYPE_REAL: {title += tr("real"); break;} case ASSUMPTION_TYPE_COMPLEX: {title += tr("complex"); break;} case ASSUMPTION_TYPE_NUMBER: {title += tr("number"); break;} case ASSUMPTION_TYPE_NONMATRIX: {title += tr("(not matrix)"); break;} default: {} } if(title.isEmpty()) title = tr("unknown"); } else { title = tr("default assumptions"); } } } if(v == CALCULATOR->getVariableById(VARIABLE_ID_PERCENT)) COMPLETION_APPEND_2(QString::fromStdString(b ? str : ename_r->name), title, title + " (%)", 1, v) else if(v == CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)) COMPLETION_APPEND_2(QString::fromStdString(b ? str : ename_r->name), title, title + " (‰)", 1, v) else COMPLETION_APPEND(QString::fromStdString(b ? str : ename_r->name), title, 1, v) } } PrintOptions po = settings->printops; po.is_approximate = NULL; po.can_display_unicode_string_arg = (void*) completionView; po.abbreviate_names = true; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(u->isActive()) { if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { const ExpressionName *ename, *ename_r; bool b = false; ename_r = &u->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); for(size_t name_i = 1; name_i <= u->countNames(); name_i++) { ename = &u->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), completionView))) { if(!b) { if(name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_UNIT); } else { str = ename_r->name; } b = true; } str += " "; if(name_has_formatting(ename)) { str += format_name(ename, TYPE_UNIT); } else { str += ename->name; } str += ""; } } if(!b && name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_UNIT); b = true; } else { ellipsize_completion_names(str); } if(u->title(false).empty()) { if(name_has_formatting(ename_r)) title2 = QString::fromStdString(format_name(ename_r, TYPE_UNIT)); else title2 = QString::fromStdString(ename_r->name); } else { title2 = QString::fromStdString(u->title(false)); ename = &u->preferredInputName(true, settings->printops.use_unicode_signs, false, u->isCurrency(), &can_display_unicode_string_function, completionView); if(ename->abbreviation && (!ename->suffix || (ename->name.length() > 5 && ename->name.find("_unit", ename->name.length() - 5) != std::string::npos))) { bool tp = title2[title2.length() - 1] == ')'; title2 += " "; if(!tp) title2 += "("; if(name_has_formatting(ename)) title2 += QString::fromStdString(ename->formattedName(TYPE_UNIT, true, false, -1, true)); else title2 += QString::fromStdString(ename->name); if(!tp) title2 += ")"; if(title2.contains("_")) title2 = QString::fromStdString(u->title(false)); } } title = QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, completionView)); if(u->isCurrency()) { COMPLETION_APPEND_FLAG(QString::fromStdString(b ? str : ename_r->name), title, title2, 1, u) } else { if(u->isSIUnit() && !u->category().empty() && title[title.length() - 1] != ')') { size_t i_slash = std::string::npos; if(u->category().length() > 1) i_slash = u->category().rfind("/", u->category().length() - 2); if(i_slash != std::string::npos) i_slash++; if((size_t) title.length() + u->category().length() - (i_slash == std::string::npos ? 0 : i_slash) < MAX_COMPLETION_LENGTH_1) { title += " ("; if(i_slash == std::string::npos) title += QString::fromStdString(u->category()); else title += QString::fromStdString(u->category().substr(i_slash, u->category().length() - i_slash)); title += ")"; } } COMPLETION_APPEND_2(QString::fromStdString(b ? str : ename_r->name), title, title2.isEmpty() ? title : title2, 1, u) } } else if(!u->isHidden()) { CompositeUnit *cu = (CompositeUnit*) u; title = QString::fromStdString(cu->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, completionView)); title2 = title; bool tp = title2[title2.length() - 1] == ')'; title2 += " "; if(!tp) title2 += "("; Prefix *prefix = NULL; int exp = 1; if(cu->countUnits() == 1 && (u = cu->get(1, &exp, &prefix)) != NULL && prefix != NULL && exp == 1) { str = ""; for(size_t name_i = 0; name_i < 2; name_i++) { const ExpressionName *ename; ename = &prefix->preferredInputName(name_i != 1, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); if(!ename->name.empty() && (ename->abbreviation == (name_i != 1))) { bool b_italic = !str.empty(); if(b_italic) str += " "; str += ename->formattedName(-1, false, true); const ExpressionName *ename2 = &u->preferredInputName(name_i != 1, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); str += ename2->formattedName(TYPE_UNIT, true, true); if(b_italic) str += ""; if(!b_italic) { if(str.find("<") == std::string::npos) { title2 += QString::fromStdString(str); } else { title2 += QString::fromStdString(ename->formattedName(TYPE_UNIT, true, false, -1, true) + ename2->formattedName(TYPE_UNIT, true, false, -1, true)); } } } } ellipsize_completion_names(str); } else { str = cu->print(po, true, TAG_TYPE_HTML, true, false); if(str.find("<") == std::string::npos) { title2 += QString::fromStdString(str); } else { title2 += QString::fromStdString(cu->print(po, true, TAG_TYPE_TERMINAL, false, false)); } } if(!tp) title2 += ")"; size_t i_slash = std::string::npos; if(cu->category().length() > 1) i_slash = cu->category().rfind("/", cu->category().length() - 2); if(i_slash != std::string::npos) i_slash++; if(cu->isSIUnit() && !cu->category().empty()) { if(title.length() + cu->category().length() - (i_slash == std::string::npos ? 0 : i_slash) < MAX_COMPLETION_LENGTH_1 && title[title.length() - 1] != ')') { title += " ("; if(i_slash == std::string::npos) title += QString::fromStdString(cu->category()); else title += QString::fromStdString(cu->category().substr(i_slash, cu->category().length() - i_slash)); title += ")"; } else { if(i_slash == std::string::npos) title = QString::fromStdString(cu->category()); else title = QString::fromStdString(cu->category().substr(i_slash, cu->category().length() - i_slash)); } } COMPLETION_APPEND_2(QString::fromStdString(str), title, title2, 1, cu) } } } QString sprefix = tr("Prefix:"); for(size_t i = 1; ; i++) { Prefix *p = CALCULATOR->getPrefix(i); if(!p) break; str = ""; const ExpressionName *ename, *ename_r; ename_r = &p->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); str = ename_r->formattedName(-1, false, true); for(size_t name_i = 1; name_i <= p->countNames(); name_i++) { ename = &p->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), completionView))) { str += " "; str += ename->formattedName(-1, false, true); str += ""; } } ellipsize_completion_names(str); title = sprefix; title += " "; switch(p->type()) { case PREFIX_DECIMAL: { title += "10"; title += QString::number(((DecimalPrefix*) p)->exponent()); title += ""; break; } case PREFIX_BINARY: { title += "2"; title += QString::number(((BinaryPrefix*) p)->exponent()); title += ""; break; } case PREFIX_NUMBER: { title += QString::fromStdString(((NumberPrefix*) p)->value().print()); break; } } COMPLETION_APPEND(QString::fromStdString(str), title, 2, p) } QString str1, str2; #define COMPLETION_CONVERT_STRING(x) str1 = tr(x); if(str1 != x) {str1 += " "; str1 += x; str1 += "";} #define COMPLETION_CONVERT_STRING2(x, y) str1 = tr(x); if(str1 != x) {str1 += " "; str1 += x; str1 += "";} str2 = tr(y); str1 += " "; str1 += str2; str1 += ""; if(str2 != y) {str1 += " "; str1 += y; str1 += "";} COMPLETION_CONVERT_STRING2("angle", "phasor") COMPLETION_APPEND_C(str1, tr("Complex Angle/Phasor Notation"), 400, NULL) /*COMPLETION_CONVERT_STRING("bases") COMPLETION_APPEND_C(str1, tr("Number bases"), 201, NULL)*/ COMPLETION_CONVERT_STRING("base") COMPLETION_APPEND_C(str1, tr("Base units"), 101, NULL) COMPLETION_CONVERT_STRING("base ") COMPLETION_APPEND_C(str1, tr("Number Base"), 200, NULL) COMPLETION_APPEND_C("bcd", tr("Binary-Coded Decimal"), 285, NULL) COMPLETION_CONVERT_STRING("bijective") COMPLETION_APPEND_C(str1, tr("Bijective Base-26"), 290, NULL) COMPLETION_CONVERT_STRING("binary") str1 += " "; str1 += "bin"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Binary Number"), 202, NULL) COMPLETION_CONVERT_STRING("calendars") COMPLETION_APPEND_C(str1, tr("Calendars"), 500, NULL) COMPLETION_CONVERT_STRING("cis") COMPLETION_APPEND_C(str1, tr("Complex cis Form"), 401, NULL) COMPLETION_CONVERT_STRING("decimal") str1 += " "; str1 += "dec"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Decimal Number"), 210, NULL) COMPLETION_CONVERT_STRING("duodecimal") str1 += " "; str1 += "duo"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Duodecimal Number"), 212, NULL) COMPLETION_CONVERT_STRING("exponential") COMPLETION_APPEND_C(str1, tr("Complex Exponential Form"), 402, NULL) COMPLETION_CONVERT_STRING("factors") COMPLETION_APPEND_C(str1, tr("Factors"), 600, NULL) COMPLETION_CONVERT_STRING("fp16") str1 += " "; str1 += "binary16"; str1 += ""; COMPLETION_APPEND_C(str1, tr("16-bit Floating Point Binary Format"), 310, NULL) COMPLETION_CONVERT_STRING("fp32") str1 += " "; str1 += "binary32"; str1 += ""; str1 += " "; str1 += "float"; str1 += ""; COMPLETION_APPEND_C(str1, tr("32-bit Floating Point Binary Format"), 311, NULL) COMPLETION_CONVERT_STRING("fp64") str1 += " "; str1 += "binary64"; str1 += ""; str1 += " "; str1 += "double"; str1 += ""; COMPLETION_APPEND_C(str1, tr("64-bit Floating Point Binary Format"), 312, NULL) COMPLETION_CONVERT_STRING("fp80"); COMPLETION_APPEND_C(str1, tr("80-bit (x86) Floating Point Binary Format"), 313, NULL) COMPLETION_CONVERT_STRING("fp128") str1 += " "; str1 += "binary128"; str1 += ""; COMPLETION_APPEND_C(str1, tr("128-bit Floating Point Binary Format"), 314, NULL) COMPLETION_CONVERT_STRING("1/") COMPLETION_APPEND_C(str1, tr("Fraction") + " (1/n)", 301, NULL) COMPLETION_CONVERT_STRING("fraction") COMPLETION_APPEND_C(str1, tr("Fraction"), 300, NULL) COMPLETION_CONVERT_STRING("decimals") COMPLETION_APPEND_C(str1, tr("Decimal Fraction"), 302, NULL) COMPLETION_CONVERT_STRING("hexadecimal") str1 += " "; str1 += "hex"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Hexadecimal Number"), 216, NULL) COMPLETION_CONVERT_STRING("latitude") str1 += " "; str1 += "latitude2"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Latitude"), 294, NULL) COMPLETION_CONVERT_STRING("longitude") str1 += " "; str1 += "longitude2"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Longitude"), 294, NULL) COMPLETION_CONVERT_STRING("mixed") COMPLETION_APPEND_C(str1, tr("Mixed Units"), 102, NULL) COMPLETION_CONVERT_STRING("octal") str1 += " "; str1 += "oct"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Octal Number"), 208, NULL) COMPLETION_CONVERT_STRING("optimal") COMPLETION_APPEND_C(str1, tr("Optimal Unit"), 100, NULL) COMPLETION_CONVERT_STRING("prefix") COMPLETION_APPEND_C(str1, tr("Optimal Prefix"), 103, NULL) COMPLETION_CONVERT_STRING("partial fraction") COMPLETION_APPEND_C(str1, tr("Expanded Partial Fractions"), 601, NULL) COMPLETION_CONVERT_STRING("polar") COMPLETION_APPEND_C(str1, tr("Complex Polar Form"), 403, NULL) COMPLETION_CONVERT_STRING2("rectangular", "cartesian") COMPLETION_APPEND_C(str1, tr("Complex Rectangular Form"), 404, NULL) COMPLETION_CONVERT_STRING("roman") COMPLETION_APPEND_C(str1, tr("Roman Numerals"), 280, NULL) COMPLETION_CONVERT_STRING("sexagesimal") str += " "; str += "sexa"; str += ""; str += " "; str += "sexa2"; str += ""; str += " "; str += "sexa3"; str += ""; COMPLETION_APPEND_C(str1, tr("Sexagesimal Number"), 292, NULL) COMPLETION_CONVERT_STRING("time") COMPLETION_APPEND_C(str1, tr("Time Format"), 293, NULL) COMPLETION_CONVERT_STRING("unicode") COMPLETION_APPEND_C(str1, tr("Unicode"), 281, NULL) COMPLETION_CONVERT_STRING("utc") COMPLETION_APPEND_C(str1, tr("UTC Time Zone"), 501, NULL) } void ExpressionEdit::setExpression(std::string str) { setExpression(QString::fromStdString(str)); } void ExpressionEdit::setExpression(const QString &str) { if(str.isEmpty()) { clear(); return; } block_add_to_undo++; setCursorWidth(0); block_text_change++; clear(); block_text_change--; block_add_to_undo--; insertPlainText(str); setCursorWidth(1); highlightParentheses(); } std::string ExpressionEdit::expression() const { return toPlainText().toStdString(); } QSize ExpressionEdit::sizeHint() const { QSize size = QPlainTextEdit::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif return size; } void ExpressionEdit::inputMethodEvent(QInputMethodEvent *event) { if(event->commitString() == "⁽") event->setCommitString("^("); if(event->commitString() == "⁰" || event->commitString() == "¹" || event->commitString() == "²" || event->commitString() == "³" || event->commitString() == "⁴" || event->commitString() == "⁵" || event->commitString() == "⁶" || event->commitString() == "⁷" || event->commitString() == "⁸" || event->commitString() == "⁹" || event->commitString() == "⁻") { wrapSelection(event->commitString()); return; } QPlainTextEdit::inputMethodEvent(event); } void ExpressionEdit::keyReleaseEvent(QKeyEvent *event) { if(!event->isAutoRepeat()) disable_history_arrow_keys = false; QPlainTextEdit::keyReleaseEvent(event); } void ExpressionEdit::enableTabCompletion(bool b) {enable_tab = b;} bool ExpressionEdit::completeOrActivateFirst(bool backwards) { if(completionView->isVisible()) { if(completionView->currentIndex().isValid()) { onCompletionActivated(completionView->currentIndex()); tabbed_index = completionView->currentIndex().row(); } else { onCompletionActivated(completionModel->index(0, 0)); tabbed_index = 0; } return true; } else if(tabbed_index >= 0) { if(backwards) tabbed_index--; else tabbed_index++; if(tabbed_index < 0) tabbed_index = completionModel->rowCount() - 1; else if(tabbed_index >= completionModel->rowCount()) tabbed_index = 0; int ti_bak = tabbed_index; onCompletionActivated(completionModel->index(tabbed_index, 0)); tabbed_index = ti_bak; return true; } else { int cm_bak = settings->completion_min; settings->completion_min = 1; complete(); settings->completion_min = cm_bak; } return completionView->isVisible(); } void ExpressionEdit::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Undo)) { editUndo(); return; } if(event->matches(QKeySequence::Redo)) { editRedo(); return; } if(event->matches(QKeySequence::Copy)) { if(!textCursor().hasSelection() && !settings->v_result.empty()) { if(settings->copy_ascii) { std::string str = settings->v_result[settings->v_result.size() - 1][0]; if(settings->copy_ascii_without_units) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(str, true))).trimmed()); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(settings->v_result[settings->v_result.size() - 1][0]))); qm->setText(QString::fromStdString(unhtmlize(settings->v_result[settings->v_result.size() - 1][0]))); qm->setObjectName("history_result"); QApplication::clipboard()->setMimeData(qm); } return; } else if(settings->copy_ascii && textCursor().hasSelection()) { QApplication::clipboard()->setText(QString::fromStdString(unformat(textCursor().selectedText().toStdString(), true))); return; } } else if(event->matches(QKeySequence::Cut) && settings->copy_ascii && textCursor().hasSelection()) { QApplication::clipboard()->setText(QString::fromStdString(unformat(textCursor().selectedText().toStdString(), true))); textCursor().deleteChar(); return; } if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Insert: { if(event->modifiers() != Qt::ShiftModifier) setOverwriteMode(!overwriteMode()); break; } case Qt::Key_Asterisk: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_MULTIPLY); return; } if(expressionInQuotes()) break; if(doChainMode(settings->multiplicationSign())) return; wrapSelection(settings->multiplicationSign()); return; } case Qt::Key_Minus: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { int pos = 0; if(textCursor().hasSelection()) pos = textCursor().selectionStart(); else pos = textCursor().position(); if(pos >= 2) { pos--; if((document()->characterAt(pos) == 'E' || document()->characterAt(pos) == 'e') && document()->characterAt(pos - 1).isNumber()) { insertPlainText(settings->printops.use_unicode_signs ? SIGN_MINUS : "-"); return; } } emit calculateRPNRequest(OPERATION_SUBTRACT); return; } if(expressionInQuotes()) break; if(doChainMode(settings->printops.use_unicode_signs ? SIGN_MINUS : "-")) return; wrapSelection(settings->printops.use_unicode_signs ? SIGN_MINUS : "-"); return; } case Qt::Key_Dead_Circumflex: { if(!event->text().isEmpty() && event->text() != "^") break; if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(settings->caret_as_xor ? OPERATION_BITWISE_XOR : OPERATION_RAISE); return; } if(expressionInQuotes()) break; if(doChainMode(settings->caret_as_xor ? " xor " : "^")) return; wrapSelection(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { if(!event->text().isEmpty() && event->text() != "~") break; insertPlainText("~"); return; } case Qt::Key_AsciiCircum: { if(!event->text().isEmpty() && event->text() != "^") break; if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(settings->caret_as_xor ? OPERATION_BITWISE_XOR : OPERATION_RAISE); return; } if(expressionInQuotes()) break; if(doChainMode(settings->caret_as_xor ? " xor " : "^")) return; wrapSelection(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Plus: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_ADD); return; } if(expressionInQuotes()) break; if(doChainMode("+")) return; wrapSelection("+"); return; } case Qt::Key_Slash: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_DIVIDE); return; } if(expressionInQuotes()) break; if(doChainMode(settings->divisionSign(false))) return; wrapSelection(settings->divisionSign(false)); return; } case Qt::Key_ParenRight: { QTextCursor cur = textCursor(); if(cur.hasSelection() || cur.position() == 0) { smartParentheses(); return; } break; } /*case Qt::Key_BraceLeft: {return;} case Qt::Key_BraceRight: {return;}*/ } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_RAISE); return; } if(doChainMode("^")) return; wrapSelection("^"); return; } if(event->modifiers() == Qt::ControlModifier || (event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { switch(event->key()) { case Qt::Key_A: { if(event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) { if(doChainMode("∠")) return; insertPlainText("∠"); return; } break; } case Qt::Key_ParenLeft: {} case Qt::Key_ParenRight: { smartParentheses(); return; } case Qt::Key_E: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_EXP10); return; } } } } if((event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab) && (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == (Qt::ShiftModifier | Qt::KeypadModifier))) { if(enable_tab) { if(!completeOrActivateFirst(event->modifiers() & Qt::ShiftModifier || event->key() == Qt::Key_Backtab)) event->ignore(); } else { if(completionView->isVisible()) { QKeyEvent *e = new QKeyEvent(event->type(), event->modifiers() & Qt::ShiftModifier || event->key() == Qt::Key_Backtab ? Qt::Key_Up : Qt::Key_Down, Qt::NoModifier, QString(), event->isAutoRepeat(), event->count()); QApplication::postEvent(completionView, e); } else { event->ignore(); } } return; } if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Escape: { if(CALCULATOR->busy()) { CALCULATOR->abort(); } else if(completionView->isVisible()) { completionView->hide(); if(!tipLabel || !tipLabel->isVisible()) { if(settings->expression_status_delay > 0) { if(!toolTipTimer) { toolTipTimer = new QTimer(this); toolTipTimer->setSingleShot(true); connect(toolTipTimer, SIGNAL(timeout()), this, SLOT(showCurrentStatus())); } toolTipTimer->start(settings->expression_status_delay); } else { showCurrentStatus(); } } } else if(document()->isEmpty()) { if(settings->close_with_esc) qApp->closeAllWindows(); } else { clear(); } return; } case Qt::Key_Return: {} case Qt::Key_Enter: { if(completionView->isVisible() && completionView->currentIndex().isValid()) { onCompletionActivated(completionView->currentIndex()); } else if(settings->rpn_mode || !document()->isEmpty()) { emit returnPressed(); } return; } case Qt::Key_Up: { if(completionView->isVisible() || disable_history_arrow_keys || event->modifiers() == Qt::ShiftModifier) break; QTextCursor c = textCursor(); bool b = (cursor_has_moved && (!c.atStart() || c.hasSelection())) || (!c.atEnd() && !c.atStart()) || history_index + 1 >= (int) settings->expression_history.size(); if(b) { QString text = toPlainText(); if((b && c.atStart()) || text.lastIndexOf("\n", c.position() - 1) >= 0) { disable_history_arrow_keys = true; break; } else { QTextCursor c = textCursor(); c.movePosition(QTextCursor::Start); setTextCursor(c); disable_history_arrow_keys = true; return; } } if(history_index + 1 < (int) settings->expression_history.size()) { if(history_index == -1) current_history = toPlainText(); history_index++; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = true; else blockParseStatus(true); if(history_index == -1 && (current_history.isEmpty() || current_history == toPlainText())) history_index = 0; if(history_index == -1) setExpression(current_history); else if(settings->expression_history.empty()) history_index = -1; else setExpression(QString::fromStdString(settings->expression_history[history_index])); if(settings->status_in_history) expression_from_history = false; else blockParseStatus(false); blockCompletion(false); dont_change_index = false; } else { break; } if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_PageUp: { if(history_index + 1 < (int) settings->expression_history.size()) { if(history_index == -1) current_history = toPlainText(); history_index++; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = true; else blockParseStatus(true); if(history_index == -1 && (current_history.isEmpty() || current_history == toPlainText())) history_index = 0; if(history_index == -1) setExpression(current_history); else if(settings->expression_history.empty()) history_index = -1; else setExpression(QString::fromStdString(settings->expression_history[history_index])); if(settings->status_in_history) expression_from_history = false; else blockParseStatus(false); blockCompletion(false); dont_change_index = false; } else { break; } if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_Down: { if(completionView->isVisible() || disable_history_arrow_keys) break; QTextCursor c = textCursor(); bool b = (cursor_has_moved && (!c.atEnd() || c.hasSelection())) || (!c.atEnd() && !c.atStart()); if(b) { QString text = toPlainText(); if((b && c.atEnd()) || text.indexOf("\n", c.position()) >= 0) { disable_history_arrow_keys = true; break; } else { QTextCursor c = textCursor(); c.movePosition(QTextCursor::End); setTextCursor(c); disable_history_arrow_keys = true; return; } } if(history_index == -1) current_history = toPlainText(); if(history_index >= -1) history_index--; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = (history_index >= 0); else blockParseStatus(true); if(history_index < 0) { if(history_index == -1 && current_history != toPlainText()) setExpression(current_history); else clear(); } else { setExpression(QString::fromStdString(settings->expression_history[history_index])); } if(settings->status_in_history) expression_from_history = false; else blockParseStatus(false); blockCompletion(false); dont_change_index = false; if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_PageDown: { if(history_index == -1) current_history = toPlainText(); if(history_index >= -1) history_index--; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = (history_index >= 0); else blockParseStatus(true); if(history_index < 0) { if(history_index == -1 && current_history != toPlainText()) setExpression(current_history); else clear(); } else { setExpression(QString::fromStdString(settings->expression_history[history_index])); } if(settings->status_in_history) expression_from_history = false; else blockParseStatus(false); blockCompletion(false); dont_change_index = false; if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_Home: { QTextCursor c = textCursor(); c.movePosition(QTextCursor::Start); setTextCursor(c); return; } case Qt::Key_End: { QTextCursor c = textCursor(); c.movePosition(QTextCursor::End); setTextCursor(c); return; } } } QPlainTextEdit::keyPressEvent(event); } void ExpressionEdit::contextMenuEvent(QContextMenuEvent *e) { if(!cmenu) { cmenu = new QMenu(this); undoAction = cmenu->addAction(tr("Undo"), this, SLOT(editUndo())); undoAction->setShortcut(QKeySequence::Undo); undoAction->setShortcutContext(Qt::WidgetShortcut); redoAction = cmenu->addAction(tr("Redo"), this, SLOT(editRedo())); redoAction->setShortcut(QKeySequence::Redo); redoAction->setShortcutContext(Qt::WidgetShortcut); cmenu->addSeparator(); cutAction = cmenu->addAction(tr("Cut"), this, SLOT(cut())); cutAction->setShortcut(QKeySequence::Cut); cutAction->setShortcutContext(Qt::WidgetShortcut); copyAction = cmenu->addAction(tr("Copy"), this, SLOT(copy())); copyAction->setShortcut(QKeySequence::Copy); copyAction->setShortcutContext(Qt::WidgetShortcut); pasteAction = cmenu->addAction(tr("Paste"), this, SLOT(paste())); pasteAction->setShortcut(QKeySequence::Paste); pasteAction->setShortcutContext(Qt::WidgetShortcut); deleteAction = cmenu->addAction(tr("Delete"), this, SLOT(editDelete())); deleteAction->setShortcut(QKeySequence::Delete); deleteAction->setShortcutContext(Qt::WidgetShortcut); calculateSelectionAction = cmenu->addAction(tr("Calculate Selection"), this, SIGNAL(calculateSelectionRequest())); cmenu->addSeparator(); cmenu->addAction(tr("Insert Date…"), this, SLOT(insertDate())); cmenu->addAction(tr("Insert Matrix…"), this, SLOT(insertMatrix())); cmenu->addSeparator(); selectAllAction = cmenu->addAction(tr("Select All"), this, SLOT(selectAll())); selectAllAction->setShortcut(QKeySequence::SelectAll); selectAllAction->setShortcutContext(Qt::WidgetShortcut); clearAction = cmenu->addAction(tr("Clear"), this, SLOT(clear())); clearAction->setShortcut(Qt::Key_Escape); clearAction->setShortcutContext(Qt::WidgetShortcut); clearHistoryAction = cmenu->addAction(tr("Clear History"), this, SLOT(clearHistory())); cmenu->addSeparator(); QMenu *menu = cmenu->addMenu(tr("Completion")); int completion_level = 0; if(settings->enable_completion) { if(settings->enable_completion2) { if(settings->completion_min2 > 1) completion_level = 3; else completion_level = 4; } else { if(settings->completion_min > 1) completion_level = 1; else completion_level = 2; } } QActionGroup *group = new QActionGroup(this); QAction *action = menu->addAction(tr("No completion"), this, SLOT(onCompletionModeChanged())); action->setData(0); action->setCheckable(true); group->addAction(action); if(completion_level == 0) action->setChecked(true); action = menu->addAction(tr("Limited strict completion"), this, SLOT(onCompletionModeChanged())); action->setData(1); action->setCheckable(true); group->addAction(action); if(completion_level == 1) action->setChecked(true); action = menu->addAction(tr("Strict completion"), this, SLOT(onCompletionModeChanged())); action->setData(2); action->setCheckable(true); group->addAction(action); if(completion_level == 2) action->setChecked(true); action = menu->addAction(tr("Limited full completion"), this, SLOT(onCompletionModeChanged())); action->setData(3); action->setCheckable(true); group->addAction(action); if(completion_level == 3) action->setChecked(true); action = menu->addAction(tr("Full completion"), this, SLOT(onCompletionModeChanged())); action->setData(4); action->setCheckable(true); group->addAction(action); if(completion_level == 4) action->setChecked(true); menu->addSeparator(); action = menu->addAction(tr("Delayed completion"), this, SLOT(enableCompletionDelay())); action->setCheckable(true); if(settings->completion_delay > 0) action->setChecked(true); menu = cmenu->addMenu(tr("Expression Status")); group = new QActionGroup(this); action = menu->addAction(tr("Off"), this, SLOT(onStatusModeChanged())); action->setData(0); action->setCheckable(true); group->addAction(action); statusOffAction = action; action = menu->addAction(tr("In history list"), this, SLOT(onStatusModeChanged())); action->setData(1); action->setCheckable(true); group->addAction(action); statusHistoryAction = action; action = menu->addAction(tr("In expression field"), this, SLOT(onStatusModeChanged())); action->setData(2); action->setCheckable(true); group->addAction(action); statusExpressionAction = action; menu->addSeparator(); group = new QActionGroup(this); action = menu->addAction(tr("With delay"), this, SLOT(onStatusModeChanged())); action->setData(3); action->setCheckable(true); group->addAction(action); statusDelayAction = action; action = menu->addAction(tr("Without delay"), this, SLOT(onStatusModeChanged())); action->setData(4); action->setCheckable(true); group->addAction(action); statusNoDelayAction = action; menu->addSeparator(); action = menu->addAction(tr("Automatically calculate selection"), this, SLOT(onAutocalcSelectionChanged())); action->setCheckable(true); autocalcSelectionAction = action; #ifndef _WIN32 QAction *enableIMAction = cmenu->addAction(tr("Use input method"), this, SLOT(enableIM())); enableIMAction->setCheckable(true); enableIMAction->setChecked(settings->enable_input_method); #endif if(fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } bool b_sel = textCursor().hasSelection(); bool b_empty = document()->isEmpty(); undoAction->setEnabled(undo_index == 0); redoAction->setEnabled(undo_index < expression_undo_buffer.size() - 1); cutAction->setEnabled(b_sel); copyAction->setEnabled(b_sel); pasteAction->setEnabled(canPaste()); deleteAction->setEnabled(b_sel); calculateSelectionAction->setEnabled(b_sel); selectAllAction->setEnabled(!b_empty); clearAction->setEnabled(!b_empty); clearHistoryAction->setEnabled(!settings->expression_history.empty()); if(!settings->display_expression_status) statusOffAction->setChecked(true); else if(settings->status_in_history) statusHistoryAction->setChecked(true); else statusExpressionAction->setChecked(true); if((settings->status_in_history && settings->auto_calculate_delay > 0) || (!settings->status_in_history && settings->expression_status_delay > 0)) statusDelayAction->setChecked(true); else statusNoDelayAction->setChecked(true); autocalcSelectionAction->setChecked(settings->autocalc_selection); cmenu->popup(e->globalPos()); } void ExpressionEdit::setMenuAndToolbarItems(QMenu *mode, QMenu *menu, QAction *action) { if(!menu && cmenu && fileMenu) { cmenu->removeAction(fileSeparator); cmenu->removeAction(modeMenu->menuAction()); cmenu->removeAction(fileMenu->menuAction()); cmenu->removeAction(tbAction); } modeMenu = mode; fileMenu = menu; tbAction = action; if(cmenu && fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } void ExpressionEdit::insertDate() { QDialog *dialog = new QDialog(this, Qt::Popup); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); QVBoxLayout *box = new QVBoxLayout(dialog); box->setContentsMargins(0, 0, 0, 0); QCalendarWidget *w = new QCalendarWidget(dialog); std::string str = textCursor().selectedText().toStdString(), str2; CALCULATOR->separateToExpression(str, str2, settings->evalops, true); remove_blank_ends(str); int b_quote = -1; if(str.length() > 2 && ((str[0] == '\"' && str[str.length() - 1] == '\"') || (str[0] == '\'' && str[str.length() - 1] == '\''))) { str = str.substr(1, str.length() - 2); remove_blank_ends(str); b_quote = 1; } if(!str.empty()) { QalculateDateTime date; if(date.set(str)) { if(b_quote < 0 && is_in(NUMBERS, str[0])) b_quote = 0; w->setSelectedDate(QDate(date.year(), date.month() - 1, date.day())); } } box->addWidget(w); connect(w, SIGNAL(clicked(QDate)), dialog, SLOT(accept())); connect(w, SIGNAL(activated(QDate)), dialog, SLOT(accept())); if(dialog->exec() == QDialog::Accepted) { if(b_quote == 0) insertPlainText(w->selectedDate().toString(Qt::ISODate)); else insertPlainText("\"" + w->selectedDate().toString(Qt::ISODate) + "\""); } dialog->deleteLater(); } void ExpressionEdit::insertMatrix() { QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Matrix")); QVBoxLayout *box = new QVBoxLayout(dialog); MatrixWidget *w = new MatrixWidget(dialog); w->setMatrixString(textCursor().selectedText()); box->addWidget(w); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); w->setFocus(); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { if(!w->isEmpty()) { insertPlainText(w->getMatrixString()); } } dialog->deleteLater(); } void ExpressionEdit::enableCompletionDelay() { if(qobject_cast(sender())->isChecked()) settings->completion_delay = 500; else settings->completion_delay = 0; } void ExpressionEdit::onCompletionModeChanged() { int completion_level = qobject_cast(sender())->data().toInt(); settings->enable_completion = completion_level > 0; if(completion_level == 0) completion_level = 4; settings->enable_completion2 = completion_level > 2; if(completion_level == 2 || completion_level > 3) settings->completion_min = 1; else settings->completion_min = 2; if(completion_level > 3) settings->completion_min2 = 1; else settings->completion_min2 = 2; } void ExpressionEdit::onAutocalcSelectionChanged() { settings->autocalc_selection = qobject_cast(sender())->isChecked(); } void ExpressionEdit::onStatusModeChanged() { int i = qobject_cast(sender())->data().toInt(); if(i == 3) { if(settings->status_in_history) settings->auto_calculate_delay = 500; else settings->expression_status_delay = 1000; } else if(i == 4) { if(settings->status_in_history) settings->auto_calculate_delay = 0; else settings->expression_status_delay = 0; } if(i < 3) { settings->display_expression_status = (i > 0); settings->status_in_history = (i == 1); if(settings->status_in_history && settings->display_expression_status) { settings->expression_status_delay = 1000; } else if(settings->auto_calculate_delay == 0) { settings->expression_status_delay = 0; } } emit expressionStatusModeChanged(i < 3); } void ExpressionEdit::editUndo() { if(undo_index == 0) return; blockCompletion(); blockParseStatus(); undo_index--; block_add_to_undo++; setCursorWidth(0); setPlainText(expression_undo_buffer.at(undo_index)); QTextCursor cur = textCursor(); cur.setPosition(expression_undo_pos.at(undo_index)); setTextCursor(cur); setCursorWidth(1); block_add_to_undo--; blockCompletion(false); blockParseStatus(false); displayParseStatus(false, false); } void ExpressionEdit::editRedo() { if(undo_index >= expression_undo_buffer.size() - 1) return; blockCompletion(); blockParseStatus(); undo_index++; block_add_to_undo++; setCursorWidth(0); setPlainText(expression_undo_buffer.at(undo_index)); QTextCursor cur = textCursor(); cur.setPosition(expression_undo_pos.at(undo_index)); setTextCursor(cur); setCursorWidth(1); block_add_to_undo--; blockCompletion(false); blockParseStatus(false); displayParseStatus(false, false); } void ExpressionEdit::editDelete() { textCursor().removeSelectedText(); } void ExpressionEdit::enableIM() { settings->enable_input_method = qobject_cast(sender())->isChecked(); setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); } void ExpressionEdit::blockCompletion(bool b, bool h) { if(b) { if(completionTimer) completionTimer->stop(); if(h) completionView->hide(); completion_blocked++; } else { completion_blocked--; } } #define HIDE_TOOLTIP if(tipLabel) {tipLabel->hideTipImmediately();} void ExpressionEdit::blockParseStatus(bool b) { if(b) { HIDE_TOOLTIP if(toolTipTimer) toolTipTimer->stop(); parse_blocked++; } else { parse_blocked--; } } void ExpressionEdit::blockUndo(bool b) { if(b) block_add_to_undo++; else block_add_to_undo--; } void ExpressionEdit::showCurrentStatus() { if((!expression_has_changed && current_status_type != 4) || current_status_text.isEmpty() || (completionView->isVisible() && (completionView->selectionModel()->hasSelection() || current_status_type == 3))) { HIDE_TOOLTIP } else { QString str = current_status_type == 4 ? "" : current_status_text; std::string str_nohtml = current_status_type == 4 ? current_status_text.toStdString() : unhtmlize(current_status_text.toStdString()); std::string current_text = current_status_type == 4 ? str_nohtml : toPlainText().toStdString(); if(((current_status_type == 1 && settings->auto_calculate) || current_status_type == 4) && str_nohtml.length() <= 2000 && !contains_plot_or_save(current_text)) { bool b_comp = false, is_approximate = false; PrintOptions po = settings->printops; po.is_approximate = &is_approximate; std::string result = CALCULATOR->unlocalizeExpression(current_text, settings->evalops.parse_options); remove_spaces(current_text); CALCULATOR->beginTemporaryStopMessages(); if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); std::string parsed_text; result = CALCULATOR->calculateAndPrint(result, 50, settings->evalops, po, settings->dual_fraction == 0 ? AUTOMATIC_FRACTION_OFF : AUTOMATIC_FRACTION_SINGLE, settings->dual_approximation == 0 ? AUTOMATIC_APPROXIMATION_OFF : AUTOMATIC_APPROXIMATION_SINGLE, current_status_type == 4 ? &parsed_text : NULL, -1, &b_comp, true, false, TAG_TYPE_HTML); if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); std::string result_nohtml = unhtmlize(result); remove_spaces(result_nohtml); if(current_status_type == 4 && parsed_text != CALCULATOR->timedOutString()) str = QString::fromStdString(parsed_text); if(!CALCULATOR->endTemporaryStopMessages() && !result.empty() && result_nohtml.length() < 200 && result_nohtml != str_nohtml && result_nohtml != current_text && result != CALCULATOR->timedOutString() && result != parsed_text) { str += " "; if(is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; if(b_comp) str += "("; str += QString::fromStdString(result); if(b_comp) str += ")"; str_nohtml = ""; } } else { remove_spaces(current_text); } if(str.isEmpty() || str_nohtml == current_text || str_nohtml.length() > 2000) { HIDE_TOOLTIP } else if(tipLabel && tipLabel->isVisible()) { tipLabel->reuseTip(str, mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight()))); if(!tipLabel->placeTip(mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight())), completionView->isVisible() ? completionView->geometry(): QRect())) { HIDE_TOOLTIP } } else { if(tipLabel) tipLabel->deleteLater(); tipLabel = new ExpressionTipLabel(str, mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight())), this); if(tipLabel->placeTip(mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight())), completionView->isVisible() ? completionView->geometry(): QRect())) { tipLabel->showNormal(); } else { HIDE_TOOLTIP } } } } void ExpressionEdit::onSelectionChanged() { if(settings->autocalc_selection && textCursor().hasSelection()) { QTextCursor cur = textCursor(); if(((!settings->status_in_history || !settings->display_expression_status) && expression_has_changed) || cur.selectionStart() != 0 || cur.selectionEnd() != toPlainText().length()) { setStatusText(cur.selectedText(), 4); } else if(current_status_type == 4) { HIDE_TOOLTIP } } else if(current_status_type == 4) { HIDE_TOOLTIP } } void ExpressionEdit::setStatusText(const QString &text, int stype) { if(toolTipTimer) toolTipTimer->stop(); current_status_text = text; if(text.isEmpty() || (stype != 4 && !settings->display_expression_status)) { HIDE_TOOLTIP } else { bool prev_func = (current_status_type == 2); current_status_type = stype; if(settings->expression_status_delay > 0 && (current_status_type != 2 || !prev_func || !tipLabel || !tipLabel->isVisible())) { if(tipLabel) tipLabel->hideTip(); if(!toolTipTimer) { toolTipTimer = new QTimer(this); toolTipTimer->setSingleShot(true); connect(toolTipTimer, SIGNAL(timeout()), this, SLOT(showCurrentStatus())); } toolTipTimer->start(settings->expression_status_delay); } else { showCurrentStatus(); } } } bool ExpressionEdit::displayFunctionHint(MathFunction *f, int arg_index) { if(!settings->display_expression_status) return false; if(!f) return false; int iargs = f->maxargs(); if((iargs == 0 && arg_index == 0) || (iargs == 1 && arg_index == 1)) return false; const ExpressionName *ename = &f->preferredName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) parent()); bool last_is_vctr = f->getArgumentDefinition(iargs) && f->getArgumentDefinition(iargs)->type() == ARGUMENT_TYPE_VECTOR; if(arg_index == 0 || function_pos.isNull()) function_pos = cursorRect().bottomRight(); if(iargs == 0 || (arg_index > iargs && iargs >= 0 && (!last_is_vctr || iargs == 1))) { if(last_is_vctr || (iargs == 1 && f->getArgumentDefinition(1) && f->getArgumentDefinition(1)->handlesVector())) { function_pos = QPoint(); return false; } else { setStatusText(tr("Too many arguments for %1().").arg(QString::fromStdString(ename->formattedName(TYPE_FUNCTION, true, true))), 2); return true; } } if(arg_index <= 0) arg_index = 1; Argument *arg; Argument default_arg; QString str, str2, str3; str += QString::fromStdString(ename->formattedName(TYPE_FUNCTION, true, true)); if(iargs < 0) { iargs = f->minargs() + 1; if((int) f->lastArgumentDefinitionIndex() > iargs) iargs = (int) f->lastArgumentDefinitionIndex(); if(arg_index > iargs) arg_index = iargs; } if(arg_index > iargs && last_is_vctr) arg_index = iargs; str += "("; int i_reduced = 1; if(iargs != 0) { for(int i2 = 1; i2 <= iargs; i2++) { if(i2 > f->minargs() && arg_index < i2) { str += "["; } if(i2 > 1) { str += QString::fromStdString(CALCULATOR->getComma()); str += " "; } if(i2 == arg_index) str += ""; arg = f->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str2 = QString::fromStdString(arg->name()); } else { str2 = tr("argument"); if(i2 > 1 || f->maxargs() != 1) { str2 += " "; str2 += QString::number(i2); } } if(i2 == arg_index) { if(arg) { str3 = QString::fromStdString(arg->printlong()); } else { Argument arg_default; str3 = QString::fromStdString(arg_default.printlong()); } if(i_reduced != 2 && settings->printops.use_unicode_signs) { str3.replace(">=", SIGN_GREATER_OR_EQUAL); str3.replace("<=", SIGN_LESS_OR_EQUAL); str3.replace("!=", SIGN_NOT_EQUAL); } if(!str3.isEmpty()) { str2 = tr("%1:").arg(str2); str2 += " "; str2 += str3; } str += str2.toHtmlEscaped(); str += ""; } else { str += str2.toHtmlEscaped(); if(i2 > f->minargs() && arg_index < i2) { str += "]"; } } } if(f->maxargs() < 0) { str += QString::fromStdString(CALCULATOR->getComma()); str += " …"; } } str += ")"; setStatusText(str, 2); return true; } void remove_non_units(MathStructure &m) { if(m.isPower() && m[0].isUnit()) return; if(m.size() > 0) { for(size_t i = 0; i < m.size();) { if(m[i].isFunction() || m[i].containsType(STRUCT_UNIT, true) <= 0) { m.delChild(i + 1); } else { remove_non_units(m[i]); i++; } } if(m.size() == 0) m.clear(); else if(m.size() == 1) m.setToChild(1); } } void find_matching_units(const MathStructure &m, const MathStructure *mparse, std::vector &v, bool top = true) { Unit *u = CALCULATOR->findMatchingUnit(m); if(u) { for(size_t i = 0; i < v.size(); i++) { if(v[i] == u) return; } v.push_back(u); return; } if(top) { if(mparse && !m.containsType(STRUCT_UNIT, true) && (mparse->containsFunctionId(FUNCTION_ID_ASIN) || mparse->containsFunctionId(FUNCTION_ID_ACOS) || mparse->containsFunctionId(FUNCTION_ID_ATAN))) { v.push_back(CALCULATOR->getRadUnit()); return; } MathStructure m2(m); remove_non_units(m2); CALCULATOR->beginTemporaryStopMessages(); m2 = CALCULATOR->convertToOptimalUnit(m2); CALCULATOR->endTemporaryStopMessages(); find_matching_units(m2, mparse, v, false); } else { for(size_t i = 0; i < m.size(); i++) { if(!m.isFunction() || !m.function()->getArgumentDefinition(i + 1) || m.function()->getArgumentDefinition(i + 1)->type() != ARGUMENT_TYPE_ANGLE) { find_matching_units(m[i], mparse, v, false); } } } } void ExpressionEdit::displayParseStatus(bool update, bool show_tooltip) { if(toolTipTimer) toolTipTimer->stop(); if(parse_blocked) return; if(update) expression_has_changed2 = true; bool prev_func = cdata->current_function; cdata->current_function = NULL; if(block_display_parse) return; status_messages.clear(); if(document()->isEmpty()) { function_pos = QPoint(); setStatusText(""); if(settings->status_in_history) emit statusChanged(QString(), false, false, false, expression_from_history); prev_parsed_expression = ""; expression_has_changed2 = false; return; } QString qtext = toPlainText(); std::string text = qtext.toStdString(), str_f; if(text.find("#") != std::string::npos) { CALCULATOR->parseComments(text, settings->evalops.parse_options); if(text.empty()) { if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("comment"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("comment")); function_pos = QPoint(); } return; } } if(text[0] == '/' && text.length() > 1) { size_t i = text.find_first_not_of(SPACES, 1); if(i != std::string::npos && (signed char) text[i] > 0 && is_not_in(NUMBER_ELEMENTS OPERATORS, text[i])) { if(settings->status_in_history) { setStatusText(""); emit statusChanged("qalc command", false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText("qalc command"); function_pos = QPoint(); } return; } } else if(text == "MC") { if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("MC (memory clear)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("MC (memory clear)")); function_pos = QPoint(); } return; } else if(text == "MS") { if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("MS (memory store)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("MS (memory store)")); function_pos = QPoint(); } return; } else if(text == "M+") { if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("M+ (memory plus)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("M+ (memory plus)")); function_pos = QPoint(); } return; } else if(text == "M-" || text == "M−") { if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("M− (memory minus)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("M− (memory minus)")); function_pos = QPoint(); } return; } CALCULATOR->beginTemporaryStopMessages(); gsub(ID_WRAP_LEFT, LEFT_PARENTHESIS, text); gsub(ID_WRAP_RIGHT, RIGHT_PARENTHESIS, text); std::string parsed_expression, parsed_expression_tooltip; remove_duplicate_blanks(text); size_t i = text.find_first_of(SPACES); if(i != std::string::npos) { str_f = text.substr(0, i); if(str_f == "factor" || equalsIgnoreCase(str_f, "factorize") || equalsIgnoreCase(str_f, tr("factorize").toStdString())) { text = text.substr(i + 1); str_f = tr("factorize").toStdString(); } else if(equalsIgnoreCase(str_f, "expand") || equalsIgnoreCase(str_f, tr("expand").toStdString())) { text = text.substr(i + 1); str_f = tr("expand").toStdString(); } else { str_f = ""; } } QTextCursor cursor = textCursor(); MathStructure mparse, mfunc; bool full_parsed = false; std::string str_e, str_u, str_w, str_sub; bool had_errors = false, had_warnings = false; settings->evalops.parse_options.preserve_format = true; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); if(!cursor.atStart()) { settings->evalops.parse_options.unended_function = &mfunc; if(cdata->current_from_struct) {cdata->current_from_struct->unref(); cdata->current_from_struct = NULL; cdata->current_from_units.clear(); cdata->current_from_categories.clear();} if(!cursor.atEnd()) { str_e = CALCULATOR->unlocalizeExpression(qtext.left(cursor.position()).toStdString(), settings->evalops.parse_options); bool b = CALCULATOR->separateToExpression(str_e, str_u, settings->evalops, false, true); b = CALCULATOR->separateWhereExpression(str_e, str_w, settings->evalops) || b; if(!b) { str_sub = str_e; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&mparse, str_e, settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(); } } else { str_e = CALCULATOR->unlocalizeExpression(text, settings->evalops.parse_options); transform_expression_for_equals_save(str_e, settings->evalops.parse_options); bool b = CALCULATOR->separateToExpression(str_e, str_u, settings->evalops, false, true); b = CALCULATOR->separateWhereExpression(str_e, str_w, settings->evalops) || b; if(!b) { CALCULATOR->parse(&mparse, str_e, settings->evalops.parse_options); full_parsed = true; } } settings->evalops.parse_options.unended_function = NULL; } bool b_func = false; if(mfunc.isFunction()) { cdata->current_function = mfunc.function(); if(mfunc.countChildren() == 0) { cdata->current_function_index = 1; b_func = displayFunctionHint(mfunc.function(), 0); } else { cdata->current_function_index = mfunc.countChildren(); b_func = displayFunctionHint(mfunc.function(), mfunc.countChildren()); } } if(!b_func) function_pos = QPoint(); if(expression_has_changed2) { bool last_is_space = false; parsed_expression_tooltip = ""; if(!full_parsed) { str_e = CALCULATOR->unlocalizeExpression(text, settings->evalops.parse_options); transform_expression_for_equals_save(str_e, settings->evalops.parse_options); last_is_space = is_in(SPACES, str_e[str_e.length() - 1]); bool b_to = CALCULATOR->separateToExpression(str_e, str_u, settings->evalops, true, true); CALCULATOR->separateWhereExpression(str_e, str_w, settings->evalops); if(!str_e.empty()) CALCULATOR->parse(&mparse, str_e, settings->evalops.parse_options); if(b_to && !str_e.empty()) { if(!cdata->current_from_struct && !mparse.containsFunctionId(FUNCTION_ID_SAVE) && !mparse.containsFunctionId(FUNCTION_ID_PLOT)) { cdata->current_from_struct = new MathStructure; EvaluationOptions eo = settings->evalops; eo.structuring = STRUCTURING_NONE; eo.mixed_units_conversion = MIXED_UNITS_CONVERSION_NONE; eo.auto_post_conversion = POST_CONVERSION_NONE; eo.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; eo.expand = -2; if(!CALCULATOR->calculate(cdata->current_from_struct, str_w.empty() ? str_e : str_e + "/." + str_w, 50, eo)) cdata->current_from_struct->setAborted(); find_matching_units(*cdata->current_from_struct, &mparse, cdata->current_from_units); cdata->current_from_categories.clear(); } } else if(cdata->current_from_struct) { cdata->current_from_struct->unref(); cdata->current_from_struct = NULL; cdata->current_from_units.clear(); cdata->current_from_categories.clear(); } } PrintOptions po; po.preserve_format = true; po.show_ending_zeroes = settings->evalops.parse_options.read_precision != DONT_READ_PRECISION && !CALCULATOR->usesIntervalArithmetic() && settings->evalops.parse_options.base > BASE_CUSTOM; po.exp_display = settings->printops.exp_display; po.lower_case_numbers = settings->printops.lower_case_numbers; po.base_display = settings->printops.base_display; po.rounding = settings->printops.rounding; po.twos_complement = settings->printops.twos_complement; po.hexadecimal_twos_complement = settings->printops.hexadecimal_twos_complement; po.base = settings->evalops.parse_options.base; Number nr_base; if(po.base == BASE_CUSTOM && (CALCULATOR->usesIntervalArithmetic() || CALCULATOR->customInputBase().isRational()) && (CALCULATOR->customInputBase().isInteger() || !CALCULATOR->customInputBase().isNegative()) && (CALCULATOR->customInputBase() > 1 || CALCULATOR->customInputBase() < -1)) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } else if(po.base == BASE_CUSTOM || (po.base < BASE_CUSTOM && !CALCULATOR->usesIntervalArithmetic() && po.base != BASE_UNICODE && po.base != BASE_BIJECTIVE_26 && po.base != BASE_BINARY_DECIMAL)) { po.base = 10; po.min_exp = 6; po.use_max_decimals = true; po.max_decimals = 5; po.preserve_format = false; } po.abbreviate_names = false; po.hide_underscore_spaces = true; po.use_unicode_signs = settings->printops.use_unicode_signs; po.digit_grouping = settings->printops.digit_grouping; po.multiplication_sign = settings->printops.multiplication_sign; po.division_sign = settings->printops.division_sign; po.short_multiplication = false; po.excessive_parenthesis = true; po.improve_division_multipliers = false; po.can_display_unicode_string_function = &can_display_unicode_string_function; po.can_display_unicode_string_arg = (void*) parent(); po.spell_out_logical_operators = settings->printops.spell_out_logical_operators; po.restrict_to_parent_precision = false; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; if(!str_w.empty()) { CALCULATOR->beginTemporaryStopMessages(); MathStructure mwhere; CALCULATOR->parseExpressionAndWhere(&mparse, &mwhere, str_e, str_w, settings->evalops.parse_options); mparse.format(po); parsed_expression = mparse.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); parsed_expression += CALCULATOR->localWhereString(); mwhere.format(po); parsed_expression += mwhere.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); CALCULATOR->endTemporaryStopMessages(); } else if(str_e.empty()) { parsed_expression = ""; } else { CALCULATOR->beginTemporaryStopMessages(); mparse.format(po); parsed_expression = mparse.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); CALCULATOR->endTemporaryStopMessages(); } if(!str_u.empty()) { std::string str_u2; size_t parse_l = parsed_expression.length(); bool had_to_conv = false; MathStructure *mparse2 = NULL; while(true) { if(last_is_space) str_u += " "; CALCULATOR->separateToExpression(str_u, str_u2, settings->evalops, true, false); remove_blank_ends(str_u); if(parsed_expression.empty()) { parsed_expression += CALCULATOR->localToString(false); parsed_expression += " "; } else { parsed_expression += CALCULATOR->localToString(); } remove_duplicate_blanks(str_u); std::string to_str1, to_str2; size_t ispace = str_u.find_first_of(SPACES); if(ispace != std::string::npos) { to_str1 = str_u.substr(0, ispace); remove_blank_ends(to_str1); to_str2 = str_u.substr(ispace + 1); remove_blank_ends(to_str2); } if(equalsIgnoreCase(str_u, "hex") || equalsIgnoreCase(str_u, "hexadecimal") || equalsIgnoreCase(str_u, tr("hexadecimal").toStdString())) { parsed_expression += tr("hexadecimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "oct") || equalsIgnoreCase(str_u, "octal") || equalsIgnoreCase(str_u, tr("octal").toStdString())) { parsed_expression += tr("octal number").toStdString(); } else if(equalsIgnoreCase(str_u, "dec") || equalsIgnoreCase(str_u, "decimal") || equalsIgnoreCase(str_u, tr("decimal").toStdString())) { parsed_expression += tr("decimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "duo") || equalsIgnoreCase(str_u, "duodecimal") || equalsIgnoreCase(str_u, tr("duodecimal").toStdString())) { parsed_expression += tr("duodecimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "doz") || equalsIgnoreCase(str_u, "dozenal")) { parsed_expression += tr("duodecimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "bin") || equalsIgnoreCase(str_u, "binary") || equalsIgnoreCase(str_u, tr("binary").toStdString())) { parsed_expression += tr("binary number").toStdString(); } else if(equalsIgnoreCase(str_u, "roman") || equalsIgnoreCase(str_u, tr("roman").toStdString())) { parsed_expression += tr("roman numerals").toStdString(); } else if(equalsIgnoreCase(str_u, "bijective") || equalsIgnoreCase(str_u, tr("bijective").toStdString())) { parsed_expression += tr("bijective base-26").toStdString(); } else if(equalsIgnoreCase(str_u, "bcd")) { parsed_expression += tr("binary-coded decimal").toStdString(); } else if(equalsIgnoreCase(str_u, "sexa") || equalsIgnoreCase(str_u, "sexa2") || equalsIgnoreCase(str_u, "sexa3") || equalsIgnoreCase(str_u, "sexagesimal") || equalsIgnoreCase(str_u, tr("sexagesimal").toStdString()) || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "sexagesimal", tr("sexagesimal"), "2") || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "sexagesimal", tr("sexagesimal"), "3")) { parsed_expression += tr("sexagesimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "latitude") || equalsIgnoreCase(str_u, tr("latitude").toStdString()) || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "latitude", tr("latitude"), "2")) { parsed_expression += tr("latitude").toStdString(); } else if(equalsIgnoreCase(str_u, "longitude") || equalsIgnoreCase(str_u, tr("longitude").toStdString()) || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "longitude", tr("longitude"), "2")) { parsed_expression += tr("longitude").toStdString(); } else if(equalsIgnoreCase(str_u, "fp32") || equalsIgnoreCase(str_u, "binary32") || equalsIgnoreCase(str_u, "float")) { parsed_expression += tr("32-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp64") || equalsIgnoreCase(str_u, "binary64") || equalsIgnoreCase(str_u, "double")) { parsed_expression += tr("64-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp16") || equalsIgnoreCase(str_u, "binary16")) { parsed_expression += tr("16-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp80")) { parsed_expression += tr("80-bit (x86) floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp128") || equalsIgnoreCase(str_u, "binary128")) { parsed_expression += tr("128-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "time") || equalsIgnoreCase(str_u, tr("time").toStdString())) { parsed_expression += tr("time format").toStdString(); } else if(equalsIgnoreCase(str_u, "unicode")) { parsed_expression += tr("Unicode").toStdString(); } else if(equalsIgnoreCase(str_u, "bases") || equalsIgnoreCase(str_u, tr("bases").toStdString())) { parsed_expression += tr("number bases").toStdString(); } else if(equalsIgnoreCase(str_u, "calendars") || equalsIgnoreCase(str_u, tr("calendars").toStdString())) { parsed_expression += tr("calendars").toStdString(); } else if(equalsIgnoreCase(str_u, "optimal") || equalsIgnoreCase(str_u, tr("optimal").toStdString())) { parsed_expression += tr("optimal unit").toStdString(); } else if(equalsIgnoreCase(str_u, "prefix") || equalsIgnoreCase(str_u, tr("prefix").toStdString()) || str_u == "?" || (str_u.length() == 2 && str_u[1] == '?' && (str_u[0] == 'b' || str_u[0] == 'a' || str_u[0] == 'd'))) { parsed_expression += tr("optimal prefix").toStdString(); } else if(equalsIgnoreCase(str_u, "base") || equalsIgnoreCase(str_u, tr("base").toStdString())) { parsed_expression += tr("base units").toStdString(); } else if(equalsIgnoreCase(str_u, "mixed") || equalsIgnoreCase(str_u, tr("mixed").toStdString())) { parsed_expression += tr("mixed units").toStdString(); } else if(equalsIgnoreCase(str_u, "factors") || equalsIgnoreCase(str_u, tr("factors").toStdString()) || equalsIgnoreCase(str_u, "factor")) { parsed_expression += tr("factors").toStdString(); } else if(equalsIgnoreCase(str_u, "partial fraction") || equalsIgnoreCase(str_u, tr("partial fraction").toStdString())) { parsed_expression += tr("expanded partial fractions").toStdString(); } else if(equalsIgnoreCase(str_u, "rectangular") || equalsIgnoreCase(str_u, "cartesian") || equalsIgnoreCase(str_u, tr("rectangular").toStdString()) || equalsIgnoreCase(str_u, tr("cartesian").toStdString())) { parsed_expression += tr("complex rectangular form").toStdString(); } else if(equalsIgnoreCase(str_u, "exponential") || equalsIgnoreCase(str_u, tr("exponential").toStdString())) { parsed_expression += tr("complex exponential form").toStdString(); } else if(equalsIgnoreCase(str_u, "polar") || equalsIgnoreCase(str_u, tr("polar").toStdString())) { parsed_expression += tr("complex polar form").toStdString(); } else if(str_u == "cis") { parsed_expression += tr("complex cis form").toStdString(); } else if(equalsIgnoreCase(str_u, "angle") || equalsIgnoreCase(str_u, tr("angle").toStdString())) { parsed_expression += tr("complex angle notation").toStdString(); } else if(equalsIgnoreCase(str_u, "phasor") || equalsIgnoreCase(str_u, tr("phasor").toStdString())) { parsed_expression += tr("complex phasor notation").toStdString(); } else if(equalsIgnoreCase(str_u, "utc") || equalsIgnoreCase(str_u, "gmt")) { parsed_expression += tr("UTC time zone").toStdString(); } else if(str_u.length() > 3 && (equalsIgnoreCase(str_u.substr(0, 3), "utc") || equalsIgnoreCase(str_u.substr(0, 3), "gmt"))) { str_u = str_u.substr(3); parsed_expression += "UTC"; remove_blanks(str_u); bool b_minus = false; if(str_u[0] == '+') { str_u.erase(0, 1); } else if(str_u[0] == '-') { b_minus = true; str_u.erase(0, 1); } else if(str_u.find(SIGN_MINUS) == 0) { b_minus = true; str_u.erase(0, strlen(SIGN_MINUS)); } unsigned int tzh = 0, tzm = 0; int itz = 0; if(!str_u.empty() && sscanf(str_u.c_str(), "%2u:%2u", &tzh, &tzm) > 0) { itz = tzh * 60 + tzm; } else { had_errors = true; } if(itz > 0) { if(b_minus) parsed_expression += '-'; else parsed_expression += '+'; if(itz < 60) { parsed_expression += "00"; } else { if(itz < 60 * 10) parsed_expression += '0'; parsed_expression += i2s(itz / 60); } if(itz % 60 > 0) { parsed_expression += ":"; if(itz % 60 < 10) parsed_expression += '0'; parsed_expression += i2s(itz % 60); } } } else if(str_u.length() > 3 && equalsIgnoreCase(str_u.substr(0, 3), "bin") && is_in(NUMBERS, str_u[3])) { unsigned int bits = s2i(str_u.substr(3)); if(bits > 4096) bits = 4096; parsed_expression += i2s(bits); parsed_expression += "-bit "; parsed_expression += tr("binary number").toStdString(); } else if(str_u.length() > 3 && equalsIgnoreCase(str_u.substr(0, 3), "hex") && is_in(NUMBERS, str_u[3])) { unsigned int bits = s2i(str_u.substr(3)); if(bits > 4096) bits = 4096; parsed_expression += i2s(bits); parsed_expression += "-bit "; parsed_expression += tr("hexadecimal number").toStdString(); } else if(str_u == "CET") { parsed_expression += "UTC"; parsed_expression += "+01"; } else if(equalsIgnoreCase(to_str1, "base") || equalsIgnoreCase(to_str1, tr("base").toStdString())) { parsed_expression += (tr("number base %1").arg(QString::fromStdString(to_str2))).toStdString(); } else if(equalsIgnoreCase(str_u, "decimals") || equalsIgnoreCase(str_u, tr("decimals").toStdString())) { parsed_expression += tr("decimal fraction").toStdString(); } else { int tofr = 0; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(str_u), tofr, tr("fraction")); if(fden > 0) { parsed_expression += tr("fraction").toStdString(); parsed_expression += " ("; parsed_expression += "1/"; parsed_expression += i2s(fden); parsed_expression += ")"; } else if(fden < 0) { parsed_expression += tr("fraction").toStdString(); } else { if(str_u[0] == '0' || str_u[0] == '?' || str_u[0] == '+' || str_u[0] == '-') { str_u = str_u.substr(1, str_u.length() - 1); remove_blank_ends(str_u); } else if(str_u.length() > 1 && str_u[1] == '?' && (str_u[0] == 'b' || str_u[0] == 'a' || str_u[0] == 'd')) { str_u = str_u.substr(2, str_u.length() - 2); remove_blank_ends(str_u); } Unit *u = CALCULATOR->getActiveUnit(str_u); if(!u) u = CALCULATOR->getCompositeUnit(str_u); Variable *v = NULL; if(!u) v = CALCULATOR->getActiveVariable(str_u); if(v && !v->isKnown()) v = NULL; Prefix *p = NULL; if(!u && !v && CALCULATOR->unitNameIsValid(str_u)) p = CALCULATOR->getPrefix(str_u); if(u) { if(!had_to_conv && !str_e.empty()) { CALCULATOR->beginTemporaryStopMessages(); MathStructure to_struct = get_units_for_parsed_expression(&mparse, u, settings->evalops, cdata->current_from_struct && !cdata->current_from_struct->isAborted() ? cdata->current_from_struct : NULL, str_e); if(!to_struct.isZero()) { mparse2 = new MathStructure(); CALCULATOR->parse(mparse2, str_e, settings->evalops.parse_options); po.preserve_format = false; to_struct.format(po); po.preserve_format = true; if(to_struct.isMultiplication() && to_struct.size() >= 2) { if(to_struct[0].isOne()) to_struct.delChild(1, true); else if(to_struct[1].isOne()) to_struct.delChild(2, true); } mparse2->multiply(to_struct); } CALCULATOR->endTemporaryStopMessages(); } mparse = u; } else if(v) { mparse = v; } else if(!p) { CALCULATOR->beginTemporaryStopMessages(); CompositeUnit cu("", settings->evalops.parse_options.limit_implicit_multiplication ? "01" : "00", "", str_u); int i_warn = 0, i_error = CALCULATOR->endTemporaryStopMessages(NULL, &i_warn); if(!had_to_conv && cu.countUnits() > 0 && !str_e.empty()) { CALCULATOR->beginTemporaryStopMessages(); MathStructure to_struct = get_units_for_parsed_expression(&mparse, &cu, settings->evalops, cdata->current_from_struct && !cdata->current_from_struct->isAborted() ? cdata->current_from_struct : NULL, str_e); if(!to_struct.isZero()) { mparse2 = new MathStructure(); CALCULATOR->parse(mparse2, str_e, settings->evalops.parse_options); po.preserve_format = false; to_struct.format(po); po.preserve_format = true; if(to_struct.isMultiplication() && to_struct.size() >= 2) { if(to_struct[0].isOne()) to_struct.delChild(1, true); else if(to_struct[1].isOne()) to_struct.delChild(2, true); } mparse2->multiply(to_struct); } CALCULATOR->endTemporaryStopMessages(); } if(i_error) { ParseOptions pa = settings->evalops.parse_options; pa.units_enabled = true; CALCULATOR->parse(&mparse, str_u, pa); } else { if(i_warn > 0) had_warnings = true; mparse = cu.generateMathStructure(true); } mparse.format(po); } if(p) { parsed_expression += p->preferredDisplayName(po.abbreviate_names, po.use_unicode_signs, false, false, po.can_display_unicode_string_function, po.can_display_unicode_string_arg).formattedName(-1, true, TAG_TYPE_HTML, 0, true, po.hide_underscore_spaces); } else { CALCULATOR->beginTemporaryStopMessages(); parsed_expression += mparse.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); CALCULATOR->endTemporaryStopMessages(); } had_to_conv = true; } } if(str_u2.empty()) break; str_u = str_u2; } if(mparse2) { mparse2->format(po); parsed_expression.replace(0, parse_l, mparse2->print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML)); mparse2->unref(); } } if(po.base == BASE_CUSTOM) CALCULATOR->setCustomOutputBase(nr_base); CALCULATOR->endTemporaryStopMessages(false, &status_messages); size_t message_n = 0; for(size_t i = 0; i < status_messages.size(); i++) { if(status_messages[i].category() != MESSAGE_CATEGORY_IMPLICIT_MULTIPLICATION || !settings->implicit_question_asked) { MessageType mtype = status_messages[i].type(); if(mtype == MESSAGE_ERROR) { if(message_n > 0) { if(message_n == 1) parsed_expression_tooltip = "• " + parsed_expression_tooltip; parsed_expression_tooltip += "
• "; } parsed_expression_tooltip += status_messages[i].message(); had_errors = true; message_n++; } else if(mtype == MESSAGE_WARNING) { had_warnings = true; } } } parsed_had_errors = had_errors && (settings->expression_status_delay >= settings->completion_delay); parsed_had_warnings = had_warnings || had_errors; if(!str_f.empty()) {str_f += " "; parsed_expression.insert(0, str_f);} if(parsed_had_errors) prev_parsed_expression = QString::fromStdString(parsed_expression_tooltip); else prev_parsed_expression = QString::fromStdString(parsed_expression); settings->evalops.parse_options.preserve_format = false; if(settings->status_in_history) { emit statusChanged(QString::fromStdString(parsed_expression), !str_e.empty(), had_errors, had_warnings, expression_from_history); if(!b_func) setStatusText(settings->chain_mode || !parsed_had_errors ? "" : prev_parsed_expression, parsed_had_errors ? 3 : 0); } else if(!b_func && show_tooltip) { setStatusText(settings->chain_mode ? "" : prev_parsed_expression, parsed_had_errors ? 3 : 1); } expression_has_changed2 = false; } else if(!b_func) { CALCULATOR->endTemporaryStopMessages(); settings->evalops.parse_options.preserve_format = false; if(prev_func && show_tooltip) { setStatusText((settings->status_in_history && !parsed_had_errors) || settings->chain_mode ? "" : prev_parsed_expression, parsed_had_errors ? 3 : 1); } } else { CALCULATOR->endTemporaryStopMessages(); settings->evalops.parse_options.preserve_format = false; } if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); } void ExpressionEdit::onTextChanged() { QString str = toPlainText(); if(str == previous_text && textCursor().position() == previous_pos) return; tabbed_index = -1; if(completionTimer) completionTimer->stop(); if(tipLabel && settings->expression_status_delay > 0 && current_status_type != 2) tipLabel->hideTip(); if(block_text_change) return; previous_pos = textCursor().position(); if(settings->automatic_digit_grouping && settings->evalops.parse_options.base == BASE_DECIMAL && previous_pos >= 3 && previous_text != str && !str.isEmpty() && str[previous_pos - 1].isDigit()) { char sep = ' '; if(settings->printops.digit_grouping == DIGIT_GROUPING_LOCALE) { if(CALCULATOR->local_digit_group_separator == "." && settings->evalops.parse_options.dot_as_separator) sep = '.'; else if(CALCULATOR->local_digit_group_separator == "," && settings->evalops.parse_options.comma_as_separator) sep = ','; } int n = 0, ns = 0, ns_p = 0; int last_pos = 0; if(previous_pos < str.length()) { last_pos = previous_pos - 1; for(; last_pos < str.length(); last_pos++) { if(!str[last_pos].isDigit() && ((sep == ' ' && !str[last_pos].isSpace()) || (sep != ' ' && str[last_pos] != sep) || last_pos == str.length() - 1 || !str[last_pos + 1].isDigit())) { break; } } last_pos--; } else { last_pos = str.length() - 1; } int first_pos = 0; for(int i = last_pos; i >= 0; i--) { if(str[i].isDigit()) { n++; } else if(((sep == ' ' && str[i].isSpace()) || (sep != ' ' && str[i] == sep)) && i > 0 && str[i - 1].isDigit()) { if(i < previous_pos) ns_p++; ns++; } else { first_pos = i + 1; break; } } if((n > 4 && ns < (n + 1) / 3) || (ns > 0 && str.length() < previous_text.length())) { for(int i = last_pos - 1; ns > 0 && i >= 0;) { if(((sep == ' ' && str[i].isSpace()) || (sep != ' ' && str[i] == sep))) { str.remove(i, 1); ns--; last_pos--; } else { i--; } } previous_pos -= ns_p; ns_p = 0; for(int i = last_pos - 2; n > 4 && i > first_pos; i -= 3) { if(sep == ' ') str.insert(i, THIN_SPACE); else str.insert(i, sep); if(i < previous_pos) ns_p++; } previous_pos += ns_p; block_text_change++; setCursorWidth(0); setPlainText(str); QTextCursor cur = textCursor(); cur.setPosition(previous_pos); setTextCursor(cur); setCursorWidth(1); block_text_change--; } } previous_text = str; if(expression_undo_buffer.isEmpty() || str != expression_undo_buffer.last()) { if(expression_undo_buffer.isEmpty()) { expression_undo_buffer.push_back(QString()); expression_undo_pos.push_back(0); } if(!block_add_to_undo) { if(expression_undo_buffer.size() > 100) {expression_undo_buffer.pop_front(); expression_undo_pos.pop_front();} else undo_index++; while(undo_index < expression_undo_buffer.size()) { expression_undo_buffer.pop_back(); expression_undo_pos.pop_back(); } expression_undo_buffer.push_back(str); expression_undo_pos.push_back(textCursor().position()); } expression_has_changed = true; } if(!dont_change_index) history_index = -1; highlightParentheses(); bool b = completionView->isVisible(); expression_has_changed2 = true; displayParseStatus(); if(!completion_blocked && settings->enable_completion) { if(b && settings->completion_delay > 0) { std::string prev_object_text = current_object_text; setCurrentObject(); if(current_object_text.find(prev_object_text) != 0 || (prev_object_text.empty() && !CALCULATOR->hasToExpression(str.toStdString(), true, settings->evalops))) { b = false; } } if(!b && settings->completion_delay > 0) { bool b2 = false; std::string str_from = str.toStdString(); if(CALCULATOR->hasToExpression(str_from, true, settings->evalops)) { std::string str_to; CALCULATOR->separateToExpression(str_from, str_to, settings->evalops, true, true); if(str_to.empty()) b2 = true; } if(!completionTimer) { completionTimer = new QTimer(this); completionTimer->setSingleShot(true); connect(completionTimer, SIGNAL(timeout()), this, SLOT(complete())); } if(b2) { complete(); } else { hideCompletion(); completionTimer->start(settings->completion_delay); } } else { complete(NULL, NULL, NULL, settings->completion_delay > 0); } } qApp->processEvents(); if(b && !completionView->isVisible()) { cdata->current_function = settings->f_answer; displayParseStatus(); } if(document()->isEmpty()) expression_has_changed = false; } bool ExpressionEdit::expressionHasChanged() { return expression_has_changed && !document()->isEmpty() && !toPlainText().trimmed().isEmpty(); } void ExpressionEdit::setExpressionHasChanged(bool b) { expression_has_changed = b; } void ExpressionEdit::onCompletionMenuItemActivated() { onCompletionActivated(sender()->property("MODEL INDEX").toModelIndex()); } bool ExpressionEdit::completionInitialized() {return sourceModel->hasChildren();} #define MFROM_CLEANUP if(mstruct_from) {cdata->current_from_struct = from_struct_bak; cdata->current_from_units = from_units_bak; cdata->current_from_categories = from_cats_bak;} bool ExpressionEdit::complete(MathStructure *mstruct_from, MathStructure *mstruct_parsed, QMenu *menu, bool current_object_is_set) { if(completionTimer) completionTimer->stop(); if(!sourceModel->hasChildren()) updateCompletion(); MathStructure *from_struct_bak = cdata->current_from_struct; std::vector from_units_bak = cdata->current_from_units; std::vector from_cats_bak = cdata->current_from_categories; completionView->setColumnHidden(2, true); if(mstruct_from) { if(current_object_is_set) do_completion_signal = -1; else do_completion_signal = 1; cdata->current_from_struct = mstruct_from; find_matching_units(*cdata->current_from_struct, mstruct_parsed, cdata->current_from_units); cdata->current_from_categories.clear(); cdata->editing_to_expression = true; cdata->editing_to_expression1 = true; current_object_start = -1; current_object_end = -1; current_object_text = ""; } else { if(!menu) do_completion_signal = 0; else do_completion_signal = -1; if(!current_object_is_set) setCurrentObject(); } cdata->to_type = 0; if(cdata->editing_to_expression && cdata->current_from_struct && cdata->current_from_struct->isDateTime()) cdata->to_type = 3; if(current_object_start < 0) { if(cdata->editing_to_expression && cdata->current_from_struct && (!cdata->current_from_units.empty() || cdata->current_from_struct->containsType(STRUCT_UNIT, true))) { cdata->to_type = 4; } else if(cdata->editing_to_expression && cdata->editing_to_expression1 && cdata->current_from_struct) { cdata->to_type = 2; } else if(!mstruct_from && cdata->current_function && cdata->current_function->subtype() == SUBTYPE_DATA_SET && cdata->current_function_index > 1) { Argument *arg = cdata->current_function->getArgumentDefinition(cdata->current_function_index); if(!arg || arg->type() != ARGUMENT_TYPE_DATA_PROPERTY) { hideCompletion(); MFROM_CLEANUP return false; } } else if(cdata->to_type < 2) { hideCompletion(); MFROM_CLEANUP return false; } } else { if(current_object_text.length() < (size_t) settings->completion_min) {hideCompletion(); MFROM_CLEANUP; return false;} } if(cdata->editing_to_expression && cdata->editing_to_expression1 && cdata->current_from_struct) { if((cdata->current_from_struct->isUnit() && cdata->current_from_struct->unit()->isCurrency()) || (cdata->current_from_struct->isMultiplication() && cdata->current_from_struct->size() == 2 && (*cdata->current_from_struct)[0].isNumber() && (*cdata->current_from_struct)[1].isUnit() && (*cdata->current_from_struct)[1].unit()->isCurrency())) { if(cdata->to_type == 4) cdata->to_type = 5; else cdata->to_type = 1; } } if(cdata->to_type < 2 && (current_object_text.empty() || is_in(NUMBERS NOT_IN_NAMES "%", current_object_text[0])) && (!current_object_text.empty() || !cdata->current_function || cdata->current_function->subtype() != SUBTYPE_DATA_SET)) { hideCompletion(); MFROM_CLEANUP return false; } if(cdata->to_type == 4 && cdata->current_from_categories.empty()) { for(size_t i = 0; i < cdata->current_from_units.size(); i++) { bool b = false; for(size_t i2 = 0; i2 < settings->alternative_volume_categories.size(); i2++) { if(cdata->current_from_units[i]->category() == settings->alternative_volume_categories[i2]) { cdata->current_from_categories.push_back(settings->volume_category); b = true; break; } } if(!b) cdata->current_from_categories.push_back(cdata->current_from_units[i]->category()); } } cdata->exact_prefix_match = QModelIndex(); cdata->exact_match_found = false; cdata->exact_prefix_match_found = false; cdata->highest_match = 0; cdata->arg = NULL; if(!mstruct_from && cdata->current_function && cdata->current_function->subtype() == SUBTYPE_DATA_SET) { cdata->arg = cdata->current_function->getArgumentDefinition(cdata->current_function_index); if(cdata->arg && (cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT || cdata->arg->type() == ARGUMENT_TYPE_DATA_PROPERTY)) { if(cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT && (current_object_text.empty() || current_object_text.length() < (size_t) settings->completion_min)) {hideCompletion(); MFROM_CLEANUP; return false;} if(cdata->current_function_index == 1) { for(size_t i = 1; i <= cdata->current_function->countNames(); i++) { if(current_object_text.find(cdata->current_function->getName(i).name) != std::string::npos) { cdata->arg = NULL; break; } } } } else { cdata->arg = NULL; } if(cdata->arg) { DataSet *o = NULL; if(cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT) o = ((DataObjectArgument*) cdata->arg)->dataSet(); else if(cdata->arg->type() == ARGUMENT_TYPE_DATA_PROPERTY) o = ((DataPropertyArgument*) cdata->arg)->dataSet(); if(o) { QFont ifont(completionView->font()); ifont.setStyle(QFont::StyleItalic); QList items; for(int i = 0; i < sourceModel->rowCount();) { QModelIndex index = sourceModel->index(i, 0); int p_type = index.data(TYPE_ROLE).toInt(); if(p_type > 2 && p_type < 100) { sourceModel->removeRow(i); } else { i++; } } DataPropertyIter it; DataProperty *dp = o->getFirstProperty(&it); std::vector found_objects; while(dp) { if(cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT) { if(dp->isKey() && dp->propertyType() == PROPERTY_STRING) { DataObjectIter it2; DataObject *obj = o->getFirstObject(&it2); while(obj) { const std::string &name = obj->getProperty(dp); int b_match = 0; if(equalsIgnoreCase(current_object_text, name, 0, current_object_text.length(), 0)) b_match = name.length() == current_object_text.length() ? 1 : 2; for(size_t i = 0; b_match && i < found_objects.size(); i++) { if(found_objects[i] == obj) b_match = 0; } if(b_match) { found_objects.push_back(obj); DataPropertyIter it3; DataProperty *dp2 = o->getFirstProperty(&it3); std::string names = name; std::string title; while(dp2) { if(title.empty() && dp2->hasName("name")) { title = dp2->getDisplayString(obj->getProperty(dp2)); } if(dp2 != dp && dp2->isKey()) { names += " "; names += dp2->getDisplayString(obj->getProperty(dp2)); names += ""; } dp2 = o->getNextProperty(&it3); } COMPLETION_APPEND_M(QString::fromStdString(names), title.empty() ? tr("Data object") : QString::fromStdString(title), 4, b_match) } obj = o->getNextObject(&it2); } } } else { int b_match = 0; size_t i_match = 0; if(current_object_text.empty()) { b_match = 2; i_match = 1; } else { for(size_t i = 1; i <= dp->countNames(); i++) { const std::string &name = dp->getName(i); if((i_match == 0 || name.length() == current_object_text.length()) && equalsIgnoreCase(current_object_text, name, 0, current_object_text.length(), 0)) { b_match = name.length() == current_object_text.length() ? 1 : 2; i_match = i; if(b_match == 1) break; } } } if(b_match) { std::string names = dp->getName(i_match); for(size_t i = 1; i <= dp->countNames(); i++) { if(i != i_match) { names += " "; names += dp->getName(i); names += ""; } } i_match = 0; COMPLETION_APPEND_M(QString::fromStdString(names), QString::fromStdString(dp->title()), 3, b_match) if(b_match > cdata->highest_match) cdata->highest_match = b_match; } } dp = o->getNextProperty(&it); } } else { cdata->arg = NULL; } } } cdata->prefixes.clear(); cdata->pstr.clear(); if(!mstruct_from && !cdata->arg && current_object_text.length() > (size_t) settings->completion_min) { for(size_t pi = 1; ; pi++) { Prefix *prefix = CALCULATOR->getPrefix(pi); if(!prefix) break; for(size_t name_i = 1; name_i <= prefix->countNames(); name_i++) { const std::string *pname = &prefix->getName(name_i).name; if(!pname->empty() && pname->length() < current_object_text.length() - settings->completion_min + 1) { bool pmatch = true; for(size_t i = 0; i < pname->length(); i++) { if((*pname)[i] != current_object_text[i]) { pmatch = false; break; } } if(pmatch) { cdata->prefixes.push_back(prefix); cdata->pstr.push_back(current_object_text.substr(pname->length())); } } } } } completionModel->setFilter(current_object_text); completionModel->sort(1); if(completionModel->rowCount() > 0) { if(menu) { hideCompletion(); HIDE_TOOLTIP int r = 0; bool b_separator = false; QModelIndex index = completionModel->index(0, 2); QString title, flag; while(index.isValid()) { title = index.data().toString(); int i = title.indexOf("= 0) i2 = title.indexOf("\"/>", i + 10); if(i2 >= 0) { flag = title.mid(i + 10, i2 - (i + 10)); title = title.left(i); } else { flag.clear(); } #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) index = index.siblingAtColumn(0); #else index = index.sibling(r, 0); #endif if(!b_separator && r > 0 && index.data(TYPE_ROLE).toInt() < 100) { menu->addSeparator(); b_separator = true; } QAction *action = menu->addAction(title, this, SLOT(onCompletionMenuItemActivated())); action->setProperty("MODEL INDEX", index); if(!flag.isEmpty()) action->setIcon(QIcon(flag)); r++; index = index.sibling(r, 2); } MFROM_CLEANUP return true; } completionView->resizeRowsToContents(); int c1_prev = completionView->columnWidth(0); completionView->horizontalHeader()->setStretchLastSection(false); completionView->resizeColumnsToContents(); QRect rect; int w = completionView->sizeHint().width(); QTextCursor cur = textCursor(); if(current_object_start >= 0) cur.setPosition(current_object_start); rect = cursorRect(cur); if(prev_rect == rect && completionView->isVisible() && completionView->width() > w) { w = completionView->width(); int scr_w = 0; if(completionView->verticalScrollBar() && completionView->verticalScrollBar()->isVisible()) scr_w = completionView->verticalScrollBar()->sizeHint().width(); if(completionView->columnWidth(0) < c1_prev) { if(completionView->columnWidth(1) <= (w - scr_w) - c1_prev) { completionView->setColumnWidth(0, c1_prev); } else { completionView->setColumnWidth(0, (w - scr_w) - completionView->columnWidth(1)); } completionView->horizontalHeader()->setStretchLastSection(true); } } if(!settings->wayland_platform || !completionView->isVisible()) { prev_rect = rect; if(settings->wayland_platform) { QWidget *win = this; while(win->parentWidget()) win = win->parentWidget(); int max_h = win->height() - mapTo(win, QPoint(0, rect.y() + rect.height())).y() - 3; if(completionView->horizontalScrollBar()) max_h -= completionView->horizontalScrollBar()->sizeHint().height(); int n = max_h / ((QAbstractItemView*) completionView)->sizeHintForRow(0); if(n > 20) n = 20; else if(n < 5) n = 5; completer->setMaxVisibleItems(n); } rect.setWidth(w); completer->complete(rect); } else { int h = (((QAbstractItemView*) completionView)->sizeHintForRow(0) * qMin(completer->maxVisibleItems(), completionModel->rowCount()) + 3) + 3; QScrollBar *hsb = completionView->horizontalScrollBar(); if(hsb && hsb->isVisible()) h += hsb->sizeHint().height(); completionView->resize(w, h); } completionView->clearSelection(); completionView->setCurrentIndex(QModelIndex()); if(tipLabel && tipLabel->isVisible()) { if(!tipLabel->placeTip(mapToGlobal(cursorRect().bottomRight()), completionView->geometry())) HIDE_TOOLTIP } else if(toolTipTimer && toolTipTimer->isActive()) { toolTipTimer->start(settings->expression_status_delay); } } else { if(tipLabel && tipLabel->isVisible() && completionView->isVisible()) tipLabel->placeTip(mapToGlobal(cursorRect().bottomRight())); hideCompletion(); MFROM_CLEANUP return false; } MFROM_CLEANUP return true; } void ExpressionEdit::onCursorPositionChanged() { tabbed_index = -1; if(completionTimer) completionTimer->stop(); if(toolTipTimer) toolTipTimer->stop(); if(tipLabel && settings->expression_status_delay > 0 && current_status_type != 2) tipLabel->hideTip(); if(block_text_change) return; cursor_has_moved = true; int epos = document()->characterCount() - 1 - textCursor().position(); if(epos == previous_epos) return; previous_epos = epos; completionView->hide(); highlightParentheses(); displayParseStatus(); } bool ExpressionEdit::expressionInQuotes() { bool in_cit1 = false, in_cit2 = false; int pos = textCursor().selectionStart(); for(int i = 0; i < pos; i++) { if(!in_cit2 && document()->characterAt(i) == '\"') { in_cit1 = !in_cit1; } else if(!in_cit1 && document()->characterAt(i) == '\'') { in_cit2 = !in_cit2; } } return in_cit1 || in_cit2; } void ExpressionEdit::highlightParentheses() { if(document()->isEmpty()) return; if(parentheses_highlighted) { block_text_change++; QTextCursor cur = textCursor(); cur.select(QTextCursor::Document); cur.setCharFormat(QTextCharFormat()); block_text_change--; parentheses_highlighted = false; } if(textCursor().hasSelection()) return; int pos = textCursor().position(), ipar2; int l = document()->characterCount() - 1; if(pos > l) pos = l; bool b = pos < l && document()->characterAt(pos) == ')'; if(!b && pos > 0 && document()->characterAt(pos - 1) == ')') { pos--; b = true; } if(b) { ipar2 = pos; int pars = 1; while(ipar2 > 0) { ipar2--; if(document()->characterAt(ipar2) == ')') pars++; else if(document()->characterAt(ipar2) == '(') pars--; if(pars == 0) break; } b = (pars == 0); } else { b = pos < l && document()->characterAt(pos) == '('; if(!b && pos > 0 && document()->characterAt(pos - 1) == '(') { pos--; b = true; } if(b) { ipar2 = pos; int pars = 1; while(ipar2 + 1 < l) { ipar2++; if(document()->characterAt(ipar2) == '(') pars++; else if(document()->characterAt(ipar2) == ')') pars--; if(pars == 0) break; } b = (pars == 0); } } if(b) { block_text_change++; QTextCharFormat format; if(settings->color == 1) format.setForeground(QColor(0, 128, 0)); else format.setForeground(QColor(0, 255, 0)); QTextCursor cur = textCursor(); cur.setPosition(pos, QTextCursor::MoveAnchor); cur.setPosition(pos + 1, QTextCursor::KeepAnchor); cur.setCharFormat(format); cur.setPosition(ipar2, QTextCursor::MoveAnchor); cur.setPosition(ipar2 + 1, QTextCursor::KeepAnchor); cur.setCharFormat(format); setCurrentCharFormat(QTextCharFormat()); block_text_change--; parentheses_highlighted = true; } } void ExpressionEdit::selectAll(bool b) { tabbed_index = -1; QTextCursor cur = textCursor(); if(b) { cur.select(QTextCursor::Document); setTextCursor(cur); if(!document()->isEmpty()) QApplication::clipboard()->setText(toPlainText(), QClipboard::Selection); cursor_has_moved = false; } else if(cur.hasSelection()) { cur.setPosition(cur.selectionEnd()); setTextCursor(cur); if(!document()->isEmpty()) QApplication::clipboard()->clear(QClipboard::Selection); } } void ExpressionEdit::insertBrackets() { QTextCursor cur = textCursor(); cur.beginEditBlock(); if(cur.hasSelection()) { int istart = cur.selectionStart(); int iend = cur.selectionEnd(); std::string str = CALCULATOR->unlocalizeExpression(toPlainText().mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); cur.setPosition(istart); cur.insertText("["); iend++; cur.setPosition(iend); cur.insertText("]"); iend++; istart++; CALCULATOR->parseSigns(str); if(str.empty() || is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { iend--; } cur.setPosition(iend); setTextCursor(cur); } else { insertPlainText("[]"); moveCursor(QTextCursor::PreviousCharacter); } cur.endEditBlock(); highlightParentheses(); } void ExpressionEdit::insertText(const QString &s) { if(overwriteMode() && !textCursor().atEnd()) { QTextCursor cur = textCursor(); cur.beginEditBlock(); cur.deleteChar(); insertPlainText(s); cur.endEditBlock(); } else { insertPlainText(s); } } void ExpressionEdit::wrapSelection(const QString &text, bool insert_before, bool always_add_parentheses, bool add_comma, const QString &add_args, bool quote) { parse_blocked++; QTextCursor cur = textCursor(); if(cur.hasSelection() && (!overwriteMode() || insert_before || always_add_parentheses || add_comma || !add_args.isEmpty())) { QString qstr = toPlainText(); std::string str = qstr.toStdString(); int istart = cur.selectionStart(); int iend = cur.selectionEnd(); if(istart == 0 && iend == qstr.length()) { if(CALCULATOR->hasToExpression(str, true, settings->evalops) || CALCULATOR->hasWhereExpression(str, settings->evalops)) { std::string str_to; CALCULATOR->separateToExpression(str, str_to, settings->evalops, true, true); CALCULATOR->separateWhereExpression(str, str_to, settings->evalops); if(str.empty()) { if(always_add_parentheses && insert_before) { setCursorWidth(0); cur.beginEditBlock(); if(quote) insertPlainText(text + "(\"\"" + add_args +")"); else insertPlainText(text + "(" + add_args +")"); cur.movePosition(QTextCursor::PreviousCharacter, QTextCursor::MoveAnchor, add_args.length() + (quote ? 2 : 1)); cur.endEditBlock(); setTextCursor(cur); setCursorWidth(1); } else if(always_add_parentheses) { insertPlainText("(" + add_args +")" + text); } else if(!text.isEmpty()) { insertPlainText(text); } else { parse_blocked--; return; } parse_blocked--; highlightParentheses(); displayParseStatus(); return; } iend = unicode_length(str); } else if(!always_add_parentheses && str.find_first_not_of(NUMBER_ELEMENTS SPACE) == std::string::npos) { if(insert_before && !text.isEmpty()) { moveCursor(QTextCursor::Start); insertPlainText(text); moveCursor(QTextCursor::End); } else { moveCursor(QTextCursor::End); if(text.isEmpty()) {parse_blocked--; return;} insertPlainText(text); } parse_blocked--; highlightParentheses(); displayParseStatus(); return; } } setCursorWidth(0); str = CALCULATOR->unlocalizeExpression(qstr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); if(insert_before || text.isEmpty()) { cur.beginEditBlock(); cur.setPosition(istart); if(quote && str.length() > 2 && str.find_first_of("\"\'") != std::string::npos) quote = false; if(quote) cur.insertText(text + "(\""); else cur.insertText(text + "("); iend += text.length() + (quote ? 2 : 1); cur.setPosition(iend); int iend_text = iend; if(quote) {cur.insertText("\""); iend++; cur.setPosition(iend);} if(!add_args.isEmpty()) { cur.insertText(add_args); iend += add_args.length(); } if(add_comma) { cur.insertText(QString::fromStdString(CALCULATOR->getComma()) + " )"); iend += 3; } else { cur.insertText(")"); iend++; } istart++; CALCULATOR->parseSigns(str); if(!quote && !str.empty() && is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { iend = iend_text; } else if(add_comma) { iend--; } cur.setPosition(iend); cur.endEditBlock(); } else { CALCULATOR->parseSigns(str); if(!str.empty() && is_in(OPERATORS, str[str.length() - 1]) && str[str.length() - 1] != NOT_CH) { insertPlainText(text); } else { cur.beginEditBlock(); cur.setPosition(istart); cur.insertText("("); cur.setPosition(iend + 1); cur.insertText(")" + text); cur.endEditBlock(); } } setTextCursor(cur); setCursorWidth(1); } else if(always_add_parentheses && insert_before) { setCursorWidth(0); cur.beginEditBlock(); if(overwriteMode()) cur.deleteChar(); if(quote) insertPlainText(text + "(\"\"" + add_args + ")"); else insertPlainText(text + "(" + add_args + ")"); cur.movePosition(QTextCursor::PreviousCharacter, QTextCursor::MoveAnchor, add_args.length() + (quote ? 2 : 1)); cur.endEditBlock(); setTextCursor(cur); setCursorWidth(1); } else if(always_add_parentheses) { insertText("(" + add_args + ")" + text); } else if(!text.isEmpty()) { insertText(text); } else { parse_blocked--; return; } parse_blocked--; highlightParentheses(); displayParseStatus(); } void ExpressionEdit::smartParentheses() { QString qexpr = toPlainText(); int istart = 0, iend = 0, ipos; QTextCursor cur = textCursor(); cur.beginEditBlock(); if(qexpr.isEmpty()) { setCursorWidth(0); insertPlainText("()"); moveCursor(QTextCursor::PreviousCharacter); cur.endEditBlock(); setCursorWidth(1); return; } ipos = cur.position(); bool goto_start = false; if(cur.hasSelection()) { istart = cur.selectionStart(); iend = cur.selectionEnd(); if(istart == 0 && iend == qexpr.length()) { std::string str = qexpr.toStdString(); if(CALCULATOR->hasToExpression(str, true, settings->evalops) || CALCULATOR->hasWhereExpression(str, settings->evalops)) { std::string str_to; CALCULATOR->separateToExpression(str, str_to, settings->evalops, true, true); CALCULATOR->separateWhereExpression(str, str_to, settings->evalops); iend = unicode_length(str); } } } else { iend = ipos; if(iend != 0) { std::string str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty() || is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { istart = iend; iend = qexpr.length(); if(istart < iend) { str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty() || (is_in(OPERATORS SPACES SEXADOT DOT RIGHT_VECTOR_WRAP LEFT_PARENTHESIS RIGHT_PARENTHESIS COMMAS, str[0]) && str[0] != MINUS_CH)) { iend = istart; } } } } else { goto_start = true; iend = qexpr.length(); std::string str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart).toStdString(), settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty() || (is_in(OPERATORS SPACES SEXADOT DOT RIGHT_VECTOR_WRAP LEFT_PARENTHESIS RIGHT_PARENTHESIS COMMAS, str[0]) && str[0] != MINUS_CH)) { iend = istart; } } } if(istart >= iend) { setCursorWidth(0); cur.setPosition(istart); setTextCursor(cur); insertPlainText("()"); moveCursor(QTextCursor::PreviousCharacter); cur.endEditBlock(); setCursorWidth(1); return; } setCursorWidth(0); std::string str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); cur.setPosition(istart); cur.insertText("("); iend++; cur.setPosition(iend); cur.insertText(")"); iend++; istart++; CALCULATOR->parseSigns(str); if(str.empty() || is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { iend--; goto_start = false; } if(goto_start) cur.setPosition(istart); else cur.setPosition(iend); setTextCursor(cur); cur.endEditBlock(); setCursorWidth(1); highlightParentheses(); } void ExpressionEdit::onCompletionHighlighted(const QModelIndex&) { if(tipLabel && tipLabel->isVisible()) {HIDE_TOOLTIP} else if(toolTipTimer && toolTipTimer->isActive()) toolTipTimer->start(settings->expression_status_delay); } void ExpressionEdit::onCompletionActivated(const QModelIndex &index_pre) { if(!index_pre.isValid()) return; #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) QModelIndex index = index_pre.siblingAtColumn(0); #else QModelIndex index = index_pre.sibling(index_pre.row(), 0); #endif if(!index.isValid()) return; std::string str; int cos_bak = current_object_start; ExpressionItem *item = NULL; Prefix *prefix = NULL; int p_type = 0; int exp = 1; void *p = NULL; const ExpressionName *ename = NULL, *ename_r = NULL, *ename_r2; int i_type = 0; size_t i_match = 0; p_type = index.data(TYPE_ROLE).toInt(); p = index.data(ITEM_ROLE).value(); i_match = index.data(IMATCH_ROLE).toInt(); i_type = index.data(MATCH_ROLE).toULongLong(); if(i_type == 3 && p) return; if(p_type == 1) item = (ExpressionItem*) p; else if(p_type == 2) prefix = (Prefix*) p; if(item && item->type() == TYPE_UNIT && ((Unit*) item)->subtype() == SUBTYPE_COMPOSITE_UNIT && (((CompositeUnit*) item)->countUnits() > 1 || !((CompositeUnit*) item)->get(1, &exp, &prefix) || exp != 1)) { PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) this; po.abbreviate_names = true; str = ((Unit*) item)->print(po, false, TAG_TYPE_HTML, true, false); } else if(item) { CompositeUnit *cu = NULL; if(item->type() == TYPE_UNIT && ((Unit*) item)->subtype() == SUBTYPE_COMPOSITE_UNIT) { cu = (CompositeUnit*) item; item = cu->get(1); } if(i_type > 2) { if(i_match > 0) ename = &item->getName(i_match); else ename = &item->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(!ename) return; if(cu && prefix) { str = prefix->preferredInputName(ename->abbreviation, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this).name; str += ename->formattedName(TYPE_UNIT, true); } else { str = ename->formattedName(TYPE_UNIT, true); } } else if(cu && prefix) { ename_r = &prefix->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(settings->printops.abbreviate_names && ename_r->abbreviation) ename_r2 = &prefix->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); else ename_r2 = NULL; if(ename_r2 == ename_r) ename_r2 = NULL; const ExpressionName *ename_i; size_t l = 0; for(size_t name_i = 0; name_i <= (ename_r2 ? prefix->countNames() + 1 : prefix->countNames()) && l != current_object_text.length(); name_i++) { if(name_i == 0) { ename_i = ename_r; } else if(name_i == 1 && ename_r2) { ename_i = ename_r2; } else { ename_i = &prefix->getName(ename_r2 ? name_i - 1 : name_i); if(!ename_i || ename_i == ename_r || ename_i == ename_r2 || (ename_i->name.length() <= l && ename_i->name.length() != current_object_text.length()) || ename_i->plural || (ename_i->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename_i->name.c_str(), (void*) this)))) { ename_i = NULL; } } if(ename_i) { if(!((Unit*)item)->useWithPrefixesByDefault() || ename_i->name.length() >= current_object_text.length()) { for(size_t i = 0; i < current_object_text.length() && i < ename_i->name.length(); i++) { if(ename_i->name[i] != current_object_text[i]) { if(i_type != 1 || !equalsIgnoreCase(ename_i->name, current_object_text)) { ename_i = NULL; } break; } } } else { ename_i = NULL; } } if(ename_i) { l = ename_i->name.length(); ename = ename_i; } } for(size_t name_i = 1; name_i <= prefix->countNames() && l != current_object_text.length(); name_i++) { ename_i = &prefix->getName(name_i); if(!ename_i || ename_i == ename_r || ename_i == ename_r2 || (ename_i->name.length() <= l && ename_i->name.length() != current_object_text.length()) || (!ename_i->plural && !(ename_i->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename_i->name.c_str(), (void*) this))))) { ename_i = NULL; } if(ename_i) { if(!((Unit*)item)->useWithPrefixesByDefault() || ename_i->name.length() >= current_object_text.length()) { for(size_t i = 0; i < current_object_text.length() && i < ename_i->name.length(); i++) { if(ename_i->name[i] != current_object_text[i] && (ename_i->name[i] < 'A' || ename_i->name[i] > 'Z' || ename_i->name[i] != current_object_text[i] + 32) && (ename_i->name[i] < 'a' || ename_i->name[i] > '<' || ename_i->name[i] != current_object_text[i] - 32)) { if(i_type != 1 || !equalsIgnoreCase(ename_i->name, current_object_text)) { ename_i = NULL; } break; } } } else { ename_i = NULL; } } if(ename_i) { l = ename_i->name.length(); ename = ename_i; } } if(ename && ename->completion_only) { ename = &prefix->preferredInputName(ename->abbreviation, settings->printops.use_unicode_signs, ename->plural, false, &can_display_unicode_string_function, (void*) this); } if(!ename) ename = ename_r; if(!ename) return; str = ename->name; str += item->preferredInputName(settings->printops.abbreviate_names && ename->abbreviation, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this).formattedName(TYPE_UNIT, true); } else { std::string str2; if(i_match > 0) { str2 = current_object_text.substr(i_match); current_object_start += unicode_length(current_object_text.substr(0, i_match)); } else { str2 = current_object_text; } ename_r = &item->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(settings->printops.abbreviate_names && ename_r->abbreviation) ename_r2 = &item->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); else ename_r2 = NULL; if(ename_r2 == ename_r) ename_r2 = NULL; std::string cap_str; for(size_t name_i = 0; name_i <= (ename_r2 ? item->countNames() + 1 : item->countNames()) && !ename; name_i++) { if(name_i == 0) { ename = ename_r; } else if(name_i == 1 && ename_r2) { ename = ename_r2; } else { ename = &item->getName(ename_r2 ? name_i - 1 : name_i); if(!ename || ename == ename_r || ename == ename_r2 || ename->plural || (ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this)))) { ename = NULL; } } if(ename) { bool b = false; std::unordered_map::iterator cap_it = capitalized_names.find(ename); if(cap_it != capitalized_names.end() && str2.length() <= cap_it->second.length()) { b = true; for(size_t i = 0; i < str2.length(); i++) { if(cap_it->second[i] != str2[i]) { if(i_type != 1 || !equalsIgnoreCase(cap_it->second, str2)) { b = false; } break; } } } if(b) cap_str = cap_it->second; if(!b && str2.length() <= ename->name.length()) { b = true; for(size_t i = 0; i < str2.length(); i++) { if(ename->name[i] != str2[i]) { if(i_type != 1 || !equalsIgnoreCase(ename->name, str2)) { b = false; } break; } } } if(!b) ename = NULL; } } for(size_t name_i = 1; name_i <= item->countNames() && !ename; name_i++) { ename = &item->getName(name_i); if(!ename || ename == ename_r || ename == ename_r2 || (!ename->plural && !(ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this))))) { ename = NULL; } if(ename) { bool b = false; if(str2.length() <= ename->name.length()) { b = true; for(size_t i = 0; i < str2.length(); i++) { if(ename->name[i] != str2[i] && (ename->name[i] < 'A' || ename->name[i] > 'Z' || ename->name[i] != str2[i] + 32) && (ename->name[i] < 'a' || ename->name[i] > '<' || ename->name[i] != str2[i] - 32)) { if(i_type != 1 || !equalsIgnoreCase(ename->name, str2)) { b = false; } break; } } } if(!b) ename = NULL; } } if(!ename || ename->completion_only) ename = ename_r; if(!ename) return; if(!cap_str.empty()) str = cap_str; else str = ename->name; } } else if(prefix) { ename_r = &prefix->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(settings->printops.abbreviate_names && ename_r->abbreviation) ename_r2 = &prefix->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); else ename_r2 = NULL; if(ename_r2 == ename_r) ename_r2 = NULL; for(size_t name_i = 0; name_i <= (ename_r2 ? prefix->countNames() + 1 : prefix->countNames()) && !ename; name_i++) { if(name_i == 0) { ename = ename_r; } else if(name_i == 1 && ename_r2) { ename = ename_r2; } else { ename = &prefix->getName(ename_r2 ? name_i - 1 : name_i); if(!ename || ename == ename_r || ename == ename_r2 || ename->plural || (ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this)))) { ename = NULL; } } if(ename) { if(current_object_text.length() <= ename->name.length()) { for(size_t i = 0; i < current_object_text.length(); i++) { if(ename->name[i] != current_object_text[i]) { if(i_type != 1 || !equalsIgnoreCase(ename->name, current_object_text)) { ename = NULL; } break; } } } else { ename = NULL; } } } for(size_t name_i = 1; name_i <= prefix->countNames() && !ename; name_i++) { ename = &prefix->getName(name_i); if(!ename || ename == ename_r || ename == ename_r2 || (!ename->plural && !(ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this))))) { ename = NULL; } if(ename) { if(current_object_text.length() <= ename->name.length()) { for(size_t i = 0; i < current_object_text.length(); i++) { if(ename->name[i] != current_object_text[i] && (ename->name[i] < 'A' || ename->name[i] > 'Z' || ename->name[i] != current_object_text[i] + 32) && (ename->name[i] < 'a' || ename->name[i] > '<' || ename->name[i] != current_object_text[i] - 32)) { if(i_type != 1 || !equalsIgnoreCase(ename->name, current_object_text)) { ename = NULL; } break; } } } else { ename = NULL; } } } if(ename && (ename->completion_only || (settings->printops.use_unicode_signs && ename->name == "u"))) { ename = &prefix->preferredInputName(ename->abbreviation, settings->printops.use_unicode_signs, ename->plural, false, &can_display_unicode_string_function, (void*) this); } if(!ename) ename = ename_r; if(!ename) return; str = ename->name; } else { str = index.data(Qt::DisplayRole).toString().toStdString(); size_t i = 0; size_t i2 = str.find(" "); while(i_match > 0) { if(i == 0) i = i2 + 4; else i = i2 + 8; if(i >= str.length()) break; i2 = str.find("", i); if(i2 == std::string::npos) break; i_match--; if(i == std::string::npos) break; } if(i2 == std::string::npos) i2 = str.length(); if(i == std::string::npos) i = 0; str = str.substr(i, i2 - i); } if(do_completion_signal > 0) { emit toConversionRequested(str); return; } blockCompletion(true); if(current_object_start >= 0) { QTextCursor c = textCursor(); c.setPosition(current_object_start); c.setPosition(current_object_end, QTextCursor::KeepAnchor); setTextCursor(c); } int i_move = 0; QString text = toPlainText(); if(item && item->type() == TYPE_FUNCTION) { if(text.length() > current_object_end && text[current_object_end] == '(') { i_move = 1; } else { str += "()"; i_move = -1; } } blockParseStatus(); insertPlainText(QString::fromStdString(str)); blockParseStatus(false); if(i_move != 0) { QTextCursor c = textCursor(); c.setPosition(c.position() + i_move); setTextCursor(c); } blockCompletion(false); if((do_completion_signal < 0 || (!item && !prefix)) && cdata->editing_to_expression && (current_object_end < 0 || current_object_end == text.length())) { if(str[str.length() - 1] != ' ' && str[str.length() - 1] != '/') { current_object_end = current_object_start + unicode_length(str); current_object_start = cos_bak; emit returnPressed(); return; } } current_object_end = current_object_start + unicode_length(str); current_object_start = cos_bak; cdata->current_function = settings->f_answer; displayParseStatus(); } void ExpressionEdit::hideCompletion() { completionView->hide(); } void ExpressionEdit::clearHistory() { settings->expression_history.clear(); history_index = -1; current_history.clear(); } void ExpressionEdit::addToHistory() { std::string str = toPlainText().toStdString(); for(size_t i = 0; i < settings->expression_history.size(); i++) { if(settings->expression_history[i] == str) { settings->expression_history.erase(settings->expression_history.begin() + i); break; } } if(settings->expression_history.size() >= 100) { settings->expression_history.pop_back(); } settings->expression_history.insert(settings->expression_history.begin(), str); history_index = 0; cursor_has_moved = false; } void ExpressionEdit::setCurrentObject() { current_object_start = -1; current_object_end = -1; current_object_text = ""; cdata->editing_to_expression = false; cdata->editing_to_expression1 = false; std::string str; size_t l_to = 0, pos = 0, pos2 = 0; if(textCursor().position() > 0) { QString str = toPlainText(); current_object_start = textCursor().position(); current_object_end = current_object_start; current_object_text = str.left(current_object_start).toStdString(); l_to = current_object_text.length(); pos = current_object_text.length(); pos2 = pos; if(l_to > 0 && current_object_text[0] == '/') return; for(size_t i = 0; i < l_to; i++) { if(current_object_text[i] == '#') { current_object_start = -1; current_object_end = -1; current_object_text = ""; break; } } } if(current_object_start >= 0) { if(CALCULATOR->hasToExpression(current_object_text, true, settings->evalops)) { cdata->editing_to_expression = true; std::string str_to, str_from = current_object_text; bool b_space = is_in(SPACES, str_from[str_from.length() - 1]); bool b_first = true; do { CALCULATOR->separateToExpression(str_from, str_to, settings->evalops, true, true); if(b_first && str_from.empty()) { if(cdata->current_from_struct) cdata->current_from_struct->unref(); cdata->current_from_struct = settings->current_result; if(cdata->current_from_struct) { cdata->current_from_struct->ref(); find_matching_units(*cdata->current_from_struct, NULL, cdata->current_from_units); cdata->current_from_categories.clear(); } } b_first = false; str_from = str_to; if(!str_to.empty() && b_space) str_from += " "; } while(CALCULATOR->hasToExpression(str_from, true, settings->evalops)); l_to = str_to.length(); } bool non_number_before = false; size_t l; while(pos2 > 0 && l_to > 0) { l = 1; while(pos2 - l > 0 && (unsigned char) current_object_text[pos2 - l] >= 0x80 && (unsigned char) current_object_text[pos2 - l] < 0xC0) l++; pos2 -= l; l_to -= l; current_object_start--; if(!CALCULATOR->utf8_pos_is_valid_in_name((char*) current_object_text.c_str() + sizeof(char) * pos2)) { pos2 += l; current_object_start++; break; } else if(l == 1 && is_in(NUMBERS, current_object_text[pos2])) { if(non_number_before) { pos2++; current_object_start++; break; } } else { non_number_before = true; } } cdata->editing_to_expression1 = (l_to == 0); if(pos2 > pos) { current_object_start = -1; current_object_end = -1; current_object_text = ""; } else { std::string str2 = toPlainText().toStdString(); while(pos < str2.length()) { if(!CALCULATOR->utf8_pos_is_valid_in_name((char*) str2.c_str() + sizeof(char) * pos)) { break; } if((unsigned char) str2[pos] >= 0xC0) pos += 2; else if((unsigned char) str2[pos] >= 0xE0) pos += 3; else if((unsigned char) str2[pos] >= 0xF0) pos += 4; else pos++; current_object_end++; } if(pos2 >= pos) { current_object_start = -1; current_object_end = -1; current_object_text = ""; } else { current_object_text = str2.substr(pos2, pos - pos2); } } } } bool ExpressionEdit::doChainMode(const QString &op) { if(expression_has_changed && !settings->rpn_mode && settings->chain_mode && !cdata->current_function && settings->evalops.parse_options.base != BASE_UNICODE && (settings->evalops.parse_options.base != BASE_CUSTOM || (CALCULATOR->customInputBase() <= 62 && CALCULATOR->customInputBase() >= -62))) { QTextCursor cur = textCursor(); if(cur.hasSelection()) { if(cur.selectionStart() != 0 || cur.selectionEnd() != toPlainText().length()) return false; } else if(!cur.atEnd()) { return false; } std::string str = CALCULATOR->unlocalizeExpression(toPlainText().toStdString(), settings->evalops.parse_options); remove_blanks(str); if(str.empty() || str[0] == '/' || CALCULATOR->hasToExpression(str, true, settings->evalops) || CALCULATOR->hasWhereExpression(str, settings->evalops) || last_is_operator(str)) return false; size_t par_n = 0, vec_n = 0; for(size_t i = 0; i < str.length(); i++) { if(str[i] == LEFT_PARENTHESIS_CH) par_n++; else if(par_n > 0 && str[i] == RIGHT_PARENTHESIS_CH) par_n--; else if(str[i] == LEFT_VECTOR_WRAP_CH) vec_n++; else if(vec_n > 0 && str[i] == RIGHT_VECTOR_WRAP_CH) vec_n--; } if(par_n > 0 || vec_n > 0) return false; cur.beginEditBlock(); if(str.find_first_not_of(NUMBER_ELEMENTS SPACE) != std::string::npos) { MathStructure mparse; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&mparse, str, settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(); if((!mparse.isMultiplication() || op != settings->multiplicationSign(false)) && (!mparse.isAddition() || (op != "+" && op != "-" && op != SIGN_MINUS)) && (!mparse.isBitwiseOr() || op != BITWISE_OR) && (!mparse.isBitwiseAnd() || op != BITWISE_AND)) { cur.movePosition(QTextCursor::Start); cur.insertText("("); cur.movePosition(QTextCursor::End); cur.insertText(")"); } else if(cur.hasSelection()) { cur.movePosition(QTextCursor::End); } } else if(cur.hasSelection()) { cur.movePosition(QTextCursor::End); } setTextCursor(cur); insertPlainText(op); cur.endEditBlock(); return true; } return false; } QString ExpressionEdit::selectedText(bool b) { if(b && !textCursor().hasSelection()) return toPlainText(); return textCursor().selectedText(); } void ExpressionEdit::insertFromMimeData(const QMimeData *source) { QString str; if(!source->objectName().startsWith("history_") && source->hasHtml()) str = unhtmlize(source->html()).trimmed(); else if(source->hasText()) str = source->text(); if(settings->printops.use_unicode_signs && str.length() > 1) { bool in_cit1 = false, in_cit2 = false; QString text = toPlainText(); int pos = textCursor().selectionStart(); for(int i = 0; i < pos; i++) { if(!in_cit2 && text[i] == '\"') { in_cit1 = !in_cit1; } else if(!in_cit1 && text[i] == '\'') { in_cit2 = !in_cit2; } } for(int i = 0; i < str.length(); i++) { if(!in_cit2 && str[i] == '\"') { in_cit1 = !in_cit1; } else if(!in_cit1 && str[i] == '\'') { in_cit2 = !in_cit2; } else if(!in_cit1 && !in_cit2) { if(str[i] == '*') str.replace(i, 1, settings->multiplicationSign()); else if(str[i] == '/') str.replace(i, 1, settings->divisionSign(false)); else if(str[i] == '-') str.replace(i, 1, SIGN_MINUS); else if(str[i] == 's' && settings->copy_ascii && settings->printops.use_unicode_signs && i + 3 < str.length() && str[i + 1] == 'q' && str[i + 2] == 'r' && str[i + 3] == 't') str.replace(i, 4, SIGN_SQRT); else if(str[i] == 'o' && settings->copy_ascii && settings->printops.use_unicode_signs && i + 2 < str.length() && str[i + 1] == 'h' && str[i + 2] == 'm') str.replace(i, 3, "Ω"); } } } if(!str.isEmpty()) insertPlainText(str); } qalculate-qt-5.5.1/src/expressionedit.h000066400000000000000000000125501475705355700201510ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef EXPRESSION_EDIT_H #define EXPRESSION_EDIT_H #include #include #include #include class QCompleter; class QStandardItemModel; class QTableView; class QMenu; class QAction; class QTimer; class ExpressionTipLabel; struct CompletionData; class ExpressionProxyModel : public QSortFilterProxyModel { Q_OBJECT public: ExpressionProxyModel(CompletionData*, QObject *parent = NULL); ~ExpressionProxyModel(); void setFilter(std::string); CompletionData *cdata; protected: std::string str; bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; }; class ExpressionEdit : public QPlainTextEdit { Q_OBJECT protected: QCompleter *completer; ExpressionProxyModel *completionModel; QStandardItemModel *sourceModel; QTableView *completionView; QMenu *cmenu, *fileMenu, *modeMenu; QAction *undoAction, *redoAction, *cutAction, *copyAction, *pasteAction, *deleteAction, *selectAllAction, *clearAction, *statusOffAction, *statusDelayAction, *statusNoDelayAction, *statusHistoryAction, *statusExpressionAction, *autocalcSelectionAction, *calculateSelectionAction, *clearHistoryAction, *fileAction, *fileSeparator, *tbAction; QTimer *completionTimer, *toolTipTimer; ExpressionTipLabel *tipLabel; QWidget *tb; QStringList expression_undo_buffer; QList expression_undo_pos; QString current_history; int history_index, undo_index; int tabbed_index; int previous_pos; QString previous_text; bool enable_tab; CompletionData *cdata; int current_object_start, current_object_end; int current_function_index; std::string current_object_text; int completion_blocked, parse_blocked, block_add_to_undo; int block_text_change; int do_completion_signal; bool disable_history_arrow_keys, dont_change_index, cursor_has_moved; int block_display_parse; QString prev_parsed_expression, parsed_expression_tooltip, current_status_text; int current_status_type; bool expression_has_changed, expression_has_changed2; bool parsed_had_errors, parsed_had_warnings; bool expression_from_history; int previous_epos; QPoint function_pos; bool parentheses_highlighted; int default_frame; QRect prev_rect; void setCurrentObject(); void setStatusText(const QString &text, int = 0); bool displayFunctionHint(MathFunction *f, int arg_index = 1); void highlightParentheses(); void keyReleaseEvent(QKeyEvent*) override; void changeEvent(QEvent*) override; void contextMenuEvent(QContextMenuEvent *e) override; void insertFromMimeData(const QMimeData*) override; bool expressionInQuotes(); public: ExpressionEdit(QWidget *parent = NULL, QWidget *toolbar = NULL); virtual ~ExpressionEdit(); std::string expression() const; QSize sizeHint() const override; void updateMinimumHeight(); void wrapSelection(const QString &text = QString(), bool insert_before = false, bool add_parentheses = false, bool add_comma = false, const QString &add_arg = QString(), bool quote = false); bool doChainMode(const QString &op); bool expressionHasChanged(); void setExpressionHasChanged(bool); void displayParseStatus(bool = false, bool = true); void inputMethodEvent(QInputMethodEvent*) override; void keyPressEvent(QKeyEvent*) override; QString selectedText(bool = false); void onCompleterEvent(QEvent*); bool eventFilter(QObject*, QEvent*) override; void setMenuAndToolbarItems(QMenu*, QMenu*, QAction*); bool completionInitialized(); void insertText(const QString&); std::vector status_messages; protected slots: void onTextChanged(); void onCursorPositionChanged(); void onCompletionActivated(const QModelIndex&); void onCompletionHighlighted(const QModelIndex&); void onCompletionMenuItemActivated(); void enableIM(); void enableCompletionDelay(); void onCompletionModeChanged(); void onAutocalcSelectionChanged(); void onStatusModeChanged(); void showCurrentStatus(); void onSelectionChanged(); public slots: void updateCompletion(); void setExpression(std::string); void setExpression(const QString &str); void blockCompletion(bool = true, bool = true); void blockParseStatus(bool = true); void blockUndo(bool = true); void hideCompletion(); void addToHistory(); void smartParentheses(); void insertBrackets(); void selectAll(bool b = true); void editUndo(); void editRedo(); void editDelete(); void insertDate(); void insertMatrix(); void enableTabCompletion(bool); bool completeOrActivateFirst(bool = false); bool complete(MathStructure* = NULL, MathStructure* = NULL, QMenu* = NULL, bool = false); void clearHistory(); signals: void returnPressed(); void toConversionRequested(std::string); void calculateRPNRequest(int); void calculateSelectionRequest(); void expressionStatusModeChanged(bool); void statusChanged(QString, bool, bool, bool, bool); }; #endif //EXPRESSION_EDIT_H qalculate-qt-5.5.1/src/fpconversiondialog.cpp000066400000000000000000000331261475705355700213340ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "fpconversiondialog.h" FPConversionDialog::FPConversionDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Floating Point Conversion (IEEE 754)")); QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Format"), this), 0, 0, Qt::AlignRight); formatCombo = new QComboBox(this); grid->addWidget(formatCombo, 0, 1); formatCombo->addItem(tr("16-bit (half precision)")); formatCombo->addItem(tr("32-bit (single precision)")); formatCombo->addItem(tr("64-bit (double precision)")); formatCombo->addItem(tr("80-bit (x86 extended format)")); formatCombo->addItem(tr("128-bit (quadruple precision)")); formatCombo->addItem(tr("Microchip 24-bit")); formatCombo->addItem(tr("Microchip 32-bit")); formatCombo->setCurrentIndex(1); grid->addWidget(new QLabel(tr("Value"), this), 1, 0, Qt::AlignRight); valueEdit = new MathLineEdit(this); valueEdit->setAlignment(Qt::AlignRight); grid->addWidget(valueEdit, 1, 1); QLabel *label = new QLabel(tr("Binary representation"), this); label->setMinimumHeight(valueEdit->sizeHint().height()); grid->addWidget(label, 2, 0, Qt::AlignRight | Qt::AlignTop); binEdit = new QTextEdit(this); grid->addWidget(binEdit, 2, 1); QFontMetrics fm(binEdit->font()); QString str; str.fill('0', 68); binEdit->setMinimumWidth(fm.boundingRect(str).width()); binEdit->setFixedHeight(fm.lineSpacing() * 3 + (binEdit->document()->documentMargin() + binEdit->frameWidth()) * 2 + binEdit->contentsMargins().top() + binEdit->contentsMargins().bottom()); binEdit->setPlainText("0"); QTextCursor cursor = binEdit->textCursor(); QTextBlockFormat textBlockFormat = cursor.blockFormat(); textBlockFormat.setAlignment(Qt::AlignRight); cursor.mergeBlockFormat(textBlockFormat); binEdit->setTextCursor(cursor); binEdit->setPlainText(""); grid->addWidget(new QLabel(tr("Hexadecimal representation"), this), 3, 0, Qt::AlignRight); hexEdit = new QLineEdit(this); hexEdit->setAlignment(Qt::AlignRight); grid->addWidget(hexEdit, 3, 1); grid->addWidget(new QLabel(tr("Floating point value"), this), 4, 0, Qt::AlignRight); hexExp2Edit = new QLineEdit(this); hexExp2Edit->setAlignment(Qt::AlignRight); grid->addWidget(hexExp2Edit, 4, 1); hexExp2Edit->setReadOnly(true); exp2Edit = new QLineEdit(this); exp2Edit->setAlignment(Qt::AlignRight); grid->addWidget(exp2Edit, 5, 1); exp2Edit->setReadOnly(true); decEdit = new QLineEdit(this); decEdit->setAlignment(Qt::AlignRight); grid->addWidget(decEdit, 6, 1); decEdit->setReadOnly(true); grid->addWidget(new QLabel(tr("Conversion error"), this), 7, 0, Qt::AlignRight); errorEdit = new QLineEdit(this); errorEdit->setAlignment(Qt::AlignRight); grid->addWidget(errorEdit, 7, 1); errorEdit->setReadOnly(true); valueEdit->setFocus(); grid->setColumnStretch(1, 1); box->addLayout(grid); box->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(formatCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(formatChanged())); connect(binEdit, SIGNAL(textChanged()), this, SLOT(binChanged())); connect(valueEdit, SIGNAL(textEdited(const QString&)), this, SLOT(valueChanged())); connect(hexEdit, SIGNAL(textEdited(const QString&)), this, SLOT(hexChanged())); box->setSizeConstraint(QLayout::SetFixedSize); } FPConversionDialog::~FPConversionDialog() {} unsigned int FPConversionDialog::getBits() { switch(formatCombo->currentIndex()) { case 0: return 16; case 1: return 32; case 2: return 64; case 3: return 80; case 4: return 128; case 5: return 24; case 6: return 32; } return 32; } unsigned int FPConversionDialog::getExponentBits() { int i = formatCombo->currentIndex(); if(i == 5) return 8; return standard_expbits(getBits()); } unsigned int FPConversionDialog::getSignPosition() { int i = formatCombo->currentIndex(); if(i == 5 || i == 6) return 8; return 0; } void FPConversionDialog::formatChanged() { updateFields(10); } void FPConversionDialog::clear() { updateFields(0); } void FPConversionDialog::updateFields(int base, const MathStructure *v) { std::string sbin; Number decnum; bool use_decnum = false; unsigned int bits = getBits(); unsigned int expbits = getExponentBits(); unsigned int sgnpos = getSignPosition(); PrintOptions po; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; po.use_unicode_signs = settings->printops.use_unicode_signs; po.exp_display = settings->printops.exp_display; po.lower_case_numbers = settings->printops.lower_case_numbers; po.rounding = settings->printops.rounding; po.base_display = BASE_DISPLAY_NONE; po.abbreviate_names = settings->printops.abbreviate_names; po.digit_grouping = settings->printops.digit_grouping; po.multiplication_sign = settings->printops.multiplication_sign; po.division_sign = settings->printops.division_sign; po.short_multiplication = settings->printops.short_multiplication; po.excessive_parenthesis = settings->printops.excessive_parenthesis; po.can_display_unicode_string_function = &can_display_unicode_string_function; po.can_display_unicode_string_arg = (void*) valueEdit; po.spell_out_logical_operators = settings->printops.spell_out_logical_operators; po.binary_bits = bits; po.show_ending_zeroes = false; po.min_exp = 0; if(base == 10 || v) { MathStructure value; if(v) { valueEdit->setText(QString::fromStdString(v->number().print(po))); base = 10; value.set(*v); } else { std::string str = valueEdit->text().toStdString(); remove_blank_ends(str); if(str.empty()) { value.setAborted(); } else { if(last_is_operator(str, true)) return; EvaluationOptions eo; eo.parse_options = settings->evalops.parse_options; eo.parse_options.read_precision = DONT_READ_PRECISION; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.base = 10; CALCULATOR->calculate(&value, CALCULATOR->unlocalizeExpression(str, eo.parse_options), 1500, eo); } } if(value.isNumber()) { sbin = to_float(value.number(), bits, expbits, sgnpos); decnum = value.number(); use_decnum = true; } else if(value.isUndefined()) { sbin = to_float(nr_one_i, bits, expbits, sgnpos); } else { sbin = ""; } CALCULATOR->clearMessages(); } else if(base == 2) { std::string str = binEdit->toPlainText().toStdString(); remove_blanks(str); if(!str.empty()) { if(str.find_first_not_of("01") == std::string::npos && str.length() <= bits) { sbin = str; } else { sbin = ""; } CALCULATOR->clearMessages(); } } else if(base == 16) { std::string str = hexEdit->text().toStdString(); remove_blanks(str); if(!str.empty()) { ParseOptions pa; pa.base = BASE_HEXADECIMAL; Number nr(str, pa); PrintOptions po; po.base = BASE_BINARY; po.binary_bits = bits; po.max_decimals = 0; po.use_max_decimals = true; po.base_display = BASE_DISPLAY_NONE; sbin = nr.print(po); if(sbin.length() < bits) sbin.insert(0, bits - sbin.length(), '0'); if(sbin.length() > bits) { sbin = ""; } CALCULATOR->clearMessages(); } } valueEdit->blockSignals(true); binEdit->blockSignals(true); hexEdit->blockSignals(true); if(sbin.empty()) { if(base != 10) valueEdit->clear(); if(base != 16) hexEdit->clear(); if(base != 2) binEdit->clear(); hexExp2Edit->clear(); exp2Edit->clear(); decEdit->clear(); errorEdit->clear(); } else { int prec_bak = CALCULATOR->getPrecision(); CALCULATOR->setPrecision(100); ParseOptions pa; pa.base = BASE_BINARY; Number nr(sbin, pa); if(base != 16) {po.base = 16; hexEdit->setText(QString::fromStdString(nr.print(po)));} if(base != 2) { std::string str = sbin; if(bits > 32) { for(size_t i = expbits + 5; i < str.length() - 1; i += 4) { if((bits == 80 && str.length() - i == 32) || (bits == 128 && (str.length() - i == 56))) str.insert(i, "\n"); else str.insert(i, " "); i++; } } str.insert(expbits + 1, bits > 32 ? "\n" : " "); str.insert(1, " "); binEdit->setPlainText(QString::fromStdString(str)); QTextCursor cursor = binEdit->textCursor(); cursor.select(QTextCursor::Document); QTextBlockFormat textBlockFormat = cursor.blockFormat(); textBlockFormat.setAlignment(Qt::AlignRight); cursor.mergeBlockFormat(textBlockFormat); cursor.setPosition(0); binEdit->setTextCursor(cursor); } if(settings->printops.min_exp == -1 || settings->printops.min_exp == 0) po.min_exp = 8; else po.min_exp = settings->printops.min_exp; po.base = 10; po.max_decimals = 50; po.use_max_decimals = true; Number value; int ret = from_float(value, sbin, bits, expbits, sgnpos); if(ret <= 0) { decEdit->setText(ret < 0 ? "NaN" : ""); hexExp2Edit->setText(ret < 0 ? "NaN" : ""); exp2Edit->setText(ret < 0 ? "NaN" : ""); errorEdit->clear(); if(base != 10) valueEdit->setText(QString::fromStdString(m_undefined.print(po))); } else { if(sbin.length() < bits) sbin.insert(0, bits - sbin.length(), '0'); Number exponent, significand; exponent.set(sbin.substr(1, expbits), pa); Number expbias(2); expbias ^= (expbits - 1); expbias--; bool subnormal = exponent.isZero(); exponent -= expbias; std::string sfloat, sfloathex; bool b_approx = false; po.is_approximate = &b_approx; if(exponent > expbias) { if(sbin[0] != '0') sfloat = nr_minus_inf.print(po); else sfloat = nr_plus_inf.print(po); sfloathex = sfloat; } else { if(subnormal) exponent++; if(subnormal) significand.set(std::string("0.") + sbin.substr(1 + expbits), pa); else significand.set(std::string("1.") + sbin.substr(1 + expbits), pa); if(sbin[0] != '0') significand.negate(); int exp_bak = po.min_exp; po.min_exp = 0; sfloat = significand.print(po); if(!subnormal || !significand.isZero()) { sfloat += " "; sfloat += settings->multiplicationSign(); sfloat += " "; sfloat += "2^"; sfloat += exponent.print(po); } if(b_approx) sfloat.insert(0, SIGN_ALMOST_EQUAL " "); b_approx = false; po.base = 16; po.lower_case_numbers = true; po.decimalpoint_sign = "."; po.use_unicode_signs = false; if(significand.isNegative()) { significand.negate(); sfloathex = "-"; } sfloathex += "0x"; sfloathex += significand.print(po); po.base = 10; sfloathex += 'p'; if(sfloathex == "0") sfloathex += "-1"; else sfloathex += exponent.print(po); if(b_approx) sfloat.insert(0, SIGN_ALMOST_EQUAL " "); po.decimalpoint_sign = settings->printops.decimalpoint_sign; po.lower_case_numbers = false; po.min_exp = exp_bak; po.use_unicode_signs = settings->printops.use_unicode_signs; } hexExp2Edit->setText(QString::fromStdString(sfloathex)); exp2Edit->setText(QString::fromStdString(sfloat)); b_approx = false; std::string svalue = value.print(po); if(base != 10) valueEdit->setText(QString::fromStdString(svalue)); if(b_approx) svalue.insert(0, SIGN_ALMOST_EQUAL " "); decEdit->setText(QString::fromStdString(svalue)); Number nr_error; if(use_decnum && (!decnum.isInfinite() || !value.isInfinite())) { nr_error = value; nr_error -= decnum; nr_error.abs(); if(decnum.isApproximate() && prec_bak < CALCULATOR->getPrecision()) CALCULATOR->setPrecision(prec_bak); } b_approx = false; std::string serror = nr_error.print(po); if(b_approx) serror.insert(0, SIGN_ALMOST_EQUAL " "); errorEdit->setText(QString::fromStdString(serror)); } CALCULATOR->setPrecision(prec_bak); } valueEdit->blockSignals(false); binEdit->blockSignals(false); hexEdit->blockSignals(false); } void FPConversionDialog::setValue(const QString &str) { valueEdit->blockSignals(true); valueEdit->setText(str); valueEdit->blockSignals(false); updateFields(10); valueEdit->selectAll(); valueEdit->setFocus(); } void FPConversionDialog::setValue(const MathStructure &m) { updateFields(0, &m); valueEdit->selectAll(); valueEdit->setFocus(); } void FPConversionDialog::setBin(const QString &str) { binEdit->blockSignals(true); binEdit->setPlainText(str); QTextCursor cursor = binEdit->textCursor(); cursor.select(QTextCursor::Document); QTextBlockFormat textBlockFormat = cursor.blockFormat(); textBlockFormat.setAlignment(Qt::AlignRight); cursor.mergeBlockFormat(textBlockFormat); cursor.setPosition(0); binEdit->setTextCursor(cursor); binEdit->blockSignals(false); updateFields(2); binEdit->setFocus(); } void FPConversionDialog::setHex(const QString &str) { hexEdit->blockSignals(true); hexEdit->setText(str); hexEdit->blockSignals(false); updateFields(16); hexEdit->selectAll(); hexEdit->setFocus(); } void FPConversionDialog::hexChanged() { updateFields(16); } void FPConversionDialog::binChanged() { updateFields(2); } void FPConversionDialog::valueChanged() { updateFields(10); } qalculate-qt-5.5.1/src/fpconversiondialog.h000066400000000000000000000024321475705355700207750ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef FP_CONVERSION_DIALOG_H #define FP_CONVERSION_DIALOG_H #include #include class QComboBox; class QTextEdit; class QLineEdit; class FPConversionDialog : public QDialog { Q_OBJECT protected: QComboBox *formatCombo; QLineEdit *valueEdit, *hexEdit, *hexExp2Edit, *exp2Edit, *decEdit, *errorEdit; QTextEdit *binEdit; unsigned int getBits(); unsigned int getExponentBits(); unsigned int getSignPosition(); protected slots: void formatChanged(); void updateFields(int base, const MathStructure *value = NULL); void hexChanged(); void binChanged(); void valueChanged(); public slots: void setValue(const QString &str); void setValue(const MathStructure &m); void setBin(const QString &str); void setHex(const QString &str); void clear(); public: FPConversionDialog(QWidget *parent = NULL); virtual ~FPConversionDialog(); }; #endif //FP_CONVERSION_DIALOG_H qalculate-qt-5.5.1/src/functioneditdialog.cpp000066400000000000000000001576451475705355700213310ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # include #else # include #endif #include #include #include "functioneditdialog.h" #include "qalculateqtsettings.h" void fix_expression(std::string &str) { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; str = CALCULATOR->unlocalizeExpression(str, pa); if(str.empty()) return; size_t i = 0; bool b = false; while(true) { i = str.find("\\", i); if(i == std::string::npos || i == str.length() - 1) break; if((str[i + 1] >= 'a' && str[i + 1] <= 'z') || (str[i + 1] >= 'A' && str[i + 1] <= 'Z') || (str[i + 1] >= '1' && str[i + 1] <= '9')) { b = true; break; } i++; } if(!b) { gsub("x", "\\x", str); gsub("y", "\\y", str); gsub("z", "\\z", str); } CALCULATOR->parseSigns(str); } SmallTextEdit::SmallTextEdit(int r, QWidget *parent) : QPlainTextEdit(parent), i_rows(r) {} SmallTextEdit::~SmallTextEdit() {} QSize SmallTextEdit::sizeHint() const { QSize size = QPlainTextEdit::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * i_rows + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * i_rows + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif return size; } MathTextEdit::MathTextEdit(QWidget *parent) : QPlainTextEdit(parent) { #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif } MathTextEdit::~MathTextEdit() {} QSize MathTextEdit::sizeHint() const { QSize size = QPlainTextEdit::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif return size; } void MathTextEdit::insertText(const QString &s) { if(overwriteMode() && !textCursor().atEnd()) { QTextCursor cur = textCursor(); cur.beginEditBlock(); cur.deleteChar(); insertPlainText(s); cur.endEditBlock(); } else { insertPlainText(s); } } void MathTextEdit::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Insert: { if(event->modifiers() != Qt::ShiftModifier) setOverwriteMode(!overwriteMode()); break; } case Qt::Key_Asterisk: { insertText(settings->multiplicationSign()); return; } case Qt::Key_Slash: { insertText(settings->divisionSign(false)); return; } case Qt::Key_Minus: { insertText(SIGN_MINUS); return; } case Qt::Key_Dead_Circumflex: { insertText(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { insertText("~"); return; } case Qt::Key_AsciiCircum: { if(settings->caret_as_xor) { insertText(" xor "); return; } break; } } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { insertText("^"); return; } QPlainTextEdit::keyPressEvent(event); } ExpandingMathLineEdit::ExpandingMathLineEdit(QWidget *parent) : QLineEdit(parent), originalWidth(-1), widgetOwnsGeometry(false) { connect(this, SIGNAL(textChanged(QString)), this, SLOT(resizeToContents())); updateMinimumWidth(); } void ExpandingMathLineEdit::setWidgetOwnsGeometry(bool value) { widgetOwnsGeometry = value; } void ExpandingMathLineEdit::changeEvent(QEvent *e) { switch(e->type()) { case QEvent::FontChange: case QEvent::StyleChange: case QEvent::ContentsRectChange: updateMinimumWidth(); break; default: break; } QLineEdit::changeEvent(e); } void ExpandingMathLineEdit::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Asterisk: { insert(settings->multiplicationSign(false)); return; } case Qt::Key_Minus: { insert(SIGN_MINUS); return; } case Qt::Key_Dead_Circumflex: { insert(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { insert("~"); return; } case Qt::Key_AsciiCircum: { if(settings->caret_as_xor) { insert(" xor "); return; } break; } } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { insert("^"); return; } QLineEdit::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } void ExpandingMathLineEdit::updateMinimumWidth() { const QMargins tm = textMargins(); const QMargins cm = contentsMargins(); const int width = tm.left() + tm.right() + cm.left() + cm.right() + 4; QStyleOptionFrame opt; initStyleOption(&opt); int minWidth = style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(width, 0), this).width(); setMinimumWidth(minWidth); } void ExpandingMathLineEdit::resizeToContents() { int oldWidth = width(); if(originalWidth == -1) originalWidth = oldWidth; if(QWidget *parent = parentWidget()) { QPoint position = pos(); #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) int hintWidth = minimumWidth() + fontMetrics().horizontalAdvance(displayText()); #else int hintWidth = minimumWidth() + fontMetrics().boundingRect(displayText()).width(); #endif int parentWidth = parent->width(); int maxWidth = isRightToLeft() ? position.x() + oldWidth : parentWidth - position.x(); int newWidth = qBound(originalWidth, hintWidth, maxWidth); if(widgetOwnsGeometry) setMaximumWidth(newWidth); if(isRightToLeft()) move(position.x() - newWidth + oldWidth, position.y()); resize(newWidth, height()); } } class SubfunctionDelegate : public QStyledItemDelegate { public: SubfunctionDelegate(QWidget *parent) : QStyledItemDelegate(parent) {} QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex&) const override { return new ExpandingMathLineEdit(parent); } void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override { if(!editor) return; Q_ASSERT(index.isValid()); QStyleOptionViewItem opt = option; initStyleOption(&opt, index); opt.showDecorationSelected = editor->style()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, nullptr, editor); QStyle *style = QApplication::style(); QRect geom = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, (QWidget*) parent()); editor->setGeometry(geom); } }; #include #include class CenteredBoxProxy : public QProxyStyle { public: QRect subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget) const override { const QRect baseRes = QProxyStyle::subElementRect(element, option, widget); const QRect itemRect = option->rect; QRect retval = baseRes; QSize sz = baseRes.size(); if(element == SE_ItemViewItemCheckIndicator) { int x = itemRect.x() + (itemRect.width()/2) - (baseRes.width()/2); retval = QRect( QPoint(x, baseRes.y()), sz); } else if(element == SE_ItemViewItemFocusRect) { sz.setWidth(baseRes.width()+baseRes.x()); retval = QRect( QPoint(0, baseRes.y()), sz); } return retval; } }; class SmallTreeView : public QTreeView { public: SmallTreeView(QWidget *parent) : QTreeView(parent) {} QSize sizeHint() const override { QSize size = QTreeView::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * 4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * 4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom()); #endif return size; } }; NamesEditDialog::NamesEditDialog(int type, QWidget *parent, bool read_only) : QDialog(parent), i_type(type) { o_item = NULL; QVBoxLayout *topbox = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); namesView = new QTreeView(this); namesModel = new QStandardItemModel(this); namesView->setSelectionMode(QAbstractItemView::SingleSelection); namesView->setRootIsDecorated(false); namesView->setStyle(new CenteredBoxProxy()); if(i_type < 0) { namesModel->setColumnCount(2); namesModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name"))); namesModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Reference"))); } else { namesModel->setColumnCount(8); namesModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name"))); namesModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Abbreviation"))); namesModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Plural"))); namesModel->setHorizontalHeaderItem(3, new QStandardItem(tr("Reference"))); namesModel->setHorizontalHeaderItem(4, new QStandardItem(tr("Avoid input"))); namesModel->setHorizontalHeaderItem(5, new QStandardItem(tr("Suffix"))); namesModel->setHorizontalHeaderItem(6, new QStandardItem(tr("Case sensitive"))); namesModel->setHorizontalHeaderItem(7, new QStandardItem(tr("Completion only"))); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QScreen *scr = screen(); # else QScreen *scr = QGuiApplication::screenAt(pos); # endif if(!scr) scr = QGuiApplication::primaryScreen(); QRect screen = scr->geometry(); #else QRect screen = QApplication::desktop()->screenGeometry(this); #endif if(screen.width() > 800) namesView->setMinimumWidth(800); } namesView->setModel(namesModel); namesView->header()->setStretchLastSection(false); namesView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); namesView->header()->setSectionResizeMode(0, QHeaderView::Stretch); if(i_type >= 0 && i_type != TYPE_UNIT) namesView->header()->hideSection(2); grid->addWidget(namesView, 0, 0); QHBoxLayout *box = new QHBoxLayout(); addButton = new QPushButton(tr("Add"), this); box->addWidget(addButton); connect(addButton, SIGNAL(clicked()), this, SLOT(addClicked())); addButton->setEnabled(!read_only); editButton = new QPushButton(tr("Edit"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); editButton->setEnabled(false); delButton = new QPushButton(tr("Remove"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); delButton->setEnabled(false); grid->addLayout(box, 1, 0, Qt::AlignRight); topbox->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Close)->setDefault(true); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(namesView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedNameChanged(const QModelIndex&, const QModelIndex&))); connect(namesModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(nameChanged(QStandardItem*))); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } NamesEditDialog::~NamesEditDialog() {} void NamesEditDialog::setNames(ExpressionItem *o, const QString &str) { o_item = o; bool read_only = !addButton->isEnabled(); ExpressionName estr(str.trimmed().toStdString()); estr.reference = true; for(size_t i = 1; i == 1 || (o && i <= o->countNames()); i++) { const ExpressionName *ename; if(o) ename = &o->getName(i); else ename = &estr; QList items; QStandardItem *item = new QStandardItem(i == 1 && !str.trimmed().isEmpty() ? str.trimmed() : QString::fromStdString(ename->name)); item->setEditable(!read_only); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->abbreviation ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->plural ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->reference ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->avoid_input ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->suffix ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->case_sensitive ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->completion_only ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); namesModel->appendRow(items); if(!read_only && i == 1 && !item->text().isEmpty() && (!o || QString::fromStdString(ename->name) != item->text())) nameChanged(item); } } void NamesEditDialog::setName(const QString &str) { if(str.trimmed().isEmpty()) return; QStandardItem *item = namesModel->item(0, 0); if(!item) { item = new QStandardItem(); QList items; items.append(item); for(int i = 1; i < namesModel->columnCount(); i++) { QStandardItem *item2 = new QStandardItem(); item2->setEditable(false); item2->setCheckable(true); item2->setCheckState(Qt::Unchecked); item2->setTextAlignment(Qt::AlignCenter); items.append(item2); } namesModel->appendRow(items); } if(str.trimmed() != item->text()) item->setText(str.trimmed()); } QString NamesEditDialog::firstName() { QStandardItem *item = namesModel->item(0, 0); if(!item) return QString(); return item->text(); } void NamesEditDialog::modifyNames(ExpressionItem *o, const QString &str) { o->clearNames(); for(int i = 0; i < namesModel->rowCount(); i++) { ExpressionName ename; if(i == 0) ename.name = str.trimmed().toStdString(); else ename.name = namesModel->item(i, 0)->text().trimmed().toStdString(); if(!ename.name.empty()) { ename.abbreviation = (namesModel->item(i, 1)->checkState() == Qt::Checked); ename.plural = (namesModel->item(i, 2)->checkState() == Qt::Checked); ename.reference = (namesModel->item(i, 3)->checkState() == Qt::Checked); ename.avoid_input = (namesModel->item(i, 4)->checkState() == Qt::Checked); ename.unicode = false; for(size_t i2 = 0; i2 < ename.name.length(); i2++) { if((unsigned char) ename.name[i] >= 0xC0) { ename.unicode = true; } } ename.suffix = (namesModel->item(i, 5)->checkState() == Qt::Checked); ename.case_sensitive = (namesModel->item(i, 6)->checkState() == Qt::Checked); ename.completion_only = (namesModel->item(i, 7)->checkState() == Qt::Checked); o->addName(ename); } } if(o->countNames() == 0) { ExpressionName ename(str.trimmed().toStdString()); ename.reference = true; o->addName(ename); } } void NamesEditDialog::modifyName(ExpressionItem *o, const QString &str) { if(o->countNames() == 0) { ExpressionName ename(str.trimmed().toStdString()); ename.reference = true; o->addName(ename); } else { o->setName(str.trimmed().toStdString()); } } void NamesEditDialog::setNames(DataProperty *o, const QString &str) { bool read_only = !addButton->isEnabled(); for(size_t i = 1; i == 1 || (o && i <= o->countNames()); i++) { QList items; QStandardItem *item = new QStandardItem(i == 1 && (!o || !str.trimmed().isEmpty()) ? str.trimmed() : QString::fromStdString(o->getName(i))); item->setEditable(!read_only); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState((!o || o->nameIsReference(i)) ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); namesModel->appendRow(items); } } void NamesEditDialog::modifyNames(DataProperty *o, const QString &str) { o->clearNames(); for(int i = 0; i < namesModel->rowCount(); i++) { if(i == 0) o->addName(str.trimmed().toStdString(), namesModel->item(i, 1)->checkState() == Qt::Checked); else o->addName(namesModel->item(i, 0)->text().trimmed().toStdString(), namesModel->item(i, 1)->checkState() == Qt::Checked); } if(o->countNames() == 0) { o->addName(str.trimmed().toStdString(), true); } } void NamesEditDialog::modifyName(DataProperty *o, const QString &str) { if(o->countNames() == 0) { o->addName(str.trimmed().toStdString(), true); } else { std::vector names; std::vector name_refs; for(size_t i = 1; i <= o->countNames(); i++) { if(i == 1) names.push_back(str.trimmed().toStdString()); else names.push_back(o->getName(i)); name_refs.push_back(o->nameIsReference(i)); } o->clearNames(); for(size_t i = 0; i < names.size(); i++) { o->addName(names[i], name_refs[i]); } } } void NamesEditDialog::addClicked() { QList items; QStandardItem *item = new QStandardItem(); QStandardItem *edit_item = item; items.append(item); for(int i = 1; i < namesModel->columnCount(); i++) { item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(Qt::Unchecked); item->setTextAlignment(Qt::AlignCenter); items.append(item); } namesModel->appendRow(items); namesView->selectionModel()->setCurrentIndex(edit_item->index(), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear | QItemSelectionModel::Rows); namesView->scrollTo(edit_item->index()); namesView->edit(edit_item->index()); } void NamesEditDialog::editClicked() { #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) namesView->edit(namesView->selectionModel()->currentIndex().siblingAtColumn(0)); #else namesView->edit(namesView->selectionModel()->currentIndex().sibling(namesView->selectionModel()->currentIndex().row(), 0)); #endif } void NamesEditDialog::delClicked() { namesModel->removeRow(namesView->selectionModel()->currentIndex().row()); } void NamesEditDialog::selectedNameChanged(const QModelIndex &index, const QModelIndex&) { if(addButton->isEnabled()) { delButton->setEnabled(index.isValid()); editButton->setEnabled(index.isValid()); } } void NamesEditDialog::nameChanged(QStandardItem *item) { if(i_type < 0 || item->column() != 0 || item->text().trimmed().isEmpty()) return; if((i_type == TYPE_FUNCTION && !CALCULATOR->functionNameIsValid(item->text().trimmed().toStdString())) || (i_type == TYPE_VARIABLE && !CALCULATOR->variableNameIsValid(item->text().trimmed().toStdString())) || (i_type == TYPE_UNIT && !CALCULATOR->unitNameIsValid(item->text().trimmed().toStdString()))) { namesModel->blockSignals(true); if(i_type == TYPE_FUNCTION) item->setText(QString::fromStdString(CALCULATOR->convertToValidFunctionName(item->text().trimmed().toStdString()))); else if(i_type == TYPE_VARIABLE) item->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(item->text().trimmed().toStdString()))); else if(i_type == TYPE_UNIT) item->setText(QString::fromStdString(CALCULATOR->convertToValidUnitName(item->text().trimmed().toStdString()))); namesModel->blockSignals(false); QMessageBox::warning(this, tr("Warning"), tr("Illegal name")); } else if(i_type == TYPE_FUNCTION && CALCULATOR->functionNameTaken(item->text().trimmed().toStdString(), (MathFunction*) o_item)) { MathFunction *f = CALCULATOR->getActiveFunction(item->text().trimmed().toStdString(), true); if(!f || f->category() != CALCULATOR->temporaryCategory()) QMessageBox::warning(this, tr("Warning"), tr("A function with the same name already exists.")); } else if(i_type == TYPE_VARIABLE && CALCULATOR->variableNameTaken(item->text().trimmed().toStdString(), (Variable*) o_item)) { Variable *var = CALCULATOR->getActiveVariable(item->text().trimmed().toStdString(), true); if(!var || var->category() != CALCULATOR->temporaryCategory()) QMessageBox::warning(this, tr("Warning"), tr("A unit or variable with the same name already exists.")); } else if(i_type == TYPE_UNIT && CALCULATOR->unitNameTaken(item->text().trimmed().toStdString(), (Unit*) o_item)) { Unit *u = CALCULATOR->getActiveUnit(item->text().trimmed().toStdString(), true); if(!u || u->category() != CALCULATOR->temporaryCategory()) QMessageBox::warning(this, tr("Warning"), tr("A unit or variable with the same name already exists.")); } } ArgumentEditDialog::ArgumentEditDialog(QWidget *parent, bool read_only) : QDialog(parent) { QVBoxLayout *topbox = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); nameEdit->setReadOnly(read_only); grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Type:"), this), 1, 0); typeCombo = new QComboBox(this); typeCombo->setEditable(false); typeCombo->addItem(tr("Free"), ARGUMENT_TYPE_FREE); typeCombo->addItem(tr("Number"), ARGUMENT_TYPE_NUMBER); typeCombo->addItem(tr("Integer"), ARGUMENT_TYPE_INTEGER); typeCombo->addItem(tr("Symbol"), ARGUMENT_TYPE_SYMBOLIC); typeCombo->addItem(tr("Text"), ARGUMENT_TYPE_TEXT); typeCombo->addItem(tr("Date"), ARGUMENT_TYPE_DATE); typeCombo->addItem(tr("Vector"), ARGUMENT_TYPE_VECTOR); typeCombo->addItem(tr("Matrix"), ARGUMENT_TYPE_MATRIX); typeCombo->addItem(tr("Boolean"), ARGUMENT_TYPE_BOOLEAN); typeCombo->addItem(tr("Angle"), ARGUMENT_TYPE_ANGLE); typeCombo->addItem(tr("Object"), ARGUMENT_TYPE_EXPRESSION_ITEM); typeCombo->addItem(tr("Function"), ARGUMENT_TYPE_FUNCTION); typeCombo->addItem(tr("Unit"), ARGUMENT_TYPE_UNIT); typeCombo->addItem(tr("Variable"), ARGUMENT_TYPE_VARIABLE); typeCombo->addItem(tr("File"), ARGUMENT_TYPE_FILE); grid->addWidget(typeCombo, 1, 1); testBox = new QCheckBox(tr("Enable rules and type test"), this); grid->addWidget(testBox, 2, 0, 1, 2); grid->addWidget(new QLabel(tr("Custom condition:"), this), 3, 0); conditionEdit = new MathLineEdit(this); conditionEdit->setToolTip("
" + tr("For example if argument is a matrix that must have equal number of rows and columns: rows(\\x) = columns(\\x)") + "
"); grid->addWidget(conditionEdit, 3, 1); matrixBox = new QCheckBox(tr("Allow matrix"), this); grid->addWidget(matrixBox, 4, 0, 1, 2); zeroBox = new QCheckBox(tr("Forbid zero"), this); grid->addWidget(zeroBox, 5, 0, 1, 2); vectorBox = new QCheckBox(tr("Handle vector"), this); vectorBox->setToolTip("
" + tr("Calculate function for each separate element in vector.") + "
"); grid->addWidget(vectorBox, 6, 0, 1, 2); minBox = new QCheckBox(tr("Min"), this); grid->addWidget(minBox, 7, 0); minEdit = new QDoubleSpinBox(this); grid->addWidget(minEdit, 7, 1); includeMinBox = new QCheckBox(tr("Include equals"), this); grid->addWidget(includeMinBox, 8, 1, Qt::AlignRight); maxBox = new QCheckBox(tr("Max"), this); grid->addWidget(maxBox, 9, 0); maxEdit = new QDoubleSpinBox(this); minEdit->setDecimals(8); minEdit->setRange(INT_MIN, INT_MAX); maxEdit->setDecimals(8); maxEdit->setRange(INT_MIN, INT_MAX); grid->addWidget(maxEdit, 9, 1); includeMaxBox = new QCheckBox(tr("Include equals"), this); grid->addWidget(includeMaxBox, 10, 1, Qt::AlignRight); topbox->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Close)->setDefault(true); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(typeCombo, SIGNAL(activated(int)), this, SLOT(typeChanged(int))); connect(minBox, SIGNAL(toggled(bool)), this, SLOT(minToggled(bool))); connect(maxBox, SIGNAL(toggled(bool)), this, SLOT(maxToggled(bool))); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } ArgumentEditDialog::~ArgumentEditDialog() {} void ArgumentEditDialog::setArgument(Argument *arg) { testBox->setChecked(!arg || arg->tests()); matrixBox->setChecked(!arg || arg->matrixAllowed() || arg->type() == ARGUMENT_TYPE_FREE || arg->type() == ARGUMENT_TYPE_MATRIX); matrixBox->setEnabled(arg && arg->type() != ARGUMENT_TYPE_FREE && arg->type() != ARGUMENT_TYPE_MATRIX); if(arg) { std::string str = settings->localizeExpression(arg->getCustomCondition()); conditionEdit->setText(QString::fromStdString(str)); } else { conditionEdit->clear(); } nameEdit->setText(arg ? QString::fromStdString(arg->name()) : QString()); zeroBox->setChecked(arg && arg->zeroForbidden()); vectorBox->setChecked(arg && arg->handlesVector()); switch(arg ? arg->type() : ARGUMENT_TYPE_FREE) { case ARGUMENT_TYPE_NUMBER: { NumberArgument *farg = (NumberArgument*) arg; minBox->setEnabled(true); minBox->setChecked(farg->min() != NULL); includeMinBox->setChecked(farg->includeEqualsMin()); includeMinBox->setEnabled(true); minEdit->setEnabled(farg->min() != NULL); minEdit->setDecimals(8); if(farg->min()) { minEdit->setValue(farg->min()->floatValue()); } else { minEdit->setValue(0.0); } maxBox->setEnabled(true); maxBox->setChecked(farg->max() != NULL); includeMaxBox->setChecked(farg->includeEqualsMax()); includeMaxBox->setEnabled(true); maxEdit->setEnabled(farg->max() != NULL); maxEdit->setDecimals(8); if(farg->max()) { maxEdit->setValue(farg->max()->floatValue()); } else { maxEdit->setValue(0.0); } break; } case ARGUMENT_TYPE_INTEGER: { NumberArgument *farg = (NumberArgument*) arg; minBox->setEnabled(true); minBox->setChecked(farg->min() != NULL); includeMinBox->setChecked(true); includeMinBox->setEnabled(false); minEdit->setEnabled(farg->min() != NULL); minEdit->setDecimals(0); if(farg->min()) { minEdit->setValue(farg->min()->intValue()); } else { minEdit->setValue(0.0); } maxBox->setEnabled(true); maxBox->setChecked(farg->max() != NULL); includeMaxBox->setChecked(true); includeMaxBox->setEnabled(false); maxEdit->setEnabled(farg->max() != NULL); maxEdit->setDecimals(0); if(farg->max()) { maxEdit->setValue(farg->max()->intValue()); } else { maxEdit->setValue(0.0); } break; } default: { minBox->setChecked(false); minEdit->setValue(0.0); minEdit->setEnabled(false); includeMinBox->setEnabled(false); includeMinBox->setChecked(true); minBox->setEnabled(false); maxBox->setChecked(false); maxEdit->setValue(0.0); maxEdit->setEnabled(false); includeMaxBox->setEnabled(false); includeMaxBox->setChecked(true); maxBox->setEnabled(false); } } typeCombo->setCurrentIndex(typeCombo->findData(arg ? arg->type() : 0)); } Argument *ArgumentEditDialog::createArgument() { Argument *arg = NULL; switch(typeCombo->currentData().toInt()) { case ARGUMENT_TYPE_NUMBER: { arg = new NumberArgument(); if(minBox->isChecked()) { QString str = minEdit->cleanText(); int i = str.indexOf(","); if(i > 0) { if(str.indexOf(".", i) > 0) { str.remove(","); } else { str.remove("."); str.replace(",", "."); } } Number nr(str.toStdString()); ((NumberArgument*) arg)->setMin(&nr); ((NumberArgument*) arg)->setIncludeEqualsMin(includeMinBox->isChecked()); } if(maxBox->isChecked()) { QString str = maxEdit->cleanText(); int i = str.indexOf(","); if(i > 0) { if(str.indexOf(".", i) > 0) { str.remove(","); } else { str.remove("."); str.replace(",", "."); } } Number nr(str.toStdString()); ((NumberArgument*) arg)->setMax(&nr); ((NumberArgument*) arg)->setIncludeEqualsMax(includeMaxBox->isChecked()); } break; } case ARGUMENT_TYPE_INTEGER: { arg = new IntegerArgument(); if(minBox->isChecked()) { QString str = minEdit->cleanText(); str.remove(","); str.remove("."); Number nr(str.toStdString()); ((IntegerArgument*) arg)->setMin(&nr); } if(maxBox->isChecked()) { QString str = maxEdit->cleanText(); str.remove(","); str.remove("."); Number nr(str.toStdString()); ((IntegerArgument*) arg)->setMax(&nr); } break; } case ARGUMENT_TYPE_SYMBOLIC: {arg = new SymbolicArgument(); break;} case ARGUMENT_TYPE_TEXT: {arg = new TextArgument(); break;} case ARGUMENT_TYPE_DATE: {arg = new DateArgument(); break;} case ARGUMENT_TYPE_FILE: {arg = new FileArgument(); break;} case ARGUMENT_TYPE_VECTOR: {arg = new VectorArgument(); break;} case ARGUMENT_TYPE_MATRIX: {arg = new MatrixArgument(); break;} case ARGUMENT_TYPE_EXPRESSION_ITEM: {arg = new ExpressionItemArgument(); break;} case ARGUMENT_TYPE_FUNCTION: {arg = new FunctionArgument(); break;} case ARGUMENT_TYPE_UNIT: {arg = new UnitArgument(); break;} case ARGUMENT_TYPE_VARIABLE: {arg = new VariableArgument(); break;} case ARGUMENT_TYPE_BOOLEAN: {arg = new BooleanArgument(); break;} case ARGUMENT_TYPE_ANGLE: {arg = new AngleArgument(); break;} default: { arg = new Argument(); } } arg->setName(nameEdit->text().trimmed().toStdString()); std::string str = conditionEdit->text().trimmed().toStdString(); fix_expression(str); arg->setCustomCondition(str); arg->setTests(testBox->isChecked()); arg->setAlerts(testBox->isChecked()); arg->setZeroForbidden(zeroBox->isChecked()); arg->setMatrixAllowed(matrixBox->isChecked()); arg->setHandleVector(vectorBox->isChecked()); return arg; } void ArgumentEditDialog::typeChanged(int index) { int i = typeCombo->itemData(index).toInt(); minEdit->setValue(0.0); maxEdit->setValue(0.0); minEdit->setEnabled(false); maxEdit->setEnabled(false); minBox->setChecked(false); maxBox->setChecked(false); if(i == ARGUMENT_TYPE_INTEGER) minEdit->setDecimals(0); else if(i == ARGUMENT_TYPE_NUMBER) minEdit->setDecimals(8); if(i == ARGUMENT_TYPE_INTEGER) maxEdit->setDecimals(0); else if(i == ARGUMENT_TYPE_NUMBER) maxEdit->setDecimals(8); includeMaxBox->setChecked(true); includeMinBox->setChecked(true); includeMaxBox->setEnabled(i == ARGUMENT_TYPE_NUMBER); includeMinBox->setEnabled(i == ARGUMENT_TYPE_NUMBER); minBox->setEnabled(i == ARGUMENT_TYPE_NUMBER || i == ARGUMENT_TYPE_INTEGER); maxBox->setEnabled(i == ARGUMENT_TYPE_NUMBER || i == ARGUMENT_TYPE_INTEGER); vectorBox->setChecked(i == ARGUMENT_TYPE_NUMBER || i == ARGUMENT_TYPE_INTEGER || i == ARGUMENT_TYPE_TEXT || i == ARGUMENT_TYPE_DATE || i == ARGUMENT_TYPE_BOOLEAN); matrixBox->setEnabled(i != ARGUMENT_TYPE_FREE && i != ARGUMENT_TYPE_MATRIX); matrixBox->setChecked(i == ARGUMENT_TYPE_FREE || i == ARGUMENT_TYPE_MATRIX); } void ArgumentEditDialog::minToggled(bool b) { minEdit->setEnabled(b); includeMinBox->setEnabled(typeCombo->currentData().toInt() == ARGUMENT_TYPE_NUMBER); } void ArgumentEditDialog::maxToggled(bool b) { maxEdit->setEnabled(b); includeMaxBox->setEnabled(typeCombo->currentData().toInt() == ARGUMENT_TYPE_NUMBER); } FunctionEditDialog::FunctionEditDialog(QWidget *parent) : QDialog(parent) { namesEditDialog = NULL; o_function = NULL; name_edited = false; QVBoxLayout *topbox = new QVBoxLayout(this); QTabWidget *tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); topbox->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); QWidget *w3 = new QWidget(this); tabs->addTab(w1, tr("Required")); tabs->addTab(w3, tr("Details")); tabs->addTab(w2, tr("Description")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Expression:"), this), 1, 0, 1, 2); expressionEdit = new MathTextEdit(this); expressionEdit->setToolTip(tr("Use x, y, and z (e.g. \"(x+y)/2\"), or\n\\x, \\y, \\z, \\a, \\b, … (e.g. \"(\\x+\\y)/2\")")); grid->addWidget(expressionEdit, 2, 0, 1, 2); QHBoxLayout *box = new QHBoxLayout(); QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); grid = new QGridLayout(w2); grid->addWidget(new QLabel(tr("Category:"), this), 0, 0); categoryEdit = new QComboBox(this); QMap hash; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(!CALCULATOR->functions[i]->category().empty()) { if(hash.find(CALCULATOR->functions[i]->category()) == hash.end()) { hash[CALCULATOR->functions[i]->category()] = true; } } } for(QMap::const_iterator it = hash.constBegin(); it != hash.constEnd(); ++it) { categoryEdit->addItem(QString::fromStdString(it.key())); } categoryEdit->setEditable(true); categoryEdit->setCurrentText(QString()); grid->addWidget(categoryEdit, 0, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 1, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 1, 1); hideBox = new QCheckBox(tr("Hide function"), this); grid->addWidget(hideBox, 2, 1, Qt::AlignRight); grid->addWidget(new QLabel(tr("Example:"), this), 3, 0); exampleEdit = new MathLineEdit(this); grid->addWidget(exampleEdit, 3, 1); grid->addWidget(new QLabel(tr("Description:"), this), 4, 0, 1, 2); descriptionEdit = new QPlainTextEdit(this); grid->addWidget(descriptionEdit, 5, 0, 1, 2); grid = new QGridLayout(w3); grid->addWidget(new QLabel(tr("Condition:"), this), 0, 0); conditionEdit = new MathLineEdit(this); conditionEdit->setToolTip(tr("Condition that must be true for the function (e.g. if the second argument must be greater than the first: \"\\y > \\x\")")); grid->addWidget(conditionEdit, 0, 1); grid->addWidget(new QLabel(tr("Sub-functions:"), this), 1, 0); subfunctionsView = new SmallTreeView(this); subfunctionsModel = new QStandardItemModel(this); subfunctionsView->setSelectionMode(QAbstractItemView::SingleSelection); subfunctionsView->setRootIsDecorated(false); subfunctionsView->setStyle(new CenteredBoxProxy()); subfunctionsModel->setColumnCount(3); subfunctionsModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Expression"))); subfunctionsModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Precalculate"))); subfunctionsModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Reference"))); subfunctionsView->setModel(subfunctionsModel); subfunctionsView->header()->setStretchLastSection(false); subfunctionsView->header()->setSectionResizeMode(0, QHeaderView::Stretch); subfunctionsView->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); SubfunctionDelegate* delegate = new SubfunctionDelegate(subfunctionsView); subfunctionsView->setItemDelegateForColumn(0, delegate); grid->addWidget(subfunctionsView, 2, 0, 1, 2); box = new QHBoxLayout(); subAddButton = new QPushButton(tr("Add"), this); box->addWidget(subAddButton); connect(subAddButton, SIGNAL(clicked()), this, SLOT(subAddClicked())); subEditButton = new QPushButton(tr("Edit"), this); box->addWidget(subEditButton); connect(subEditButton, SIGNAL(clicked()), this, SLOT(subEditClicked())); subEditButton->setEnabled(false); subDelButton = new QPushButton(tr("Remove"), this); box->addWidget(subDelButton); connect(subDelButton, SIGNAL(clicked()), this, SLOT(subDelClicked())); subDelButton->setEnabled(false); grid->addLayout(box, 3, 0, 1, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("Arguments:"), this), 4, 0); argumentsView = new SmallTreeView(this); argumentsModel = new QStandardItemModel(this); argumentsView->setSelectionMode(QAbstractItemView::SingleSelection); argumentsView->setRootIsDecorated(false); argumentsModel->setColumnCount(3); argumentsModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name"))); argumentsModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Type"))); argumentsModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Reference"))); argumentsView->setModel(argumentsModel); argumentsView->header()->setStretchLastSection(false); argumentsView->header()->setSectionResizeMode(0, QHeaderView::Stretch); argumentsView->header()->setSectionResizeMode(1, QHeaderView::Stretch); argumentsView->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); grid->addWidget(argumentsView, 5, 0, 1, 2); box = new QHBoxLayout(); argAddButton = new QPushButton(tr("Add"), this); box->addWidget(argAddButton); connect(argAddButton, SIGNAL(clicked()), this, SLOT(argAddClicked())); argEditButton = new QPushButton(tr("Edit"), this); box->addWidget(argEditButton); connect(argEditButton, SIGNAL(clicked()), this, SLOT(argEditClicked())); argEditButton->setEnabled(false); argDelButton = new QPushButton(tr("Remove"), this); box->addWidget(argDelButton); connect(argDelButton, SIGNAL(clicked()), this, SLOT(argDelClicked())); argDelButton->setEnabled(false); grid->addLayout(box, 6, 0, 1, 2, Qt::AlignRight); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); topbox->addWidget(buttonBox); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(expressionEdit, SIGNAL(textChanged()), this, SLOT(onFunctionChanged())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onFunctionChanged())); connect(conditionEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFunctionChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onFunctionChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFunctionChanged())); connect(exampleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFunctionChanged())); connect(categoryEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(onFunctionChanged())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(subfunctionsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedSubfunctionChanged(const QModelIndex&, const QModelIndex&))); connect(argumentsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedArgumentChanged(const QModelIndex&, const QModelIndex&))); connect(argumentsView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(argumentActivated(const QModelIndex&))); connect(argumentsModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(argumentChanged(QStandardItem*))); connect(subfunctionsModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(onFunctionChanged())); connect(this, SIGNAL(rejected()), this, SLOT(onRejected())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } FunctionEditDialog::~FunctionEditDialog() {} void FunctionEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_FUNCTION, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_function, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onFunctionChanged(); } UserFunction *FunctionEditDialog::createFunction(MathFunction **replaced_item) { if(replaced_item) *replaced_item = NULL; MathFunction *func = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString())) { func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { *replaced_item = func; } } UserFunction *f; if(func && func->isLocal() && func->subtype() == SUBTYPE_USER_FUNCTION) { f = (UserFunction*) func; f->clearNames(); f->setApproximate(false); if(!modifyFunction(f)) return NULL; return f; } f = new UserFunction("", "", ""); std::string str; f->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); f->setTitle(titleEdit->text().trimmed().toStdString()); f->setCategory(categoryEdit->currentText().trimmed().toStdString()); f->setHidden(hideBox->isChecked()); str = settings->unlocalizeExpression(exampleEdit->text().trimmed().toStdString()); f->setExample(str); str = conditionEdit->text().trimmed().toStdString(); fix_expression(str); f->setCondition(str); for(int i = 0; i < argumentsModel->rowCount(); i++) { Argument *arg = (Argument*) argumentsModel->item(i, 0)->data().value(); if(arg) f->setArgumentDefinition(i + 1, arg); } for(int i = 0; i < subfunctionsModel->rowCount(); i++) { str = subfunctionsModel->item(i, 0)->text().trimmed().toStdString(); fix_expression(str); f->addSubfunction(str, subfunctionsModel->item(i, 1)->checkState() == Qt::Checked); } if(namesEditDialog) namesEditDialog->modifyNames(f, nameEdit->text()); else NamesEditDialog::modifyName(f, nameEdit->text()); str = expressionEdit->toPlainText().trimmed().toStdString(); fix_expression(str); ((UserFunction*) f)->setFormula(str); CALCULATOR->addFunction(f); return f; } bool FunctionEditDialog::modifyFunction(MathFunction *f, MathFunction **replaced_item) { if(replaced_item) *replaced_item = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString(), f)) { MathFunction *func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { *replaced_item = func; } } f->setLocal(true); if(namesEditDialog) namesEditDialog->modifyNames(f, nameEdit->text()); else NamesEditDialog::modifyName(f, nameEdit->text()); std::string str; f->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); f->setTitle(titleEdit->text().trimmed().toStdString()); f->setCategory(categoryEdit->currentText().trimmed().toStdString()); f->setHidden(hideBox->isChecked()); str = settings->unlocalizeExpression(exampleEdit->text().trimmed().toStdString()); f->setExample(str); str = conditionEdit->text().trimmed().toStdString(); fix_expression(str); f->setCondition(str); f->clearArgumentDefinitions(); for(int i = 0; i < argumentsModel->rowCount(); i++) { Argument *arg = (Argument*) argumentsModel->item(i, 0)->data().value(); if(arg) f->setArgumentDefinition(i + 1, arg); } if(f->subtype() == SUBTYPE_USER_FUNCTION) { ((UserFunction*) f)->clearSubfunctions(); for(int i = 0; i < subfunctionsModel->rowCount(); i++) { str = subfunctionsModel->item(i, 0)->text().trimmed().toStdString(); fix_expression(str); ((UserFunction*) f)->addSubfunction(str, subfunctionsModel->item(i, 1)->checkState() == Qt::Checked); } str = expressionEdit->toPlainText().trimmed().toStdString(); fix_expression(str); ((UserFunction*) f)->setFormula(str); } return true; } void FunctionEditDialog::subAddClicked() { QList items; QStandardItem *item = new QStandardItem(); QStandardItem *edit_item = item; item->setEditable(true); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(Qt::Unchecked); item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem("\\" + QString::number(subfunctionsModel->rowCount() + 1)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); subfunctionsModel->appendRow(items); subfunctionsView->selectionModel()->setCurrentIndex(edit_item->index(), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear | QItemSelectionModel::Rows); subfunctionsView->scrollTo(edit_item->index()); subfunctionsView->edit(edit_item->index()); onFunctionChanged(); } void FunctionEditDialog::subEditClicked() { #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) subfunctionsView->edit(subfunctionsView->selectionModel()->currentIndex().siblingAtColumn(0)); #else subfunctionsView->edit(subfunctionsView->selectionModel()->currentIndex().sibling(subfunctionsView->selectionModel()->currentIndex().row(), 0)); #endif onFunctionChanged(); } void FunctionEditDialog::subDelClicked() { subfunctionsModel->removeRow(subfunctionsView->selectionModel()->currentIndex().row()); onFunctionChanged(); for(int i = 0; i < subfunctionsModel->rowCount(); i++) { QStandardItem *item = subfunctionsModel->item(i, 2); if(item) { item->setText("\\" + QString::number(i + 1)); } } } void FunctionEditDialog::argAddClicked() { QList items; QStandardItem *item = new QStandardItem(); item->setData(QVariant::fromValue((void*) NULL)); QStandardItem *edit_item = item; item->setEditable(true); items.append(item); Argument defarg; item = new QStandardItem(QString::fromStdString(defarg.printlong())); item->setData(QVariant::fromValue((void*) NULL)); item->setEditable(false); items.append(item); QString refstr = "\\"; int i = argumentsModel->rowCount() + 1; if(i <= 3) refstr += (char) ('x' + (i - 1)); else refstr += (char) ('a' + (i - 4)); item = new QStandardItem(refstr); item->setData(QVariant::fromValue((void*) NULL)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); argumentsModel->appendRow(items); argumentsView->selectionModel()->setCurrentIndex(edit_item->index(), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear | QItemSelectionModel::Rows); argumentsView->scrollTo(edit_item->index()); argEditClicked(); } void FunctionEditDialog::argumentActivated(const QModelIndex &index) { if(!nameEdit->isReadOnly() && index.column() != 0) argEditClicked(); } void FunctionEditDialog::argumentChanged(QStandardItem *item) { if(nameEdit->isReadOnly() || item->column() != 0) return; Argument *arg = (Argument*) item->data().value(); if(arg) { arg->setName(item->text().trimmed().toStdString()); } else if(!item->text().trimmed().isEmpty()) { arg = new Argument(item->text().trimmed().toStdString()); item->setData(QVariant::fromValue((void*) arg)); } onFunctionChanged(); } void FunctionEditDialog::argEditClicked() { int r = argumentsView->selectionModel()->currentIndex().row(); QStandardItem *item = argumentsModel->item(r, 0); if(!item) return; Argument *arg = (Argument*) item->data().value(); ArgumentEditDialog *d = new ArgumentEditDialog(this, nameEdit->isReadOnly()); d->setArgument(arg); d->exec(); if(!nameEdit->isReadOnly()) { if(arg) delete arg; arg = d->createArgument(); argumentsModel->blockSignals(true); item->setData(QVariant::fromValue((void*) arg)); item->setText(QString::fromStdString(arg->name())); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item = argumentsModel->item(r, 1); item->setText(QString::fromStdString(arg->printlong())); item->setData("

" + item->text() + "

", Qt::ToolTipRole); argumentsModel->blockSignals(false); onFunctionChanged(); } d->deleteLater(); } void FunctionEditDialog::argDelClicked() { int r = argumentsView->selectionModel()->currentIndex().row(); QStandardItem *item = argumentsModel->item(r, 0); if(!item) return; Argument *arg = (Argument*) item->data().value(); if(arg) delete arg; argumentsModel->removeRow(r); onFunctionChanged(); for(int i = 0; i < argumentsModel->rowCount(); i++) { QStandardItem *item = argumentsModel->item(i, 2); if(item) { QString refstr = "\\"; if(i <= 3) refstr += (char) ('x' + (i - 1)); else refstr += (char) ('a' + (i - 4)); item->setText(refstr); } } } void FunctionEditDialog::selectedSubfunctionChanged(const QModelIndex &index, const QModelIndex&) { if(!expressionEdit->isReadOnly()) { subDelButton->setEnabled(index.isValid()); subEditButton->setEnabled(index.isValid()); } } void FunctionEditDialog::selectedArgumentChanged(const QModelIndex &index, const QModelIndex&) { if(!expressionEdit->isReadOnly()) { argDelButton->setEnabled(index.isValid()); argEditButton->setEnabled(index.isValid()); } } void FunctionEditDialog::onRejected() { if(expressionEdit->isReadOnly()) return; for(int i = 0; i < argumentsModel->rowCount(); i++) { QStandardItem *item = argumentsModel->item(i, 0); if(item) { Argument *arg = (Argument*) item->data(Qt::UserRole).value(); if(arg && !nameEdit->isReadOnly()) delete arg; } } } void FunctionEditDialog::setFunction(MathFunction *f) { o_function = f; name_edited = false; bool read_only = !f->isLocal(); nameEdit->setText(QString::fromStdString(f->getName(1).name)); if(namesEditDialog) namesEditDialog->setNames(f, nameEdit->text()); if(f->subtype() == SUBTYPE_USER_FUNCTION) { expressionEdit->setEnabled(true); std::string str = settings->localizeExpression(((UserFunction*) f)->formula()); expressionEdit->setPlainText(QString::fromStdString(str)); for(size_t i = 1; i <= ((UserFunction*) f)->countSubfunctions(); i++) { QList items; str = settings->localizeExpression(((UserFunction*) f)->getSubfunction(i)); QStandardItem *item = new QStandardItem(QString::fromStdString(str)); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item->setEditable(!read_only); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(((UserFunction*) f)->subfunctionPrecalculated(i) ? Qt::Checked : Qt::Unchecked); if(read_only) item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable); item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem("\\" + QString::number(i)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); subfunctionsModel->appendRow(items); } } else { read_only = true; expressionEdit->setEnabled(false); expressionEdit->clear(); subfunctionsView->setEnabled(false); } int args = f->maxargs(); if(args < 0) { args = f->minargs() + 1; } if((int) f->lastArgumentDefinitionIndex() > args) args = (int) f->lastArgumentDefinitionIndex(); for(int i = 1; i <= args; i++) { Argument *arg = f->getArgumentDefinition(i); QString str, str2; if(arg) { if(!read_only) arg = arg->copy(); str = QString::fromStdString(arg->printlong()); str2 = QString::fromStdString(arg->name()); } else { Argument defarg; str = QString::fromStdString(defarg.printlong()); } QList items; QStandardItem *item = new QStandardItem(str2); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item->setData(QVariant::fromValue((void*) arg)); item->setEditable(!read_only); items.append(item); item = new QStandardItem(str); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item->setData(QVariant::fromValue((void*) arg)); item->setEditable(false); items.append(item); QString refstr = "\\"; if(i <= 3) refstr += (char) ('x' + (i - 1)); else refstr += (char) ('a' + (i - 4)); item = new QStandardItem(refstr); item->setData(QVariant::fromValue((void*) arg)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); argumentsModel->appendRow(items); } descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(f->description())); descriptionEdit->blockSignals(false); std::string str = settings->localizeExpression(f->example(true)); exampleEdit->setText(QString::fromStdString(str)); str = settings->localizeExpression(f->condition()); conditionEdit->setText(QString::fromStdString(str)); titleEdit->setText(QString::fromStdString(f->title(false))); categoryEdit->blockSignals(true); categoryEdit->setCurrentText(QString::fromStdString(f->category())); categoryEdit->blockSignals(false); descriptionEdit->setReadOnly(read_only); exampleEdit->setReadOnly(read_only); titleEdit->setReadOnly(read_only); hideBox->setChecked(f->isHidden()); okButton->setEnabled(false); nameEdit->setReadOnly(read_only); subEditButton->setEnabled(false); subAddButton->setEnabled(!read_only); subDelButton->setEnabled(false); argEditButton->setEnabled(false); argAddButton->setEnabled(!read_only); argDelButton->setEnabled(false); conditionEdit->setReadOnly(read_only); expressionEdit->setReadOnly(read_only); } void FunctionEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->functionNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidFunctionName(str.trimmed().toStdString()))); } name_edited = true; onFunctionChanged(); } void FunctionEditDialog::onFunctionChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && (!expressionEdit->document()->isEmpty() || !expressionEdit->isEnabled()) && !nameEdit->text().trimmed().isEmpty()); } void FunctionEditDialog::setExpression(const QString &str) { expressionEdit->setPlainText(str); onFunctionChanged(); } void FunctionEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } QString FunctionEditDialog::expression() const { return expressionEdit->toPlainText(); } bool FunctionEditDialog::editFunction(QWidget *parent, MathFunction *f, MathFunction **replaced_item) { FunctionEditDialog *d = new FunctionEditDialog(parent); d->setWindowTitle(tr("Edit Function")); d->setFunction(f); while(d->exec() == QDialog::Accepted) { if(d->modifyFunction(f, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } UserFunction *FunctionEditDialog::newFunction(QWidget *parent, MathFunction **replaced_item) { FunctionEditDialog *d = new FunctionEditDialog(parent); d->setWindowTitle(tr("New Function")); std::string f_name; int i = 1; do { f_name = "f"; f_name += i2s(i); i++; } while(CALCULATOR->nameTaken(f_name)); d->setName(QString::fromStdString(f_name)); UserFunction *f = NULL; while(d->exec() == QDialog::Accepted) { f = d->createFunction(replaced_item); if(f) break; } d->deleteLater(); return f; } qalculate-qt-5.5.1/src/functioneditdialog.h000066400000000000000000000107621475705355700207620ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef FUNCTION_EDIT_DIALOG_H #define FUNCTION_EDIT_DIALOG_H #include #include #include #include class QPlainTextEdit; class QPushButton; class QRadioButton; class QDoubleSpinBox; class QComboBox; class QCheckBox; class QTreeView; class QStandardItemModel; class QStandardItem; class NamesEditDialog : public QDialog { Q_OBJECT protected: QTreeView *namesView; QStandardItemModel *namesModel; QPushButton *addButton, *editButton, *delButton; ExpressionItem *o_item; int i_type; protected slots: void addClicked(); void delClicked(); void editClicked(); void selectedNameChanged(const QModelIndex&, const QModelIndex&); void nameChanged(QStandardItem*); public: NamesEditDialog(int type, QWidget *parent = NULL, bool = false); virtual ~NamesEditDialog(); void modifyNames(ExpressionItem*, const QString&); static void modifyName(ExpressionItem*, const QString&); void setNames(ExpressionItem*, const QString&); void modifyNames(DataProperty*, const QString&); static void modifyName(DataProperty*, const QString&); void setNames(DataProperty*, const QString&); void setName(const QString&); QString firstName(); }; class MathTextEdit : public QPlainTextEdit { public: MathTextEdit(QWidget *parent); ~MathTextEdit(); QSize sizeHint() const; void insertText(const QString&); protected: void keyPressEvent(QKeyEvent *event) override; }; class SmallTextEdit : public QPlainTextEdit { public: SmallTextEdit(int r, QWidget *parent); ~SmallTextEdit(); QSize sizeHint() const; protected: int i_rows; }; class ExpandingMathLineEdit : public QLineEdit { Q_OBJECT public: ExpandingMathLineEdit(QWidget *parent); void setWidgetOwnsGeometry(bool value); protected: void changeEvent(QEvent *e) override; void keyPressEvent(QKeyEvent*) override; public slots: void resizeToContents(); private: void updateMinimumWidth(); int originalWidth; bool widgetOwnsGeometry; }; class ArgumentEditDialog : public QDialog { Q_OBJECT protected: QComboBox *typeCombo; QLineEdit *nameEdit, *conditionEdit; QDoubleSpinBox *minEdit, *maxEdit; QCheckBox *maxBox, *minBox, *vectorBox, *matrixBox, *zeroBox, *includeMinBox, *includeMaxBox, *testBox; protected slots: void typeChanged(int); void minToggled(bool); void maxToggled(bool); public: ArgumentEditDialog(QWidget *parent = NULL, bool = false); virtual ~ArgumentEditDialog(); Argument *createArgument(); void setArgument(Argument*); }; class FunctionEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *titleEdit, *conditionEdit, *exampleEdit; QComboBox *categoryEdit; QCheckBox *hideBox; QPlainTextEdit *expressionEdit, *descriptionEdit; QPushButton *okButton, *argDelButton, *argAddButton, *argEditButton, *subDelButton, *subAddButton, *subEditButton; QTreeView *subfunctionsView, *argumentsView; QStandardItemModel *subfunctionsModel, *argumentsModel; NamesEditDialog *namesEditDialog; MathFunction *o_function; bool name_edited; protected slots: void onNameEdited(const QString&); void onFunctionChanged(); void subAddClicked(); void subEditClicked(); void subDelClicked(); void argAddClicked(); void argEditClicked(); void argDelClicked(); void argumentChanged(QStandardItem *item); void argumentActivated(const QModelIndex&); void selectedSubfunctionChanged(const QModelIndex&, const QModelIndex&); void selectedArgumentChanged(const QModelIndex&, const QModelIndex&); void onRejected(); void editNames(); public: FunctionEditDialog(QWidget *parent = NULL); virtual ~FunctionEditDialog(); UserFunction *createFunction(MathFunction **replaced_item = NULL); bool modifyFunction(MathFunction *f, MathFunction **replaced_item = NULL); void setFunction(MathFunction *f); void setExpression(const QString&); QString expression() const; void setName(const QString&); static bool editFunction(QWidget *parent, MathFunction *f, MathFunction **replaced_item = NULL); static UserFunction *newFunction(QWidget *parent, MathFunction **replaced_item = NULL); }; #endif //FUNCTION_EDIT_DIALOG_H qalculate-qt-5.5.1/src/functionsdialog.cpp000066400000000000000000000724711475705355700206370ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "functionsdialog.h" #include "itemproxymodel.h" #include "functioneditdialog.h" #include "dataseteditdialog.h" FunctionsDialog::FunctionsDialog(QWidget *parent) : QDialog(parent, Qt::Window) { QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Functions")); QHBoxLayout *hbox = new QHBoxLayout(); topbox->addLayout(hbox); vsplitter = new QSplitter(Qt::Vertical, this); hbox->addWidget(vsplitter, 1); hsplitter = new QSplitter(Qt::Horizontal, this); categoriesView = new QTreeWidget(this); categoriesView->setSelectionMode(QAbstractItemView::SingleSelection); categoriesView->setRootIsDecorated(false); categoriesView->headerItem()->setText(0, tr("Category")); categoriesView->setColumnCount(2); categoriesView->setColumnHidden(1, true); categoriesView->installEventFilter(this); hsplitter->addWidget(categoriesView); QWidget *w = new QWidget(this); QVBoxLayout *vbox = new QVBoxLayout(w); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); functionsView = new QTreeView(this); functionsView->setSelectionMode(QAbstractItemView::SingleSelection); functionsView->setRootIsDecorated(false); functionsModel = new ItemProxyModel(this); functionsView->installEventFilter(this); sourceModel = new QStandardItemModel(this); functionsModel->setSourceModel(sourceModel); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Function"))); functionsView->setModel(functionsModel); selected_item = NULL; vbox->addWidget(functionsView, 1); searchEdit = new QLineEdit(this); searchEdit->addAction(LOAD_ICON("edit-find"), QLineEdit::LeadingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) searchEdit->setTextMargins(22, 0, 0, 0); # endif #endif searchEdit->installEventFilter(this); vbox->addWidget(searchEdit, 0); hsplitter->addWidget(w); vsplitter->addWidget(hsplitter); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); vsplitter->addWidget(descriptionView); vsplitter->setStretchFactor(0, 2); vsplitter->setStretchFactor(1, 1); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); QVBoxLayout *box = new QVBoxLayout(); newButton = new QPushButton(tr("New…"), this); box->addWidget(newButton); connect(newButton, SIGNAL(clicked()), this, SLOT(newClicked())); editButton = new QPushButton(tr("Edit…"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); deactivateButton = new QPushButton(tr("Deactivate"), this); box->addWidget(deactivateButton); connect(deactivateButton, SIGNAL(clicked()), this, SLOT(deactivateClicked())); delButton = new QPushButton(tr("Delete"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); box->addSpacing(12); calculateButton = new QPushButton(tr("Calculate…"), this); box->addWidget(calculateButton); connect(calculateButton, SIGNAL(clicked()), this, SLOT(calculateClicked())); calculateButton->setDefault(true); applyButton = new QPushButton(tr("Apply"), this); box->addWidget(applyButton); connect(applyButton, SIGNAL(clicked()), this, SLOT(applyClicked())); insertButton = new QPushButton(tr("Insert"), this); box->addWidget(insertButton); connect(insertButton, SIGNAL(clicked()), this, SLOT(insertClicked())); box->addSpacing(12); favouriteButton = new QCheckBox(tr("Favorite"), this); box->addWidget(favouriteButton); connect(favouriteButton, SIGNAL(clicked()), this, SLOT(favouriteClicked())); box->addStretch(1); hbox->addLayout(box, 0); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); topbox->addWidget(buttonBox); selected_category = "All"; updateFunctions(); functionsView->setFocus(); connect(searchEdit, SIGNAL(textChanged(const QString&)), this, SLOT(searchChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(categoriesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(functionsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedFunctionChanged(const QModelIndex&, const QModelIndex&))); connect(functionsView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(calculateClicked())); if(!settings->functions_geometry.isEmpty()) restoreGeometry(settings->functions_geometry); else try_resize(this, 900, 800); if(!settings->functions_vsplitter_state.isEmpty()) vsplitter->restoreState(settings->functions_vsplitter_state); if(!settings->functions_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->functions_hsplitter_state); } FunctionsDialog::~FunctionsDialog() {} bool FunctionsDialog::eventFilter(QObject *o, QEvent *e) { if(e->type() == QEvent::KeyPress) { QKeyEvent *event = static_cast(e); if(o == searchEdit) { if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up || event->key() == Qt::Key_PageDown || event->key() == Qt::Key_PageUp) { functionsView->setFocus(); QKeyEvent *eventCopy = new QKeyEvent(event->type(), event->key(), event->modifiers(), event->text(), event->isAutoRepeat(), event->count()); QApplication::postEvent(functionsView, eventCopy); return true; } } else if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { if(!event->text().isEmpty() && event->text()[0].isLetterOrNumber()) { searchEdit->setFocus(); searchEdit->setText(event->text()); return true; } } } return QDialog::eventFilter(o, e); } void FunctionsDialog::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Find)) { searchEdit->setFocus(); return; } if(event->key() == Qt::Key_Escape && searchEdit->hasFocus()) { searchEdit->clear(); functionsView->setFocus(); return; } if(event->key() == Qt::Key_Return && functionsView->hasFocus()) { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(index.isValid()) { calculateClicked(); return; } } QDialog::keyPressEvent(event); } void FunctionsDialog::closeEvent(QCloseEvent *e) { settings->functions_geometry = saveGeometry(); settings->functions_vsplitter_state = vsplitter->saveState(); settings->functions_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void FunctionsDialog::reject() { settings->functions_geometry = saveGeometry(); settings->functions_vsplitter_state = vsplitter->saveState(); settings->functions_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } void FunctionsDialog::searchChanged(const QString &str) { functionsModel->setSecondaryFilter(str.toStdString()); functionsView->selectionModel()->setCurrentIndex(functionsModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); if(str.isEmpty()) functionsView->setFocus(); } void FunctionsDialog::newClicked() { MathFunction *replaced_item = NULL; UserFunction *f = FunctionEditDialog::newFunction(this, &replaced_item); if(f) { if(replaced_item && (replaced_item == f || !CALCULATOR->hasFunction(replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item && !replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } selected_item = f; if(f->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(f->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(f->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateFunctions(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) functionsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) f), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + f->category() && (selected_category != "Uncategorized" || !f->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { functionsModel->invalidate(); } sourceModel->sort(0); QModelIndex index = functionsModel->mapFromSource(item->index()); if(index.isValid()) { functionsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); functionsView->scrollTo(index); } if(f != replaced_item && !f->isHidden()) settings->favourite_functions.push_back(f); emit itemsChanged(); } } void FunctionsDialog::editClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *replaced_item = NULL; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f && ((f->subtype() != SUBTYPE_DATA_SET && FunctionEditDialog::editFunction(this, f, &replaced_item)) || (f->subtype() == SUBTYPE_DATA_SET && DataSetEditDialog::editDataset(this, (DataSet*) f, &replaced_item)))) { sourceModel->removeRow(functionsModel->mapToSource(functionsView->selectionModel()->currentIndex()).row()); if(replaced_item && !CALCULATOR->hasFunction(replaced_item)) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item && !replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } selected_item = f; if(f->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(f->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(f->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateFunctions(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) functionsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) f), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + f->category() && (selected_category != "Uncategorized" || !f->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { functionsModel->invalidate(); } sourceModel->sort(0); QModelIndex index = functionsModel->mapFromSource(item->index()); if(index.isValid()) { functionsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); functionsView->scrollTo(index); } emit itemsChanged(); } } void FunctionsDialog::favouriteClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(!f) return; if(favouriteButton->isChecked()) { settings->favourite_functions.push_back(f); } else { for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == f) { settings->favourite_functions.erase(settings->favourite_functions.begin() + i); break; } } if(selected_category == "Favorites") { if(settings->favourite_functions.empty()) { QList list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else { selected_item = NULL; functionsModel->invalidate(); selectedFunctionChanged(functionsView->selectionModel()->currentIndex(), functionsView->selectionModel()->currentIndex()); } } } settings->favourite_functions_changed = true; emit favouritesChanged(); } void FunctionsDialog::delClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f && f->isLocal()) { sourceModel->removeRow(functionsModel->mapToSource(functionsView->selectionModel()->currentIndex()).row()); selected_item = NULL; f->destroy(); emit itemsChanged(); } } void FunctionsDialog::applyClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); emit applyFunctionRequest(f); } void FunctionsDialog::calculateClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f) { emit calculateFunctionRequest(f); } } void FunctionsDialog::insertClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f) { emit insertFunctionRequest(f); } } void FunctionsDialog::deactivateClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f) { f->setActive(!f->isActive()); QList list = categoriesView->findItems(f->isActive() ? "All" : "Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else if(!f->isActive()) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QStringList l; l << tr("Inactive"); l << "Inactive"; QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); categoriesView->setCurrentItem(i, 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } emit itemsChanged(); } } void FunctionsDialog::selectedFunctionChanged(const QModelIndex &index, const QModelIndex&) { if(index.isValid()) { MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(CALCULATOR->stillHasFunction(f)) { selected_item = f; Argument *arg; Argument default_arg; std::string str; const ExpressionName *ename = &f->preferredName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView); str = ""; str += ename->formattedName(TYPE_FUNCTION, true, true); str += ""; int iargs = f->maxargs(); if(iargs < 0) { iargs = f->minargs() + 1; if((int) f->lastArgumentDefinitionIndex() > iargs) iargs = (int) f->lastArgumentDefinitionIndex(); } str += "("; if(iargs != 0) { for(int i2 = 1; i2 <= iargs; i2++) { if(i2 > f->minargs()) { str += "["; } if(i2 > 1) { str += CALCULATOR->getComma(); str += " "; } arg = f->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str += arg->name(); } else { str += tr("argument").toStdString(); if(i2 > 1 || f->maxargs() != 1) { str += " "; str += i2s(i2); } } if(i2 > f->minargs()) { str += "]"; } } if(f->maxargs() < 0) { str += CALCULATOR->getComma(); str += " …"; } } str += ")"; for(size_t i2 = 1; i2 <= f->countNames(); i2++) { if(&f->getName(i2) != ename) { str += "
"; str += f->getName(i2).formattedName(TYPE_FUNCTION, true, true); } } str += "

"; if(f->subtype() == SUBTYPE_DATA_SET) { str += "
"; str += tr("Retrieves data from the %1 data set for a given object and property. If \"info\" is typed as property, a dialog window will pop up with all properties of the object.").arg(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) descriptionView))).toHtmlEscaped().toStdString(); str += "
"; } if(!f->description().empty()) { str += "
"; str += to_html_escaped(f->description()); str += "
"; } if(!f->example(true).empty()) { str += "
"; str += tr("Example:").toStdString(); str += " "; str += to_html_escaped(f->example(false, ename->formattedName(TYPE_FUNCTION, true))); str += "
"; } if(f->subtype() == SUBTYPE_DATA_SET && !((DataSet*) f)->copyright().empty()) { str += "
"; str += to_html_escaped(((DataSet*) f)->copyright()); str += "
"; } if(iargs) { str += "
"; str += tr("Arguments").toStdString(); str += "
"; for(int i2 = 1; i2 <= iargs; i2++) { arg = f->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str += arg->name(); } else { str += i2s(i2); } str += ": "; if(arg) { str += to_html_escaped(arg->printlong()); } else { str += default_arg.printlong(); } if(i2 > f->minargs()) { str += " ("; str += tr("optional", "optional argument").toStdString(); if(!f->getDefaultValue(i2).empty() && f->getDefaultValue(i2) != "\"\"") { str += ", "; str += tr("default:", "argument default").toStdString(); str += " "; ParseOptions pa = settings->evalops.parse_options; pa.base = 10; std::string str2 = CALCULATOR->localizeExpression(f->getDefaultValue(i2), pa); gsub("*", settings->multiplicationSign(), str2); gsub("/", settings->divisionSign(false), str2); gsub("-", SIGN_MINUS, str2); str += str2; } str += ")"; } str += "
"; } } if(!f->condition().empty()) { str += "
"; str += tr("Requirement:", "Required condition for function").toStdString(); str += " "; str += to_html_escaped(f->printCondition()); str += "
"; } if(f->subtype() == SUBTYPE_DATA_SET) { DataSet *ds = (DataSet*) f; str += "
"; str += tr("Properties").toStdString(); str += "
"; DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); while(dp) { if(!dp->isHidden()) { if(!dp->title(false).empty()) { str += tr("%1:").arg(QString::fromStdString(dp->title())).toStdString(); str += " "; } for(size_t i = 1; i <= dp->countNames(); i++) { if(i > 1) str += ", "; str += dp->getName(i); } if(dp->isKey()) { str += " ("; //: indicating that the property is a data set key str += tr("key").toStdString(); str += ")"; } str += "
"; if(!dp->description().empty()) { str += ""; str += to_html_escaped(dp->description()); str += "
"; } } dp = ds->getNextProperty(&it); } } if(f->isActive() != (deactivateButton->text() == tr("Deactivate"))) { deactivateButton->setMinimumWidth(deactivateButton->width()); if(f->isActive()) { deactivateButton->setText(tr("Deactivate")); } else { deactivateButton->setText(tr("Activate")); } } editButton->setEnabled(!f->isBuiltin()); insertButton->setEnabled(f->isActive()); calculateButton->setEnabled(f->isActive()); delButton->setEnabled(f->isLocal()); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == f) { favouriteButton->setChecked(true); break; } } deactivateButton->setEnabled(true); applyButton->setEnabled(f->isActive() && ((f->minargs() <= 1 && f->id() != FUNCTION_ID_LOGN) || settings->rpn_mode)); descriptionView->setHtml(QString::fromStdString(str)); return; } } editButton->setEnabled(false); insertButton->setEnabled(false); calculateButton->setEnabled(false); delButton->setEnabled(false); deactivateButton->setEnabled(false); applyButton->setEnabled(false); favouriteButton->setEnabled(false); favouriteButton->setChecked(false); descriptionView->clear(); selected_item = NULL; } void FunctionsDialog::selectedCategoryChanged(QTreeWidgetItem *iter, QTreeWidgetItem*) { if(!iter) selected_category = ""; else selected_category = iter->text(1).toStdString(); searchEdit->clear(); functionsModel->setFilter(selected_category); QModelIndex index = functionsView->selectionModel()->currentIndex(); if(index.isValid()) { selectedFunctionChanged(index, QModelIndex()); functionsView->scrollTo(index); } } struct tree_struct { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; tree_struct *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct &s1) const { return string_is_less(item, s1.item); } }; void FunctionsDialog::updateFunctions() { size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; tree_struct function_cats; function_cats.parent = NULL; bool has_inactive = false, has_uncat = false; std::list::iterator it; QStandardItem *item_sel = NULL; functionsView->selectionModel()->blockSignals(true); sourceModel->clear(); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Function"))); for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(!f->isActive()) { has_inactive = true; } else { tree_struct *item = &function_cats; if(!f->category().empty()) { cat = f->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } else { has_uncat = true; } } QStandardItem *item = new QStandardItem(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) functionsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) f), Qt::UserRole); sourceModel->appendRow(item); if(f == selected_item) item_sel = item; } functionsView->selectionModel()->blockSignals(false); sourceModel->sort(0); function_cats.sort(); categoriesView->blockSignals(true); categoriesView->clear(); categoriesView->blockSignals(false); QTreeWidgetItem *iter, *iter2, *iter3; QStringList l; l.clear(); l << tr("Favorites"); l << "Favorites"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Favorites") { iter->setSelected(true); } l.clear(); l << tr("User functions"); l << "User items"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "User items") { iter->setSelected(true); } if(has_inactive) { //add "Inactive" category if there are inactive functions l.clear(); l << tr("Inactive"); l << "Inactive"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Inactive") { iter->setSelected(true); } } l.clear(); l << tr("All", "All functions"); l << "All"; iter3 = new QTreeWidgetItem(categoriesView, l); tree_struct *item, *item2; function_cats.it = function_cats.items.begin(); if(function_cats.it != function_cats.items.end()) { item = &*function_cats.it; ++function_cats.it; item->it = item->items.begin(); } else { item = NULL; } str = ""; iter2 = iter3; while(item) { str += "/"; str += item->item; l.clear(); l << QString::fromStdString(item->item); l << QString::fromStdString(str); iter = new QTreeWidgetItem(iter2, l); if(str == selected_category) { iter->setExpanded(true); iter->setSelected(true); } while(item && item->it == item->items.end()) { size_t str_i = str.rfind("/"); if(str_i == std::string::npos) { str = ""; } else { str = str.substr(0, str_i); } item = item->parent; iter2 = iter->parent(); iter = iter2; } if(item) { item2 = &*item->it; if(item->it == item->items.begin()) iter2 = iter; ++item->it; item = item2; item->it = item->items.begin(); } } if(has_uncat) { //add "Uncategorized" category if there are functions without category l.clear(); l << tr("Uncategorized"); l << "Uncategorized"; iter = new QTreeWidgetItem(iter3, l); if(selected_category == "Uncategorized") { iter->setSelected(true); } } iter3->setExpanded(true); if(categoriesView->selectedItems().isEmpty()) { //if no category has been selected (previously selected has been renamed/deleted), select "All" selected_category = "All"; iter3->setSelected(true); } searchEdit->blockSignals(true); searchEdit->clear(); searchEdit->blockSignals(false); functionsModel->setFilter(selected_category); QModelIndex index; if(item_sel) index = functionsModel->mapFromSource(item_sel->index()); if(!index.isValid()) index = functionsModel->index(0, 0); if(index.isValid()) { functionsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); functionsView->scrollTo(index); } selectedFunctionChanged(index, QModelIndex()); } void FunctionsDialog::setSearch(const QString &str) { searchEdit->setText(str); } void FunctionsDialog::selectCategory(std::string str) { QList list = categoriesView->findItems((str.empty() || str == "All") ? "All" : "/" + QString::fromStdString(str), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } qalculate-qt-5.5.1/src/functionsdialog.h000066400000000000000000000042251475705355700202740ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef FUNCTIONS_DIALOG_H #define FUNCTIONS_DIALOG_H #include #include class QTreeView; class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QStandardItemModel; class QPushButton; class QLineEdit; class QSplitter; class ItemProxyModel; class QComboBox; class QLabel; class QAbstractButton; class FunctionsDialog : public QDialog { Q_OBJECT protected: QTreeView *functionsView; QTreeWidget *categoriesView; QTextEdit *descriptionView; ItemProxyModel *functionsModel; QStandardItemModel *sourceModel; QPushButton *deactivateButton, *calculateButton, *insertButton, *delButton, *editButton, *newButton, *applyButton; QAbstractButton *favouriteButton; QLineEdit *searchEdit; QSplitter *vsplitter, *hsplitter; std::string selected_category; ExpressionItem *selected_item; void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent*) override; protected slots: void selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedFunctionChanged(const QModelIndex&, const QModelIndex&); void newClicked(); void editClicked(); void delClicked(); void applyClicked(); void insertClicked(); void calculateClicked(); void deactivateClicked(); void favouriteClicked(); void searchChanged(const QString&); public: FunctionsDialog(QWidget *parent = NULL); virtual ~FunctionsDialog(); void updateFunctions(); void setSearch(const QString&); void selectCategory(std::string); bool eventFilter(QObject*, QEvent*) override; public slots: void reject() override; signals: void itemsChanged(); void favouritesChanged(); void applyFunctionRequest(MathFunction*); void insertFunctionRequest(MathFunction*); void calculateFunctionRequest(MathFunction*); }; #endif //FUNCTIONS_DIALOG_H qalculate-qt-5.5.1/src/historyview.cpp000066400000000000000000002013261475705355700200340ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "expressionedit.h" #include "historyview.h" #include "qalculateqtsettings.h" bool qstring_has_nondigit(const QString &str) { for(int i = 0; i < str.length(); i++) { if(!str[i].isDigit()) return true; } return false; } QString unhtmlize(QString str, bool b_ascii) { int i = 0, i2; str.remove("\n"); while(true) { i = str.indexOf("<", i); if(i < 0) break; i2 = str.indexOf(">", i + 1); if(i2 < 0) break; int i_sup = str.indexOf("vertical-align:super", i); int i_sub = str.indexOf("vertical-align:sub", i); int i_small = str.indexOf("font-size:small", i); int i_italic = str.indexOf("font-style:italic", i); if(i_sup > i && i2 > i_sup) { int i3 = str.indexOf("= 0) { QString str2 = unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii); if(!b_ascii && str2.length() == 1 && str2[0] == '2') str.replace(i, i3 - i, SIGN_POWER_2); else if(!b_ascii && str2.length() == 1 && str2[0] == '3') str.replace(i, i3 - i, SIGN_POWER_3); else if(str.length() == i3 + 7 && (str2.length() == 1 || !qstring_has_nondigit(str2))) str.replace(i, i3 - i, "^" + str2); else str.replace(i, i3 - i, "^(" + str2 + ")"); continue; } } else if(i_sub > i && i2 > i_sub) { int i3 = str.indexOf("= 0) { if(i_small > i && i2 > i_small) str.remove(i, i3 - i); else str.replace(i, i3 - i, "_" + unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii)); continue; } } else if(i_italic > i && i2 > i_italic) { int i3 = str.indexOf("= 0) { QString name = unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii); if(!name.isEmpty() && name[0] != '\'' && name[0] != '\"') { Variable *v = CALCULATOR->getActiveVariable(name.toStdString()); bool replace_all_i = (!v || v->isKnown()); if(replace_all_i && name.length() == 1 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z'))) { name.insert(0, "\\"); str.replace(i, i3 - i, name); continue; } else if(replace_all_i) { name.insert(0, "\""); name += "\""; str.replace(i, i3 - i, name); continue; } } } } else if((i2 - i == 3 && str.mid(i + 1, 2) == "br") || (i2 - i == 4 && str.mid(i + 1, 3) == "/tr")) { str.replace(i, i2 - i + 1, "\n"); continue; } else if(i2 - i > 5 && str.mid(i + 1, 4) == "span" && i2 + 1 < str.length() && str[i2 + 1] == '#') { int i3 = str.indexOf("= 0 && str.indexOf("
") == i3) { str.remove(i, i3 - i); continue; } } else if(i2 - i == 5 && str.mid(i + 1, 4) == "head") { int i3 = str.indexOf("", i2 + 1); if(i3 > 0) { i2 = i3 + 6; } } else if(i2 - i == 4) { if(str.mid(i + 1, 3) == "sup") { int i3 = str.indexOf("", i2 + 1); if(i3 >= 0) { QString str2 = unhtmlize(str.mid(i + 5, i3 - i - 5), b_ascii); if(str2.length() == 1 && str2[0] == '2') str.replace(i, i3 - i + 6, SIGN_POWER_2); else if(str2.length() == 1 && str2[0] == '3') str.replace(i, i3 - i + 6, SIGN_POWER_3); else if(str.length() == i3 + 6 && (str2.length() == 1 || !qstring_has_nondigit(str2))) str.replace(i, i3 - i + 6, "^" + str2); else str.replace(i, i3 - i + 6, "^(" + str2 + ")"); continue; } } else if(str.mid(i + 1, 3) == "sub") { int i3 = str.indexOf("
", i + 4); if(i3 >= 0) { str.replace(i, i3 - i + 6, "_" + unhtmlize(str.mid(i + 5, i3 - i - 5), b_ascii)); continue; } } } else if(i2 - i == 17 && str.mid(i + 1, 16) == "i class=\"symbol\"") { int i3 = str.indexOf("
", i2 + 1); if(i3 >= 0) { QString name = unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii); if(name.length() == 1 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z'))) { name.insert(0, "\\"); } else { name.insert(0, "\""); name += "\""; } str.replace(i, i3 - i + 4, name); continue; } } str.remove(i, i2 - i + 1); } str.replace(" " SIGN_DIVISION_SLASH " ", "/"); str.replace("&", "&"); str.replace(">", ">"); str.replace("<", "<"); str.replace(" ", " "); str.replace(" ", THIN_SPACE); str.replace(" ", NNBSP); str.replace(""", "\""); return str; } HistoryView::HistoryView(QWidget *parent) : QTextEdit(parent) { fileMenu = NULL; i_pos = 0; i_pos_p = 0; previous_cursor = 0; previous_temporary = 0; last_ans = 0; #ifdef _WIN32 has_lock_symbol = 1; #else has_lock_symbol = -1; #endif initial_loaded = false; setReadOnly(true); QImage img1px(1, 1, QImage::Format_ARGB32); img1px.fill(Qt::transparent); document()->addResource(QTextDocument::ImageResource, QUrl("data://img1px.png"), QVariant(img1px)); text_color = palette().text().color(); setTextColor(text_color); cmenu = NULL; searchDialog = NULL; findAction = new QAction(tr("Search…"), this); addAction(findAction); connect(findAction, SIGNAL(triggered()), this, SLOT(editFind())); findDateAction = new QAction(tr("Search by Date…"), this); addAction(findDateAction); connect(findDateAction, SIGNAL(triggered()), this, SLOT(editFindDate())); } HistoryView::~HistoryView() {} void HistoryView::replaceColors(QString &str, QColor prev_text_color) { if(settings->color == 2) { str.replace("color: #585858", "color: #AAAAAA"); str.replace("color: #800000", "color: #FFAAAA"); str.replace("color: #000080", "color: #AAAAFF"); str.replace("color:#005858", "color:#AAFFFF"); str.replace("color:#585800", "color:#FFFFAA"); str.replace("color:#580058", "color:#FFAAFF"); str.replace("color:#800000", "color:#FFAAAA"); str.replace("color:#000080", "color:#AAAAFF"); str.replace("color:#008000", "color:#BBFFBB"); str.replace("color:#668888", "color:#88AAAA"); str.replace("color:#888866", "color:#AAAA88"); str.replace("color:#886688", "color:#AA88AA"); str.replace("color:#666699", "color:#AA8888"); str.replace("color:#669966", "color:#99BB99"); str.replace("color: #666666", "color: #AAAAAA"); str.replace(prev_text_color.name(QColor::HexRgb), text_color.name(QColor::HexRgb)); str.replace(":/icons/actions", ":/icons/dark/actions"); } else { str.replace("color: #AAAAAA", "color: #585858"); str.replace("color: #AAAAFF", "color: #000080"); str.replace("color: #FFAAAA", "color: #800000"); str.replace("color:#AAFFFF", "color:#005858"); str.replace("color:#FFFFAA", "color:#585800"); str.replace("color:#FFAAFF", "color:#580058"); str.replace("color:#FFAAAA", "color:#800000"); str.replace("color:#AAAAFF", "color:#000080"); str.replace("color:#BBFFBB", "color:#008000"); str.replace("color:#88AAAA", "color:#668888"); str.replace("color:#AAAA88", "color:#888866"); str.replace("color:#AA88AA", "color:#886688"); str.replace("color:#AA8888", "color:#666699"); str.replace("color:#99BB99", "color:#669966"); str.replace("color: #AAAAAA", "color: #666666"); str.replace(prev_text_color.name(QColor::HexRgb), text_color.name(QColor::HexRgb)); str.replace(":/icons/dark/actions", ":/icons/actions"); } } void replace_colors(std::string &str) { if(settings->color == 2) { gsub("color:#005858", "color:#AAFFFF", str); gsub("color:#585800", "color:#FFFFAA", str); gsub("color:#580058", "color:#FFAAFF", str); gsub("color:#800000", "color:#FFAAAA", str); gsub("color:#000080", "color:#AAAAFF", str); gsub("color:#008000", "color:#BBFFBB", str); gsub(":/icons/actions", ":/icons/dark/actions", str); } else { gsub("color:#AAFFFF", "color:#005858", str); gsub("color:#FFFFAA", "color:#585800", str); gsub("color:#FFAAFF", "color:#580058", str); gsub("color:#FFAAAA", "color:#800000", str); gsub("color:#AAAAFF", "color:#000080", str); gsub("color:#BBFFBB", "color:#008000", str); gsub(":/icons/dark/actions", ":/icons/actions", str); } } std::string uncolorize(std::string str, bool remove_class) { size_t i = 0; while(true) { i = str.find(" style=\"color:#", i); if(i == std::string::npos) break; str.erase(i, 22); } if(remove_class) { gsub(" class=\"nous\"", "", str); gsub(" class=\"symbol\"", "", str); } i = 0; size_t i2 = 0, i1 = 0; int depth = 0; while(true) { i2 = str.find("", i); i = str.find(" 0) { depth--; if(depth == 0 && str[i1 + 5] == '>') { str.erase(i2, 7); str.erase(i1, 6); i = i1; } else { i = i2 + 7; } } else { i = i2 + 7; } } else if(i != std::string::npos) { if(depth == 0) i1 = i; i += 6; depth++; } else { break; } } return str; } std::string replace_parse_colors(std::string str) { if(settings->color == 2) { gsub("color:#AAFFFF", "color:#88AAAA", str); gsub("color:#FFFFAA", "color:#AAAA88", str); gsub("color:#FFAAFF", "color:#AA88AA", str); gsub("color:#FFAAAA", "color:#AA8888", str); gsub("color:#BBFFBB", "color:#99BB99", str); } else { gsub("color:#005858", "color:#668888", str); gsub("color:#585800", "color:#888866", str); gsub("color:#580058", "color:#886688", str); gsub("color:#000080", "color:#666699", str); gsub("color:#008000", "color:#669966", str); } return str; } void replace_one(QString &str, const QString &origstr, const QString &newstr, bool b_last = false) { int index = (b_last ? str.lastIndexOf(origstr) : str.indexOf(origstr)); if(index > 0) { str.replace(index, origstr.length(), newstr); } } void HistoryView::loadInitial(bool reload) { if(reload && !initial_loaded) return; s_text.clear(); i_pos = 0; i_pos_p = 0; previous_html.clear(); last_ans = 0; last_ref = ""; i_pos2 = 0; i_pos_p2 = 0; previous_html2.clear(); last_ans2 = 0; last_ref2 = ""; previous_temporary = false; previous_cursor = 0; previous_cursor2 = 0; for(size_t i = 0; i < settings->v_expression.size() && !reload;) { if(i > 0 && !settings->v_protected[i] && settings->v_expression[i] == settings->v_expression[i - 1] && settings->v_parse[i] == settings->v_parse[i - 1] && settings->v_result[i] == settings->v_result[i - 1] && settings->v_pexact[i] == settings->v_pexact[i] && settings->v_exact[i] == settings->v_exact[i - 1] && settings->v_value[i] == settings->v_value[i - 1] && settings->v_parse[i].find("rand") == std::string::npos && settings->v_expression[i].find("rand") == std::string::npos) { settings->v_expression.erase(settings->v_expression.begin() + i); settings->v_parse.erase(settings->v_parse.begin() + i); settings->v_result.erase(settings->v_result.begin() + i); settings->v_protected.erase(settings->v_protected.begin() + i); settings->v_time.erase(settings->v_time.begin() + i); settings->v_exact.erase(settings->v_exact.begin() + i); settings->v_pexact.erase(settings->v_pexact.begin() + i); settings->v_value.erase(settings->v_value.begin() + i); settings->v_messages.erase(settings->v_messages.begin() + i); settings->v_parseerror.erase(settings->v_parseerror.begin() + i); } else { i++; } } if(settings->v_expression.empty()) { if(!settings->clear_history_on_exit && !reload) { setHtml("" + tr("Type a mathematical expression above, e.g. \"5 + 2 / 3\", and press the enter key.") + ""); } else { setHtml(""); } } else { size_t i = 0; for(; i < settings->v_expression.size() - 1; i++) { if(!settings->v_messages[i].isEmpty()) replaceColors(settings->v_messages[i]); addResult(settings->v_result[i], settings->v_expression[i], settings->v_pexact[i], settings->v_parse[i], true, false, QString(), NULL, 1, i); } if((settings->color == 2 && (s_text.contains("color:#00") || s_text.contains("color:#58"))) || (settings->color != 2 && (s_text.contains("color:#FF") || s_text.contains("color:#AA")))) { replaceColors(s_text); for(size_t i = 0; i < settings->v_expression.size(); i++) { replace_colors(settings->v_parse[i]); for(size_t i2 = 0; i2 < settings->v_result[i].size(); i2++) { replace_colors(settings->v_result[i][i2]); } } } setHtml("" + s_text + ""); if(!settings->v_messages[i].isEmpty()) { replaceColors(settings->v_messages[i]); if(!reload || settings->history_answer.empty() || !settings->current_result) { settings->current_result = NULL; settings->v_messages[i].replace("font-size:normal", "font-size:small "); settings->v_messages[i].replace("width=\"2\"", "width=\"1\""); } } addResult(settings->v_result[i], settings->v_expression[i], settings->v_pexact[i], settings->v_parse[i], true, false, QString(), NULL, reload && !settings->history_answer.empty() && settings->current_result ? 2 : 1, i); } initial_loaded = true; QFontMetrics fm(font()); prev_fonti = fm.boundingRect("Öy"); } #define PASTE_H QFontMetrics fm(font()); \ int paste_h = fm.ascent() * 0.75; \ if(paste_h < 12) paste_h = 12; void HistoryView::clearTemporary() { if(!previous_temporary || previous_html.isEmpty()) return; QTextCursor cur = textCursor(); cur.setPosition(previous_cursor); cur.setPosition(0, QTextCursor::KeepAnchor); setTextCursor(cur); cur.deleteChar(); if(!previous_html2.isEmpty()) { cur.setPosition(previous_cursor2); cur.setPosition(0, QTextCursor::KeepAnchor); setTextCursor(cur); cur.deleteChar(); insertHtml("" + previous_html2 + "
"); previous_html = previous_html2; previous_cursor = textCursor().position(); } else { previous_html.clear(); previous_cursor = 0; } previous_temporary = false; i_pos = i_pos2; i_pos_p = i_pos_p2; last_ans = last_ans2; last_ref = last_ref2; previous_cursor2 = 0; i_pos2 = 0; i_pos_p2 = 0; previous_html2.clear(); last_ans2 = 0; last_ref2 = ""; } bool HistoryView::testTemporaryResultLength(const std::string &str) { QFontMetrics fm(font()); return fm.boundingRect(QStringLiteral("#9999") + "= " + unhtmlize(QString::fromStdString(str))).width() < width() * 1.65; } int HistoryView::maxTemporaryCharacters() { QFontMetrics fm(font()); return (width() * 1.65 / fm.averageCharWidth()) - 7; } void HistoryView::addResult(std::vector values, std::string expression, bool pexact, std::string parse, int exact, bool dual_approx, const QString &image, bool *implicit_warning, int initial_load, size_t index, bool temporary, const std::string &tmp_value) { if(temporary && !previous_temporary) { previous_cursor2 = previous_cursor; } if(!temporary && previous_temporary && expression.empty() && parse.empty()) { clearTemporary(); } QString serror; bool b_parse_error = (initial_load && !expression.empty() && settings->v_parseerror[index] && !settings->v_messages[index].isEmpty()); if(!initial_load && CALCULATOR->message()) { do { if(CALCULATOR->message()->category() == MESSAGE_CATEGORY_IMPLICIT_MULTIPLICATION && (settings->implicit_question_asked || implicit_warning)) { if(!settings->implicit_question_asked) *implicit_warning = true; } else { QString mstr = QString::fromStdString(CALCULATOR->message()->message()); if(settings->printops.use_unicode_signs) { mstr.replace(">=", SIGN_GREATER_OR_EQUAL); mstr.replace("<=", SIGN_LESS_OR_EQUAL); mstr.replace("!=", SIGN_NOT_EQUAL); mstr.replace("\n", "
"); } MessageType mtype = CALCULATOR->message()->type(); if(temporary) { if(mtype == MESSAGE_ERROR || mtype == MESSAGE_WARNING) { if(!serror.isEmpty()) { if(!serror.startsWith("• ")) serror = "• " + serror; serror += "\n• "; } serror += mstr; } } else { if(mtype == MESSAGE_ERROR || mtype == MESSAGE_WARNING) { serror += "color == 2) serror += "#FFAAAA"; else serror += "#800000"; } else { if(settings->color == 2) serror += "#AAAAFF"; else serror += "#000080"; } serror += ""; if(CALCULATOR->message()->stage() == MESSAGE_STAGE_PARSING) b_parse_error = true; serror += "\">"; if(!mstr.startsWith("-")) serror += "- "; serror += mstr.toHtmlEscaped(); serror += ""; } else { values.insert(values.begin(), std::string("#") + mstr.toStdString()); } } } } while(CALCULATOR->nextMessage()); if(serror.isEmpty() && values.empty() && expression.empty() && parse.empty()) return; } PASTE_H QString str; bool comment = false; if(!expression.empty() || !parse.empty()) { comment = !temporary && expression.empty() && parse == "#"; if(initial_load && index != settings->v_expression.size() - 1) str += QStringLiteral(""; if(temporary) { parse_tmp = parse; result_tmp = tmp_value; } else if(!initial_load) { settings->v_expression.push_back(expression); settings->v_parse.push_back(parse); settings->v_pexact.push_back(pexact); settings->v_protected.push_back(false); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) settings->v_time.push_back(QDateTime::currentSecsSinceEpoch()); #else settings->v_time.push_back(QDateTime::currentMSecsSinceEpoch() / 1000); #endif settings->v_messages.push_back(serror); settings->v_parseerror.push_back(b_parse_error); settings->v_result.push_back(values); settings->v_exact.push_back(std::vector()); settings->v_value.push_back(std::vector()); size_t n = 0; for(size_t i = 0; i < values.size(); i++) { settings->v_exact[settings->v_exact.size() - 1].push_back(exact || i < values.size() - 1); settings->v_value[settings->v_value.size() - 1].push_back(dual_approx && n == 0 ? settings->history_answer.size() - 1 : settings->history_answer.size()); if(values[i].empty() || values[i][0] != '#') n++; } } gsub("", "", parse); if(!comment && !temporary && !expression.empty() && (settings->history_expression_type > 0 || parse.empty())) { if(!parse.empty() && settings->history_expression_type > 1 && parse != expression) { str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); str += QString::fromStdString(expression).toHtmlEscaped(); str += ""; if(settings->color == 2) str += "  "; else str += "  "; str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); if(pexact) str += "= "; else str += SIGN_ALMOST_EQUAL " "; if(!settings->colorize_result) str += QString::fromStdString(uncolorize(parse, false)); else str += QString::fromStdString(replace_parse_colors(parse)); str += ""; str += ""; } else { str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); str += QString::fromStdString(expression).toHtmlEscaped(); str += ""; } } else if(!comment) { if(temporary) str += ""; else str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); if(!pexact) str += SIGN_ALMOST_EQUAL " "; if(!settings->colorize_result) str += QString::fromStdString(uncolorize(parse, false)); else str += QString::fromStdString(parse); str += ""; if(!temporary && b_parse_error && !expression.empty()) { str += "    "; if(settings->color == 2) str += ""; else str += ""; str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); str += QString::fromStdString(replace_parse_colors(expression)); str += ""; str += ""; } } if(initial_load && settings->v_protected[index]) { if(has_lock_symbol < 0) { QFontDatabase database; if(database.families(QFontDatabase::Symbol).contains("Noto Color Emoji")) has_lock_symbol = 1; else has_lock_symbol = 0; } if(has_lock_symbol) str += " 🔒"; else str += " [P]"; } if(temporary) { temporary_error = serror; if(!serror.isEmpty()) str += QStringLiteral("\"temporary_error\"/").arg(":/icons/actions/scalable/warning.svg").arg(fm.ascent()); } str += ""; } else if(!initial_load && !settings->v_result.empty()) { for(size_t i = values.size(); i > 0; i--) { settings->v_result[settings->v_result.size() - 1].insert(settings->v_result[settings->v_result.size() - 1].begin(), values[i - 1]); settings->v_exact[settings->v_exact.size() - 1].insert(settings->v_exact[settings->v_exact.size() - 1].begin(), exact || i < values.size()); settings->v_value[settings->v_value.size() - 1].insert(settings->v_value[settings->v_value.size() - 1].begin(), dual_approx && i == 1 ? settings->history_answer.size() - 1 : settings->history_answer.size()); } if(!serror.isEmpty()) { settings->v_messages[settings->v_messages.size() - 1] += serror; } } if(!temporary) str += serror; if(initial_load) str += settings->v_messages[index]; str.replace("", ""); if((!expression.empty() || !parse.empty()) && !temporary) { i_pos = str.length(); if(initial_load != 1) i_pos_p = i_pos; } size_t i_answer_pre = 0; if(temporary && values.empty()) { values.push_back(""); } size_t n = 0; for(size_t i = 0; i < values.size(); i++) { size_t i_answer = 0; if(initial_load) i_answer = settings->v_value[index][i]; else if(!temporary) i_answer = dual_approx && n == 0 ? settings->history_answer.size() - 1 : settings->history_answer.size(); if(!values[i].empty() && values[i][0] == '#') { str += " 1 && n > 0))) str += "; font-size:small"; else if(!comment) str += "; font-size:normal"; if((!expression.empty() || !parse.empty()) && i == values.size() - 1) str += QStringLiteral("; padding-bottom: %1 px").arg(paste_h / 4); str += "\">"; if(i_answer == 0) str += QStringLiteral("").arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); else str += QStringLiteral("").arg(i_answer).arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); if(values[i].size() == 1 || values[i][1] != '-') str += "- "; str += QString::fromStdString(values[i]).mid(1); str += ""; continue; } QFontMetrics fm(font()); int w_number = fm.boundingRect("#9999").width(); int w = 0; str += ""; if(initial_load != 1) { w = fm.boundingRect("= " + unhtmlize(QString::fromStdString(values[i]))).width(); } if(i_answer != 0 && i_answer != i_answer_pre) { if(!initial_load && expression.empty() && parse.empty() && last_ans == i_answer && !last_ref.isEmpty()) { previous_html.remove(last_ref); } QString sref; if(settings->color == 2) { sref = QStringLiteral("#%1").arg(i_answer).arg(initial_load ? (int) index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); } else { sref = QStringLiteral("#%1").arg(i_answer).arg(initial_load ? (int) index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); } bool b = true; if(initial_load) { for(size_t i2 = 0; i2 < i; i2++) { if(settings->v_value[index][i2] == i_answer && (values[i2].empty() || values[i2][0] != '#')) { b = false; } } } if(b) str += sref; if((initial_load > 1 && n == 0) || (!initial_load && (!dual_approx || i == values.size() - 1))) { last_ans = i_answer; last_ref = sref; } } str += " 1 && n > 0 && i_answer <= i_answer_pre) || w * 1.5 + w_number > width() || !settings->format_result) { gsub("", "", values[i]); } else if(w * 1.85 + w_number > width()) { str += "; font-size:large"; if(temporary) {str += "; line-height:"; str += QString::number((int) fm.lineSpacing() * 1.5); str += "px";} gsub("", "", values[i]); } else { str += "; font-size:x-large"; gsub("", "", values[i]); } if((!expression.empty() || !parse.empty()) && i == values.size() - 1) str += QStringLiteral("; padding-bottom: %1 px").arg(paste_h / 4); str += "\">"; int b_exact = 1; if(initial_load) { b_exact = settings->v_exact[index][i]; } else { if(exact < 0) b_exact = -1; else if(exact == 0 && i == values.size() - 1) b_exact = 0; } if(temporary && !values[i].empty()) { str += ""; } else if(!temporary) { if(i_answer == 0) str += QStringLiteral("").arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); else str += QStringLiteral("").arg(i_answer).arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); } if(!temporary || !values[i].empty()) { if(b_exact > 0) str += "= "; else if(b_exact == 0) str += SIGN_ALMOST_EQUAL " "; } if(!settings->colorize_result) str += QString::fromStdString(uncolorize(values[i], false)); else str += QString::fromStdString(values[i]); if(!image.isEmpty() && i == values.size() - 1 && w * 1.85 + w_number + fm.ascent() <= width()) { str += QStringLiteral("setExchangeRatesUsed(-100); int i = CALCULATOR->exchangeRatesUsed(); CALCULATOR->setExchangeRatesUsed(-100); if(i > 0) { QString sources_str; int n = 0; if(i & 0b0001) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(1)); n++;} if(i & 0b0010) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(2)); n++;} if(i & 0b0100) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(3)); n++;} if(i & 0b1000) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(4)); n++;} if(n > 0) { str += " alt=\""; str += tr("Exchange rate source(s):", "", n); str += sources_str; str += "\\n("; str += tr("updated %1", "", n).arg(QString::fromStdString(QalculateDateTime(CALCULATOR->getExchangeRatesTime(CALCULATOR->exchangeRatesUsed())).toISOString())); str += ")"; str += "\""; } } str += "/>"; } if(!temporary || !values[i].empty()) str += ""; str += ""; i_answer_pre = i_answer; n++; } str.replace("\n", "
"); int i = 0; if(!previous_temporary && (!expression.empty() || !parse.empty())) { previous_html2 = previous_html; i_pos2 = i_pos; i_pos_p2 = i_pos_p; last_ans2 = last_ans; last_ref2 = last_ref; } if(!initial_load) { if(settings->format_result && n > 0) { previous_html.replace("font-size:normal", "font-size:small "); previous_html.replace("width=\"2\"", "width=\"1\""); } while(true) { i = previous_html.indexOf("", i); previous_html.remove(i, i2 - i + 1); if(i < i_pos_p && expression.empty() && parse.empty()) i_pos_p -= (i2 - i + 1); } QTextCursor cur = textCursor(); cur.setPosition(previous_cursor); cur.setPosition(0, QTextCursor::KeepAnchor); setTextCursor(cur); cur.deleteChar(); } if(expression.empty() && parse.empty()) { if(!initial_load && settings->format_result && n > 0) { i = 0; while(true) { i = previous_html.indexOf("; font-size:x-large", i); if(i < 0) break; previous_html.remove(i, 19); if(i < i_pos_p) i_pos_p -= 19; } i = 0; while(true) { i = previous_html.indexOf("; font-size:large", i); if(i < 0) break; previous_html.remove(i, 17); if(i < i_pos_p) i_pos_p -= 17; } i = 0; } if(initial_load) { s_text.insert(i_pos, str); } else { QTextCursor cur = textCursor(); cur.setPosition(0); setTextCursor(cur); previous_html.insert(i_pos_p, str); insertHtml("" + previous_html + "
"); previous_cursor = textCursor().position(); previous_html2 = previous_html; i_pos2 = i_pos; i_pos_p2 = i_pos_p; last_ans2 = last_ans; last_ref2 = last_ref; } } else { if(initial_load) { if(index == settings->v_expression.size() - 1) { QTextCursor cur = textCursor(); cur.setPosition(0); setTextCursor(cur); insertHtml("" + str + "
"); previous_html = str; previous_cursor = textCursor().position(); } else { s_text.insert(0, "" + str + "
"); } } else { if(previous_html.isEmpty()) { setHtml(""); } else if(!previous_temporary) { if(settings->format_result) { previous_html.remove("; font-size:x-large"); previous_html.remove("; font-size:large"); } replace_one(previous_html, "border-top: 0px none", "border-top: 1px dashed"); replace_one(previous_html, "padding-top: 0px", "padding-top: " + QString::number(paste_h / 2) + "px"); insertHtml("" + previous_html + "
"); } QTextCursor cur = textCursor(); cur.setPosition(0); setTextCursor(cur); insertHtml("" + str + "
"); previous_html = str; previous_cursor = textCursor().position(); } } previous_temporary = temporary; } void HistoryView::changeEvent(QEvent *e) { if(e->type() == QEvent::PaletteChange || e->type() == QEvent::ApplicationPaletteChange) { text_color = palette().text().color(); setTextColor(text_color); for(size_t i = 0; i < settings->v_expression.size(); i++) { replace_colors(settings->v_parse[i]); for(size_t i2 = 0; i2 < settings->v_result[i].size(); i2++) { replace_colors(settings->v_result[i][i2]); } } reloadHistory(); } else if(e->type() == QEvent::FontChange) { QFontMetrics fm(font()); if(fm.boundingRect("Öy") != prev_fonti) { reloadHistory(); } updateMinimumHeight(); } QTextEdit::changeEvent(e); } void HistoryView::addMessages() { std::vector values; addResult(values, "", true, "", true); } void HistoryView::mouseMoveEvent(QMouseEvent *e) { QString str = anchorAt(e->pos()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) bool b_tooltip = false; if(str.isEmpty() && (document()->documentLayout()->imageAt(e->pos()).indexOf(":/icons") == 0 || (e->pos().x() > width() - 150 && document()->documentLayout()->imageAt(e->pos()).indexOf(":/data/flags") == 0))) { QPoint p(viewport()->mapFromParent(e->pos())); for(int n = 0; n < 5; n++) { QTextCursor cur = cursorForPosition(p); cur.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); QString str = cur.selection().toHtml(); int i = str.lastIndexOf(" alt=\""); if(i >= 0) { i += 6; int i2 = str.indexOf("\"", i + 1); if(i2 > i) { str = str.mid(i, i2 - i); if(str == "temporary_error") str = temporary_error; else str.replace("\\n", "\n"); QToolTip::showText(mapToGlobal(e->pos()), str); b_tooltip = true; } break; } p.rx() += QFontMetrics(font()).ascent() / 2; } } if(!b_tooltip) QToolTip::hideText(); #endif if(str.isEmpty()) viewport()->setCursor(Qt::IBeamCursor); else viewport()->setCursor(Qt::PointingHandCursor); QTextEdit::mouseMoveEvent(e); } void HistoryView::mouseDoubleClickEvent(QMouseEvent *e) { QString str = anchorAt(e->pos()); if(str.isEmpty() && e->button() == Qt::LeftButton) { int i1 = -1, i2 = -1; indexAtPos(e->pos(), &i1, &i2, NULL, &str); if(i1 >= 0 && str.length() > 0) { if(str[0] == 'c') { editComment(i1, i2); } else if(str[0] == 'p') { int index = str.indexOf(":"); if(index < 0) return; str = str.mid(index + 1); index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && i1 < (int) settings->v_result.size() && i2 < (int) settings->v_result[i1].size()) { emit insertTextRequested(settings->v_result[i1][settings->v_result[i1].size() - i2 - 1]); } } } else if(str[0] == '#') { int index = str.indexOf(":"); if(index < 0) emit insertValueRequested(str.mid(1).toInt()); else emit insertValueRequested(str.mid(1, index - 1).toInt()); } else if(str[0] == 'e' || str[0] == 'a') { int i = str.mid(1).toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && (size_t) i1 < settings->v_result.size() && i2 >= 0 && (size_t) i2 < settings->v_result[i1].size()) { if(!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') editComment(i1, i2); else emit insertTextRequested(settings->v_result[i1][i2]); } } } } } else { QTextEdit::mouseDoubleClickEvent(e); } } void HistoryView::mouseReleaseEvent(QMouseEvent *e) { QString str = anchorAt(e->pos()); if(!str.isEmpty() && e->button() == Qt::LeftButton) { if(str.startsWith("https://")) QDesktopServices::openUrl(QUrl(str)); if(str[0] == 'p') { int index = str.indexOf(":"); if(index < 0) return; str = str.mid(index + 1); index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && i1 < (int) settings->v_result.size() && i2 < (int) settings->v_result[i1].size()) { emit insertTextRequested(settings->v_result[i1][settings->v_result[i1].size() - i2 - 1]); } } } else if(str[0] == '#') { int index = str.indexOf(":"); if(index < 0) emit insertValueRequested(str.mid(1).toInt()); else emit insertValueRequested(str.mid(1, index - 1).toInt()); } else { int index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && (size_t) i1 < settings->v_result.size() && i2 >= 0 && (size_t) i2 < settings->v_result[i1].size()) emit insertTextRequested(settings->v_result[i1][i2]); } } } else { QTextEdit::mouseReleaseEvent(e); } } void HistoryView::keyPressEvent(QKeyEvent *e) { if(e->matches(QKeySequence::Copy)) { editCopy(); return; } QTextEdit::keyPressEvent(e); if(!e->isAccepted() && (e->key() != Qt::Key_Control && e->key() != Qt::Key_Meta && e->key() != Qt::Key_Alt)) { expressionEdit->setFocus(); expressionEdit->keyPressEvent(e); } } void HistoryView::inputMethodEvent(QInputMethodEvent *e) { QTextEdit::inputMethodEvent(e); if(!e->isAccepted() && !e->commitString().isEmpty()) { expressionEdit->setFocus(); expressionEdit->inputMethodEvent(e); } } void HistoryView::editClear() { for(size_t i1 = 0; i1 < settings->v_protected.size();) { if(!settings->v_protected[i1]) { if(i1 == settings->v_protected.size() - 1) settings->current_result = NULL; settings->v_expression.erase(settings->v_expression.begin() + i1); settings->v_parse.erase(settings->v_parse.begin() + i1); settings->v_result.erase(settings->v_result.begin() + i1); settings->v_protected.erase(settings->v_protected.begin() + i1); settings->v_time.erase(settings->v_time.begin() + i1); settings->v_exact.erase(settings->v_exact.begin() + i1); settings->v_pexact.erase(settings->v_pexact.begin() + i1); settings->v_value.erase(settings->v_value.begin() + i1); settings->v_messages.erase(settings->v_messages.begin() + i1); settings->v_parseerror.erase(settings->v_parseerror.begin() + i1); } else { i1++; } } verticalScrollBar()->setValue(0); reloadHistory(); } void HistoryView::editMoveToTop() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_expression.size()) return; settings->current_result = NULL; settings->v_expression.push_back(settings->v_expression[i1]); settings->v_parse.push_back(settings->v_parse[i1]); settings->v_pexact.push_back(settings->v_pexact[i1]); settings->v_protected.push_back(settings->v_protected[i1]); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) settings->v_time.push_back(QDateTime::currentSecsSinceEpoch()); #else settings->v_time.push_back(QDateTime::currentMSecsSinceEpoch() / 1000); #endif settings->v_result.push_back(settings->v_result[i1]); settings->v_exact.push_back(settings->v_exact[i1]); settings->v_value.push_back(settings->v_value[i1]); settings->v_messages.push_back(settings->v_messages[i1]); settings->v_parseerror.push_back(settings->v_parseerror[i1]); settings->v_expression.erase(settings->v_expression.begin() + i1); settings->v_parse.erase(settings->v_parse.begin() + i1); settings->v_result.erase(settings->v_result.begin() + i1); settings->v_protected.erase(settings->v_protected.begin() + i1); settings->v_time.erase(settings->v_time.begin() + i1); settings->v_exact.erase(settings->v_exact.begin() + i1); settings->v_pexact.erase(settings->v_pexact.begin() + i1); settings->v_value.erase(settings->v_value.begin() + i1); settings->v_messages.erase(settings->v_messages.begin() + i1); settings->v_parseerror.erase(settings->v_parseerror.begin() + i1); verticalScrollBar()->setValue(0); reloadHistory(); } void HistoryView::reloadHistory() { int vpos = verticalScrollBar()->value(); loadInitial(true); emit historyReloaded(); verticalScrollBar()->setValue(vpos); } void HistoryView::editRemove() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_expression.size()) return; if(i2 >= 0 && i2 < (int) settings->v_result[i1].size()) { bool remove_expression = true; for(size_t i = 0; i < settings->v_result[i1].size(); i++) { if(i != (size_t) i2 && (settings->v_result[i1][i].empty() || settings->v_result[i1][i][0] != '#')) { remove_expression = false; break; } } if(remove_expression) { i2 = -1; } else { settings->v_result[i1].erase(settings->v_result[i1].begin() + i2); settings->v_exact[i1].erase(settings->v_exact[i1].begin() + i2); settings->v_value[i1].erase(settings->v_value[i1].begin() + i2); } } if(i2 < 0) { if((size_t) i1 == settings->v_expression.size() - 1) settings->current_result = NULL; settings->v_expression.erase(settings->v_expression.begin() + i1); settings->v_parse.erase(settings->v_parse.begin() + i1); settings->v_result.erase(settings->v_result.begin() + i1); settings->v_protected.erase(settings->v_protected.begin() + i1); settings->v_time.erase(settings->v_time.begin() + i1); settings->v_exact.erase(settings->v_exact.begin() + i1); settings->v_pexact.erase(settings->v_pexact.begin() + i1); settings->v_value.erase(settings->v_value.begin() + i1); settings->v_messages.erase(settings->v_messages.begin() + i1); settings->v_parseerror.erase(settings->v_parseerror.begin() + i1); } int vpos = verticalScrollBar()->value(); reloadHistory(); verticalScrollBar()->setValue(vpos); } void HistoryView::editComment(int i1, int i2) { bool b_edit = !settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#'; if(i2 > 0 && !settings->v_result[i1][i2 - 1].empty() && settings->v_result[i1][i2 - 1][0] == '#') { i2--; b_edit = true; } QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Comment")); QGridLayout *grid = new QGridLayout(); QPlainTextEdit *commentEdit = new QPlainTextEdit(this); if(b_edit) { QString str = QString::fromStdString(unhtmlize(settings->v_result[i1][i2].substr(1))); commentEdit->setPlainText(str); commentEdit->selectAll(); } commentEdit->setFocus(); grid->addWidget(commentEdit, 0, 0); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted && (b_edit || !commentEdit->toPlainText().trimmed().isEmpty())) { if(b_edit && commentEdit->toPlainText().trimmed().isEmpty()) { editRemove(); } else { QString str = "#" + commentEdit->toPlainText().trimmed().toHtmlEscaped(); str.replace("\n", "
"); if(b_edit) { if(settings->v_result[i1][i2] != str.toStdString()) { settings->v_result[i1][i2] = str.toStdString(); int vpos = verticalScrollBar()->value(); reloadHistory(); verticalScrollBar()->setValue(vpos); } } else if(!settings->history_answer.empty() && i1 == (int) settings->v_result.size() - 1 && i2 == 0) { std::vector values; values.push_back(str.toStdString()); addResult(values, "", true, "", settings->v_exact[i1][i2]); } else { settings->v_result[i1].insert(settings->v_result[i1].begin() + i2, str.toStdString()); settings->v_exact[i1].insert(settings->v_exact[i1].begin() + i2, settings->v_exact[i1][i2]); settings->v_value[i1].insert(settings->v_value[i1].begin() + i2, settings->v_value[i1][i2]); int vpos = verticalScrollBar()->value(); reloadHistory(); verticalScrollBar()->setValue(vpos); } } } dialog->deleteLater(); } void HistoryView::editComment() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_expression.size()) return; if(i2 < 0 || i2 >= (int) settings->v_result[i1].size()) i2 = 0; editComment(i1, i2); } void HistoryView::editProtect() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_protected.size()) return; settings->v_protected[i1] = protectAction->isChecked(); if(i1 == 0) settings->current_result = NULL; int vpos = verticalScrollBar()->value(); reloadHistory(); verticalScrollBar()->setValue(vpos); } void HistoryView::indexAtPos(const QPoint &pos, int *expression_index, int *result_index, int *value_index, QString *anchorstr) { *expression_index = -1; *result_index = -1; if(value_index) *value_index = -1; QString sref = anchorAt(pos); if(sref.isEmpty()) { QTextCursor cur = cursorForPosition(viewport()->mapFromParent(pos)); cur.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); QString str = cur.selection().toHtml(); int i = str.lastIndexOf("= 0) { i += 9; int i2 = str.indexOf("\"", i); if(i2 >= 0) sref = str.mid(i, i2 - i); } } if(sref.isEmpty()) { QTextCursor cur = cursorForPosition(viewport()->mapFromParent(pos)); cur.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); cur.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); QString str = cur.selection().toHtml(); int i = str.lastIndexOf("= 0) { i += 9; int i2 = str.indexOf("\"", i); if(i2 >= 0) sref = str.mid(i, i2 - i); } } if(anchorstr) *anchorstr = sref; if(sref.isEmpty() || sref == "TR" || sref == "TP") return; int i = sref.indexOf(":"); if(sref[0] == '#' || sref[0] == 'p' || sref[0] == 'c') { if(i < 0) return; int i2 = sref.indexOf(":", i + 1); if(i2 >= 0) { *expression_index = sref.mid(i + 1, i2 - (i + 1)).toInt(); *result_index = sref.mid(i2 + 1).toInt(); if(*expression_index >= 0 && *expression_index < (int) settings->v_result.size() && *result_index < (int) settings->v_result[*expression_index].size()) { *result_index = settings->v_result[*expression_index].size() - *result_index - 1; } if(value_index) *value_index = sref.mid(1, i - 1).toInt(); } else { *expression_index = sref.mid(i + 1).toInt(); } } else if(sref[0] == 'a' || sref[0] == 'e') { *expression_index = sref.mid(1).toInt(); } else if(i >= 0) { *expression_index = sref.left(i).toInt(); *result_index = sref.mid(i + 1).toInt(); } else { *expression_index = sref.toInt(); } } void HistoryView::updateMinimumHeight() { QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) setMinimumHeight(fm.lineSpacing() * 4.4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else setMinimumHeight(fm.lineSpacing() * 4.4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif } void HistoryView::contextMenuEvent(QContextMenuEvent *e) { if(!cmenu) { cmenu = new QMenu(this); insertValueAction = cmenu->addAction(tr("Insert Value"), this, SLOT(editInsertValue())); insertTextAction = cmenu->addAction(tr("Insert Text"), this, SLOT(editInsertText())); copyAction = new QAction(tr("Copy"), this); connect(copyAction, SIGNAL(triggered()), this, SLOT(editCopy())); copyAction->setShortcut(QKeySequence::Copy); copyAction->setShortcutContext(Qt::WidgetShortcut); copyFormattedAction = cmenu->addAction(tr("Copy"), this, SLOT(editCopyFormatted())); copyAsciiAction = cmenu->addAction(tr("Copy unformatted ASCII"), this, SLOT(editCopyAscii())); selectAllAction = cmenu->addAction(tr("Select All"), this, SLOT(selectAll())); selectAllAction->setShortcut(QKeySequence::SelectAll); selectAllAction->setShortcutContext(Qt::WidgetShortcut); cmenu->addAction(findAction); cmenu->addAction(findDateAction); cmenu->addSeparator(); protectAction = cmenu->addAction(tr("Protect"), this, SLOT(editProtect())); protectAction->setCheckable(true); commentAction = cmenu->addAction(tr("Add Comment…"), this, SLOT(editComment())); movetotopAction = cmenu->addAction(tr("Move to Top"), this, SLOT(editMoveToTop())); cmenu->addSeparator(); delAction = cmenu->addAction(tr("Remove"), this, SLOT(editRemove())); clearAction = cmenu->addAction(tr("Clear"), this, SLOT(editClear())); if(fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } int i1 = -1, i2 = -1, i3 = -1; QString astr; context_pos = e->pos(); indexAtPos(context_pos, &i1, &i2, &i3, &astr); bool b_tmp = (i1 < 0 && (astr == "TR" || astr == "TP")); selectAllAction->setEnabled(!document()->isEmpty()); protectAction->setChecked(i1 >= 0 && i1 < (int) settings->v_protected.size() && settings->v_protected[i1]); if((i1 >= 0 || b_tmp) && e->reason() == QContextMenuEvent::Mouse && !textCursor().hasSelection()) { if(i2 < 0) i2 = 0; bool b_edit = (!astr.isEmpty() && astr[0] == 'c') || (!b_tmp && i2 < (int) settings->v_result[i1].size() && ((!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') || (i2 > 0 && !settings->v_result[i1][i2 - 1].empty() && settings->v_result[i1][i2 - 1][0] == '#'))); insertValueAction->setEnabled(i3 >= 0 && !b_edit); insertTextAction->setEnabled(true); copyAction->setEnabled(true); copyFormattedAction->setEnabled(true); copyAsciiAction->setEnabled(true); delAction->setEnabled(i1 >= 0); protectAction->setEnabled(i1 >= 0); movetotopAction->setEnabled(i1 >= 0 && !settings->v_expression.empty()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) if(i1 >= 0 && !settings->v_time.empty() && settings->v_time[i1] != 0) findDateAction->setText(tr("Search by Date…") + " (" + QDateTime::fromSecsSinceEpoch(settings->v_time[i1]).date().toString(Qt::ISODate) + ")"); #else if(i1 >= 0 && !settings->v_time.empty() && settings->v_time[i1] != 0) findDateAction->setText(tr("Search by Date…") + " (" + QDateTime::fromMSecsSinceEpoch(settings->v_time[i1] * 1000).date().toString(Qt::ISODate) + ")"); #endif else findDateAction->setText(tr("Search by Date…")); commentAction->setEnabled(i1 >= 0); if(b_edit) commentAction->setText(tr("Edit Comment…")); else commentAction->setText(tr("Add Comment…")); } else { copyAction->setEnabled(textCursor().hasSelection()); copyFormattedAction->setEnabled(textCursor().hasSelection()); copyAsciiAction->setEnabled(textCursor().hasSelection()); delAction->setEnabled(false); protectAction->setEnabled(false); movetotopAction->setEnabled(false); insertValueAction->setEnabled(false); insertTextAction->setEnabled(false); findDateAction->setText(tr("Search by Date…")); commentAction->setEnabled(false); commentAction->setText(tr("Add Comment…")); } findAction->setEnabled(!settings->v_expression.empty()); findDateAction->setEnabled(!settings->v_expression.empty()); clearAction->setEnabled(!settings->v_expression.empty()); cmenu->popup(e->globalPos()); } void HistoryView::setMenuAndToolbarItems(QMenu *mode, QMenu *menu, QAction *action) { if(!menu && cmenu && fileMenu) { cmenu->removeAction(fileSeparator); cmenu->removeAction(modeMenu->menuAction()); cmenu->removeAction(fileMenu->menuAction()); cmenu->removeAction(tbAction); } modeMenu = mode; fileMenu = menu; tbAction = action; if(cmenu && fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } void HistoryView::doFind() { if(!find(searchEdit->text())) { QTextCursor c = textCursor(); QTextCursor cbak = c; c.movePosition(QTextCursor::Start); setTextCursor(c); if(!find(searchEdit->text())) { setTextCursor(cbak); } } } void HistoryView::editFind() { if(searchDialog) { searchDialog->setWindowState((searchDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); searchDialog->show(); qApp->processEvents(); searchDialog->raise(); searchDialog->activateWindow(); searchEdit->clear(); searchEdit->setFocus(); return; } searchDialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(searchDialog); if(settings->always_on_top) searchDialog->setWindowFlags(searchDialog->windowFlags() | Qt::WindowStaysOnTopHint); searchDialog->setWindowTitle(tr("Search")); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Text:"), this), 0, 0); searchEdit = new QLineEdit(this); searchEdit->setFocus(); grid->addWidget(searchEdit, 0, 1); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, searchDialog); connect(buttonBox->addButton(tr("Search"), QDialogButtonBox::AcceptRole), SIGNAL(clicked()), this, SLOT(doFind())); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), searchDialog, SLOT(reject())); box->addWidget(buttonBox); searchDialog->show(); } void HistoryView::editFindDate() { QDialog *dialog = new QDialog(this, Qt::Popup); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); QVBoxLayout *box = new QVBoxLayout(dialog); box->setContentsMargins(0, 0, 0, 0); QCalendarWidget *w = new QCalendarWidget(dialog); if(!settings->v_time.empty() && settings->v_time[settings->v_time.size() - 1] > 0) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) w->setMaximumDate(QDateTime::fromSecsSinceEpoch(settings->v_time[settings->v_time.size() - 1]).date()); #else w->setMaximumDate(QDateTime::fromMSecsSinceEpoch(settings->v_time[settings->v_time.size() - 1] * 1000).date()); #endif for(size_t i = settings->v_time.size() - 1; ; i--) { if(i == 0 || settings->v_time[i] == 0) { if(settings->v_time[i] == 0) i++; #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) w->setMinimumDate(QDateTime::fromSecsSinceEpoch(settings->v_time[i]).date()); #else w->setMinimumDate(QDateTime::fromMSecsSinceEpoch(settings->v_time[i] * 1000).date()); #endif break; } } } box->addWidget(w); connect(w, SIGNAL(clicked(QDate)), dialog, SLOT(accept())); connect(w, SIGNAL(activated(QDate)), dialog, SLOT(accept())); if(dialog->exec() == QDialog::Accepted) { QDate date = w->selectedDate(); for(size_t i = settings->v_time.size(); i > 0; i--) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) if(settings->v_time[i - 1] != 0 && QDateTime::fromSecsSinceEpoch(settings->v_time[i - 1]).date() <= date) { #else if(settings->v_time[i - 1] != 0 && QDateTime::fromMSecsSinceEpoch(settings->v_time[i - 1] * 1000).date() <= date) { #endif if(settings->history_expression_type > 1) scrollToAnchor("e" + QString::number(i - 1)); else scrollToAnchor(QString::number(i - 1)); break; } } } dialog->deleteLater(); } void remove_separator(std::string ©_text) { for(size_t i = ((CALCULATOR->local_digit_group_separator.empty() || CALCULATOR->local_digit_group_separator == " " || CALCULATOR->local_digit_group_separator == settings->printops.decimalpoint()) ? 1 : 0); i < 4; i++) { std::string str_sep; if(i == 0) str_sep = CALCULATOR->local_digit_group_separator; else if(i == 1) str_sep = THIN_SPACE; else if(i == 2) str_sep = NNBSP; else str_sep = " "; size_t index = copy_text.find(str_sep); while(index != std::string::npos) { if(index > 0 && index + str_sep.length() < copy_text.length() && copy_text[index - 1] >= '0' && copy_text[index - 1] <= '9' && copy_text[index + str_sep.length()] >= '0' && copy_text[index + str_sep.length()] <= '9') { copy_text.erase(index, str_sep.length()); } else { index++; } index = copy_text.find(str_sep, index); } } } QString replace_first_minus(const QString &qstr) { if(qstr.indexOf(SIGN_MINUS) == 0) { std::string str = qstr.toStdString(); if(str.find_first_of(OPERATORS) == std::string::npos) { for(size_t i = strlen(SIGN_MINUS); i < str.length(); i++) { if((signed char) str[i] < 0) return qstr; } std::string str_new = str; str_new.replace(0, strlen(SIGN_MINUS), "-"); return QString::fromStdString(str_new); } } return qstr; } std::string replace_first_minus(const std::string &str) { if(str.find(SIGN_MINUS) == 0 && str.find_first_of(OPERATORS) == std::string::npos) { for(size_t i = strlen(SIGN_MINUS); i < str.length(); i++) { if((signed char) str[i] < 0) return str; } std::string str_new = str; str_new.replace(0, strlen(SIGN_MINUS), "-"); return str_new; } return str; } std::string unformat(std::string str, bool restorable) { remove_separator(str); gsub(SIGN_MINUS, "-", str); gsub(SIGN_MULTIPLICATION, "*", str); gsub(SIGN_MULTIDOT, "*", str); gsub(SIGN_MIDDLEDOT, "*", str); gsub(THIN_SPACE, " ", str); gsub(NNBSP, " ", str); gsub(SIGN_DIVISION, "/", str); gsub(SIGN_DIVISION_SLASH, "/", str); gsub(SIGN_SQRT, "sqrt", str); gsub("Ω", "ohm", str); gsub("µ", restorable ? "µ" : "u", str); return str; } void HistoryView::editCopy(int ascii) { if(ascii < 0) ascii = settings->copy_ascii; if(textCursor().hasSelection()) { QString str = textCursor().selection().toHtml(), str_nohtml; int i = str.indexOf(""); if(i >= 0) { int i2 = str.indexOf("", i + 20); if(i2 >= 0) str = str.mid(i + 20, i2 - i - 20).trimmed(); str_nohtml = unhtmlize(str, ascii); } else if(str.startsWith(""); int i2 = str.indexOf("", i + 6); if(i2 >= 0) str = str.mid(i + 6, i2 - i - 6).trimmed(); str_nohtml = unhtmlize(str, ascii).trimmed(); str_nohtml.replace("\n\n", "\n"); str_nohtml.replace("\n ", "\n"); } else { str_nohtml = unhtmlize(textCursor().selectedText(), ascii); } if(ascii) { QApplication::clipboard()->setText(QString::fromStdString(unformat(str_nohtml.toStdString()))); } else { i = 0; while(true) { i = str.indexOf("color:", i); if(i < 0) break; int i2 = str.indexOf(";", i); int i3 = str.indexOf("\"", i); if(i2 < 0 || i3 < i2) i2 = i3 - 1; if(i2 < 0) break; str.remove(i, i2 - i); } i = 0; while(true) { i = str.indexOf("", i); if(i2 < 0) break; str.remove(i, i2 - i + 2); } str.remove("font-size:x-large;"); str.remove("font-size:large;"); str.replace("; ;", ";"); str.replace("style=\" ", "style=\""); str.replace("style=\" ", "style=\""); str.replace("style=\"; ", "style=\""); str.remove(" style=\"\""); str.remove(" style=\";\""); int i2 = 0; QList i1; i = 0; int depth = 0; while(true) { i2 = str.indexOf("", i); i = str.indexOf("= 0 && (i < 0 || i2 < i)) { if(depth > 0) { depth--; int i3 = str.indexOf(">", i1.last()); if(i3 < i1.last()) break; QString str2 = str.mid(i1.last() + 5, i3 - (i1.last() + 5) + 1); if(str2 == ">") { str.remove(i2, 7); str.remove(i1.last(), 6); i = i1.last(); } else if(str2 == " style=\"vertical-align:super;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else if(str2 == " style=\"font-style:italic; vertical-align:super;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else if(str2 == " style=\"font-style:italic;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else if(str2 == " style=\"vertical-align:sub;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else { i = i2 + 7; } i1.removeLast(); } else { i = i2 + 7; } } else if(i >= 0) { i1 << i; i += 6; depth++; } else { break; } } i = 0; while(true) { i = str.indexOf("", i); if(i2 < 0) break; str.remove(i, i2 - i + 1); } str.remove(""); QMimeData *qm = new QMimeData(); qm->setHtml(str); qm->setText(str_nohtml); qm->setObjectName("history_selection"); QApplication::clipboard()->setMimeData(qm); } } else { int i1 = -1, i2 = -1; QString astr; indexAtPos(context_pos, &i1, &i2, NULL, &astr); if(i1 < 0 && astr == "TP") { if(ascii) { QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(parse_tmp, true)))); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(parse_tmp))); qm->setText(QString::fromStdString(unhtmlize(parse_tmp))); qm->setObjectName("history_expression"); QApplication::clipboard()->setMimeData(qm); } return; } bool b_temp = (i1 < 0 && astr == "TR"); if(i1 < 0 && !b_temp) return; if(i2 < 0 && !b_temp) { if(i1 >= 0 && (size_t) i1 < settings->v_expression.size()) { if(astr[0] == 'e' || (astr[0] != 'a' && settings->history_expression_type == 1 && !settings->v_expression[i1].empty())) { if(ascii > 0 || (ascii < 0 && settings->copy_ascii)) { QApplication::clipboard()->setText(QString::fromStdString(unformat(settings->v_expression[i1]))); } else { QApplication::clipboard()->setText(QString::fromStdString(settings->v_expression[i1])); } } else { if(ascii) { QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(settings->v_parse[i1], true)))); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(settings->v_parse[i1]))); qm->setText(QString::fromStdString(unhtmlize(settings->v_parse[i1]))); qm->setObjectName("history_expression"); QApplication::clipboard()->setMimeData(qm); } } } } else { if(b_temp || ((size_t) i1 < settings->v_result.size() && (size_t) i2 < settings->v_result[i1].size())) { if(ascii) { std::string str = (b_temp ? result_tmp : settings->v_result[i1][i2]); if(!str.empty() && str[0] == '#') str.erase(0, 1); if(settings->copy_ascii_without_units) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(str, true))).trimmed()); } else { QMimeData *qm = new QMimeData(); if(b_temp) { qm->setHtml(QString::fromStdString(uncolorize(result_tmp))); qm->setText(QString::fromStdString(unhtmlize((result_tmp)))); } else if(!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') { qm->setHtml(QString::fromStdString(uncolorize(settings->v_result[i1][i2].substr(1)))); qm->setText(QString::fromStdString(unhtmlize((settings->v_result[i1][i2].substr(1))))); } else { qm->setHtml(QString::fromStdString(uncolorize(settings->v_result[i1][i2]))); qm->setText(QString::fromStdString(unhtmlize((settings->v_result[i1][i2])))); } qm->setObjectName("history_result"); QApplication::clipboard()->setMimeData(qm); } } } } } void HistoryView::editCopyAscii() { editCopy(1); } void HistoryView::editCopyFormatted() { editCopy(0); } void HistoryView::editInsertValue() { int i1 = -1, i2 = -1, i3 = -1; indexAtPos(context_pos, &i1, &i2, &i3); if(i3 > 0) emit insertValueRequested(i3); } void HistoryView::editInsertText() { int i1 = -1, i2 = -1; QString astr; indexAtPos(context_pos, &i1, &i2, NULL, &astr); if(i1 < 0 && astr == "TR") { emit insertTextRequested(result_tmp); } else if(i1 < 0 && astr == "TP") { emit insertTextRequested(parse_tmp); } else if(i2 >= 0) { if(i1 >= 0 && (size_t) i1 < settings->v_result.size() && (size_t) i2 < settings->v_result[i1].size()) { if(!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') emit insertTextRequested(settings->v_result[i1][i2].substr(1)); else emit insertTextRequested(settings->v_result[i1][i2]); } } else { if(i1 >= 0 && (size_t) i1 < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i1].empty() ? settings->v_parse[i1] : settings->v_expression[i1]); } } qalculate-qt-5.5.1/src/historyview.h000066400000000000000000000060351475705355700175010ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef HISTORY_VIEW_H #define HISTORY_VIEW_H #include class QImage; class QMenu; class QAction; class ExpressionEdit; class QColor; class QLineEdit; class QDialog; class HistoryView : public QTextEdit { Q_OBJECT public: HistoryView(QWidget *parent = NULL); virtual ~HistoryView(); ExpressionEdit *expressionEdit; QAction *findAction; QDialog *searchDialog; void addResult(std::vector values, std::string expression = "", bool pexact = true, std::string parse = "", int exact = 1, bool dual_approx = false, const QString &image = QString(), bool *implicit_warning = NULL, int initial_load = 0, size_t index = 0, bool temporary = false, const std::string &tmp_value = ""); void clearTemporary(); void addMessages(); void loadInitial(bool reload = false); void indexAtPos(const QPoint &pos, int *expression_index, int *result_index, int *value_index = NULL, QString *anchorstr = NULL); void replaceColors(QString&, QColor prev_text_color = QColor()); void setMenuAndToolbarItems(QMenu*, QMenu*, QAction*); void updateMinimumHeight(); bool testTemporaryResultLength(const std::string&); int maxTemporaryCharacters(); protected: QString s_text, previous_html, previous_html2, temporary_error; std::string parse_tmp, result_tmp; int i_pos, i_pos2, i_pos_p, i_pos_p2, previous_cursor, previous_cursor2, previous_temporary; int has_lock_symbol; QMenu *cmenu, *fileMenu, *modeMenu; QAction *insertTextAction, *insertValueAction, *copyAction, *copyFormattedAction, *copyAsciiAction, *selectAllAction, *delAction, *clearAction, *protectAction, *movetotopAction, *tbAction, *fileSeparator, *findDateAction, *commentAction; QColor text_color; QRect prev_fonti; QPoint context_pos; QLineEdit *searchEdit; size_t last_ans, last_ans2; QString last_ref, last_ref2; bool initial_loaded; void mouseDoubleClickEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void contextMenuEvent(QContextMenuEvent *e) override; void keyPressEvent(QKeyEvent *e) override; void inputMethodEvent(QInputMethodEvent*) override; void changeEvent(QEvent*) override; void editComment(int, int); protected slots: void doFind(); public slots: void editInsertValue(); void editInsertText(); void editCopy(int = -1); void editCopyFormatted(); void editCopyAscii(); void editClear(); void editRemove(); void editProtect(); void editFind(); void editFindDate(); void editMoveToTop(); void editComment(); void reloadHistory(); signals: void insertTextRequested(std::string); void insertValueRequested(int); void historyReloaded(); }; #endif //HISTORY_VIEW_H qalculate-qt-5.5.1/src/itemproxymodel.cpp000066400000000000000000000063171475705355700205240ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include "itemproxymodel.h" #include #include "qalculateqtsettings.h" ItemProxyModel::ItemProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { setSortCaseSensitivity(Qt::CaseInsensitive); setSortLocaleAware(true); setDynamicSortFilter(false); show_hidden = true; } ItemProxyModel::~ItemProxyModel() {} bool ItemProxyModel::filterAcceptsRow(int source_row, const QModelIndex&) const { QModelIndex index = sourceModel()->index(source_row, 0); if(!index.isValid()) return false; ExpressionItem *item = (ExpressionItem*) index.data(Qt::UserRole).value(); if(cat.empty()) return false; if(!show_hidden && item->isHidden() && (item->type() != TYPE_UNIT || !((Unit*) item)->isCurrency())) return false; if(cat == "All") { if(!item->isActive()) return false; } else if(cat == "Inactive") { if(item->isActive()) return false; } else if(cat == "Uncategorized") { if(!item->isActive() || !item->category().empty()) return false; } else if(cat == "User items") { if(!item->isActive() || !item->isLocal()) return false; } else if(cat == "Favorites") { bool b = false; if(item->type() == TYPE_UNIT) { for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == item) {b = true; break;} } } if(item->type() == TYPE_FUNCTION) { for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == item) {b = true; break;} } } if(item->type() == TYPE_VARIABLE) { for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == item) {b = true; break;} } } if(!b) return false; } else { if(!item->isActive()) return false; if(!subcat.empty()) { size_t l1 = subcat.length(), l2; l2 = item->category().length(); if((l2 != l1 && (l2 <= l1 || item->category()[l1] != '/')) || item->category().substr(0, l1) != subcat) return false; } else { if(item->category() != cat) return false; } } if(filter.empty()) return true; return name_matches(item, filter) || title_matches(item, filter) || (item->type() == TYPE_UNIT && country_matches((Unit*) item, filter)); } void ItemProxyModel::setFilter(std::string scat, std::string sfilter) { remove_blank_ends(sfilter); if(cat != scat || filter != sfilter) { cat = scat; if(cat[0] == '/') subcat = cat.substr(1, cat.length() - 1); else subcat = ""; filter = sfilter; invalidateFilter(); } } void ItemProxyModel::setSecondaryFilter(std::string sfilter) { remove_blank_ends(sfilter); if(filter != sfilter) { filter = sfilter; invalidateFilter(); } } void ItemProxyModel::setShowHidden(bool b) { if(b != show_hidden) { show_hidden = b; invalidateFilter(); } } std::string ItemProxyModel::currentFilter() const { return cat; } std::string ItemProxyModel::currentSecondaryFilter() const { return filter; } qalculate-qt-5.5.1/src/itemproxymodel.h000066400000000000000000000017241475705355700201660ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef ITEM_PROXY_MODEL_H #define ITEM_PROXY_MODEL_H #include class ItemProxyModel : public QSortFilterProxyModel { Q_OBJECT public: ItemProxyModel(QObject *parent = NULL); ~ItemProxyModel(); void setFilter(std::string, std::string = ""); void setSecondaryFilter(std::string); void setShowHidden(bool); std::string currentFilter() const; std::string currentSecondaryFilter() const; protected: std::string cat, subcat, filter; bool show_hidden; bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; }; #endif //ITEM_PROXY_MODEL_H qalculate-qt-5.5.1/src/keypadwidget.cpp000066400000000000000000002470371475705355700201320ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "keypadwidget.h" #include "qalculateqtsettings.h" #define BUTTON_DATA "QALCULATE DATA1" #define BUTTON_DATA2 "QALCULATE DATA2" #define BUTTON_DATA3 "QALCULATE DATA3" #define BUTTON_VALUE "QALCULATE VALUE1" #define BUTTON_VALUE2 "QALCULATE VALUE2" #define BUTTON_VALUE3 "QALCULATE VALUE3" #define SYMBOL_BUTTON_BOX(x) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked())); \ box->addWidget(button); #define SYMBOL_BUTTON3(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_OPERATOR_SYMBOL_BUTTON(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_OPERATOR_ITEM_BUTTON(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) z)); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL2_ITEM_BUTTON(x, y, o, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o)); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_ITEM2_BUTTON(x, o1, o2, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o2)); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_ITEM2_BUTTON(x, o1, o2, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o2)); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_BUTTON(x, r, c) SYMBOL_BUTTON3(x, x, x, r, c) #define SYMBOL_BUTTON2(x, y, r, c) SYMBOL_BUTTON3(x, y, y, r, c) #define OPERATOR_BUTTON3(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onOperatorButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_ITEM_SYMBOL_BUTTON(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) y)); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_SYMBOL_BUTTON(x, y, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, y); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_BUTTON(x, r, c) OPERATOR_BUTTON3(x, x, x, r, c) #define OPERATOR_BUTTON2(x, y, r, c) OPERATOR_BUTTON3(x, y, y, r, c) #define ITEM_BUTTON3(o1, o2, o3, x, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o2)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o3)); \ button->setToolTip(QString::fromStdString(o1->title(true, settings->printops.use_unicode_signs)), (void*) o1 == (void*) o2 ? QString() : QString::fromStdString(o2->title(true, settings->printops.use_unicode_signs)), (void*) o2 == (void*) o3 ? QString() : QString::fromStdString(o3->title(true, settings->printops.use_unicode_signs))); \ connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define ITEM_OPERATOR_ITEM_BUTTON(o1, o2, o3, x, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA2, o2); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o3)); \ button->setToolTip(QString::fromStdString(o1->title(true, settings->printops.use_unicode_signs)), o2, QString::fromStdString(o3->title(true, settings->printops.use_unicode_signs))); \ connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SET_ITEM_BUTTON2(button, o1, o2) button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o2)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o2)); \ button->setToolTip(QString::fromStdString(o1->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(o2->title(true, settings->printops.use_unicode_signs))); #define ITEM_BUTTON(o, x, r, c) ITEM_BUTTON3(o, o, o, x, r, c) #define ITEM_BUTTON2(o1, o2, x, r, c) ITEM_BUTTON3(o1, o2, o2, x, r, c) #define BASE_BUTTON(x, i, r, c) button = new KeypadButton(x, this); \ button->setCheckable(true); \ grid->addWidget(button, r, c); \ button->setProperty(BUTTON_DATA, i); \ connect(button, SIGNAL(clicked()), this, SLOT(onBaseButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onBaseButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onBaseButtonClicked2())); #define MENU_ITEM(x) item = x;\ if(item) {\ action = menu->addAction(QString::fromStdString(item->title(true, settings->printops.use_unicode_signs)), this, SLOT(onItemButtonClicked()));\ action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) item));\ } #define MENU_SYMBOL(x) action = menu->addAction(x, this, SLOT(onSymbolButtonClicked()));\ action->setProperty(BUTTON_DATA, x); #define CREATE_MENU menu = new QMenu(this);\ button->setMenu(menu);\ button->setPopupMode(settings->separate_keypad_menu_buttons ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup);\ button->menuSet(); #define ADD_SECTION(str) \ if(!menu->style()->styleHint(QStyle::SH_Menu_SupportsSections)) { \ aw = new QWidgetAction(this); \ QLabel *label = new QLabel(str, this); \ label->setAlignment(Qt::AlignCenter); \ aw->setDefaultWidget(label); \ menu->addSeparator(); \ menu->addAction(aw); \ menu->addSeparator(); \ } else { \ menu->addSection(str); \ } void KeypadWidget::createKeypad(int i) { KeypadButton *button; QMenu *menu; MathFunction *f, *f2; int c = 0; QGridLayout *grid; QHBoxLayout *box; if(i == KEYPAD_GENERAL && !sinButton) { grid = new QGridLayout(keypadG); grid->setContentsMargins(0, 0, 0, 0); button = new KeypadButton("MS", this); connect(button, SIGNAL(clicked()), this, SIGNAL(MSClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MSClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MSClicked())); button->setToolTip(tr("Memory store")); grid->addWidget(button, c, 0, 1, 1); button = new KeypadButton("MC", this); button->setToolTip(tr("Memory clear")); connect(button, SIGNAL(clicked()), this, SIGNAL(MCClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MCClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MCClicked())); grid->addWidget(button, c, 1, 1, 1); button = new KeypadButton("MR", this); button->setToolTip(tr("Memory recall")); connect(button, SIGNAL(clicked()), this, SIGNAL(MRClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MRClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MRClicked())); grid->addWidget(button, c, 2, 1, 1); button = new KeypadButton("M+", this); button->setToolTip(tr("Memory add"), tr("Memory subtract")); connect(button, SIGNAL(clicked()), this, SIGNAL(MPlusClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MMinusClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MMinusClicked())); grid->addWidget(button, c, 3, 1, 1); //: Standard calculator button. Do not use more than three characters. button = new KeypadButton(tr("STO"), this); connect(button, SIGNAL(clicked()), this, SIGNAL(storeClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(newFunctionClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(newFunctionClicked())); button->setToolTip(tr("Store"), tr("New function")); grid->addWidget(button, c, 4, 1, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateStoreMenu())); c++; button = new KeypadButton("hyp"); button->setCheckable(true); grid->addWidget(button, c, 0, 1, 1); connect(button, SIGNAL(toggled(bool)), this, SLOT(onHypToggled(bool))); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SIN), CALCULATOR->getFunctionById(FUNCTION_ID_ASIN), tr("sin"), c, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateSinMenu())); sinButton = button; ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_COS), CALCULATOR->getFunctionById(FUNCTION_ID_ACOS), tr("cos"), c, 2); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateCosMenu())); cosButton = button; ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_TAN), CALCULATOR->getFunctionById(FUNCTION_ID_ATAN), tr("tan"), c, 3); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateTanMenu())); tanButton = button; ITEM_BUTTON3(CALCULATOR->getVariableById(VARIABLE_ID_PI), CALCULATOR->getVariableById(VARIABLE_ID_EULER), CALCULATOR->getVariableById(VARIABLE_ID_CATALAN), SIGN_PI, c, 4); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updatePiMenu())); c++; OPERATOR_ITEM2_BUTTON("^", CALCULATOR->getFunctionById(FUNCTION_ID_SQUARE), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), c, 2); button->setRichText("xy"); button->setToolTip(tr("Exponentiation"), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_SQUARE)->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_EXP)->title(true, settings->printops.use_unicode_signs))); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updatePowerMenu())); ITEM_BUTTON3(CALCULATOR->getFunctionById(FUNCTION_ID_SQRT), CALCULATOR->getFunctionById(FUNCTION_ID_CBRT), CALCULATOR->getFunctionById(FUNCTION_ID_ROOT), SIGN_SQRT, c, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateSqrtMenu())); f = CALCULATOR->getActiveFunction("log10"); if(f) { ITEM_BUTTON3(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), f, CALCULATOR->getFunctionById(FUNCTION_ID_LOGN), "ln", c, 0); } else { ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), CALCULATOR->getFunctionById(FUNCTION_ID_LOGN), "ln", c, 0); } CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateLnMenu())); ITEM_OPERATOR_ITEM_BUTTON(CALCULATOR->getVariableById(VARIABLE_ID_I), "∠", CALCULATOR->getFunctionById(FUNCTION_ID_ARG), CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0 ? "j" : "i", c, 3); imaginaryButton = button; QFont ifont(button->font()); ifont.setStyle(QFont::StyleItalic); button->setFont(ifont); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateComplexMenu())); f = CALCULATOR->getActiveFunction("cis"); if(f) { ITEM_BUTTON3(CALCULATOR->getVariableById(VARIABLE_ID_E), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), f, "e", c, 4); } else { ITEM_BUTTON2(CALCULATOR->getVariableById(VARIABLE_ID_E), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), "e", c, 4); } CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateEMenu())); c++; f = CALCULATOR->getActiveFunction("perm"); f2 = CALCULATOR->getActiveFunction("comb"); if(f && f2) { OPERATOR_ITEM2_BUTTON("!", f, f2, c, 0); button->setToolTip(QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_FACTORIAL)->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(f->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(f2->title(true, settings->printops.use_unicode_signs))); } else { OPERATOR_BUTTON("!", c, 0); } button->setText("x!"); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateFactorialMenu())); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SUM), CALCULATOR->getFunctionById(FUNCTION_ID_PRODUCT), "Σ", c, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateSumMenu())); SYMBOL_BUTTON3("x", "y", "z", c, 2); button->setToolTip(QString(), "y", "z"); button->setFont(ifont); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateXMenu())); SYMBOL_BUTTON("=", c, 3); button->setRichText("x ="); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateEqualsMenu())); button = new KeypadButton("a(x)b", this); connect(button, SIGNAL(clicked()), this, SIGNAL(factorizeClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(expandClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(expandClicked())); button->setToolTip(tr("Factorize"), tr("Expand")); grid->addWidget(button, c, 4); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateFactorizeMenu())); c++; SYMBOL_BUTTON2("%", "‰", c, 1); button->setToolTip(tr("Percent or remainder"), QString::fromStdString(CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)->title(true, settings->printops.use_unicode_signs))); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updatePercentageMenu())); SYMBOL_ITEM2_BUTTON("±", CALCULATOR->getFunctionById(FUNCTION_ID_UNCERTAINTY), CALCULATOR->getFunctionById(FUNCTION_ID_INTERVAL), c, 0); button->setToolTip(tr("Uncertainty/interval"), tr("Relative error"), tr("Interval")); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateIntervalMenu())); std::string sunit = settings->latest_button_unit; if(sunit.empty()) sunit = "m"; Unit *u = CALCULATOR->getActiveUnit(sunit); button = new KeypadButton(QString::fromStdString(sunit), this); Prefix *p1 = CALCULATOR->getExactDecimalPrefix(-3), *p2 = CALCULATOR->getExactDecimalPrefix(3); button->setProperty(BUTTON_DATA, u ? QVariant::fromValue((void*) u) : QString::fromStdString(sunit)); button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) p1)); button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) p2)); connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onUnitButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onUnitButtonClicked3())); grid->addWidget(button, c, 2, 1, 1); unitButton = button; unitButton->setToolTip(QString::fromStdString(u ? u->title(true, settings->printops.use_unicode_signs) : sunit), p1 ? QString::fromStdString(p1->longName()) : QString(), p2 ? QString::fromStdString(p2->longName()) : QString()); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateUnitsMenu())); backButton = new KeypadButton(LOAD_ICON("go-back"), this, true); backButton->setToolTip(tr("Move cursor left"), tr("Move cursor to start")); connect(backButton, SIGNAL(clicked()), this, SIGNAL(leftClicked())); connect(backButton, SIGNAL(clicked2()), this, SIGNAL(startClicked())); connect(backButton, SIGNAL(clicked3()), this, SIGNAL(startClicked())); grid->addWidget(backButton, c, 3, 1, 1); forwardButton = new KeypadButton(LOAD_ICON("go-forward"), this, true); forwardButton->setToolTip(tr("Move cursor right"), tr("Move cursor to end")); connect(forwardButton, SIGNAL(clicked()), this, SIGNAL(rightClicked())); connect(forwardButton, SIGNAL(clicked2()), this, SIGNAL(endClicked())); connect(forwardButton, SIGNAL(clicked3()), this, SIGNAL(endClicked())); grid->addWidget(forwardButton, c, 4, 1, 1); for(c = 0; c < 5; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 5; r++) grid->setRowStretch(r, 1); } else if(i == KEYPAD_PROGRAMMING && !binButton) { grid = new QGridLayout(keypadP); grid->setContentsMargins(0, 0, 0, 0); BASE_BUTTON("BIN", 2, 0, 0); binButton = button; BASE_BUTTON("OCT", 8, 0, 1); octButton = button; BASE_BUTTON("DEC", 10, 0, 2); decButton = button; BASE_BUTTON("HEX", 16, 0, 3); hexButton = button; box = new QHBoxLayout(); SYMBOL_BUTTON_BOX("A"); aButton = button; SYMBOL_BUTTON_BOX("B"); bButton = button; SYMBOL_BUTTON_BOX("C"); cButton = button; SYMBOL_BUTTON_BOX("D"); dButton = button; SYMBOL_BUTTON_BOX("E"); eButton = button; SYMBOL_BUTTON_BOX("F"); fButton = button; updateBase(); grid->addLayout(box, 1, 0, 1, 4); OPERATOR_BUTTON2("&", "&&", 2, 0); button->setText("AND"); button->setToolTip(tr("Bitwise AND"), tr("Logical AND")); OPERATOR_BUTTON2("|", "||", 2, 1); button->setText("OR"); button->setToolTip(tr("Bitwise OR"), tr("Logical OR")); OPERATOR_BUTTON("xor", 2, 2); button->setText("XOR"); button->setToolTip(tr("Bitwise Exclusive OR")); OPERATOR_BUTTON2("~", "NOT", 2, 3); button->setText("NOT"); button->setToolTip(tr("Bitwise NOT"), tr("Logical NOT")); OPERATOR_BUTTON("<<", 3, 0); button->setToolTip(tr("Bitwise Left Shift")); OPERATOR_BUTTON(">>", 3, 1); button->setToolTip(tr("Bitwise Right Shift")); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_BIT_CMP), tr("cmp"), 3, 2); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_CIRCULAR_SHIFT), tr("rot"), 3, 3); OPERATOR_BUTTON2("mod", "rem", 4, 0); button->setText("mod"); button->setToolTip(QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_MOD)->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_REM)->title(true, settings->printops.use_unicode_signs))); OPERATOR_BUTTON("//", 4, 1); button->setText("div"); f = CALCULATOR->getActiveFunction("div"); if(f) button->setToolTip(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs))); f = CALCULATOR->getActiveFunction("log10"); f2 = CALCULATOR->getActiveFunction("log2"); if(f && f2) { ITEM_BUTTON2(f2, f, "log2", 4, 2); } else { ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), "ln", 4, 2); } ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_ASCII), CALCULATOR->getFunctionById(FUNCTION_ID_CHAR), tr("a→1"), 4, 3); for(c = 0; c < 4; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 5; r++) grid->setRowStretch(r, 1); } else if(i == KEYPAD_ALGEBRA && !xButton) { grid = new QGridLayout(keypadX); grid->setContentsMargins(0, 0, 0, 0); for(size_t i = 0; i < 3; i++) { SYMBOL_BUTTON((i == 0 ? "x" : (i == 1 ? "y" : "z")), 0, i); if(i == 0) xButton = button; int id = 0; if(i == 0) id = VARIABLE_ID_X; else if(i == 1) id = VARIABLE_ID_Y; else if(i == 2) id = VARIABLE_ID_Z; QFont ifont(button->font()); ifont.setStyle(QFont::StyleItalic); button->setFont(ifont); menu = new QMenu(this); button->setMenu(menu); connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateAssumptions())); menu->setProperty(BUTTON_DATA, id); } SYMBOL_BUTTON("n", 0, 3); SYMBOL_BUTTON2("=", SIGN_NOT_EQUAL, 1, 2); SYMBOL_BUTTON("/.", 1, 3); button->setToolTip(QString::fromStdString(CALCULATOR->localWhereString())); SYMBOL_BUTTON("<", 2, 0); SYMBOL_BUTTON(SIGN_LESS_OR_EQUAL, 2, 1); SYMBOL_BUTTON(">", 2, 2); SYMBOL_BUTTON(SIGN_GREATER_OR_EQUAL, 2, 3); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SUM), CALCULATOR->getFunctionById(FUNCTION_ID_PRODUCT), "∑", 3, 0); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_DIFFERENTIATE), CALCULATOR->getFunctionById(FUNCTION_ID_D_SOLVE), "d/dx", 3, 1); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_INTEGRATE), "∫", 3, 2); button = new KeypadButton("a(x)b", this); connect(button, SIGNAL(clicked()), this, SIGNAL(factorizeClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(expandClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(expandPartialFractionsClicked())); button->setToolTip(tr("Factorize"), tr("Expand"), tr("Expand partial fractions")); grid->addWidget(button, 3, 3); ITEM_BUTTON(CALCULATOR->getVariableById(VARIABLE_ID_PI), SIGN_PI, 1, 0); ITEM_BUTTON2(CALCULATOR->getVariableById(VARIABLE_ID_E), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), "e", 1, 1); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SQRT), CALCULATOR->getFunctionById(FUNCTION_ID_ROOT), SIGN_SQRT, 4, 0); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_CBRT), CALCULATOR->getFunctionById(FUNCTION_ID_ROOT), "∛", 4, 1); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), CALCULATOR->getFunctionById(FUNCTION_ID_LOGN), "ln", 4, 2); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_ABS), "|x|", 4, 3); for(c = 0; c < 4; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 5; r++) grid->setRowStretch(r, 1); } else if(i == KEYPAD_CUSTOM && !customEditButton) { grid = new QGridLayout(keypadC); grid->setContentsMargins(0, 0, 0, 0); customGrid = grid; customEditButton = new KeypadButton(LOAD_ICON("document-edit"), this); customEditButton->setCheckable(true); menu = new QMenu(this); addColumnAction = menu->addAction(tr("Add column"), this, SLOT(addCustomColumn())); addColumnAction->setEnabled(settings->custom_button_columns < 100); addRowAction = menu->addAction(tr("Add row"), this, SLOT(addCustomRow())); addRowAction->setEnabled(settings->custom_button_rows < 100); removeColumnAction = menu->addAction(tr("Remove column"), this, SLOT(removeCustomColumn())); removeColumnAction->setEnabled(settings->custom_button_columns > 1); removeRowAction = menu->addAction(tr("Remove row"), this, SLOT(removeCustomRow())); removeRowAction->setEnabled(settings->custom_button_rows > 1); customEditButton->setMenu(menu); customEditButton->setPopupMode(QToolButton::MenuButtonPopup); connect(customEditButton, SIGNAL(toggled(bool)), this, SLOT(onCustomEditClicked(bool))); grid->addWidget(customEditButton, 0, 0); customButtons.resize(settings->custom_button_columns); for(c = 0; c < settings->custom_button_columns; c++) { customButtons[c].resize(settings->custom_button_rows); for(int r = 0; r < settings->custom_button_rows; r++) { if(c == 0 && r == 0) { customButtons[c][r] = NULL; } else { button = new KeypadButton(QString(), this); connect(button, SIGNAL(clicked()), this, SLOT(onCustomButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onCustomButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onCustomButtonClicked3())); grid->addWidget(button, r, c); customButtons[c][r] = button; } grid->setRowStretch(r, 1); } grid->setColumnStretch(c, 1); } for(size_t i = 0; i < settings->custom_buttons.size();) { custom_button *cb = &settings->custom_buttons[i]; if(cb->c > 0 && cb->r > 0 && (cb->c != 1 || cb->r != 1) && cb->c <= customButtons.size() && cb->r <= customButtons[cb->c - 1].size()) { button = customButtons[cb->c - 1][cb->r - 1]; if(button) { if(cb->label.contains("setRichText(cb->label); else button->setText(cb->label); button->setProperty(BUTTON_DATA, cb->type[0]); button->setProperty(BUTTON_VALUE, QString::fromStdString(cb->value[0])); button->setProperty(BUTTON_DATA2, cb->type[1]); button->setProperty(BUTTON_VALUE2, QString::fromStdString(cb->value[1])); button->setProperty(BUTTON_DATA3, cb->type[2]); button->setProperty(BUTTON_VALUE3, QString::fromStdString(cb->value[2])); button->setToolTip(settings->shortcutText(cb->type[0], cb->value[0]), settings->shortcutText(cb->type[1], cb->value[1]), settings->shortcutText(cb->type[2], cb->value[2])); } i++; } else { settings->custom_buttons.erase(settings->custom_buttons.begin() + i); } } b_edit = false; } else if(i == KEYPAD_NUMBERPAD && !acButton[1]) { createNumpad(keypadN, 1); } } void KeypadWidget::createNumpad(QWidget *w, int i) { if(acButton[i]) return; KeypadButton *button; MathFunction *f, *f2; QGridLayout *grid = new QGridLayout(w); grid->setContentsMargins(0, 0, 0, 0); int c = 0; SYMBOL_BUTTON2("(", "[", 1, c) button->setToolTip(tr("Left parenthesis"), tr("Left vector bracket")); SYMBOL_BUTTON2(")", "]", 2, c) button->setToolTip(tr("Right parenthesis"), tr("Right vector bracket")); button = new KeypadButton("(x)", this); button->setToolTip(tr("Smart parentheses"), tr("Vector brackets")); connect(button, SIGNAL(clicked()), this, SIGNAL(parenthesesClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(bracketsClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(bracketsClicked())); grid->addWidget(button, 0, c, 1, 1); SYMBOL_BUTTON3(QString::fromStdString(CALCULATOR->getComma()), " ", "\n", 3, c) button->setToolTip(tr("Argument separator"), tr("Blank space"), tr("New line")); commaButton[i] = button; c++; SYMBOL_OPERATOR_SYMBOL_BUTTON("0", "⁰", "°", 3, c) button->setToolTip(QString(), "x0", QString::fromStdString(CALCULATOR->getDegUnit()->title(true, settings->printops.use_unicode_signs))); f = CALCULATOR->getActiveFunction("inv"); if(f) { SYMBOL_OPERATOR_ITEM_BUTTON("1", "¹", f, 2, c) button->setToolTip(QString(), "x1", "1/x"); } else { SYMBOL_OPERATOR_SYMBOL_BUTTON("1", "¹", "¹", 2, c) button->setToolTip(QString(), "x1"); } SYMBOL_OPERATOR_SYMBOL_BUTTON("4", "⁴", "¼", 1, c) button->setToolTip(QString(), "x4", "1/4"); SYMBOL_OPERATOR_SYMBOL_BUTTON("7", "⁷", "⅐", 0, c) button->setToolTip(QString(), "x7", "1/7"); c++; SYMBOL_BUTTON3(QString::fromStdString(CALCULATOR->getDecimalPoint()), " ", "\n", 3, c) button->setToolTip(tr("Decimal point"), tr("Blank space"), tr("New line")); dotButton[i] = button; SYMBOL_OPERATOR_SYMBOL_BUTTON("2", "²", "½", 2, c) button->setToolTip(QString(), "x2", "1/2"); SYMBOL_OPERATOR_SYMBOL_BUTTON("5", "⁵", "⅕", 1, c) button->setToolTip(QString(), "x5", "1/5"); SYMBOL_OPERATOR_SYMBOL_BUTTON("8", "⁸", "⅛", 0, c) button->setToolTip(QString(), "x8", "1/8"); c++; SYMBOL_OPERATOR_SYMBOL_BUTTON("3", "³", "⅓", 2, c) button->setToolTip(QString(), "x3", "1/3"); SYMBOL_OPERATOR_SYMBOL_BUTTON("6", "⁶", "⅙", 1, c) button->setToolTip(QString(), "x6", "1/6"); SYMBOL_OPERATOR_SYMBOL_BUTTON("9", "⁹", "⅑", 0, c) button->setToolTip(QString(), "x9", "1/9"); f = CALCULATOR->getActiveFunction("exp10"); f2 = CALCULATOR->getActiveFunction("exp2"); if(f && f2) { OPERATOR_ITEM2_BUTTON("E", f, f2, 3, c); button->setToolTip("10x", QString::fromStdString(f->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(f2->title(true, settings->printops.use_unicode_signs))); } else { OPERATOR_BUTTON("E", 3, c); button->setToolTip("10x"); } button->setText("EXP"); c++; ITEM_BUTTON(settings->vans[0], "ANS", 3, c); button = new KeypadButton("ANS", this); button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) settings->vans[0])); \ button->setToolTip(QString::fromStdString(settings->vans[0]->title(true, settings->printops.use_unicode_signs)), tr("Previous result (static)")); connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(answerClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(answerClicked())); grid->addWidget(button, 3, c, 1, 1); OPERATOR_BUTTON3(settings->multiplicationSign(), "&", "<<", 1, c); button->setToolTip(tr("Multiplication"), tr("Bitwise AND"), tr("Bitwise Shift")); multiplicationButton[i] = button; button = new KeypadButton(LOAD_ICON("edit-delete"), this, true); connect(button, SIGNAL(clicked()), this, SIGNAL(delClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(backspaceClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(backspaceClicked())); button->setToolTip(tr("Delete"), tr("Backspace")); grid->addWidget(button, 0, c, 1, 1); delButton[i] = button; OPERATOR_SYMBOL_BUTTON("+", "+", 2, c); button->setToolTip(tr("Addition"), tr("Plus")); c++; f = CALCULATOR->getActiveFunction("neg"); if(f) { OPERATOR_ITEM_SYMBOL_BUTTON(SIGN_MINUS, f, SIGN_MINUS, 2, c); button->setToolTip(tr("Subtraction"), QString::fromStdString(f->title(true, settings->printops.use_unicode_signs)) + " (" + QKeySequence(Qt::CTRL | Qt::Key_Minus).toString(QKeySequence::NativeText) + ")", tr("Minus")); } else { OPERATOR_SYMBOL_BUTTON(SIGN_MINUS, SIGN_MINUS, 2, c); button->setToolTip(tr("Subtraction"), tr("Minus")); } OPERATOR_BUTTON3(settings->divisionSign(), "|", "~", 1, c); divisionButton[i] = button; button->setProperty(BUTTON_DATA, settings->divisionSign(false)); button->setToolTip(tr("Division"), tr("Bitwise OR"), tr("Bitwise NOT")); button = new KeypadButton(LOAD_ICON("edit-clear"), this); button->setToolTip(tr("Clear expression")); connect(button, SIGNAL(clicked()), this, SIGNAL(clearClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(clearClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(clearClicked())); grid->addWidget(button, 0, c, 1, 1); acButton[i] = button; button = new KeypadButton("=", this); button->setToolTip(tr("Calculate expression"), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_SOLVE)->title(true, settings->printops.use_unicode_signs))); button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) CALCULATOR->getFunctionById(FUNCTION_ID_SOLVE))); \ connect(button, SIGNAL(clicked()), this, SIGNAL(equalsClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked())); connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked())); grid->addWidget(button, 3, c, 1, 1); for(c = 0; c < 6; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 4; r++) grid->setRowStretch(r, 1); } KeypadWidget::KeypadWidget(QWidget *parent) : QWidget(parent) { QHBoxLayout *box = new QHBoxLayout(this); leftStack = new QStackedLayout(); box->addLayout(leftStack, 11); box->addSpacing(box->spacing()); numpad = new QWidget(this); if(settings->hide_numpad) numpad->hide(); box->addWidget(numpad, 12); keypadG = new QWidget(this); leftStack->addWidget(keypadG); keypadP = new QWidget(this); leftStack->addWidget(keypadP); keypadX = new QWidget(this); leftStack->addWidget(keypadX); keypadC = new QWidget(this); leftStack->addWidget(keypadC); keypadN = new QWidget(this); leftStack->addWidget(keypadN); sinButton = NULL; cosButton = NULL; tanButton = NULL; delButton[0] = NULL; delButton[1] = NULL; acButton[0] = NULL; acButton[1] = NULL; backButton = NULL; forwardButton = NULL; dotButton[0] = NULL; commaButton[0] = NULL; multiplicationButton[0] = NULL; divisionButton[0] = NULL; dotButton[1] = NULL; commaButton[1] = NULL; multiplicationButton[1] = NULL; divisionButton[1] = NULL; imaginaryButton = NULL; binButton = NULL; octButton = NULL; decButton = NULL; hexButton = NULL; aButton = NULL; bButton = NULL; cButton = NULL; dButton = NULL; eButton = NULL; fButton = NULL; unitButton = NULL; storeButton = NULL; customOKButton = NULL; customEditButton = NULL; xButton = NULL; updateStretch(); setKeypadType(settings->keypad_type); } KeypadWidget::~KeypadWidget() {} void KeypadWidget::updateSinMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SIN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SINH)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ASIN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ASINH)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("csc")) MENU_ITEM(CALCULATOR->getActiveFunction("csch")) MENU_ITEM(CALCULATOR->getActiveFunction("arccsc")) MENU_ITEM(CALCULATOR->getActiveFunction("arcsch")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SINC)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SININT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SINHINT)) } } void KeypadWidget::updateCosMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COS)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COSH)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ACOS)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ACOSH)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("sec")) MENU_ITEM(CALCULATOR->getActiveFunction("sech")) MENU_ITEM(CALCULATOR->getActiveFunction("arcsec")) MENU_ITEM(CALCULATOR->getActiveFunction("arsech")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COSINT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COSHINT)) } } void KeypadWidget::updateTanMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_TAN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_TANH)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ATAN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ATANH)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("cot")) MENU_ITEM(CALCULATOR->getActiveFunction("coth")) MENU_ITEM(CALCULATOR->getActiveFunction("arccot")) MENU_ITEM(CALCULATOR->getActiveFunction("arcoth")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ATAN2)) } } void KeypadWidget::updatePiMenu() { QMenu *menu = qobject_cast(sender()); QAction *action; if(menu->isEmpty()) { QMap map; Variable *v[9]; v[0] = CALCULATOR->getActiveVariable("apery"); v[1] = CALCULATOR->getVariableById(VARIABLE_ID_CATALAN); v[2] = CALCULATOR->getVariableById(VARIABLE_ID_EULER); v[3] = CALCULATOR->getActiveVariable("golden"); v[4] = CALCULATOR->getActiveVariable("omega"); v[5] = CALCULATOR->getActiveVariable("plastic"); v[6] = CALCULATOR->getActiveVariable("pythagoras"); for(size_t i = 0; i < 7; i++) { if(v[i]) map[QString::fromStdString(v[i]->title(true, settings->printops.use_unicode_signs))] = v[i]; } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } menu->addSeparator(); map.clear(); v[0] = CALCULATOR->getActiveVariable("c"); v[1] = CALCULATOR->getActiveVariable("newtonian_constant"); v[2] = CALCULATOR->getActiveVariable("planck"); v[3] = CALCULATOR->getActiveVariable("boltzmann"); v[4] = CALCULATOR->getActiveVariable("avogadro"); v[5] = CALCULATOR->getActiveVariable("magnetic_constant"); v[6] = CALCULATOR->getActiveVariable("electric_constant"); v[7] = CALCULATOR->getActiveVariable("characteristic_impedance"); v[8] = CALCULATOR->getActiveVariable("standard_gravity"); for(size_t i = 0; i < 9; i++) { if(v[i]) map[QString::fromStdString(v[i]->title(true, settings->printops.use_unicode_signs))] = v[i]; } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } menu->addSeparator(); action = menu->addAction(tr("Enable units in physical constants"), this, SLOT(variableUnitsActivated())); action->setCheckable(true); action->setObjectName("action_variable_units"); menu->addSeparator(); menu->addAction(tr("All constants"), this, SIGNAL(openVariablesRequest())); } action = findChild("action_variable_units"); if(action) action->setChecked(CALCULATOR->variableUnitsEnabled()); } void KeypadWidget::updateLnMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getActiveFunction("log10")) MENU_ITEM(CALCULATOR->getActiveFunction("log2")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LOGN)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LOGINT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_POLYLOG)) } } void KeypadWidget::updateSqrtMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_CBRT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ROOT)) MENU_ITEM(CALCULATOR->getActiveFunction("sqrtpi")) } } void KeypadWidget::updatePowerMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SQUARE)) MENU_ITEM(CALCULATOR->getActiveFunction("exp10")) MENU_ITEM(CALCULATOR->getActiveFunction("exp2")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LAMBERT_W)) } } void KeypadWidget::updateEMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_EXP)) MENU_ITEM(CALCULATOR->getActiveFunction("cis")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_EXPINT)) } } void KeypadWidget::updateFactorialMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_GAMMA)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_DOUBLE_FACTORIAL)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_MULTI_FACTORIAL)) MENU_ITEM(CALCULATOR->getActiveFunction("hyperfactorial")) MENU_ITEM(CALCULATOR->getActiveFunction("superfactorial")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("perm")) MENU_ITEM(CALCULATOR->getActiveFunction("comb")) MENU_ITEM(CALCULATOR->getActiveFunction("derangement")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_BINOMIAL)) } } void KeypadWidget::updateSumMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_PRODUCT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_FOR)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_IF)) } } void KeypadWidget::updateXMenu() { QMenu *menu = qobject_cast(sender()); menu->clear(); QAction *action; QMap map; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(!CALCULATOR->variables[i]->isKnown() && !CALCULATOR->variables[i]->isHidden() && CALCULATOR->variables[i]->isActive() && CALCULATOR->variables[i] != CALCULATOR->getVariableById(VARIABLE_ID_X)) { map[QString::fromStdString(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs))] = CALCULATOR->variables[i]; } } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } } void KeypadWidget::updateEqualsMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_SYMBOL(SIGN_NOT_EQUAL); MENU_SYMBOL("<"); MENU_SYMBOL(SIGN_LESS_OR_EQUAL); MENU_SYMBOL(">"); MENU_SYMBOL(SIGN_GREATER_OR_EQUAL); menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SOLVE)) MENU_ITEM(CALCULATOR->getActiveFunction("solve2")) MENU_ITEM(CALCULATOR->getActiveFunction("linearfunction")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_D_SOLVE)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_NEWTON_RAPHSON)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SECANT_METHOD)) } } void KeypadWidget::updateFactorizeMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; menu->addAction(tr("Expand"), this, SIGNAL(expandClicked())); menu->addAction(tr("Expand partial fractions"), this, SIGNAL(expandPartialFractionsClicked())); menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_DIFFERENTIATE)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_INTEGRATE)) } } void KeypadWidget::updatePercentageMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_MOD)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_REM)); MENU_ITEM(CALCULATOR->getFunction("div")); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ABS)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_GCD)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LCM)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_DIVISORS)); menu->addSeparator(); MENU_ITEM(CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)); MENU_ITEM(CALCULATOR->getVariableById(VARIABLE_ID_PERMYRIAD)); menu->addSeparator(); action = menu->addAction(tr("Percentage Calculation Tool"), this, SIGNAL(openPercentageCalculationRequest())); } } void KeypadWidget::updateUnitsMenu() { QMenu *menu = qobject_cast(sender()); menu->clear(); ExpressionItem *item; QAction *action; QMap map, map2; const char *si_units[] = {"m", "g", "s", "A", "K", "J", "W", "L", "V", "ohm", "N", "Pa", "C", "F", "S", "oC", "Hz", "cd", "mol", "Wb", "T", "H", "lm", "lx", "Bq", "Gy", "Sv", "kat"}; size_t n = 0; for(size_t i = 0; i < 5 && i < settings->recent_units.size(); i++) { item = settings->recent_units[i]; action = menu->addAction(QString::fromStdString(item->title(true, settings->printops.use_unicode_signs)), this, SLOT(onUnitItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) item)); n++; } if(n > 0) menu->addSeparator(); for(size_t i = 0; i < 28; i++) { item = CALCULATOR->getActiveUnit(si_units[i]); for(size_t i = 0; item && i < 5 && i < settings->recent_units.size(); i++) { if(item == settings->recent_units[i]) { item = NULL; break; } } if(item) { if(n >= 15) map2[QString::fromStdString(item->title(true, settings->printops.use_unicode_signs))] = item; else map[QString::fromStdString(item->title(true, settings->printops.use_unicode_signs))] = item; n++; } } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onUnitItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } if(!map2.isEmpty()) { QMenu *menu2 = menu->addMenu(tr("more")); for(QMap::const_iterator it = map2.constBegin(); it != map2.constEnd(); ++it) { action = menu2->addAction(it.key(), this, SLOT(onUnitItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } } menu->addSeparator(); for(int i = -9; i <= 12; i += 3) { Prefix *p = CALCULATOR->getExactDecimalPrefix(i); if(p) { action = menu->addAction(QString::fromStdString(p->longName(true, true)), this, SLOT(onPrefixItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) p)); } } QMenu *menu2 = menu->addMenu(tr("more")); for(int i = -30; i <= 30; i += 3) { if(i == -9) i = -2; else if(i == 1) i = -1; else if(i == 2) i = 1; else if(i == 4) i = 2; else if(i == 5) i = 15; Prefix *p = CALCULATOR->getExactDecimalPrefix(i); if(p) { action = menu2->addAction(QString::fromStdString(p->longName(true, true)), this, SLOT(onPrefixItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) p)); } } menu->addSeparator(); menu->addAction(tr("All units"), this, SIGNAL(openUnitsRequest())); } void KeypadWidget::updateStoreMenu() { QMenu *menu = qobject_cast(sender()); menu->clear(); QAction *action; QMap map; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal()) { map[QString::fromStdString(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs))] = CALCULATOR->variables[i]; } } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } if(!map.isEmpty()) menu->addSeparator(); menu->addAction(tr("All variables"), this, SIGNAL(openVariablesRequest())); } void KeypadWidget::updateCustomActionOK() { QTreeWidgetItem *item = actionList->currentItem(); customOKButton->setEnabled(item && (item->data(0, Qt::UserRole).toInt() < 0 || ((!labelEdit || !labelEdit->text().trimmed().isEmpty()) && (!SHORTCUT_REQUIRES_VALUE(item->data(0, Qt::UserRole).toInt()) || !valueEdit->currentText().isEmpty())))); } void KeypadWidget::customActionOKClicked() { QString value = valueEdit->currentText(); QTreeWidgetItem *item = actionList->currentItem(); if(!item) return; if(settings->testShortcutValue(item->data(0, Qt::UserRole).toInt(), value, customActionDialog)) { customActionDialog->accept(); } else { valueEdit->setFocus(); } valueEdit->setCurrentText(value); } void KeypadWidget::currentCustomActionChanged(QTreeWidgetItem *item, QTreeWidgetItem *item_prev) { if(!item || !SHORTCUT_USES_VALUE(item->data(0, Qt::UserRole).toInt())) { valueEdit->clear(); valueEdit->clearEditText(); valueEdit->setEnabled(false); valueLabel->setEnabled(false); return; } int i = item->data(0, Qt::UserRole).toInt(); int i_prev = -1; if(item_prev) i_prev = item_prev->data(0, Qt::UserRole).toInt(); valueEdit->setEnabled(true); valueLabel->setEnabled(true); if(i == SHORTCUT_TYPE_FUNCTION || i == SHORTCUT_TYPE_FUNCTION_WITH_DIALOG) { if(i_prev != SHORTCUT_TYPE_FUNCTION && i_prev != SHORTCUT_TYPE_FUNCTION_WITH_DIALOG) { valueEdit->clear(); QStringList citems; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(f->isActive() && !f->isHidden()) citems << QString::fromStdString(f->referenceName()); } citems.sort(Qt::CaseInsensitive); valueEdit->addItems(citems); valueEdit->clearEditText(); } } else { valueEdit->clear(); if(i == SHORTCUT_TYPE_UNIT || i == SHORTCUT_TYPE_CONVERT_TO) { QStringList citems; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(u->isActive() && !u->isHidden()) citems << QString::fromStdString(u->referenceName()); } citems.sort(Qt::CaseInsensitive); valueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_VARIABLE) { QStringList citems; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(v->isActive() && !v->isHidden()) citems << QString::fromStdString(v->referenceName()); } citems.sort(Qt::CaseInsensitive); valueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_OPERATOR) { QStringList citems; citems << "+" << (settings->printops.use_unicode_signs ? SIGN_MINUS : "-") << settings->multiplicationSign(false) << settings->divisionSign(false) << "^" << ".+" << (QStringLiteral(".") + (settings->printops.use_unicode_signs ? SIGN_MINUS : "-")) << (QStringLiteral(".") + settings->multiplicationSign(false)) << (QStringLiteral(".") + settings->divisionSign(false)) << ".^" << "mod" << "rem" << "//" << "&" << "|" << "<<" << ">>" << "&&" << "||" << "xor" << "=" << SIGN_NOT_EQUAL << "<" << SIGN_LESS_OR_EQUAL << SIGN_GREATER_OR_EQUAL << ">"; valueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_COPY_RESULT) { settings->updateActionValueTexts(); valueEdit->addItems(settings->copy_action_value_texts); } if(i == SHORTCUT_TYPE_COPY_RESULT) valueEdit->setCurrentText(settings->copy_action_value_texts[0]); else valueEdit->clearEditText(); } } void KeypadWidget::editCustomAction(KeypadButton *button, int i) { if(i < 1 || i > 3) return; QDialog *dialog = new QDialog(this); customActionDialog = dialog; if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Button Action")); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); if(i == 1) { grid->addWidget(new QLabel(tr("Label:"), dialog), 0, 0); labelEdit = new QLineEdit(dialog); labelEdit->setText(button->richText().isEmpty() ? button->text() : button->richText()); grid->addWidget(labelEdit, 0, 1); } else { labelEdit = NULL; } actionList = new QTreeWidget(dialog); actionList->setColumnCount(1); actionList->setHeaderLabel(tr("Action")); actionList->setSelectionMode(QAbstractItemView::SingleSelection); actionList->setRootIsDecorated(false); actionList->header()->setVisible(true); actionList->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); actionList->setSortingEnabled(true); actionList->sortByColumn(-1, Qt::AscendingOrder); grid->addWidget(actionList, i != 1 ? 0 : 1, 0, 1, 2); int type = -1; if(button->property(i == 2 ? BUTTON_DATA2 : (i == 3 ? BUTTON_DATA3 : BUTTON_DATA)).isValid()) type = button->property(i == 2 ? BUTTON_DATA2 : (i == 3 ? BUTTON_DATA3 : BUTTON_DATA)).toInt(); QTreeWidgetItem *item = new QTreeWidgetItem(actionList, QStringList(tr("None"))); item->setData(0, Qt::UserRole, -1); actionList->setCurrentItem(item); for(int i = SHORTCUT_TYPE_FUNCTION; i <= SHORTCUT_TYPE_QUIT; i++) { item = new QTreeWidgetItem(actionList, QStringList(settings->shortcutTypeText((shortcut_type) i))); item->setData(0, Qt::UserRole, i); if(i == type) actionList->setCurrentItem(item); if(i == SHORTCUT_TYPE_HISTORY_SEARCH) { item = new QTreeWidgetItem(actionList, QStringList(settings->shortcutTypeText((shortcut_type) SHORTCUT_TYPE_HISTORY_CLEAR))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_HISTORY_CLEAR); if(type == SHORTCUT_TYPE_HISTORY_CLEAR) actionList->setCurrentItem(item); } else if(i == SHORTCUT_TYPE_APPROXIMATE) { item = new QTreeWidgetItem(actionList, QStringList(settings->shortcutTypeText((shortcut_type) SHORTCUT_TYPE_TOGGLE_FRACTION))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_TOGGLE_FRACTION); if(type == SHORTCUT_TYPE_TOGGLE_FRACTION) actionList->setCurrentItem(item); } } valueLabel = new QLabel(tr("Value:"), dialog); grid->addWidget(valueLabel, i != 1 ? 1 : 2, 0); valueEdit = new QComboBox(dialog); valueEdit->setEditable(true); valueEdit->setLineEdit(new MathLineEdit()); grid->addWidget(valueEdit, i != 1 ? 1 : 2, 1); grid->setColumnStretch(1, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(customActionOKClicked())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(labelEdit) connect(labelEdit, SIGNAL(textEdited(const QString&)), this, SLOT(updateCustomActionOK())); connect(actionList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(updateCustomActionOK())); connect(actionList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(currentCustomActionChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(valueEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(updateCustomActionOK())); customOKButton = buttonBox->button(QDialogButtonBox::Ok); currentCustomActionChanged(actionList->currentItem(), NULL); if(button->property(i == 2 ? BUTTON_VALUE2 : (i == 3 ? BUTTON_VALUE3 : BUTTON_VALUE)).isValid()) { QString value = button->property(i == 2 ? BUTTON_VALUE2 : (i == 3 ? BUTTON_VALUE3 : BUTTON_VALUE)).toString(); if(type == SHORTCUT_TYPE_COPY_RESULT) { int v = value.toInt(); if(v >= 0 && v < settings->copy_action_value_texts.size()) valueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { valueEdit->setCurrentText(value); } } customOKButton->setEnabled(false); if(labelEdit) labelEdit->setFocus(); else actionList->setFocus(); dialog->resize(dialog->sizeHint().width(), dialog->sizeHint().width() * 1.25); if(dialog->exec() == QDialog::Accepted) { int grid_i = customGrid->indexOf(button); int c = 0, r = 0, cs = 0, rs = 0; customGrid->getItemPosition(grid_i, &r, &c, &rs, &cs); c++; r++; size_t index = 0; for(size_t i = settings->custom_buttons.size(); i > 0; i--) { if(settings->custom_buttons[i - 1].r == r && settings->custom_buttons[i - 1].c == c) { index = i; break; } } if(index == 0) { custom_button cb; cb.c = c; cb.r = r; cb.type[0] = -1; cb.type[1] = -1; cb.type[2] = -1; settings->custom_buttons.push_back(cb); index = settings->custom_buttons.size(); } index--; custom_button *cb = &settings->custom_buttons[index]; cb->type[i - 1] = actionList->currentItem()->data(0, Qt::UserRole).toInt(); cb->value[i - 1] = valueEdit->currentText().toStdString(); button->setProperty(i == 2 ? BUTTON_DATA2 : (i == 3 ? BUTTON_DATA3 : BUTTON_DATA), actionList->currentItem()->data(0, Qt::UserRole).toInt()); button->setProperty(i == 2 ? BUTTON_VALUE2 : (i == 3 ? BUTTON_VALUE3 : BUTTON_VALUE), valueEdit->currentText()); button->setToolTip(settings->shortcutText(cb->type[0], cb->value[0]), settings->shortcutText(cb->type[1], cb->value[1]), settings->shortcutText(cb->type[2], cb->value[2])); if(labelEdit) { settings->custom_buttons[index].label = labelEdit->text().trimmed(); if(labelEdit->text().contains("setRichText(labelEdit->text().trimmed()); else button->setText(labelEdit->text()); } } dialog->deleteLater(); } void KeypadWidget::onCustomEditClicked(bool b) { b_edit = b; } void KeypadWidget::addCustomRow() { settings->custom_button_rows++; int r = settings->custom_button_rows - 1; for(int c = 0; c < settings->custom_button_columns; c++) { customButtons[c].resize(settings->custom_button_rows); KeypadButton *button = new KeypadButton(QString(), this); connect(button, SIGNAL(clicked()), this, SLOT(onCustomButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onCustomButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onCustomButtonClicked3())); customGrid->addWidget(button, r, c); customButtons[c][r] = button; customGrid->setRowStretch(r, 1); } addRowAction->setEnabled(settings->custom_button_rows < 100); removeRowAction->setEnabled(true); } void KeypadWidget::addCustomColumn() { settings->custom_button_columns++; customButtons.resize(settings->custom_button_columns); int c = settings->custom_button_columns - 1; customButtons[c].resize(settings->custom_button_rows); for(int r = 0; r < settings->custom_button_rows; r++) { KeypadButton *button = new KeypadButton(QString(), this); connect(button, SIGNAL(clicked()), this, SLOT(onCustomButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onCustomButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onCustomButtonClicked3())); customGrid->addWidget(button, r, c); customButtons[c][r] = button; customGrid->setRowStretch(r, 1); } customGrid->setColumnStretch(c, 1); updateStretch(); addColumnAction->setEnabled(settings->custom_button_columns < 100); removeColumnAction->setEnabled(true); } void KeypadWidget::removeCustomRow() { if(settings->custom_button_rows <= 1) return; settings->custom_button_rows--; int r = settings->custom_button_rows; customGrid->setRowStretch(r, 0); for(int c = 0; c < settings->custom_button_columns; c++) { for(size_t i = settings->custom_buttons.size(); i > 0; i--) { if(settings->custom_buttons[i - 1].r == r + 1 && settings->custom_buttons[i - 1].c == c + 1) { settings->custom_buttons.erase(settings->custom_buttons.begin() + i); break; } } customGrid->removeWidget(customButtons[c][r]); customButtons[c][r]->deleteLater(); customButtons[c].pop_back(); } addRowAction->setEnabled(true); removeRowAction->setEnabled(settings->custom_button_rows > 1); } void KeypadWidget::removeCustomColumn() { if(settings->custom_button_columns <= 1) return; settings->custom_button_columns--; int c = settings->custom_button_columns; customGrid->setColumnStretch(c, 0); for(int r = 0; r < settings->custom_button_rows; r++) { for(size_t i = settings->custom_buttons.size(); i > 0; i--) { if(settings->custom_buttons[i - 1].r == r + 1 && settings->custom_buttons[i - 1].c == c + 1) { settings->custom_buttons.erase(settings->custom_buttons.begin() + i); break; } } customGrid->removeWidget(customButtons[c][r]); customButtons[c][r]->deleteLater(); } customButtons.pop_back(); updateStretch(); addColumnAction->setEnabled(true); removeColumnAction->setEnabled(settings->custom_button_columns > 1); } void KeypadWidget::onCustomButtonClicked() { KeypadButton *button = qobject_cast(sender()); if(b_edit || !sender()->property(BUTTON_DATA).isValid() || sender()->property(BUTTON_DATA).toInt() < 0) { editCustomAction(button, 1); } else { emit shortcutClicked(sender()->property(BUTTON_DATA).toInt(), sender()->property(BUTTON_VALUE).toString()); } } void KeypadWidget::onCustomButtonClicked2() { KeypadButton *button = qobject_cast(sender()); if(b_edit || !sender()->property(BUTTON_DATA2).isValid() || sender()->property(BUTTON_DATA2).toInt() < 0) { editCustomAction(button, 2); } else { emit shortcutClicked(sender()->property(BUTTON_DATA2).toInt(), sender()->property(BUTTON_VALUE2).toString()); } } void KeypadWidget::onCustomButtonClicked3() { KeypadButton *button = qobject_cast(sender()); if(b_edit || !sender()->property(BUTTON_DATA3).isValid() || sender()->property(BUTTON_DATA3).toInt() < 0) { editCustomAction(button, 3); } else { emit shortcutClicked(sender()->property(BUTTON_DATA3).toInt(), sender()->property(BUTTON_VALUE3).toString()); } } void KeypadWidget::intervalDisplayActivated() { int v = qobject_cast(sender())->data().toInt(); if(v < 0) { settings->printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; settings->adaptive_interval_display = true; } else { settings->printops.interval_display = (IntervalDisplay) v; settings->adaptive_interval_display = false; } emit resultFormatUpdated(0); } void KeypadWidget::intervalCalculationActivated() { settings->evalops.interval_calculation = (IntervalCalculation) qobject_cast(sender())->data().toInt(); emit expressionCalculationUpdated(0); } void KeypadWidget::conciseInputActivated() { CALCULATOR->setConciseUncertaintyInputEnabled(!CALCULATOR->conciseUncertaintyInputEnabled()); emit expressionFormatUpdated(false); } void KeypadWidget::variableUnitsActivated() { CALCULATOR->setVariableUnitsEnabled(!CALCULATOR->variableUnitsEnabled()); emit expressionCalculationUpdated(0); } void KeypadWidget::updateIntervalMenu() { QMenu *menu = qobject_cast(sender()); QAction *action; QActionGroup *group; QWidgetAction *aw; if(menu->isEmpty()) { ADD_SECTION(tr("Interval Display")); group = new QActionGroup(this); group->setObjectName("group_interval_display"); action = menu->addAction(tr("Adaptive"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(-1); action = menu->addAction(tr("Significant digits"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_SIGNIFICANT_DIGITS); action = menu->addAction(tr("Interval"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_INTERVAL); action = menu->addAction(tr("Plus/minus"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_PLUSMINUS); action = menu->addAction(tr("Relative"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_RELATIVE); action = menu->addAction(tr("Concise"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_CONCISE); ADD_SECTION(tr("Interval Calculation")); group = new QActionGroup(this); group->setObjectName("group_interval_calculation"); action = menu->addAction(tr("Variance formula"), this, SLOT(intervalCalculationActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_CALCULATION_VARIANCE_FORMULA); action = menu->addAction(tr("Interval arithmetic"), this, SLOT(intervalCalculationActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_CALCULATION_INTERVAL_ARITHMETIC); menu->addSeparator(); action = menu->addAction(tr("Allow concise uncertainty input"), this, SLOT(conciseInputActivated())); action->setCheckable(true); action->setObjectName("action_concise_input"); } group = findChild("group_interval_display"); if(!group) return; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == (settings->adaptive_interval_display ? -1 : settings->printops.interval_display)) { actions.at(i)->setChecked(true); break; } } group = findChild("group_interval_calculation"); if(!group) return; actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == settings->evalops.interval_calculation) { actions.at(i)->setChecked(true); break; } } action = findChild("action_concise_input"); if(action) action->setChecked(CALCULATOR->conciseUncertaintyInputEnabled()); } void KeypadWidget::complexFormActivated() { settings->evalops.complex_number_form = (ComplexNumberForm) qobject_cast(sender())->data().toInt(); settings->complex_angle_form = (settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS); emit expressionCalculationUpdated(0); } void KeypadWidget::updateComplexMenu() { QMenu *menu = qobject_cast(sender()); ExpressionItem *item; QAction *action; QActionGroup *group; if(menu->isEmpty()) { MENU_SYMBOL("∠") MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_RE)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_IM)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ARG)) MENU_ITEM(CALCULATOR->getActiveFunction("conj")) menu->addSeparator(); menu = menu->addMenu(tr("Complex number form")); group = new QActionGroup(this); group->setObjectName("group_complex_form"); action = menu->addAction(tr("Rectangular"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_RECTANGULAR); action = menu->addAction(tr("Exponential"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_EXPONENTIAL); action = menu->addAction(tr("Polar"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_POLAR); action = menu->addAction(tr("Angle/phasor"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_CIS); } group = findChild("group_complex_form"); if(!group) return; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == settings->evalops.complex_number_form) { actions.at(i)->setChecked(true); break; } } } void KeypadWidget::updateAssumptions() { QMenu *menu = qobject_cast(sender()); QAction *action; QActionGroup *group; QString name; QWidgetAction *aw; int id = menu->property(BUTTON_DATA).toInt(); if(id == VARIABLE_ID_Y) name = "y"; else if(id == VARIABLE_ID_Z) name = "z"; else name = "x"; if(menu->isEmpty()) { ADD_SECTION(tr("Type", "Assumptions type")); group = new QActionGroup(this); group->setObjectName("group_type_" + name); action = menu->addAction(tr("Number"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_NUMBER); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Real"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_REAL); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Rational"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_RATIONAL); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Integer"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_INTEGER); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Boolean"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_BOOLEAN); action->setProperty(BUTTON_DATA, id); ADD_SECTION(tr("Sign", "Assumptions sign")); group = new QActionGroup(this); group->setObjectName("group_sign_" + name); action = menu->addAction(tr("Unknown", "Unknown assumptions sign"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_UNKNOWN); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Non-zero"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONZERO); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_POSITIVE); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Non-negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONNEGATIVE); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NEGATIVE); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Non-positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONPOSITIVE); menu->addSeparator(); action = menu->addAction(tr("Default assumptions"), this, SLOT(defaultAssumptionsActivated())); action->setProperty(BUTTON_DATA, id); } Variable *v = CALCULATOR->getVariableById(id); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; Assumptions *ass = uv->assumptions(); if(!ass) ass = CALCULATOR->defaultAssumptions(); group = findChild("group_type_" + name); if(!group) return; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == ass->type()) { actions.at(i)->setChecked(true); break; } } group = findChild("group_sign_" + name); if(!group) return; actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == ass->sign()) { actions.at(i)->setChecked(true); break; } } } void KeypadWidget::defaultAssumptionsActivated() { QAction *action = qobject_cast(sender()); Variable *v = CALCULATOR->getVariableById(action->property(BUTTON_DATA).toInt()); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; uv->setAssumptions(NULL); emit expressionCalculationUpdated(0); } void KeypadWidget::assumptionsTypeActivated() { QAction *action = qobject_cast(sender()); Variable *v = CALCULATOR->getVariableById(action->property(BUTTON_DATA).toInt()); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; if(!uv->assumptions()) uv->setAssumptions(new Assumptions()); uv->assumptions()->setType((AssumptionType) action->data().toInt()); emit expressionCalculationUpdated(0); } void KeypadWidget::assumptionsSignActivated() { QAction *action = qobject_cast(sender()); Variable *v = CALCULATOR->getVariableById(action->property(BUTTON_DATA).toInt()); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; if(!uv->assumptions()) uv->setAssumptions(new Assumptions()); uv->assumptions()->setSign((AssumptionSign) action->data().toInt()); emit expressionCalculationUpdated(0); } void KeypadWidget::setKeypadType(int i) { if(i < 0 || i > KEYPAD_NUMBERPAD) i = 0; createKeypad(i); hideNumpad(settings->hide_numpad); if(leftStack->currentIndex() == KEYPAD_PROGRAMMING && settings->programming_base_changed) { settings->programming_base_changed = false; emit baseClicked(BASE_DECIMAL, true, false); } leftStack->setCurrentIndex(i); } void KeypadWidget::hideNumpad(bool b) { if(!b) createNumpad(numpad, 0); numpad->setVisible(!b); } void KeypadWidget::updateStretch() { int left_size = 5; if(settings->separate_keypad_menu_buttons) left_size++; if(settings->custom_button_columns > left_size) left_size = settings->custom_button_columns; ((QBoxLayout*) layout())->setStretchFactor(leftStack, (left_size * 2) + 1); ((QBoxLayout*) layout())->setStretchFactor(numpad, 12); } void KeypadWidget::showSeparateKeypadMenuButtons(bool b) { QList buttons = findChildren(); for(int i = 0; i < buttons.count(); i++) { if(buttons.at(i) != customEditButton && buttons.at(i)->menu()) { buttons.at(i)->setPopupMode(b ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup); } buttons.at(i)->updateSize(); } updateStretch(); QRect r = geometry(); r.moveTo(0, 0); repaint(r); } void KeypadWidget::updateBase() { if(!binButton) return; binButton->setChecked(settings->printops.base == 2 && settings->evalops.parse_options.base == 2); octButton->setChecked(settings->printops.base == 8 && settings->evalops.parse_options.base == 8); decButton->setChecked(settings->printops.base == 10 && settings->evalops.parse_options.base == 10); hexButton->setChecked(settings->printops.base == 16 && settings->evalops.parse_options.base == 16); int base = settings->evalops.parse_options.base; if(base == BASE_CUSTOM) base = CALCULATOR->customOutputBase().intValue(); else if(base < 2 || base > 36) base = 10; aButton->setEnabled(base > 10); bButton->setEnabled(base > 11); cButton->setEnabled(base > 12); dButton->setEnabled(base > 13); eButton->setEnabled(base > 14); fButton->setEnabled(base > 15); } void KeypadWidget::updateSymbols() { for(size_t i = 0; i < 2; i++) { if(!dotButton[i]) continue; multiplicationButton[i]->setText(settings->multiplicationSign()); multiplicationButton[i]->setText(settings->multiplicationSign()); multiplicationButton[i]->setProperty(BUTTON_DATA, settings->multiplicationSign()); divisionButton[i]->setText(settings->divisionSign()); divisionButton[i]->setProperty(BUTTON_DATA, settings->divisionSign(false)); commaButton[i]->setText(QString::fromStdString(CALCULATOR->getComma())); commaButton[i]->setProperty(BUTTON_DATA, QString::fromStdString(CALCULATOR->getComma())); dotButton[i]->setText(QString::fromStdString(CALCULATOR->getDecimalPoint())); dotButton[i]->setProperty(BUTTON_DATA, QString::fromStdString(CALCULATOR->getDecimalPoint())); } if(imaginaryButton) imaginaryButton->setText(CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0 ? "j" : "i"); } void KeypadWidget::changeEvent(QEvent *e) { if(e->type() == QEvent::PaletteChange || e->type() == QEvent::ApplicationPaletteChange) { for(size_t i = 0; i < 2; i++) { if(!acButton[i]) continue; acButton[i]->setIcon(LOAD_ICON("edit-clear")); delButton[i]->setIcon(LOAD_ICON("edit-delete")); } if(backButton) backButton->setIcon(LOAD_ICON("go-back")); if(forwardButton) forwardButton->setIcon(LOAD_ICON("go-forward")); if(customEditButton) customEditButton->setIcon(LOAD_ICON("document-edit")); } else if(e->type() == QEvent::FontChange || e->type() == QEvent::ApplicationFontChange) { QList buttons = findChildren(); for(int i = 0; i < buttons.count(); i++) { buttons.at(i)->updateSize(); } } QWidget::changeEvent(e); } void KeypadWidget::onHypToggled(bool b) { if(b) { SET_ITEM_BUTTON2(sinButton, CALCULATOR->getFunctionById(FUNCTION_ID_SINH), CALCULATOR->getFunctionById(FUNCTION_ID_ASINH)); SET_ITEM_BUTTON2(cosButton, CALCULATOR->getFunctionById(FUNCTION_ID_COSH), CALCULATOR->getFunctionById(FUNCTION_ID_ACOSH)); SET_ITEM_BUTTON2(tanButton, CALCULATOR->getFunctionById(FUNCTION_ID_TANH), CALCULATOR->getFunctionById(FUNCTION_ID_ATANH)); } else { SET_ITEM_BUTTON2(sinButton, CALCULATOR->getFunctionById(FUNCTION_ID_SIN), CALCULATOR->getFunctionById(FUNCTION_ID_ASIN)); SET_ITEM_BUTTON2(cosButton, CALCULATOR->getFunctionById(FUNCTION_ID_COS), CALCULATOR->getFunctionById(FUNCTION_ID_ACOS)); SET_ITEM_BUTTON2(tanButton, CALCULATOR->getFunctionById(FUNCTION_ID_TAN), CALCULATOR->getFunctionById(FUNCTION_ID_ATAN)); } } void KeypadWidget::onSymbolButtonClicked() { emit symbolClicked(sender()->property(BUTTON_DATA).toString()); } void KeypadWidget::onSymbolButtonClicked2() { emit symbolClicked(sender()->property(BUTTON_DATA2).toString()); } void KeypadWidget::onSymbolButtonClicked3() { emit symbolClicked(sender()->property(BUTTON_DATA3).toString()); } void KeypadWidget::onOperatorButtonClicked() { emit operatorClicked(sender()->property(BUTTON_DATA).toString()); } void KeypadWidget::onOperatorButtonClicked2() { emit operatorClicked(sender()->property(BUTTON_DATA2).toString()); } void KeypadWidget::onOperatorButtonClicked3() { emit operatorClicked(sender()->property(BUTTON_DATA3).toString()); } void KeypadWidget::onBaseButtonClicked() { settings->programming_base_changed = settings->programming_base_changed || (settings->printops.base == BASE_DECIMAL && settings->evalops.parse_options.base == BASE_DECIMAL); emit baseClicked(sender()->property(BUTTON_DATA).toInt(), true, true); } void KeypadWidget::onBaseButtonClicked2() { settings->programming_base_changed = settings->programming_base_changed || (settings->printops.base == BASE_DECIMAL && settings->evalops.parse_options.base == BASE_DECIMAL); emit baseClicked(sender()->property(BUTTON_DATA).toInt(), false, true); } void KeypadWidget::onItemButtonClicked() { ExpressionItem *item = (ExpressionItem*) sender()->property(BUTTON_DATA).value(); if(item->type() == TYPE_FUNCTION) emit functionClicked((MathFunction*) item); else if(item->type() == TYPE_VARIABLE) emit variableClicked((Variable*) item); else if(item->type() == TYPE_UNIT) emit unitClicked((Unit*) item); } void KeypadWidget::onPrefixItemClicked() { emit prefixClicked((Prefix*) sender()->property(BUTTON_DATA).value()); } void KeypadWidget::onUnitItemClicked() { Unit *u = (Unit*) sender()->property(BUTTON_DATA).value(); emit unitClicked(u); if(unicode_length(u->print(false, true, true)) <= 3) { settings->latest_button_unit = u->print(false, true, true); unitButton->setText(QString::fromStdString(settings->latest_button_unit)); Prefix *p1 = CALCULATOR->getExactDecimalPrefix(-3), *p2 = CALCULATOR->getExactDecimalPrefix(3); unitButton->setToolTip(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs)), p1 ? QString::fromStdString(p1->longName()) : QString(), p2 ? QString::fromStdString(p2->longName()) : QString()); unitButton->setProperty(BUTTON_DATA, QVariant::fromValue((void*) u)); } } void KeypadWidget::onUnitButtonClicked2() { emit prefixClicked((Prefix*) sender()->property(BUTTON_DATA2).value()); } void KeypadWidget::onUnitButtonClicked3() { emit prefixClicked((Prefix*) sender()->property(BUTTON_DATA3).value()); } void KeypadWidget::onItemButtonClicked2() { ExpressionItem *item = (ExpressionItem*) sender()->property(BUTTON_DATA2).value(); if(item->type() == TYPE_FUNCTION) emit functionClicked((MathFunction*) item); else if(item->type() == TYPE_VARIABLE) emit variableClicked((Variable*) item); else if(item->type() == TYPE_UNIT) emit unitClicked((Unit*) item); } void KeypadWidget::onItemButtonClicked3() { ExpressionItem *item = (ExpressionItem*) sender()->property(BUTTON_DATA3).value(); if(item->type() == TYPE_FUNCTION) emit functionClicked((MathFunction*) item); else if(item->type() == TYPE_VARIABLE) emit variableClicked((Variable*) item); else if(item->type() == TYPE_UNIT) emit unitClicked((Unit*) item); } KeypadButton::KeypadButton(const QString &text, QWidget *parent, bool autorepeat) : QToolButton(parent), longPressTimer(NULL), b_longpress(false), b_autorepeat(autorepeat) { setFocusPolicy(Qt::TabFocus); if(text.contains("separate_keypad_menu_buttons && menu() ? 10 : 0)); size.setHeight(size.height() * 1.6); setMinimumSize(size); } void KeypadButton::setRichText(const QString &text) { richtext = text; setText(QString()); } const QString &KeypadButton::richText() const { return richtext; } void KeypadButton::menuSet() { if(settings->separate_keypad_menu_buttons) updateSize(); QString str = toolTip(); if(!str.isEmpty()) { str.replace(tr("Right-click/long press: %1").arg(QString()), tr("Right-click: %1").arg(QString())); str += "
"; } str += tr("Long press: %1").arg(tr("Open menu")); QToolButton::setToolTip(str); connect(menu(), SIGNAL(aboutToShow()), this, SLOT(menuOpened())); connect(menu(), SIGNAL(aboutToHide()), this, SLOT(menuClosed())); } void KeypadButton::menuOpened() { if(longPressTimer && longPressTimer->isActive()) longPressTimer->stop(); } void KeypadButton::menuClosed() { } void KeypadButton::paintEvent(QPaintEvent *p) { QToolButton::paintEvent(p); if(!richtext.isEmpty()) { QPainter painter(this); QTextDocument doc; doc.setHtml(richtext); QFont f = font(); doc.setDefaultFont(f); QPointF point = p->rect().center(); bool b_menu = (menu() && settings->separate_keypad_menu_buttons); point.setY(point.y() - doc.size().height() / 2.0 + 2.0); point.setX((point.x() - (b_menu ? 6.0 : 0.0)) - doc.size().width() / 2.0 + 2.0); painter.translate(point); painter.save(); doc.drawContents(&painter); painter.restore(); } } void KeypadButton::mousePressEvent(QMouseEvent *e) { b_longpress = false; if(e->button() == Qt::LeftButton && (!menu() || popupMode() != QToolButton::DelayedPopup)) { if(!longPressTimer) { longPressTimer = new QTimer(this); longPressTimer->setSingleShot(!b_autorepeat); connect(longPressTimer, SIGNAL(timeout()), this, SLOT(longPressTimeout())); } longPressTimer->start(b_autorepeat ? 250 : 500); } QToolButton::mousePressEvent(e); } void KeypadButton::longPressTimeout() { b_longpress = true; if(menu()) { showMenu(); } else if(b_autorepeat) { emit clicked(); } else { emit clicked2(); } } void KeypadButton::mouseReleaseEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) { emit clicked2(); } else if(e->button() == Qt::MiddleButton) { emit clicked3(); } else { if(longPressTimer && longPressTimer->isActive() && e->button() == Qt::LeftButton) { longPressTimer->stop(); } else if(b_longpress && e->button() == Qt::LeftButton) { b_longpress = false; blockSignals(true); QToolButton::mouseReleaseEvent(e); blockSignals(false); return; } QToolButton::mouseReleaseEvent(e); } } void KeypadButton::setToolTip(const QString &s1, const QString &s2, const QString &s3) { QString str; if(!s1.isEmpty()) str += s1; if(!s2.isEmpty()) { if(!str.isEmpty()) str += "
"; if(!b_autorepeat) str += tr("Right-click/long press: %1").arg(s2); else str += tr("Right-click: %1").arg(s2); } if(!s3.isEmpty()) { if(!str.isEmpty()) str += "
"; str += tr("Middle-click: %1").arg(s3); } QToolButton::setToolTip(str); } qalculate-qt-5.5.1/src/keypadwidget.h000066400000000000000000000130721475705355700175650ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef KEYPAD_WIDGET_H #define KEYPAD_WIDGET_H #include #include #include #include class QTimer; class QStackedLayout; class QLineEdit; class QComboBox; class QTreeWidget; class QTreeWidgetItem; class QDialog; class QGridLayout; class QAction; class QLabel; class QPushButton; class KeypadButton : public QToolButton { Q_OBJECT public: KeypadButton(const QString &text, QWidget *parent = NULL, bool autorepeat = false); KeypadButton(const QIcon &icon, QWidget *parent = NULL, bool autorepeat = false); ~KeypadButton(); void setToolTip(const QString &s1, const QString &s2 = QString(), const QString &s3 = QString()); void setRichText(const QString &text); const QString &richText() const; void menuSet(); void updateSize(); protected: QString richtext; QTimer *longPressTimer; bool b_longpress; bool b_autorepeat; void paintEvent(QPaintEvent*) override; void mouseReleaseEvent(QMouseEvent*) override; void mousePressEvent(QMouseEvent*) override; protected slots: void longPressTimeout(); void menuOpened(); void menuClosed(); signals: void clicked2(); void clicked3(); }; enum { KEYPAD_GENERAL = 0, KEYPAD_PROGRAMMING = 1, KEYPAD_ALGEBRA = 2, KEYPAD_CUSTOM = 3, KEYPAD_NUMBERPAD = 4 }; class KeypadWidget : public QWidget { Q_OBJECT public: KeypadWidget(QWidget *parent = NULL); virtual ~KeypadWidget(); protected: KeypadButton *sinButton, *cosButton, *tanButton, *delButton[2], *acButton[2], *backButton, *forwardButton, *dotButton[2], *commaButton[2], *multiplicationButton[2], *divisionButton[2], *imaginaryButton, *binButton, *octButton, *decButton, *hexButton, *aButton, *bButton, *cButton, *dButton, *eButton, *fButton, *unitButton, *storeButton, *xButton; QPushButton *customOKButton; QToolButton *customEditButton; QWidget *keypadG, *keypadP, *keypadX, *keypadC, *keypadN; QVector > customButtons; QStackedLayout *leftStack; QGridLayout *customGrid; QLineEdit *labelEdit; QComboBox *valueEdit; QLabel *valueLabel; QTreeWidget *actionList; QWidget *numpad; QDialog *customActionDialog; QAction *addRowAction, *addColumnAction, *removeRowAction, *removeColumnAction; bool b_edit; void changeEvent(QEvent *e); void editCustomAction(KeypadButton*, int); void updateStretch(); void createKeypad(int); void createNumpad(QWidget*, int); protected slots: void onSymbolButtonClicked(); void onOperatorButtonClicked(); void onItemButtonClicked(); void onUnitItemClicked(); void onPrefixItemClicked(); void onUnitButtonClicked2(); void onUnitButtonClicked3(); void onSymbolButtonClicked2(); void onOperatorButtonClicked2(); void onItemButtonClicked2(); void onSymbolButtonClicked3(); void onOperatorButtonClicked3(); void onItemButtonClicked3(); void onBaseButtonClicked(); void onBaseButtonClicked2(); void onCustomButtonClicked(); void onCustomButtonClicked2(); void onCustomButtonClicked3(); void onHypToggled(bool); void assumptionsTypeActivated(); void assumptionsSignActivated(); void defaultAssumptionsActivated(); void updateAssumptions(); void onCustomEditClicked(bool); void removeCustomRow(); void addCustomRow(); void removeCustomColumn(); void addCustomColumn(); void updateCustomActionOK(); void customActionOKClicked(); void currentCustomActionChanged(QTreeWidgetItem*, QTreeWidgetItem*); void intervalDisplayActivated(); void intervalCalculationActivated(); void conciseInputActivated(); void variableUnitsActivated(); void updateIntervalMenu(); void complexFormActivated(); void updateComplexMenu(); void updateStoreMenu(); void updateSinMenu(); void updateCosMenu(); void updateTanMenu(); void updatePiMenu(); void updateLnMenu(); void updateSqrtMenu(); void updatePowerMenu(); void updateEMenu(); void updateFactorialMenu(); void updateSumMenu(); void updateXMenu(); void updateEqualsMenu(); void updateFactorizeMenu(); void updatePercentageMenu(); void updateUnitsMenu(); public slots: void updateBase(); void updateSymbols(); void setKeypadType(int); void hideNumpad(bool); void showSeparateKeypadMenuButtons(bool); signals: void operatorClicked(const QString&); void symbolClicked(const QString&); void functionClicked(MathFunction *f); void variableClicked(Variable *v); void unitClicked(Unit *u); void prefixClicked(Prefix *p); void delClicked(); void clearClicked(); void equalsClicked(); void parenthesesClicked(); void bracketsClicked(); void leftClicked(); void rightClicked(); void endClicked(); void startClicked(); void MSClicked(); void MCClicked(); void MRClicked(); void MPlusClicked(); void MMinusClicked(); void storeClicked(); void newFunctionClicked(); void backspaceClicked(); void answerClicked(); void baseClicked(int, bool, bool); void factorizeClicked(); void expandClicked(); void expandPartialFractionsClicked(); void expressionCalculationUpdated(int); void expressionFormatUpdated(bool); void resultFormatUpdated(int); void shortcutClicked(int, const QString&); void openVariablesRequest(); void openUnitsRequest(); void openPercentageCalculationRequest(); }; #endif //KEYPAD_WIDGET_H qalculate-qt-5.5.1/src/main.cpp000066400000000000000000000276711475705355700163750ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculatewindow.h" #include "qalculateqtsettings.h" #ifdef _WIN32 # include #endif QString custom_title; QalculateQtSettings *settings; extern bool title_modified; QTranslator translator, translator_qt, translator_qtbase; int main(int argc, char **argv) { #ifdef _WIN32 if(!qEnvironmentVariableIsSet("QT_QPA_PLATFORM")) { qputenv("QT_QPA_PLATFORM", "windows:altgr"); } #endif QApplication app(argc, argv); app.setApplicationName("qalculate-qt"); app.setApplicationDisplayName("Qalculate!"); app.setOrganizationName("qalculate"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)) app.setDesktopFileName("io.github.Qalculate.qalculate-qt"); #endif app.setApplicationVersion("5.5.1"); #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) app.setAttribute(Qt::AA_UseHighDpiPixmaps); #endif settings = new QalculateQtSettings(); QalculateTranslator eqtr; app.installTranslator(&eqtr); if(!settings->ignore_locale) { if(!settings->custom_lang.isEmpty()) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)) QLocale::setDefault(QLocale(QLocale(settings->custom_lang).language(), QLocale(settings->custom_lang).territory())); #else QLocale::setDefault(QLocale(QLocale(settings->custom_lang).language(), QLocale(settings->custom_lang).country())); #endif #ifdef _WIN32 _putenv_s("LANG", settings->custom_lang.toLocal8Bit().data()); } else { ULONG nlang = 0; DWORD n = 0; if(GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &nlang, NULL, &n)) { WCHAR wlocale[n]; if(GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &nlang, wlocale, &n)) { std::string lang = utf8_encode(wlocale); if(!lang.empty()) { gsub("-", "_", lang); if(lang != QLocale().name().toStdString()) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)) QLocale::setDefault(QLocale(QLocale(QString::fromStdString(lang)).language(), QLocale(QString::fromStdString(lang)).territory())); #else QLocale::setDefault(QLocale(QLocale(QString::fromStdString(lang)).language(), QLocale(QString::fromStdString(lang)).country())); #endif } _putenv_s("LANG", lang.c_str()); } } } } #else QString lang = settings->custom_lang; if(lang.indexOf(".") < 0) lang += ".utf8"; setenv("LANG", lang.toLocal8Bit().data(), 1); } #endif #ifndef TRANSLATIONS_DIR # define TRANSLATIONS_DIR ":/translations" #endif if(translator.load(QLocale(), QLatin1String("qalculate-qt"), QLatin1String("_"), QLatin1String(TRANSLATIONS_DIR))) app.installTranslator(&translator); #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) if(translator_qt.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::path(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qt); if(translator_qtbase.load(QLocale(), QLatin1String("qtbase"), QLatin1String("_"), QLibraryInfo::path(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qtbase); #else if(translator_qt.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qt); if(translator_qtbase.load(QLocale(), QLatin1String("qtbase"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qtbase); #endif } QCommandLineParser *parser = new QCommandLineParser(); QCommandLineOption fOption(QStringList() << "f" << "file", QApplication::tr("Execute expressions and commands from a file"), QApplication::tr("FILE")); parser->addOption(fOption); QCommandLineOption nOption(QStringList() << "n" << "new-instance", QApplication::tr("Start a new instance of the application")); parser->addOption(nOption); QCommandLineOption tOption(QStringList() << "title", QApplication::tr("Specify the window title"), QApplication::tr("TITLE")); parser->addOption(tOption); QCommandLineOption vOption(QStringList() << "v" << "version", QApplication::tr("Display the application version")); parser->addOption(vOption); QCommandLineOption wOption(QStringList() << "w" << "workspace", QApplication::tr("Open workspace"), QApplication::tr("FILE")); parser->addOption(wOption); parser->addPositionalArgument("expression", QApplication::tr("Expression to calculate"), QApplication::tr("[EXPRESSION]")); parser->addHelpOption(); parser->process(app); if(parser->isSet(vOption)) { puts(qApp->applicationVersion().toUtf8().data()); return 0; } std::string homedir = getLocalDir(); recursiveMakeDir(homedir); QLockFile lockFile(QString::fromStdString(buildPath(homedir, "qalculate-qt.lock"))); if(settings->allow_multiple_instances < 1 && !parser->isSet(nOption) && !lockFile.tryLock(100)) { if(lockFile.error() == QLockFile::LockFailedError) { bool ami_changed = false; if(settings->allow_multiple_instances < 0 && parser->value(fOption).isEmpty() && parser->value(wOption).isEmpty() && parser->positionalArguments().isEmpty()) { settings->allow_multiple_instances = (QMessageBox::question(NULL, QApplication::tr("Allow multiple instances?"), QApplication::tr("By default, only one instance (one main window) of %1 is allowed.\n\nIf multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved.\n\nDo you, despite this, want to change the default behavior and allow multiple simultaneous instances?").arg("Qalculate!"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes); ami_changed = true; if(settings->allow_multiple_instances) { QLocalSocket socket; socket.connectToServer("qalculate-qt"); if(socket.waitForConnected()) { socket.write("+"); socket.waitForBytesWritten(3000); socket.disconnectFromServer(); } } } if(settings->allow_multiple_instances <= 0) { #ifdef _WIN32 qint64 pid = 0; lockFile.getLockInfo(&pid, NULL, NULL); if(pid != 0) AllowSetForegroundWindow(pid); #endif QTextStream outStream(stdout); outStream << QApplication::tr("%1 is already running.").arg(app.applicationDisplayName()) << '\n'; QLocalSocket socket; socket.connectToServer("qalculate-qt"); if(socket.waitForConnected()) { QString command; if(!parser->value(fOption).isEmpty()) { command = "f"; command += parser->value(fOption); } else if(!parser->value(wOption).isEmpty()) { command = "w"; command += parser->value(wOption); } else if(ami_changed) { command = "-"; } else { command = "0"; } QStringList args = parser->positionalArguments(); for(int i = 0; i < args.count(); i++) { if(i > 0) command += " "; else if(command == "f") command += ";"; command += args.at(i); } socket.write(command.toUtf8()); socket.waitForBytesWritten(3000); socket.disconnectFromServer(); } return 1; } } } #ifndef __APPLE__ app.setWindowIcon(LOAD_APP_ICON("qalculate-qt")); #endif new Calculator(settings->ignore_locale); CALCULATOR->setExchangeRatesWarningEnabled(false); settings->loadPreferences(); if(!parser->value(wOption).isEmpty()) settings->loadWorkspace(parser->value(wOption).toLocal8Bit().data()); if(settings->disable_cursor_blinking) app.setCursorFlashTime(0); CALCULATOR->loadExchangeRates(); if(!CALCULATOR->loadGlobalDefinitions()) { QTextStream outStream(stderr); outStream << QApplication::tr("Failed to load global definitions!\n"); return 1; } if(settings->do_imaginary_j && CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") == 0) { Variable *v_i = CALCULATOR->getVariableById(VARIABLE_ID_I); ExpressionName ename = v_i->getName(1); ename.name = "j"; ename.reference = false; v_i->addName(ename, 1, true); v_i->setChanged(false); } settings->f_answer->setCategory(CALCULATOR->getFunctionById(FUNCTION_ID_WARNING)->category()); settings->f_answer->setChanged(false); CALCULATOR->loadLocalDefinitions(); Unit *u = CALCULATOR->getActiveUnit("L"); if(u) settings->volume_category = u->category(); u = CALCULATOR->getActiveUnit("teaspoon"); if(u && u->category().find(settings->volume_category) == 0) settings->alternative_volume_categories.push_back(u->category()); u = CALCULATOR->getActiveUnit("gal"); if(u && u->category().find(settings->volume_category) == 0) settings->alternative_volume_categories.push_back(u->category()); u = CALCULATOR->getActiveUnit("UK_gal"); if(u && u->category().find(settings->volume_category) == 0) settings->alternative_volume_categories.push_back(u->category()); settings->setCustomAngleUnit(); settings->updateFavourites(); QColor c = QApplication::palette().base().color(); if(c.red() + c.green() + c.blue() < 255) settings->color = 2; else settings->color = 1; settings->saved_app_font = app.font(); if(settings->use_custom_app_font) { QFont font; font.fromString(QString::fromStdString(settings->custom_app_font)); app.setFont(font); } QalculateWindow *win = new QalculateWindow(); if(parser->value(tOption).isEmpty()) { win->updateWindowTitle(QString(), false, true); title_modified = false; } else { win->setWindowTitle(parser->value(tOption)); title_modified = true; } win->setCommandLineParser(parser); win->show(); app.processEvents(); win->initFinished(); if(!parser->value(fOption).isEmpty()) win->executeFromFile(parser->value(fOption)); QStringList args = parser->positionalArguments(); QString expression; for(int i = 0; i < args.count(); i++) { if(i > 0) expression += " "; expression += args.at(i); } expression = expression.trimmed(); if(!expression.isEmpty()) win->calculate(expression); args.clear(); settings->checkVersion(false, win); if(!settings->use_custom_app_font) win->loadInitialHistory(); return app.exec(); } QalculateTranslator::QalculateTranslator() : QTranslator() {} QString QalculateTranslator::translate(const char *context, const char *sourceText, const char *disambiguation, int n) const { if(!translator_qt.translate(context, sourceText, disambiguation, n).isEmpty() || !translator_qtbase.translate(context, sourceText, disambiguation, n).isEmpty()) return QString(); if(strcmp(context, "QalculateTranslator") == 0) return QString(); //: Only used when Qt translation is missing if(strcmp(sourceText, "OK") == 0) return tr("OK"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Cancel") == 0) return tr("Cancel"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Close") == 0) return tr("Close"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Yes") == 0) return tr("&Yes"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&No") == 0) return tr("&No"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Open") == 0) return tr("&Open"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Save") == 0) return tr("&Save"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Select All") == 0) return tr("&Select All"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Look in:") == 0) return tr("Look in:"); //: Only used when Qt translation is missing if(strcmp(sourceText, "File &name:") == 0) return tr("File &name:"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Files of type:") == 0) return tr("Files of type:"); return QString(); } qalculate-qt-5.5.1/src/matrixwidget.cpp000066400000000000000000000137731475705355700201570ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include "matrixwidget.h" #include "qalculateqtsettings.h" MatrixWidget::MatrixWidget(QWidget *parent, int r, int c) : QWidget(parent) { QVBoxLayout *box = new QVBoxLayout(this); box->setContentsMargins(0, 0, 0, 0); QHBoxLayout *hbox = new QHBoxLayout(); box->addLayout(hbox); hbox->addStretch(1); rowsSpin = new QSpinBox(this); rowsSpin->setRange(1, 10000); rowsSpin->setValue(r); hbox->addWidget(rowsSpin); connect(rowsSpin, SIGNAL(valueChanged(int)), this, SLOT(matrixRowsChanged(int))); hbox->addWidget(new QLabel(SIGN_MULTIPLICATION)); columnsSpin = new QSpinBox(this); columnsSpin->setRange(1, 10000); columnsSpin->setValue(c); hbox->addWidget(columnsSpin); connect(columnsSpin, SIGNAL(valueChanged(int)), this, SLOT(matrixColumnsChanged(int))); matrixTable = new QTableWidget(this); matrixTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); QTableWidgetItem *proto = new QTableWidgetItem(); proto->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); matrixTable->setItemPrototype(proto); matrixTable->setRowCount(r); matrixTable->setColumnCount(c); matrixTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); matrixTable->setFocus(); setEditable(true); box->addWidget(matrixTable, 1); connect(matrixTable, SIGNAL(itemChanged(QTableWidgetItem*)), this, SIGNAL(matrixChanged())); } MatrixWidget::~MatrixWidget() {} QSize MatrixWidget::sizeHint() const { QFontMetrics fm(matrixTable->font()); return QSize(fm.boundingRect("000000").width() * 12, QWidget::sizeHint().height()); } void MatrixWidget::matrixRowsChanged(int i) { matrixTable->setRowCount(i); matrixTable->adjustSize(); emit dimensionChanged(i, matrixTable->columnCount()); } void MatrixWidget::matrixColumnsChanged(int i) { matrixTable->setColumnCount(i); matrixTable->adjustSize(); emit dimensionChanged(matrixTable->rowCount(), i); } void MatrixWidget::setEditable(bool b) { matrixTable->setEditTriggers(b ? QAbstractItemView::AllEditTriggers : QAbstractItemView::NoEditTriggers); rowsSpin->setReadOnly(!b); columnsSpin->setReadOnly(!b); } QString MatrixWidget::getMatrixString() const { QString str; int max_c = -1, max_r = -1; for(int r = 0; r < matrixTable->rowCount(); r++) { bool b = false; for(int c = 0; c < matrixTable->columnCount(); c++) { QTableWidgetItem *item = matrixTable->item(r, c); if(item && !item->text().isEmpty()) { b = true; if(c > max_c) max_c = c; } } if(b) max_r = r; } if(max_r < 0) {max_r = matrixTable->rowCount() - 1; max_c = matrixTable->columnCount() - 1;} str = "["; QString str_e; for(int r = 0; r <= max_r; r++) { if(r > 0) str += "; "; for(int c = 0; c <= max_c; c++) { if(c > 0) str += " "; QTableWidgetItem *item = matrixTable->item(r, c); if(!item || item->text().isEmpty()) { str += "0"; } else { str_e = item->text(); bool in_cit1 = false, in_cit2 = false; int pars = 0, brackets = 0; for(int i = 0; i < str_e.length(); i++) { if(!in_cit1 && !in_cit2) { if(str_e[i] == '[') brackets++; else if(str_e[i] == ']' && brackets > 0) brackets++; else if(str_e[i] == '(' && brackets == 0) pars++; else if(str_e[i] == ')' && brackets == 0 && pars > 0) pars--; else if(brackets == 0 && pars == 0 && (str_e[i].isSpace() || str_e[i] == ';' || (str_e[i] == ',' && settings->printops.decimalpoint() != ","))) { str += "("; str_e += ")"; break; } } if(str_e[i] == '\"') { if(in_cit1) in_cit1 = false; else if(!in_cit2) in_cit1 = true; } else if(str_e[i] == '\'') { if(in_cit2) in_cit2 = false; else if(!in_cit1) in_cit1 = true; } } str += str_e; } } } str += "]"; return str; } void MatrixWidget::setMatrix(const MathStructure &mstruct) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.base = 10; QTableWidgetItem *item; if(mstruct.isMatrix()) { MathStructure m(mstruct); rowsSpin->setValue(m.rows()); columnsSpin->setValue(m.columns()); CALCULATOR->startControl(2000); for(size_t i = 0; i < m.rows(); i++) { for(size_t i2 = 0; i2 < m.columns(); i2++) { m.getElement(i + 1, i2 + 1)->format(po); item = new QTableWidgetItem(QString::fromStdString(m.getElement(i + 1, i2 + 1)->print(po))); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); matrixTable->setItem((int) i, (int) i2, item); } } CALCULATOR->stopControl(); } } void MatrixWidget::setMatrixStrings(const MathStructure &mstruct) { QTableWidgetItem *item; rowsSpin->setValue(mstruct.rows()); columnsSpin->setValue(mstruct.columns()); for(size_t i = 0; i < mstruct.rows(); i++) { for(size_t i2 = 0; i2 < mstruct.columns(); i2++) { item = new QTableWidgetItem(QString::fromStdString(mstruct.getElement(i + 1, i2 + 1)->symbol())); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); matrixTable->setItem((int) i, (int) i2, item); } } } void MatrixWidget::setMatrixString(const QString &str) { if(str.isEmpty()) return; MathStructure m; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&m, CALCULATOR->unlocalizeExpression(str.toStdString(), settings->evalops.parse_options), settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(); setMatrix(m); } bool MatrixWidget::isEmpty() const { for(int r = 0; r < matrixTable->rowCount(); r++) { for(int c = 0; c < matrixTable->columnCount(); c++) { QTableWidgetItem *item = matrixTable->item(r, c); if(item && !item->text().isEmpty()) { return false; } } } return true; } qalculate-qt-5.5.1/src/matrixwidget.h000066400000000000000000000022001475705355700176030ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef MATRIX_WIDGET_H #define MATRIX_WIDGET_H #include #include class QTableWidget; class QSpinBox; class MatrixWidget : public QWidget { Q_OBJECT public: MatrixWidget(QWidget *parent = 0, int r = 8, int c = 8); ~MatrixWidget(); QSize sizeHint() const override; QString getMatrixString() const; void setMatrix(const MathStructure&); void setMatrixStrings(const MathStructure&); void setMatrixString(const QString&); void setEditable(bool); bool isEmpty() const; protected: QSpinBox *rowsSpin, *columnsSpin; QTableWidget *matrixTable; protected slots: void matrixRowsChanged(int); void matrixColumnsChanged(int); signals: void matrixChanged(); void dimensionChanged(int, int); }; #endif //MATRIX_WIDGET_H qalculate-qt-5.5.1/src/percentagecalculationdialog.cpp000066400000000000000000000371541475705355700231620ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "percentagecalculationdialog.h" #define PERCENTAGE_ENTRY_ID "QALCULATE DATA1" PercentageCalculationDialog::PercentageCalculationDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Percentage")); QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Value 1"), this), 0, 0, Qt::AlignRight); value1Edit = new MathLineEdit(this); value1Edit->setAlignment(Qt::AlignRight); grid->addWidget(value1Edit, 0, 1); value1Edit->setProperty(PERCENTAGE_ENTRY_ID, 1); QFontMetrics fm(value1Edit->font()); QString str; str.fill('0', 27); value1Edit->setMinimumWidth(fm.boundingRect(str).width()); grid->addWidget(new QLabel(tr("Value 2"), this), 1, 0, Qt::AlignRight); value2Edit = new MathLineEdit(this); value2Edit->setAlignment(Qt::AlignRight); grid->addWidget(value2Edit, 1, 1); value2Edit->setProperty(PERCENTAGE_ENTRY_ID, 2); grid->addWidget(new QLabel(tr("Change from 1 to 2"), this), 2, 0, Qt::AlignRight); changeEdit = new MathLineEdit(this); changeEdit->setAlignment(Qt::AlignRight); grid->addWidget(changeEdit, 2, 1); changeEdit->setProperty(PERCENTAGE_ENTRY_ID, 4); grid->addWidget(new QLabel(tr("Change from 1 to 2"), this), 3, 0, Qt::AlignRight); change1Edit = new MathLineEdit(this); change1Edit->setAlignment(Qt::AlignRight); grid->addWidget(change1Edit, 3, 1); change1Edit->setProperty(PERCENTAGE_ENTRY_ID, 8); grid->addWidget(new QLabel("%", this), 3, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("Change from 2 to 1"), this), 4, 0, Qt::AlignRight); change2Edit = new MathLineEdit(this); change2Edit->setAlignment(Qt::AlignRight); grid->addWidget(change2Edit, 4, 1); change2Edit->setProperty(PERCENTAGE_ENTRY_ID, 16); grid->addWidget(new QLabel("%", this), 4, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("2 compared to 1"), this), 5, 0, Qt::AlignRight); compare1Edit = new MathLineEdit(this); compare1Edit->setAlignment(Qt::AlignRight); grid->addWidget(compare1Edit, 5, 1); compare1Edit->setProperty(PERCENTAGE_ENTRY_ID, 32); grid->addWidget(new QLabel("%", this), 5, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("1 compared to 2"), this), 6, 0, Qt::AlignRight); compare2Edit = new MathLineEdit(this); compare2Edit->setAlignment(Qt::AlignRight); grid->addWidget(compare2Edit, 6, 1); compare2Edit->setProperty(PERCENTAGE_ENTRY_ID, 64); grid->addWidget(new QLabel("%", this), 6, 2, Qt::AlignRight); value1Edit->setFocus(); QLabel *descr = new QLabel("" + tr("Enter two values, of which at most one is a percentage, and the others will be calculated for you.") + "", this); descr->setWordWrap(true); descr->setContentsMargins(0, 6, 0, 12); grid->addWidget(descr, 7, 0, 1, 3); box->addLayout(grid); box->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); clearButton = buttonBox->addButton(tr("Clear"), QDialogButtonBox::ResetRole); clearButton->setEnabled(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(clearButton, SIGNAL(clicked()), this, SLOT(onClearClicked())); connect(value1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(value2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(changeEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(change1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(change2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(compare1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(compare2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(value1Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(value2Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(changeEdit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(change1Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(change2Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(compare1Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(compare2Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); updating_percentage_entries = false; } PercentageCalculationDialog::~PercentageCalculationDialog() {} void PercentageCalculationDialog::resetValues(const QString &str) { onClearClicked(); if(!str.trimmed().isEmpty()) { value1Edit->setText(str.trimmed()); percentageEntryChanged(value1Edit->property(PERCENTAGE_ENTRY_ID).toInt(), str.trimmed().isEmpty()); } value1Edit->setFocus(); } void PercentageCalculationDialog::onClearClicked() { updating_percentage_entries = true; value1Edit->clear(); value2Edit->clear(); changeEdit->clear(); change1Edit->clear(); change2Edit->clear(); compare1Edit->clear(); compare2Edit->clear(); clearButton->setEnabled(false); value1Edit->setFocus(); percentage_entries_changes.clear(); updating_percentage_entries = false; } void PercentageCalculationDialog::onPercentageEntryEditingFinished() { QLineEdit *entry = qobject_cast(sender()); int id = entry->property(PERCENTAGE_ENTRY_ID).toInt(); QString str1 = entry->text(); EvaluationOptions eo; eo.parse_options = settings->evalops.parse_options; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.read_precision = DONT_READ_PRECISION; eo.parse_options.base = 10; eo.assume_denominators_nonzero = true; eo.warn_about_denominators_assumed_nonzero = false; MathStructure m1(CALCULATOR->parse(CALCULATOR->unlocalizeExpression(str1.toStdString(), eo.parse_options), eo.parse_options)); CALCULATOR->calculate(&m1, 500, eo); PrintOptions po = settings->printops; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; if(id > 4) { po.max_decimals = 2; po.use_max_decimals = true; } entry->blockSignals(true); entry->setText(QString::fromStdString(m1.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m1, 200, po))); entry->blockSignals(false); } void PercentageCalculationDialog::onPercentageEntryChanged(const QString &str) { percentageEntryChanged(qobject_cast(sender())->property(PERCENTAGE_ENTRY_ID).toInt(), str.trimmed().isEmpty()); } void PercentageCalculationDialog::percentageEntryChanged(int entry_id, bool is_empty) { if(updating_percentage_entries) return; for(size_t i = 0; i < percentage_entries_changes.size(); i++) { if(percentage_entries_changes[i] == entry_id) { percentage_entries_changes.erase(percentage_entries_changes.begin() + i); break; } } if(!is_empty) { percentage_entries_changes.push_back(entry_id); updatePercentageEntries(); } clearButton->setEnabled(!percentage_entries_changes.empty()); } void PercentageCalculationDialog::updatePercentageEntries() { if(updating_percentage_entries) return; if(percentage_entries_changes.size() < 2) return; int variant1 = percentage_entries_changes[percentage_entries_changes.size() - 1]; int variant2 = percentage_entries_changes[percentage_entries_changes.size() - 2]; if(variant1 > 4) { for(int i = percentage_entries_changes.size() - 3; i >= 0 && variant2 > 4; i--) { variant2 = percentage_entries_changes[(size_t) i]; } if(variant2 > 4) return; } int variant = variant1 + variant2; updating_percentage_entries = true; MathStructure m1, m2, m3, m4, m5, m6, m7, m1_pre, m2_pre; QString str1, str2; switch(variant) { case 3: {str1 = value1Edit->text(); str2 = value2Edit->text(); break;} case 5: {str1 = value1Edit->text(); str2 = changeEdit->text(); break;} case 9: {str1 = value1Edit->text(); str2 = change1Edit->text(); break;} case 17: {str1 = value1Edit->text(); str2 = change2Edit->text(); break;} case 33: {str1 = value1Edit->text(); str2 = compare1Edit->text(); break;} case 65: {str1 = value1Edit->text(); str2 = compare2Edit->text(); break;} case 6: {str1 = value2Edit->text(); str2 = changeEdit->text(); break;} case 10: {str1 = value2Edit->text(); str2 = change1Edit->text(); break;} case 18: {str1 = value2Edit->text(); str2 = change2Edit->text(); break;} case 34: {str1 = value2Edit->text(); str2 = compare1Edit->text(); break;} case 66: {str1 = value2Edit->text(); str2 = compare2Edit->text(); break;} case 12: {str1 = changeEdit->text(); str2 = change1Edit->text(); break;} case 20: {str1 = changeEdit->text(); str2 = change2Edit->text(); break;} case 36: {str1 = changeEdit->text(); str2 = compare1Edit->text(); break;} case 68: {str1 = changeEdit->text(); str2 = compare2Edit->text(); break;} default: {variant = 0;} } if(str2 == SIGN_MINUS || str1 == SIGN_MINUS) {updating_percentage_entries = false; return;} EvaluationOptions eo; eo.parse_options = settings->evalops.parse_options; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.read_precision = DONT_READ_PRECISION; eo.parse_options.base = 10; eo.assume_denominators_nonzero = true; eo.warn_about_denominators_assumed_nonzero = false; if(variant != 0) { m1_pre.set(CALCULATOR->parse(CALCULATOR->unlocalizeExpression(str1.toStdString(), eo.parse_options), eo.parse_options)); m2_pre.set(CALCULATOR->parse(CALCULATOR->unlocalizeExpression(str2.toStdString(), eo.parse_options), eo.parse_options)); } bool b_divzero = false; MathStructure mtest; if(variant == 17 || variant == 65 || variant == 10 || variant == 34 || variant == 12 || variant == 20 || variant == 36 || variant == 68) { mtest = m2_pre; CALCULATOR->calculate(&mtest, 500, eo); if(!mtest.isNumber()) mtest = m_one; } switch(variant) { case 3: {m1 = m1_pre; m2 = m2_pre; break;} case 5: {m1 = m1_pre; m2 = m2_pre; m2 += m1; break;} case 9: {m1 = m1_pre; m2 = m2_pre; m2 /= 100; m2 += 1; m2 *= m1; break;} case 17: { ComparisonResult cr = mtest.number().compare(-100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m2_pre += 1; m2 = m1; m2 /= m2_pre; break; } case 33: {m1 = m1_pre; m2 = m2_pre; m2 /= 100; m2 *= m1; break;} case 65: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m2 = m1; m2 /= m2_pre; break; } case 6: {m2 = m1_pre; m1 = m1_pre; m1 -= m2_pre; break;} case 10: { ComparisonResult cr = mtest.number().compare(-100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m2 = m1_pre; m2_pre /= 100; m2_pre += 1; m1 = m2; m1 /= m2_pre; break; } case 18: {m2 = m1_pre; m2_pre /= 100; m2_pre += 1; m1 = m2; m1 *= m2_pre; break;} case 34: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m2 = m1_pre; m2_pre /= 100; m1 = m2; m1 /= m2_pre; break; } case 66: {m2 = m1_pre; m2_pre /= 100; m1 = m2; m1 *= m2_pre; break;} case 12: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m1 /= m2_pre; m2 = m1; m2 += m1_pre; break; } case 20: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m1_pre.negate(); m2 = m1_pre; m2_pre /= 100; m2 /= m2_pre; m1 = m2; m1 += m1_pre; break; } case 36: { ComparisonResult cr = mtest.number().compare(100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m2_pre -= 1; m1 /= m2_pre; m2 = m1; m2 += m1_pre; break; } case 68: { ComparisonResult cr = mtest.number().compare(100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m1_pre.negate(); m2 = m1_pre; m2_pre /= 100; m2_pre -= 1; m2 /= m2_pre; m1 = m2; m1 += m1_pre; break; } default: {variant = 0;} } if(b_divzero) { if(variant != 3 && variant != 5 && variant != 9 && variant != 17 && variant != 33 && variant != 65) value1Edit->clear(); if(variant != 3 && variant != 6 && variant != 10 && variant != 18 && variant != 34 && variant != 66) value2Edit->clear(); if(variant != 5 && variant != 6 && variant != 12 && variant != 20 && variant != 36 && variant != 68) changeEdit->clear(); if(variant != 9 && variant != 10 && variant != 12) change1Edit->clear(); if(variant != 17 && variant != 18 && variant != 20) change2Edit->clear(); if(variant != 33 && variant != 34 && variant != 36) compare1Edit->clear(); if(variant != 65 && variant != 66 && variant != 68) compare2Edit->clear(); } else if(variant != 0) { CALCULATOR->calculate(&m1, 500, eo); CALCULATOR->calculate(&m2, 500, eo); m3 = m2; m3 -= m1; m6 = m2; m6 /= m1; m7 = m1; m7 /= m2; m4 = m6; m4 -= 1; m5 = m7; m5 -= 1; m4 *= 100; m5 *= 100; m6 *= 100; m7 *= 100; CALCULATOR->calculate(&m1, 500, eo); CALCULATOR->calculate(&m2, 500, eo); CALCULATOR->calculate(&m3, 500, eo); if(!m1.isZero()) CALCULATOR->calculate(&m4, 500, eo); if(!m2.isZero()) CALCULATOR->calculate(&m5, 500, eo); if(!m1.isZero()) CALCULATOR->calculate(&m6, 500, eo); if(!m2.isZero()) CALCULATOR->calculate(&m7, 500, eo); PrintOptions po = settings->printops; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; if(variant1 != 1) value1Edit->setText(QString::fromStdString(m1.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m1, 200, po))); if(variant1 != 2) value2Edit->setText(QString::fromStdString(m2.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m2, 200, po))); if(variant1 != 4) changeEdit->setText(QString::fromStdString(m3.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m3, 200, po))); po.max_decimals = 2; po.use_max_decimals = true; if(variant1 != 8) change1Edit->setText(m1.isZero() ? QString() : QString::fromStdString(m4.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m4, 200, po))); if(variant1 != 16) change2Edit->setText(m2.isZero() ? QString() : QString::fromStdString(m5.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m5, 200, po))); if(variant1 != 32) compare1Edit->setText(m1.isZero() ? QString() : QString::fromStdString(m6.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m6, 200, po))); if(variant1 != 64) compare2Edit->setText(m2.isZero() ? QString() : QString::fromStdString(m7.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m7, 200, po))); } CALCULATOR->clearMessages(); updating_percentage_entries = false; } qalculate-qt-5.5.1/src/percentagecalculationdialog.h000066400000000000000000000023541475705355700226210ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef PERCENTAGE_CALCULATION_DIALOG_H #define PERCENTAGE_CALCULATION_DIALOG_H #include #include class QPushButton; class QLineEdit; class PercentageCalculationDialog : public QDialog { Q_OBJECT protected: QLineEdit *value1Edit, *value2Edit, *changeEdit, *change1Edit, *change2Edit, *compare1Edit, *compare2Edit; QPushButton *clearButton; void updatePercentageEntries(); void percentageEntryChanged(int, bool = false); std::vector percentage_entries_changes; bool updating_percentage_entries; protected slots: void onPercentageEntryChanged(const QString&); void onPercentageEntryEditingFinished(); void onClearClicked(); public: PercentageCalculationDialog(QWidget *parent = NULL); virtual ~PercentageCalculationDialog(); void resetValues(const QString &str = QString()); }; #endif //PERCENTAGE_CALCULATION_DIALOG_H qalculate-qt-5.5.1/src/periodictabledialog.cpp000066400000000000000000000245731475705355700214350ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "periodictabledialog.h" PeriodicTableDialog::PeriodicTableDialog(QWidget *parent) : QDialog(parent, Qt::Window | Qt::MSWindowsFixedSizeDialogHint) { setWindowTitle(tr("Periodic Table")); QVBoxLayout *topbox = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); topbox->addLayout(grid); grid->setSpacing(3); QFontMetrics fm(font()); QSize size = fm.boundingRect("AB").size(); size.setWidth(size.width() * 2); size.setHeight(size.height() * 2); for(int i = 1; i <= 18; i++) { QLabel *label = new QLabel(QString::number(i), this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 0, i > 2 ? i + 1 : i, Qt::AlignCenter); } for(int i = 1; i <= 7; i++) { QLabel *label = new QLabel(QString::number(i), this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, i, 0, Qt::AlignCenter); } QLabel *label = new QLabel("*", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 6, 3, Qt::AlignCenter); label = new QLabel("**", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 7, 3, Qt::AlignCenter); label = new QLabel("*", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 9, 3, Qt::AlignCenter); label = new QLabel("**", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 10, 3, Qt::AlignCenter); DataSet *dc = CALCULATOR->getDataSet("atom"); if(dc) { DataProperty *p_xpos = dc->getProperty("x_pos"); DataProperty *p_ypos = dc->getProperty("y_pos"); DataProperty *p_weight = dc->getProperty("weight"); DataProperty *p_number = dc->getProperty("number"); DataProperty *p_symbol = dc->getProperty("symbol"); DataProperty *p_class = dc->getProperty("class"); DataProperty *p_name = dc->getProperty("name"); if(p_xpos && p_ypos && p_weight && p_number && p_symbol && p_class && p_name) { int x_pos = 0, y_pos = 0; for(int i = 1; i < 120; i++) { DataObject *e = dc->getObject(i2s(i)); if(e) { x_pos = s2i(e->getProperty(p_xpos)); y_pos = s2i(e->getProperty(p_ypos)); } if(e && x_pos > 0 && x_pos <= 18 && y_pos > 0 && y_pos <= 10) { QPushButton *e_button = new QPushButton(QString::fromStdString(e->getProperty(p_symbol)), this); e_button->setFlat(true); int group = s2i(e->getProperty(p_class)); if(group > 0 && group <= 11) { QPalette pal = e_button->palette(); switch(group) { case 1: {pal.setColor(QPalette::Button, QColor("#eeccee")); break;} case 2: {pal.setColor(QPalette::Button, QColor("#ddccee")); break;} case 3: {pal.setColor(QPalette::Button, QColor("#ccddff")); break;} case 4: {pal.setColor(QPalette::Button, QColor("#ddeeff")); break;} case 5: {pal.setColor(QPalette::Button, QColor("#cceeee")); break;} case 6: {pal.setColor(QPalette::Button, QColor("#bbffbb")); break;} case 7: {pal.setColor(QPalette::Button, QColor("#eeffdd")); break;} case 8: {pal.setColor(QPalette::Button, QColor("#ffffaa")); break;} case 9: {pal.setColor(QPalette::Button, QColor("#ffddaa")); break;} case 10: {pal.setColor(QPalette::Button, QColor("#ffccdd")); break;} case 11: {pal.setColor(QPalette::Button, QColor("#aaeedd")); break;} default: {} } pal.setColor(QPalette::ButtonText, QColor("#000000")); pal.setColor(QPalette::Text, QColor("#000000")); pal.setColor(QPalette::WindowText, QColor("#000000")); e_button->setAutoFillBackground(true); e_button->setPalette(pal); e_button->update(); } if(x_pos > 2) { grid->addWidget(e_button, y_pos, x_pos + 1); } else { grid->addWidget(e_button, y_pos, x_pos); } std::string tip = e->getProperty(p_number); tip += " "; tip += e->getProperty(p_name); std::string weight = e->getPropertyDisplayString(p_weight); if(!weight.empty() && weight != "-") { tip += "\n"; tip += weight; } e_button->setToolTip(QString::fromStdString(tip)); e_button->setProperty("ELEMENT OBJECT", QVariant::fromValue((void*) e)); if(i == 1) { QMargins margins = e_button->contentsMargins(); if(margins.left() + margins.right() > size.width() / 2 - 3) { size.setWidth(size.width() / 2 + 4 + margins.left() + margins.right()); } if(margins.bottom() + margins.top() > size.height() / 2 - 3) { size.setWidth(size.height() / 2 + 4 + margins.bottom() + margins.top()); } } e_button->setMinimumSize(size); e_button->setMaximumSize(size); connect(e_button, SIGNAL(clicked()), this, SLOT(elementClicked())); } } } } for(int i = 0; i < 20; i++) { grid->setColumnStretch(i, 1); } for(int i = 0; i < 10; i++) { grid->setRowStretch(i, 1); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); buttonBox->setFocus(); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); layout()->setSizeConstraint(QLayout::SetFixedSize); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } PeriodicTableDialog::~PeriodicTableDialog() {} void PeriodicTableDialog::reject() { for(QMap::const_iterator it = elementDialogs.constBegin(); it != elementDialogs.constEnd(); ++it) { (*it)->reject(); } QDialog::reject(); } void PeriodicTableDialog::onAlwaysOnTopChanged() { if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); else setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); for(QMap::const_iterator it = elementDialogs.constBegin(); it != elementDialogs.constEnd(); ++it) { if(settings->always_on_top) (*it)->setWindowFlags((*it)->windowFlags() | Qt::WindowStaysOnTopHint); else (*it)->setWindowFlags((*it)->windowFlags() & ~Qt::WindowStaysOnTopHint); } } void PeriodicTableDialog::elementClicked() { DataObject *e = (DataObject*) sender()->property("ELEMENT OBJECT").value(); QMap::const_iterator qit = elementDialogs.find(e); if(qit != elementDialogs.constEnd()) { (*qit)->show(); qApp->processEvents(); (*qit)->raise(); (*qit)->activateWindow(); return; } QDialog *dialog = new QDialog(this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); dialog->setWindowTitle(tr("Element Data")); QVBoxLayout *topbox = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); topbox->addLayout(grid); DataSet *ds = e->parentSet(); DataProperty *p_number = ds->getProperty("number"); DataProperty *p_symbol = ds->getProperty("symbol"); DataProperty *p_class = ds->getProperty("class"); DataProperty *p_name = ds->getProperty("name"); int group = s2i(e->getProperty(p_class)); QString group_name; switch(group) { case ALKALI_METALS: {group_name = tr("Alkali Metal"); break;} case ALKALI_EARTH_METALS: {group_name = tr("Alkaline-Earth Metal"); break;} case LANTHANIDES: {group_name = tr("Lanthanide"); break;} case ACTINIDES: {group_name = tr("Actinide"); break;} case TRANSITION_METALS: {group_name = tr("Transition Metal"); break;} case METALS: {group_name = tr("Metal"); break;} case METALLOIDS: {group_name = tr("Metalloid"); break;} case NONMETALS: {group_name = tr("Polyatomic Non-Metal"); break;} case HALOGENS: {group_name = tr("Diatomic Non-Metal"); break;} case NOBLE_GASES: {group_name = tr("Noble Gas"); break;} case TRANSACTINIDES: {group_name = tr("Unknown chemical properties"); break;} default: {group_name = tr("Unknown"); break;} } grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(QString::fromStdString(e->getProperty(p_number))), dialog), 0, 0, 1, 3, Qt::AlignRight); grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(QString::fromStdString(e->getProperty(p_symbol))), dialog), 1, 0, 1, 3); grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(QString::fromStdString(e->getProperty(p_name))), dialog), 2, 0, 1, 3); grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(tr("%1:").arg(QString::fromStdString(p_class->title()))), dialog), 3, 0); grid->addWidget(new QLabel(group_name, dialog), 3, 1); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int row = 4; while(dp) { if(!dp->isHidden() && dp != p_number && dp != p_class && dp != p_symbol && dp != p_name) { std::string sval = e->getPropertyDisplayString(dp); if(!sval.empty()) { grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(tr("%1:").arg(QString::fromStdString(dp->title()))), dialog), row, 0); grid->addWidget(new QLabel(QString::fromStdString(sval), dialog), row, 1); QPushButton *button = new QPushButton(LOAD_ICON("edit-paste"), QString(), dialog); grid->addWidget(button, row, 2); button->setProperty("ELEMENT OBJECT", QVariant::fromValue((void*) e)); button->setProperty("ELEMENT PROPERTY", QVariant::fromValue((void*) dp)); connect(button, SIGNAL(clicked()), this, SLOT(propertyClicked())); row++; } } dp = ds->getNextProperty(&it); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, dialog); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), dialog, SLOT(reject())); dialog->layout()->setSizeConstraint(QLayout::SetFixedSize); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); elementDialogs[e] = dialog; dialog->show(); } void PeriodicTableDialog::propertyClicked() { emit insertPropertyRequest((DataObject*) sender()->property("ELEMENT OBJECT").value(), (DataProperty*) sender()->property("ELEMENT PROPERTY").value()); } qalculate-qt-5.5.1/src/periodictabledialog.h000066400000000000000000000016761475705355700211010ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef PERIODIC_TABLE_DIALOG_H #define PERIODIC_TABLE_DIALOG_H #include #include #include class PeriodicTableDialog : public QDialog { Q_OBJECT protected: QMap elementDialogs; protected slots: void elementClicked(); void propertyClicked(); public slots: void reject() override; void onAlwaysOnTopChanged(); public: PeriodicTableDialog(QWidget *parent = NULL); virtual ~PeriodicTableDialog(); signals: void insertPropertyRequest(DataObject*, DataProperty*); }; #endif //PERIODIC_TABLE_DIALOG_H qalculate-qt-5.5.1/src/plotdialog.cpp000066400000000000000000000653351475705355700176060ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "plotdialog.h" #define TYPE_ROLE Qt::UserRole #define YAXIS2_ROLE Qt::UserRole + 1 #define STYLE_ROLE Qt::UserRole + 2 #define SMOOTHING_ROLE Qt::UserRole + 3 #define ROWS_ROLE Qt::UserRole + 4 #define YVECTOR_ROLE Qt::UserRole + 5 #define XVECTOR_ROLE Qt::UserRole + 6 #define X_ROLE Qt::UserRole + 7 PlotDialog::PlotDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Plot")); QVBoxLayout *topbox = new QVBoxLayout(this); tabs = new QTabWidget(this); topbox->addWidget(tabs); QWidget *tab; QGridLayout *grid; QHBoxLayout *hbox; QButtonGroup *group; int r = 0; plotThread = NULL; tab = new QWidget(this); tabs->addTab(tab, tr("Data")); grid = new QGridLayout(tab); grid->addWidget(new QLabel(tr("Title:")), r, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, r, 1); r++; grid->addWidget(new QLabel(tr("Expression:")), r, 0); expressionEdit = new MathLineEdit(this); grid->addWidget(expressionEdit, r, 1); r++; connect(expressionEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableDisableButtons())); connect(expressionEdit, SIGNAL(returnPressed()), this, SLOT(onExpressionActivated())); hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 0, 1, 2); r++; hbox->addStretch(1); group = new QButtonGroup(this); functionButton = new QRadioButton(tr("Function"), this); group->addButton(functionButton, 0); hbox->addWidget(functionButton); vectorButton = new QRadioButton(tr("Vector/matrix"), this); group->addButton(vectorButton, 1); hbox->addWidget(vectorButton); pairedButton = new QRadioButton(tr("Paired matrix"), this); group->addButton(pairedButton, 2); hbox->addWidget(pairedButton); group->button(settings->default_plot_type)->setChecked(true); connect(group, SIGNAL(buttonToggled(QAbstractButton*, bool)), this, SLOT(onTypeToggled(QAbstractButton*, bool))); rowsBox = new QCheckBox(tr("Rows"), this); hbox->addWidget(rowsBox); rowsBox->setChecked(settings->default_plot_rows); rowsBox->setEnabled(settings->default_plot_type > 0); grid->addWidget(new QLabel(tr("X variable:")), r, 0); variableEdit = new QLineEdit(this); grid->addWidget(variableEdit, r, 1); r++; variableEdit->setText(QString::fromStdString(settings->default_plot_variable)); variableEdit->setEnabled(settings->default_plot_type == 0); connect(variableEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableDisableButtons())); grid->addWidget(new QLabel(tr("Style:")), r, 0); styleCombo = new QComboBox(this); grid->addWidget(styleCombo, r, 1); r++; styleCombo->addItem(tr("Line"), PLOT_STYLE_LINES); styleCombo->addItem(tr("Points"), PLOT_STYLE_POINTS); styleCombo->addItem(tr("Line with points"), PLOT_STYLE_POINTS_LINES); styleCombo->addItem(tr("Boxes/bars"), PLOT_STYLE_BOXES); styleCombo->addItem(tr("Histogram"), PLOT_STYLE_HISTOGRAM); styleCombo->addItem(tr("Steps"), PLOT_STYLE_STEPS); styleCombo->addItem(tr("Candlesticks"), PLOT_STYLE_CANDLESTICKS); styleCombo->addItem(tr("Dots"), PLOT_STYLE_DOTS); styleCombo->addItem(tr("Polar"), PLOT_STYLE_POLAR); styleCombo->setCurrentIndex(styleCombo->findData(settings->default_plot_style)); grid->addWidget(new QLabel(tr("Smoothing:")), r, 0); smoothingCombo = new QComboBox(this); grid->addWidget(smoothingCombo, r, 1); r++; smoothingCombo->addItem(tr("None"), PLOT_SMOOTHING_NONE); smoothingCombo->addItem(tr("Monotonic"), PLOT_SMOOTHING_UNIQUE); smoothingCombo->addItem(tr("Natural cubic splines"), PLOT_SMOOTHING_CSPLINES); smoothingCombo->addItem(tr("Bezier"), PLOT_SMOOTHING_BEZIER); smoothingCombo->addItem(tr("Bezier (monotonic)"), PLOT_SMOOTHING_SBEZIER); smoothingCombo->setCurrentIndex(smoothingCombo->findData(settings->default_plot_smoothing)); grid->addWidget(new QLabel(tr("Y-axis:")), r, 0); hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 1); r++; group = new QButtonGroup(this); primaryButton = new QRadioButton(tr("Primary"), this); group->addButton(primaryButton); hbox->addWidget(primaryButton); secondaryButton = new QRadioButton(tr("Secondary"), this); group->addButton(secondaryButton); hbox->addWidget(secondaryButton); primaryButton->setChecked(true); hbox->addStretch(1); hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 0, 1, 2); r++; hbox->addStretch(1); addButton = new QPushButton(tr("Add"), this); hbox->addWidget(addButton); addButton->setEnabled(false); connect(addButton, SIGNAL(clicked()), this, SLOT(onAddClicked())); applyButton = new QPushButton(tr("Apply"), this); hbox->addWidget(applyButton); applyButton->setEnabled(false); connect(applyButton, SIGNAL(clicked()), this, SLOT(onApplyClicked())); removeButton = new QPushButton(tr("Remove"), this); hbox->addWidget(removeButton); removeButton->setEnabled(false); connect(removeButton, SIGNAL(clicked()), this, SLOT(onRemoveClicked())); graphsTable = new QTreeWidget(this); grid->addWidget(graphsTable, r, 0, 1, 2); grid->setRowStretch(r, 1); r++; graphsTable->setSelectionMode(QAbstractItemView::ExtendedSelection); graphsTable->setColumnCount(2); QStringList list; list << tr("Title"); list << tr("Expression"); graphsTable->setHeaderLabels(list); graphsTable->setRootIsDecorated(false); connect(graphsTable, SIGNAL(itemSelectionChanged()), this, SLOT(onGraphsSelectionChanged())); tab = new QWidget(this); tabs->addTab(tab, tr("Function Range")); grid = new QGridLayout(tab); r = 0; grid->addWidget(new QLabel(tr("Minimum x value:")), r, 0); minxEdit = new MathLineEdit(this); grid->addWidget(minxEdit, r, 1); r++; minxEdit->setText(QString::fromStdString(settings->default_plot_min)); grid->addWidget(new QLabel(tr("Maximum x value:")), r, 0); maxxEdit = new MathLineEdit(this); grid->addWidget(maxxEdit, r, 1); r++; maxxEdit->setText(QString::fromStdString(settings->default_plot_max)); group = new QButtonGroup(this); rateButton = new QRadioButton(tr("Sampling rate:"), this); group->addButton(rateButton, 0); grid->addWidget(rateButton, r, 0); rateSpin = new QSpinBox(this); grid->addWidget(rateSpin, r, 1); r++; rateSpin->setRange(1, INT_MAX); rateSpin->setValue(settings->default_plot_sampling_rate); rateButton->setChecked(settings->default_plot_use_sampling_rate); rateSpin->setEnabled(settings->default_plot_use_sampling_rate); stepButton = new QRadioButton(tr("Step size:"), this); group->addButton(stepButton, 1); grid->addWidget(stepButton, r, 0); stepEdit = new MathLineEdit(this); grid->addWidget(stepEdit, r, 1); r++; stepEdit->setText(QString::fromStdString(settings->default_plot_step)); stepButton->setChecked(!settings->default_plot_use_sampling_rate); stepEdit->setEnabled(!settings->default_plot_use_sampling_rate); complexBox = new QCheckBox(tr("Show real and imaginary parts"), this); grid->addWidget(complexBox, r, 0, 1, 2); complexBox->setChecked(settings->default_plot_complex); r++; connect(complexBox, SIGNAL(clicked(bool)), this, SLOT(onComplexClicked(bool))); connect(group, SIGNAL(buttonToggled(QAbstractButton*, bool)), this, SLOT(onRateStepToggled(QAbstractButton*, bool))); applyButton2 = new QPushButton(tr("Apply"), this); grid->addWidget(applyButton2, r, 0, 1, 2, Qt::AlignRight | Qt::AlignTop); grid->setRowStretch(r, 1); connect(applyButton2, SIGNAL(clicked()), this, SLOT(onApply2Clicked())); tab = new QWidget(this); tabs->addTab(tab, tr("Appearance")); grid = new QGridLayout(tab); r = 0; grid->addWidget(new QLabel(tr("Title:")), r, 0); titleEdit2 = new QLineEdit(this); grid->addWidget(titleEdit2, r, 1); r++; gridBox = new QCheckBox(tr("Display grid"), this); grid->addWidget(gridBox, r, 0); gridBox->setChecked(settings->default_plot_display_grid); borderBox = new QCheckBox(tr("Display full border"), this); grid->addWidget(borderBox, r, 1); r++; borderBox->setChecked(settings->default_plot_full_border); minyBox = new QCheckBox(tr("Minimum y value:"), this); grid->addWidget(minyBox, r, 0); minySpin = new QSpinBox(this); grid->addWidget(minySpin, r, 1); r++; minySpin->setEnabled(false); minySpin->setRange(INT_MIN, INT_MAX); minySpin->setValue(-1); connect(minyBox, SIGNAL(toggled(bool)), minySpin, SLOT(setEnabled(bool))); maxyBox = new QCheckBox(tr("Maximum y value:"), this); grid->addWidget(maxyBox, r, 0); maxySpin = new QSpinBox(this); grid->addWidget(maxySpin, r, 1); r++; maxySpin->setEnabled(false); maxySpin->setRange(INT_MIN, INT_MAX); maxySpin->setValue(10); connect(maxyBox, SIGNAL(toggled(bool)), maxySpin, SLOT(setEnabled(bool))); logxBox = new QCheckBox(tr("Logarithmic x scale:"), this); grid->addWidget(logxBox, r, 0); logxSpin = new QSpinBox(this); grid->addWidget(logxSpin, r, 1); r++; logxSpin->setRange(2, 100); logxSpin->setValue(10); logxSpin->setEnabled(false); connect(logxBox, SIGNAL(toggled(bool)), logxSpin, SLOT(setEnabled(bool))); logyBox = new QCheckBox(tr("Logarithmic y scale:"), this); grid->addWidget(logyBox, r, 0); logySpin = new QSpinBox(this); grid->addWidget(logySpin, r, 1); r++; logySpin->setRange(2, 100); logySpin->setValue(10); logySpin->setEnabled(false); connect(logyBox, SIGNAL(toggled(bool)), logySpin, SLOT(setEnabled(bool))); grid->addWidget(new QLabel(tr("X-axis label:")), r, 0); xaxisEdit = new QLineEdit(this); grid->addWidget(xaxisEdit, r, 1); r++; grid->addWidget(new QLabel(tr("Y-axis label:")), r, 0); yaxisEdit = new QLineEdit(this); grid->addWidget(yaxisEdit, r, 1); r++; grid->addWidget(new QLabel(tr("Line width:")), r, 0); lineSpin = new QSpinBox(this); grid->addWidget(lineSpin, r, 1); r++; lineSpin->setRange(1, 10); lineSpin->setValue(settings->default_plot_linewidth); grid->addWidget(new QLabel(tr("Legend placement:")), r, 0); legendCombo = new QComboBox(this); grid->addWidget(legendCombo, r, 1); r++; legendCombo->addItem(tr("None"), PLOT_LEGEND_NONE); legendCombo->addItem(tr("Top-left"), PLOT_LEGEND_TOP_LEFT); legendCombo->addItem(tr("Top-right"), PLOT_LEGEND_TOP_RIGHT); legendCombo->addItem(tr("Bottom-left"), PLOT_LEGEND_BOTTOM_LEFT); legendCombo->addItem(tr("Bottom-right"), PLOT_LEGEND_BOTTOM_RIGHT); legendCombo->addItem(tr("Below"), PLOT_LEGEND_BELOW); legendCombo->addItem(tr("Outside"), PLOT_LEGEND_OUTSIDE); legendCombo->setCurrentIndex(legendCombo->findData(settings->default_plot_legend_placement)); applyButton3 = new QPushButton(tr("Apply"), this); grid->addWidget(applyButton3, r, 0, 1, 2, Qt::AlignRight | Qt::AlignTop); grid->setRowStretch(r, 1); connect(applyButton3, SIGNAL(clicked()), this, SLOT(onApply3Clicked())); expressionEdit->setFocus(); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); } PlotDialog::~PlotDialog() {} void PlotDialog::reject() { resetParameters(); settings->default_plot_legend_placement = (PlotLegendPlacement) legendCombo->currentData().toInt(); settings->default_plot_smoothing = (PlotSmoothing) smoothingCombo->currentData().toInt(); settings->default_plot_style = (PlotStyle) styleCombo->currentData().toInt(); settings->default_plot_display_grid = gridBox->isChecked(); settings->default_plot_full_border = borderBox->isChecked(); settings->default_plot_min = minxEdit->text().toStdString(); settings->default_plot_max = maxxEdit->text().toStdString(); settings->default_plot_step = stepEdit->text().toStdString(); settings->default_plot_sampling_rate = rateSpin->value(); settings->default_plot_linewidth = lineSpin->value(); settings->default_plot_rows = rowsBox->isChecked(); settings->default_plot_type = (vectorButton->isChecked() ? 1 : (pairedButton->isChecked() ? 2 : 0)); settings->default_plot_variable = variableEdit->text().toStdString(); settings->default_plot_use_sampling_rate = rateButton->isChecked(); CALCULATOR->closeGnuplot(); if(plotThread && plotThread->running) { plotThread->write(0); } QDialog::reject(); } void PlotDialog::resetParameters() { expressionEdit->clear(); titleEdit->clear(); titleEdit2->clear(); xaxisEdit->clear(); yaxisEdit->clear(); graphsTable->clear(); addButton->setEnabled(false); removeButton->setEnabled(false); applyButton->setEnabled(false); primaryButton->setChecked(true); } void PlotDialog::enableDisableButtons() { bool b = (!functionButton->isChecked() || !variableEdit->text().trimmed().isEmpty()) && !expressionEdit->text().trimmed().isEmpty(); addButton->setEnabled(b); QList list = graphsTable->selectedItems(); removeButton->setEnabled(list.count() >= 1); applyButton->setEnabled(b && list.count() == 1); } void PlotDialog::setExpression(const QString &str) { expressionEdit->setText(str); expressionEdit->setFocus(); expressionEdit->selectAll(); } void PlotDialog::onExpressionActivated() { if(applyButton->isEnabled()) onApplyClicked(); else if(addButton->isEnabled()) onAddClicked(); } void PlotDialog::onAddClicked() { QTreeWidgetItem *item = new QTreeWidgetItem(graphsTable); updateItem(item); graphsTable->selectionModel()->clear(); item->setSelected(true); expressionEdit->setFocus(); expressionEdit->selectAll(); updatePlot(); } std::string plot_min, plot_max, plot_x, plot_str, plot_step; int plot_rate; bool plot_busy; int plot_complex; std::vector y_vectors; std::vector x_vectors; std::vector pdps; PlotParameters pp; void PlotDialog::abort() { CALCULATOR->abort(); } class PlotThread : public Thread { protected: void run() { while(true) { EvaluationOptions eo; eo.approximation = APPROXIMATION_APPROXIMATE; eo.parse_options = settings->evalops.parse_options; eo.parse_options.base = 10; eo.parse_options.read_precision = DONT_READ_PRECISION; int type = -1; if(!read(&type) || type <= 0) return; if(type == 2) { CALCULATOR->startControl(); CALCULATOR->plotVectors(&pp, y_vectors, x_vectors, pdps, false, 0); CALCULATOR->stopControl(); } else { void *x = NULL; if(!read(&x) || !x) return; MathStructure *y_vector = (MathStructure*) x; if(!read(&x)) return; CALCULATOR->beginTemporaryStopIntervalArithmetic(); CALCULATOR->startControl(); if(!x) { y_vector->set(CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_str, eo.parse_options), eo)); } else { MathStructure *x_vector = (MathStructure*) x; MathStructure min = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_min, eo.parse_options), eo); MathStructure max = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_max, eo.parse_options), eo); if(plot_rate < 0) { MathStructure m_step = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_step, eo.parse_options), eo); if(!CALCULATOR->aborted()) { y_vector->set(CALCULATOR->expressionToPlotVector(CALCULATOR->unlocalizeExpression(plot_str, eo.parse_options), min, max, m_step, plot_complex >= 0 ? plot_complex : settings->evalops.allow_complex, x_vector, plot_x, eo.parse_options, 0)); } } else if(!CALCULATOR->aborted()) { y_vector->set(CALCULATOR->expressionToPlotVector(CALCULATOR->unlocalizeExpression(plot_str, eo.parse_options), min, max, plot_rate, plot_complex, x_vector, plot_x, eo.parse_options, 0)); } } CALCULATOR->stopControl(); CALCULATOR->endTemporaryStopIntervalArithmetic(); } plot_busy = false; } } }; void PlotDialog::generatePlotSeries(MathStructure **x_vector, MathStructure **y_vector, int type, QString str, QString str_x) { *y_vector = new MathStructure(); plot_str = str.toStdString(); plot_x = str_x.toStdString(); if(type == 1 || type == 2) { *x_vector = NULL; } else { *x_vector = new MathStructure(); (*x_vector)->clearVector(); plot_min = minxEdit->text().toStdString(); plot_max = maxxEdit->text().toStdString(); if(stepButton->isChecked()) { plot_rate = -1; plot_step = stepEdit->text().toStdString(); } else { plot_rate = rateSpin->value(); } plot_complex = settings->default_plot_complex; } plot_busy = true; if(!plotThread) plotThread = new PlotThread; if(!plotThread->running) plotThread->start(); if(plotThread->write(1) && plotThread->write((void*) *y_vector) && plotThread->write((void*) *x_vector)) { QProgressDialog *dialog = NULL; int i = 0; while(plot_busy && plotThread->running && i < 100) { sleep_ms(10); i++; } i = 0; if(plot_busy && plotThread->running) { dialog = new QProgressDialog(tr("Calculating…"), tr("Cancel"), 0, 0, this); dialog->setWindowTitle(tr("Calculating…")); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); } while(plot_busy && plotThread->running) { qApp->processEvents(); sleep_ms(100); } if(dialog) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); } } settings->displayMessages(this); } bool PlotDialog::generatePlot() { for(int i = 0; ; i++) { QTreeWidgetItem *item = graphsTable->topLevelItem(i); if(!item) { if(i == 0) return false; break; } MathStructure *x_vector = (MathStructure*) item->data(0, XVECTOR_ROLE).value(); MathStructure *y_vector = (MathStructure*) item->data(0, YVECTOR_ROLE).value(); std::string title = item->text(0).toStdString(); std::string expr = item->text(1).toStdString(); int type = item->data(0, TYPE_ROLE).toInt(); int style = item->data(0, STYLE_ROLE).toInt(); int smoothing = item->data(0, SMOOTHING_ROLE).toInt(); bool yaxis2 = item->data(0, YAXIS2_ROLE).toBool(); bool rows = item->data(0, ROWS_ROLE).toBool(); int count = 1; if(type == 1) { if(y_vector->isMatrix()) { count = 0; if(rows) { for(size_t i = 1; i <= y_vector->rows(); i++) { y_vectors.push_back(m_undefined); y_vector->rowToVector(i, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); count++; } } else { for(size_t i = 1; i <= y_vector->columns(); i++) { y_vectors.push_back(m_undefined); y_vector->columnToVector(i, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); count++; } } } else if(y_vector->isVector()) { y_vectors.push_back(*y_vector); x_vectors.push_back(m_undefined); } else { y_vectors.push_back(*y_vector); y_vectors[y_vectors.size() - 1].transform(STRUCT_VECTOR); x_vectors.push_back(m_undefined); } } else if(type == 2) { if(y_vector->isMatrix()) { count = 0; if(rows) { for(size_t i = 1; i <= y_vector->rows(); i += 2) { y_vectors.push_back(m_undefined); y_vector->rowToVector(i + 1, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); y_vector->rowToVector(i, x_vectors[x_vectors.size() - 1]); count++; } } else { for(size_t i = 1; i <= y_vector->columns(); i += 2) { y_vectors.push_back(m_undefined); y_vector->columnToVector(i + 1, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); y_vector->columnToVector(i, x_vectors[x_vectors.size() - 1]); count++; } } } else if(y_vector->isVector()) { y_vectors.push_back(*y_vector); x_vectors.push_back(m_undefined); } else { y_vectors.push_back(*y_vector); y_vectors[y_vectors.size() - 1].transform(STRUCT_VECTOR); x_vectors.push_back(m_undefined); } } else { y_vectors.push_back(*y_vector); x_vectors.push_back(*x_vector); } for(int i = 0; i < count; i++) { PlotDataParameters *pdp = new PlotDataParameters(); pdp->title = title; if(pdp->title.empty()) { pdp->title = expr; } if(count > 1) { pdp->title += " :"; pdp->title += i2s(i + 1); } pdp->test_continuous = (type != 1 && type != 2); pdp->smoothing = (PlotSmoothing) smoothing; pdp->style = (PlotStyle) style; pdp->yaxis2 = yaxis2; pdps.push_back(pdp); } } pp.legend_placement = (PlotLegendPlacement) legendCombo->currentData().toInt(); pp.title = titleEdit2->text().toStdString(); pp.x_label = xaxisEdit->text().toStdString(); pp.y_label = yaxisEdit->text().toStdString(); pp.grid = gridBox->isChecked(); pp.x_log = logxBox->isChecked(); pp.y_log = logyBox->isChecked(); pp.x_log_base = logxSpin->value(); pp.y_log_base = logySpin->value(); pp.auto_y_min = !minyBox->isChecked(); pp.auto_y_max = !maxyBox->isChecked(); pp.y_min = minySpin->value(); pp.y_max = maxySpin->value(); pp.color = settings->default_plot_color; pp.show_all_borders = borderBox->isChecked(); pp.linewidth = lineSpin->value(); return true; } void PlotDialog::updatePlot() { if(!generatePlot()) { CALCULATOR->closeGnuplot(); return; } plot_busy = true; if(!plotThread) plotThread = new PlotThread; if(!plotThread->running) plotThread->start(); if(plotThread->write(2)) { QProgressDialog *dialog = NULL; int i = 0; while(plot_busy && plotThread->running && i < 100) { sleep_ms(10); i++; } i = 0; if(plot_busy && plotThread->running) { dialog = new QProgressDialog(tr("Processing…"), tr("Cancel"), 0, 0, this); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); } while(plot_busy && plotThread->running) { qApp->processEvents(); sleep_ms(100); } if(dialog) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); } } settings->displayMessages(this); for(size_t i = 0; i < pdps.size(); i++) { if(pdps[i]) delete pdps[i]; } pdps.clear(); x_vectors.clear(); y_vectors.clear(); } void PlotDialog::updateItem(QTreeWidgetItem *item) { int type = (vectorButton->isChecked() ? 1 : (pairedButton->isChecked() ? 2 : 0)); QString expression = expressionEdit->text().trimmed(); QString title = titleEdit->text().trimmed(); QString str_x = variableEdit->text().trimmed(); if((type == 1 || type == 2) && title.isEmpty()) { Variable *v = CALCULATOR->getActiveVariable(expression.toStdString()); if(v) { title = QString::fromStdString(v->title(false)); } } MathStructure *x_vector, *y_vector; generatePlotSeries(&x_vector, &y_vector, type, expression, str_x); bool b_multiple = (type != 1 && type != 2 && y_vector->isMatrix() && expression != item->text(1)); MathStructure mfunc; if(b_multiple) { EvaluationOptions eo; eo.approximation = APPROXIMATION_APPROXIMATE; eo.parse_options = settings->evalops.parse_options; eo.parse_options.base = 10; eo.parse_options.read_precision = DONT_READ_PRECISION; eo.interval_calculation = INTERVAL_CALCULATION_NONE; mfunc = CALCULATOR->parse(expression.toStdString(), eo.parse_options); if(!mfunc.isVector()) { CALCULATOR->beginTemporaryStopIntervalArithmetic(); CALCULATOR->beginTemporaryStopMessages(); mfunc.eval(eo); CALCULATOR->endTemporaryStopMessages(); CALCULATOR->endTemporaryStopIntervalArithmetic(); if(!mfunc.isVector() || mfunc.size() != y_vector->columns()) b_multiple = false; } } PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) expressionEdit; po.base = 10; po.is_approximate = NULL; po.allow_non_usable = false; for(size_t i = 0; ; i++) { if(b_multiple) { MathStructure *m = new MathStructure(); y_vector->columnToVector(i + 1, *m); item->setData(0, YVECTOR_ROLE, QVariant::fromValue((void*) m)); item->setData(0, XVECTOR_ROLE, QVariant::fromValue((void*) new MathStructure(*x_vector))); QString str = QString::fromStdString(mfunc[i].print(po)); item->setText(1, str); if(i == 0) expressionEdit->setText(str); } else { item->setData(0, YVECTOR_ROLE, QVariant::fromValue((void*) y_vector)); item->setData(0, XVECTOR_ROLE, QVariant::fromValue((void*) x_vector)); item->setText(1, expression); } item->setData(0, TYPE_ROLE, type); item->setData(0, YAXIS2_ROLE, secondaryButton->isChecked()); item->setData(0, ROWS_ROLE, rowsBox->isChecked()); item->setData(0, SMOOTHING_ROLE, smoothingCombo->currentData()); item->setData(0, STYLE_ROLE, styleCombo->currentData()); item->setData(0, X_ROLE, str_x); item->setText(0, title); item->setTextAlignment(1, Qt::AlignRight | Qt::AlignVCenter); if(!b_multiple || i + 1 >= y_vector->columns()) break; item = new QTreeWidgetItem(graphsTable); } if(b_multiple) { delete y_vector; delete x_vector; } } void PlotDialog::onApplyClicked() { QList list = graphsTable->selectedItems(); if(list.count() != 1) return; MathStructure *x_vector = (MathStructure*) list[0]->data(0, XVECTOR_ROLE).value(); if(x_vector) delete x_vector; MathStructure *y_vector = (MathStructure*) list[0]->data(0, YVECTOR_ROLE).value(); if(y_vector) delete y_vector; updateItem(list[0]); expressionEdit->setFocus(); expressionEdit->selectAll(); updatePlot(); } void PlotDialog::onRemoveClicked() { QList list = graphsTable->selectedItems(); for(int i = 0; i < list.count(); i++) { MathStructure *x_vector = (MathStructure*) list[i]->data(0, XVECTOR_ROLE).value(); if(x_vector) delete x_vector; MathStructure *y_vector = (MathStructure*) list[i]->data(0, YVECTOR_ROLE).value(); if(y_vector) delete y_vector; delete list[i]; } updatePlot(); } void PlotDialog::onComplexClicked(bool b) { settings->default_plot_complex = b; } void PlotDialog::onApply2Clicked() { for(int i = 0; ; i++) { QTreeWidgetItem *item = graphsTable->topLevelItem(i); if(!item) break; MathStructure *x_vector = (MathStructure*) item->data(0, XVECTOR_ROLE).value(); if(x_vector) delete x_vector; MathStructure *y_vector = (MathStructure*) item->data(0, YVECTOR_ROLE).value(); if(y_vector) delete y_vector; generatePlotSeries(&x_vector, &y_vector, item->data(0, TYPE_ROLE).toInt(), item->text(1), item->data(0, X_ROLE).toString()); item->setData(0, YVECTOR_ROLE, QVariant::fromValue((void*) y_vector)); item->setData(0, XVECTOR_ROLE, QVariant::fromValue((void*) x_vector)); } updatePlot(); } void PlotDialog::onApply3Clicked() { updatePlot(); } void PlotDialog::onTypeToggled(QAbstractButton *w, bool b) { if(b) { rowsBox->setEnabled(w != functionButton); variableEdit->setEnabled(w == functionButton); enableDisableButtons(); } } void PlotDialog::onRateStepToggled(QAbstractButton *w, bool b) { if(b) { rateSpin->setEnabled(w == rateButton); stepEdit->setEnabled(w == stepButton); } } void PlotDialog::onGraphsSelectionChanged() { enableDisableButtons(); } qalculate-qt-5.5.1/src/plotdialog.h000066400000000000000000000041341475705355700172410ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef PLOT_DIALOG_H #define PLOT_DIALOG_H #include #include class QLineEdit; class QPushButton; class QRadioButton; class QCheckBox; class QSpinBox; class QComboBox; class QTreeWidget; class QTreeWidgetItem; class QTabWidget; class QAbstractButton; class PlotDialog : public QDialog { Q_OBJECT protected: QLineEdit *titleEdit, *expressionEdit, *variableEdit, *stepEdit, *titleEdit2, *xaxisEdit, *yaxisEdit, *minxEdit, *maxxEdit; QRadioButton *functionButton, *vectorButton, *pairedButton, *primaryButton, *secondaryButton, *rateButton, *stepButton; QCheckBox *rowsBox, *gridBox, *borderBox, *minyBox, *maxyBox, *logxBox, *logyBox, *complexBox; QComboBox *styleCombo, *smoothingCombo, *legendCombo; QPushButton *addButton, *applyButton, *removeButton, *applyButton2, *applyButton3; QTreeWidget *graphsTable; QSpinBox *minySpin, *maxySpin, *logxSpin, *logySpin, *rateSpin, *lineSpin; QTabWidget *tabs; Thread *plotThread; void generatePlotSeries(MathStructure **x_vector, MathStructure **y_vector, int type, QString str, QString str_x); bool generatePlot(); void updatePlot(); void updateItem(QTreeWidgetItem*); public: PlotDialog(QWidget *parent = NULL); virtual ~PlotDialog(); void resetParameters(); protected slots: void enableDisableButtons(); void onExpressionActivated(); void onAddClicked(); void onComplexClicked(bool); void onApplyClicked(); void onRemoveClicked(); void onApply2Clicked(); void onApply3Clicked(); void onTypeToggled(QAbstractButton*, bool); void onRateStepToggled(QAbstractButton*, bool); void onGraphsSelectionChanged(); void abort(); public slots: void reject() override; void setExpression(const QString&); }; #endif //PLOT_DIALOG_H qalculate-qt-5.5.1/src/preferencesdialog.cpp000066400000000000000000001315471475705355700211300ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # include #endif #include #include "qalculateqtsettings.h" #include "preferencesdialog.h" #define BOX(t, x, f) box = new QCheckBox(t, this); l->addWidget(box, r, 0, 1, 2); box->setChecked(x); connect(box, SIGNAL(toggled(bool)), this, SLOT(f)); r++; #define BOX1(t, x, f) box = new QCheckBox(t, this); l->addWidget(box, r, 0); box->setChecked(x); connect(box, SIGNAL(toggled(bool)), this, SLOT(f)); QString font_string(std::string str) { size_t i = str.find(","); if(i != std::string::npos && i < str.length() - 1) { if(str[i + 1] != ' ') str.insert(i + 1, 1, ' '); i = str.find(",", i + 1); if(i != std::string::npos) str = str.substr(0, i); } return QString::fromStdString(str); } class PreferencesPageScroll : public QScrollArea { protected: QWidget *child_widget; bool use_child_hint; public: PreferencesPageScroll(QWidget *parent, QWidget *child, bool b) : QScrollArea(parent), child_widget(child), use_child_hint(b) { setWidget(child); } QSize sizeHint() const { if(use_child_hint) { QSize s = child_widget->sizeHint(); s.setHeight(s.height() + 1); return s; } return QScrollArea::sizeHint(); } }; PreferencesDialog::PreferencesDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Preferences")); QVBoxLayout *topbox = new QVBoxLayout(this); QTabWidget *tabs = new QTabWidget(this); topbox->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); QWidget *w3 = new QWidget(this); QWidget *w4 = new QWidget(this); QAbstractButton *box; QGridLayout *l; QComboBox *combo; int r = 0; l = new QGridLayout(w1); BOX(tr("Ignore system language (requires restart)"), settings->ignore_locale, ignoreLocaleToggled(bool)); ignoreLocaleBox = box; QLabel *label = new QLabel(tr("Language:"), this); l->addWidget(label, r, 0); combo = new QComboBox(this); combo->addItem(tr("Default")); combo->addItem("Català"); combo->addItem("Deutsch"); combo->addItem("English"); combo->addItem("Español"); combo->addItem("Français"); combo->addItem("ქართული ენა"); combo->addItem("Nederlands"); combo->addItem("Português"); combo->addItem("Português do Brasil"); combo->addItem("Русский"); combo->addItem("Slovenščina"); combo->addItem("Svenska"); combo->addItem("汉语"); QString lang = settings->custom_lang.left(2); if(lang == "ca") combo->setCurrentIndex(1); else if(lang == "de") combo->setCurrentIndex(2); else if(lang == "en") combo->setCurrentIndex(3); else if(lang == "es") combo->setCurrentIndex(4); else if(lang == "fr") combo->setCurrentIndex(5); else if(lang == "ka") combo->setCurrentIndex(6); else if(lang == "nl") combo->setCurrentIndex(7); else if(settings->custom_lang == "pt_PT") combo->setCurrentIndex(8); else if(lang == "pt") combo->setCurrentIndex(9); else if(lang == "ru") combo->setCurrentIndex(10); else if(lang == "sl") combo->setCurrentIndex(11); else if(lang == "sv") combo->setCurrentIndex(12); else if(lang == "zh") combo->setCurrentIndex(13); else combo->setCurrentIndex(0); combo->setEnabled(!settings->ignore_locale); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(langChanged(int))); l->addWidget(combo, r, 1); r++; langCombo = combo; BOX(tr("Allow multiple instances"), settings->allow_multiple_instances > 0, multipleInstancesToggled(bool)); BOX(tr("Clear history on exit"), settings->clear_history_on_exit, clearHistoryToggled(bool)); l->addWidget(new QLabel(tr("Max history lines saved:"), this), r, 0); QSpinBox *spin = new QSpinBox(this); spin->setRange(0, 100000); spin->setValue(settings->max_history_lines); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(maxHistoryLinesChanged(int))); l->addWidget(spin, r, 1); r++; BOX(tr("Close application with Escape key"), settings->close_with_esc, closeWithEscToggled(bool)); BOX(tr("Use keyboard keys for RPN"), settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN, rpnKeysToggled(bool)); rpnKeysBox = box; rpnKeysBox->setEnabled(settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN); BOX(tr("Use caret for bitwise XOR"), settings->caret_as_xor, caretAsXorToggled(bool)); BOX(tr("Keep above other windows"), settings->always_on_top, keepAboveToggled(bool)); QCheckBox *box2 = new QCheckBox(tr("Preserve history height"), this); l->addWidget(box2, r, 0, 1, 2); connect(box2, SIGNAL(stateChanged(int)), this, SLOT(preserveHeightChanged(int))); r++; preserveHeightBox = box2; if(settings->preserve_history_height < 0) { box2->setTristate(true); box2->setCheckState(Qt::PartiallyChecked); } else { box2->setChecked(settings->preserve_history_height > 0); } box2->setToolTip(tr("Do not change the height of history list when keypad or number bases are show or hidden.")); l->addWidget(new QLabel(tr("Window title:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Application name"), TITLE_APP); combo->addItem(tr("Result"), TITLE_RESULT); combo->addItem(tr("Application name + result"), TITLE_APP_RESULT); combo->addItem(tr("Workspace"), TITLE_WORKSPACE); combo->addItem(tr("Application name + workspace"), TITLE_APP_WORKSPACE); combo->setCurrentIndex(combo->findData(settings->title_type)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(titleChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Tooltips:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Show all"), 1); combo->addItem(tr("Hide in keypad"), 2); combo->addItem(tr("Hide all"), 0); combo->setCurrentIndex(combo->findData(settings->enable_tooltips)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(tooltipsChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Style:"), this), r, 0); combo = new QComboBox(this); QStringList list = QStyleFactory::keys(); combo->addItem(tr("Default (requires restart)", "Default style")); combo->addItems(list); if(settings->style.isEmpty()) { combo->setCurrentIndex(0); } else { int i = list.indexOf(settings->style); combo->setCurrentIndex(i < 0 ? 0 : i + 1); } connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(styleChanged(int))); l->addWidget(combo, r, 1); r++; styleCombo = combo; #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) BOX(tr("Dark mode"), settings->palette == 1 || (settings->palette == -1 && QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark), darkModeToggled(bool)); #else BOX(tr("Dark mode"), settings->palette == 1, darkModeToggled(bool)); #endif BOX(tr("Disable cursor blinking"), settings->disable_cursor_blinking, disableCursorBlinkingToggled(bool)); BOX(tr("Colorize result"), settings->colorize_result, colorizeToggled(bool)); BOX(tr("Format result"), settings->format_result, formatToggled(bool)); BOX1(tr("Custom result font:"), settings->use_custom_result_font, resultFontToggled(bool)); QPushButton *button = new QPushButton(font_string(settings->custom_result_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked());; r++; connect(button, SIGNAL(clicked()), this, SLOT(resultFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); BOX1(tr("Custom expression font:"), settings->use_custom_expression_font, expressionFontToggled(bool)); button = new QPushButton(font_string(settings->custom_expression_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked());; r++; connect(button, SIGNAL(clicked()), this, SLOT(expressionFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); BOX1(tr("Custom keypad font:"), settings->use_custom_keypad_font, keypadFontToggled(bool)); button = new QPushButton(font_string(settings->custom_keypad_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked());; r++; connect(button, SIGNAL(clicked()), this, SLOT(keypadFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); BOX1(tr("Custom application font:"), settings->use_custom_app_font, appFontToggled(bool)); button = new QPushButton(font_string(settings->custom_app_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked()); r++; connect(button, SIGNAL(clicked()), this, SLOT(appFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); l->setRowStretch(r, 1); r = 0; l = new QGridLayout(w4); l->addWidget(new QLabel(tr("Expression status:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Off"), 0); combo->addItem(tr("In history list"), 1); combo->addItem(tr("In expression field"), 2); if(!settings->display_expression_status) combo->setCurrentIndex(0); else if(settings->status_in_history) combo->setCurrentIndex(1); else combo->setCurrentIndex(2); statusCombo = combo; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(statusModeChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Status tooltip delay:")), r, 0); statusDelayWidget = new QSpinBox(this); statusDelayWidget->setRange(0, 10000); statusDelayWidget->setSingleStep(250); //: milliseconds statusDelayWidget->setSuffix(" " + tr("ms")); statusDelayWidget->setValue(settings->expression_status_delay); statusDelayWidget->setEnabled(settings->display_expression_status); connect(statusDelayWidget, SIGNAL(valueChanged(int)), this, SLOT(statusDelayChanged(int))); l->addWidget(statusDelayWidget, r, 1); r++; l->addWidget(new QLabel(tr("Calculate as you type delay:")), r, 0); calculateDelayWidget = new QSpinBox(this); calculateDelayWidget->setRange(0, 10000); calculateDelayWidget->setSingleStep(250); //: milliseconds calculateDelayWidget->setSuffix(" " + tr("ms")); calculateDelayWidget->setValue(settings->auto_calculate_delay); calculateDelayWidget->setEnabled(settings->status_in_history); connect(calculateDelayWidget, SIGNAL(valueChanged(int)), this, SLOT(calculateDelayChanged(int))); l->addWidget(calculateDelayWidget, r, 1); r++; BOX(tr("Automatically calculate selection"), settings->autocalc_selection, autocalcSelectionToggled(bool)); l->addWidget(new QLabel(tr("Expression in history:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Parsed"), 0); combo->addItem(tr("Entered"), 1); combo->addItem(tr("Entered + parsed"), 2); combo->setCurrentIndex(combo->findData(settings->history_expression_type)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(historyExpressionChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Expression after calculation:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Keep expression"), KEEP_EXPRESSION); combo->addItem(tr("Clear expression"), CLEAR_EXPRESSION); combo->addItem(tr("Replace with result"), REPLACE_EXPRESSION_WITH_RESULT); combo->addItem(tr("Replace with result if shorter"), REPLACE_EXPRESSION_WITH_RESULT_IF_SHORTER); combo->setCurrentIndex(combo->findData(settings->replace_expression)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(replaceExpressionChanged(int))); l->addWidget(combo, r, 1); r++; BOX(tr("Automatically copy result"), settings->autocopy_result, autocopyResultToggled(bool)); l->addWidget(new QLabel(tr("Parsing mode:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Adaptive"), PARSING_MODE_ADAPTIVE); combo->addItem(tr("Conventional"), PARSING_MODE_CONVENTIONAL); combo->addItem(tr("Implicit multiplication first"), PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST); combo->addItem(tr("Chain"), PARSING_MODE_CHAIN); combo->addItem(tr("RPN"), PARSING_MODE_RPN); combo->setCurrentIndex(combo->findData(settings->evalops.parse_options.parsing_mode)); parseCombo = combo; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(parsingModeChanged(int))); l->addWidget(combo, r, 1); r++; BOX(tr("Simplified percentage calculation"), settings->simplified_percentage, simplifiedPercentageToggled(bool)); BOX(tr("Read precision"), settings->evalops.parse_options.read_precision != DONT_READ_PRECISION, readPrecisionToggled(bool)); BOX(tr("Allow concise uncertainty input"), CALCULATOR->conciseUncertaintyInputEnabled(), conciseUncertaintyInputToggled(bool)); conciseUncertaintyInputBox = box; BOX(tr("Limit implicit multiplication"), settings->evalops.parse_options.limit_implicit_multiplication, limitImplicitToggled(bool)); BOX(tr("Interpret unrecognized symbols as variables"), settings->evalops.parse_options.unknowns_enabled, unknownsToggled(bool)); l->addWidget(new QLabel(tr("Interval calculation:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Variance formula"), INTERVAL_CALCULATION_VARIANCE_FORMULA); combo->addItem(tr("Interval arithmetic"), INTERVAL_CALCULATION_INTERVAL_ARITHMETIC); combo->setCurrentIndex(combo->findData(settings->evalops.interval_calculation)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(intervalCalculationChanged(int))); l->addWidget(combo, r, 1); r++; intervalCalculationCombo = combo; BOX(tr("Factorize result"), settings->evalops.structuring == STRUCTURING_FACTORIZE, factorizeToggled(bool)); l->setRowStretch(r, 1); l = new QGridLayout(w2); r = 0; QGridLayout *l2 = new QGridLayout(); l2->addWidget(new QLabel(tr("Two's complement output:"), this), 0, 0); l2->addWidget(new QLabel(tr("Two's complement input:"), this), 1, 0); box = new QCheckBox(tr("Binary"), this); l2->addWidget(box, 0, 1); box->setChecked(settings->printops.twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(binTwosToggled(bool))); box = new QCheckBox(tr("Hexadecimal"), this); l2->addWidget(box, 0, 2); box->setChecked(settings->printops.hexadecimal_twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(hexTwosToggled(bool))); box = new QCheckBox(tr("Binary"), this); l2->addWidget(box, 1, 1); box->setChecked(settings->evalops.parse_options.twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(binTwosInputToggled(bool))); box = new QCheckBox(tr("Hexadecimal"), this); l2->addWidget(box, 1, 2); box->setChecked(settings->evalops.parse_options.hexadecimal_twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(hexTwosInputToggled(bool))); l2->addWidget(new QLabel(tr("Binary bits:"), this), 2, 0); combo = new QComboBox(this); combo->addItem(tr("Automatic"), 0); combo->addItem("8", 8); combo->addItem("16", 16); combo->addItem("32", 32); combo->addItem("64", 64); combo->addItem("128", 128); combo->addItem("256", 256); combo->addItem("512", 512); combo->addItem("1024", 1024); combo->setCurrentIndex(combo->findData(settings->printops.binary_bits)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(bitsChanged(int))); l2->addWidget(combo, 2, 1, 1, 2); l->addLayout(l2, r, 0, 1, 2); r++; BOX(tr("Use lower case letters in non-decimal numbers"), settings->printops.lower_case_numbers, lowerCaseToggled(bool)); BOX(tr("Use special duodecimal symbols"), settings->printops.duodecimal_symbols, duodecimalSymbolsToggled(bool)); BOX(tr("Use dot as multiplication sign"), settings->printops.multiplication_sign != MULTIPLICATION_SIGN_X, multiplicationDotToggled(bool)); BOX(tr("Use Unicode division slash in output"), settings->printops.division_sign == DIVISION_SIGN_DIVISION_SLASH, divisionSlashToggled(bool)); BOX(tr("Spell out logical operators"), settings->printops.spell_out_logical_operators, spellOutToggled(bool)); BOX(tr("Use E-notation instead of 10^n"), settings->printops.exp_display != EXP_POWER_OF_10, eToggled(bool)); BOX(tr("Use 'j' as imaginary unit"), CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0, imaginaryJToggled(bool)); BOX(tr("Use comma as decimal separator"), CALCULATOR->getDecimalPoint() == COMMA, decimalCommaToggled(bool)); decimalCommaBox = box; BOX(tr("Ignore comma in numbers"), settings->evalops.parse_options.comma_as_separator, ignoreCommaToggled(bool)); ignoreCommaBox = box; BOX(tr("Ignore dots in numbers"), settings->evalops.parse_options.dot_as_separator, ignoreDotToggled(bool)); ignoreDotBox = box; BOX(tr("Indicate repeating decimals"), settings->printops.indicate_infinite_series, repeatingDecimalsToggled(bool)); if(CALCULATOR->getDecimalPoint() == COMMA) ignoreCommaBox->hide(); if(CALCULATOR->getDecimalPoint() == DOT) ignoreDotBox->hide(); BOX(tr("Copy unformatted ASCII by default"), settings->copy_ascii, copyAsciiToggled(bool)); l->addWidget(new QLabel(tr("Digit grouping:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("None"), DIGIT_GROUPING_NONE); combo->addItem(tr("Standard"), DIGIT_GROUPING_STANDARD); combo->addItem(tr("Local"), DIGIT_GROUPING_LOCALE); combo->setCurrentIndex(combo->findData(settings->printops.digit_grouping)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(groupingChanged(int))); l->addWidget(combo, r, 1); r++; BOX(tr("Automatically group digits in input (experimental)"), settings->automatic_digit_grouping, automaticDigitGroupingToggled(bool)); l->addWidget(new QLabel(tr("Interval display:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Adaptive"), -1); combo->addItem(tr("Significant digits"), INTERVAL_DISPLAY_SIGNIFICANT_DIGITS); combo->addItem(tr("Interval"), INTERVAL_DISPLAY_INTERVAL); combo->addItem(tr("Plus/minus"), INTERVAL_DISPLAY_PLUSMINUS); combo->addItem(tr("Relative"), INTERVAL_DISPLAY_RELATIVE); combo->addItem(tr("Concise"), INTERVAL_DISPLAY_CONCISE); combo->addItem(tr("Midpoint"), INTERVAL_DISPLAY_MIDPOINT); combo->addItem(tr("Lower"), INTERVAL_DISPLAY_LOWER); combo->addItem(tr("Upper"), INTERVAL_DISPLAY_UPPER); if(settings->adaptive_interval_display) combo->setCurrentIndex(0); else combo->setCurrentIndex(combo->findData(settings->printops.interval_display)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(intervalDisplayChanged(int))); intervalDisplayCombo = combo; l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Rounding:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Round halfway numbers away from zero"), ROUNDING_HALF_AWAY_FROM_ZERO); combo->addItem(tr("Round halfway numbers to even"), ROUNDING_HALF_TO_EVEN); combo->addItem(tr("Round halfway numbers to odd"), ROUNDING_HALF_TO_ODD); combo->addItem(tr("Round halfway numbers toward zero"), ROUNDING_HALF_TOWARD_ZERO); combo->addItem(tr("Round halfway numbers to random"), ROUNDING_HALF_RANDOM); combo->addItem(tr("Round halfway numbers up"), ROUNDING_HALF_UP); combo->addItem(tr("Round halfway numbers down"), ROUNDING_HALF_DOWN); combo->addItem(tr("Round toward zero"), ROUNDING_TOWARD_ZERO); combo->addItem(tr("Round away from zero"), ROUNDING_AWAY_FROM_ZERO); combo->addItem(tr("Round up"), ROUNDING_UP); combo->addItem(tr("Round down"), ROUNDING_DOWN); combo->setCurrentIndex(combo->findData(settings->printops.rounding)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(roundingChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Complex number form:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Rectangular"), COMPLEX_NUMBER_FORM_RECTANGULAR); combo->addItem(tr("Exponential"), COMPLEX_NUMBER_FORM_EXPONENTIAL); combo->addItem(tr("Polar"), COMPLEX_NUMBER_FORM_POLAR); combo->addItem(tr("Angle/phasor"), COMPLEX_NUMBER_FORM_CIS); combo->setCurrentIndex(combo->findData(settings->evalops.complex_number_form)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(complexFormChanged(int))); complexFormCombo = combo; l->addWidget(combo, r, 1); r++; l->setRowStretch(r, 1); l = new QGridLayout(w3); r = 0; BOX(tr("Enable units"), settings->evalops.parse_options.units_enabled, unitsToggled(bool)); BOX(tr("Abbreviate names"), settings->printops.abbreviate_names, abbreviateNamesToggled(bool)); BOX(tr("Use binary prefixes for information units"), CALCULATOR->usesBinaryPrefixes() > 0, binaryPrefixesToggled(bool)); l->addWidget(new QLabel(tr("Automatic unit conversion:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("No conversion"), POST_CONVERSION_NONE); combo->addItem(tr("Base units"), POST_CONVERSION_BASE); combo->addItem(tr("Optimal units"), POST_CONVERSION_OPTIMAL); combo->addItem(tr("Optimal SI units"), POST_CONVERSION_OPTIMAL_SI); combo->setCurrentIndex(combo->findData(settings->evalops.auto_post_conversion)); l->addWidget(combo, r, 1); r++; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(conversionChanged(int))); BOX(tr("Convert to mixed units"), settings->evalops.mixed_units_conversion != MIXED_UNITS_CONVERSION_NONE, mixedUnitsToggled(bool)); l->addWidget(new QLabel(tr("Automatic unit prefixes:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Default")); combo->addItem(tr("No prefixes")); combo->addItem(tr("Prefixes for some units")); combo->addItem(tr("Prefixes also for currencies")); combo->addItem(tr("Prefixes for all units")); if(settings->prefixes_default) combo->setCurrentIndex(0); else if(!settings->printops.use_unit_prefixes) combo->setCurrentIndex(1); else if(settings->printops.use_prefixes_for_all_units) combo->setCurrentIndex(4); else if(settings->printops.use_prefixes_for_currencies) combo->setCurrentIndex(3); else combo->setCurrentIndex(2); l->addWidget(combo, r, 1); r++; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(prefixesChanged(int))); BOX(tr("Enable all SI-prefixes"), settings->printops.use_all_prefixes, allPrefixesToggled(bool)); BOX(tr("Enable denominator prefixes"), settings->printops.use_denominator_prefix, denominatorPrefixToggled(bool)); BOX(tr("Enable units in physical constants"), CALCULATOR->variableUnitsEnabled(), variableUnitsToggled(bool)); variableUnitsBox = box; BOX(tr("Copy unformatted ASCII without units"), settings->copy_ascii_without_units, copyAsciiWithoutUnitsToggled(bool)); l->addWidget(new QLabel(tr("Temperature calculation:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Absolute"), TEMPERATURE_CALCULATION_ABSOLUTE); combo->addItem(tr("Relative"), TEMPERATURE_CALCULATION_RELATIVE); combo->addItem(tr("Hybrid"), TEMPERATURE_CALCULATION_HYBRID); combo->setCurrentIndex(combo->findData(CALCULATOR->getTemperatureCalculationMode())); tcCombo = combo; l->addWidget(combo, r, 1); r++; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(temperatureCalculationChanged(int))); box = new QCheckBox(tr("Exchange rates updates:"), this); box->setChecked(settings->auto_update_exchange_rates > 0); connect(box, SIGNAL(toggled(bool)), this, SLOT(exratesToggled(bool))); l->addWidget(box, r, 0); int days = settings->auto_update_exchange_rates <= 0 ? 7 : settings->auto_update_exchange_rates; spin = new QSpinBox(this); spin->setRange(1, 100); spin->setValue(days); spin->setEnabled(settings->auto_update_exchange_rates > 0); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(exratesChanged(int))); l->addWidget(spin, r, 1); exratesSpin = spin; r++; QString str = tr("%n day(s)", "", days); int index = str.indexOf(QString::number(days)); if(index == 0) { str = str.mid(index + QString::number(days).length()); if(str == " day(s)") str = (days == 1 ? " day" : " days"); exratesSpin->setSuffix(str); } else { exratesSpin->setPrefix(str.right(index)); } l->setRowStretch(r, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); QSize size = get_screen_geometry(this).size(); QSize sh = w1->sizeHint().expandedTo(w2->sizeHint().expandedTo(w3->sizeHint().expandedTo(w4->sizeHint()))); if(size.width() >= sh.width() + 100) tabs->setUsesScrollButtons(false); bool use_child_hint = size.height() >= sh.height() + 100; QScrollArea *s1 = new PreferencesPageScroll(this, w1, use_child_hint); QScrollArea *s2 = new PreferencesPageScroll(this, w2, use_child_hint); QScrollArea *s3 = new PreferencesPageScroll(this, w3, use_child_hint); QScrollArea *s4 = new PreferencesPageScroll(this, w4, use_child_hint); tabs->addTab(s1, tr("Look && Feel")); tabs->addTab(s2, tr("Numbers && Operators")); tabs->addTab(s3, tr("Units && Currencies")); tabs->addTab(s4, tr("Parsing && Calculation")); } PreferencesDialog::~PreferencesDialog() {} void PreferencesDialog::ignoreLocaleToggled(bool b) { settings->ignore_locale = b; if(settings->ignore_locale) { langCombo->blockSignals(true); langCombo->setCurrentIndex(0); langCombo->blockSignals(false); } langCombo->setEnabled(!settings->ignore_locale); } void PreferencesDialog::langChanged(int i) { switch(i) { case 0: {settings->custom_lang = ""; break;} case 1: {settings->custom_lang = "ca_ES"; break;} case 2: {settings->custom_lang = "de_DE"; break;} case 3: {settings->custom_lang = "en_US"; break;} case 4: {settings->custom_lang = "es_ES"; break;} case 5: {settings->custom_lang = "fr_FR"; break;} case 6: {settings->custom_lang = "ka_GE"; break;} case 7: {settings->custom_lang = "nl_NL"; break;} case 8: {settings->custom_lang = "pt_PT"; break;} case 9: {settings->custom_lang = "pt_BR"; break;} case 10: {settings->custom_lang = "ru"; break;} case 11: {settings->custom_lang = "sl_SL"; break;} case 12: {settings->custom_lang = "sv_SE"; break;} case 13: {settings->custom_lang = "zh_CN"; break;} } if(!settings->custom_lang.isEmpty()) { ignoreLocaleBox->setChecked(false); settings->ignore_locale = false; } QMessageBox::information(this, tr("Restart required"), tr("Please restart the program for the language change to take effect."), QMessageBox::Close); } void PreferencesDialog::multipleInstancesToggled(bool b) { settings->allow_multiple_instances = b; } void PreferencesDialog::clearHistoryToggled(bool b) { settings->clear_history_on_exit = b; } void PreferencesDialog::maxHistoryLinesChanged(int i) { settings->max_history_lines = i; } void PreferencesDialog::preserveHeightChanged(int state) { preserveHeightBox->setTristate(false); settings->preserve_history_height = (state == Qt::Checked); settings->keypad_appended = false; settings->bases_appended = false; } void PreferencesDialog::keepAboveToggled(bool b) { settings->always_on_top = b; if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); else setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); show(); emit alwaysOnTopChanged(); } void PreferencesDialog::tooltipsChanged(int i) { settings->enable_tooltips = qobject_cast(sender())->itemData(i).toInt(); emit enableTooltipsChanged(); } void PreferencesDialog::statusModeChanged(int i) { settings->display_expression_status = (i > 0); settings->status_in_history = (i == 1); statusDelayWidget->setEnabled(settings->display_expression_status); calculateDelayWidget->setEnabled(settings->status_in_history); emit statusModeChanged(); } void PreferencesDialog::statusDelayChanged(int v) { settings->expression_status_delay = v; } void PreferencesDialog::calculateDelayChanged(int v) { settings->auto_calculate_delay = v; } void PreferencesDialog::autocalcSelectionToggled(bool b) { settings->autocalc_selection = b; } void PreferencesDialog::binTwosToggled(bool b) { settings->printops.twos_complement = b; emit resultDisplayUpdated(); } void PreferencesDialog::hexTwosToggled(bool b) { settings->printops.hexadecimal_twos_complement = b; emit resultDisplayUpdated(); } void PreferencesDialog::binTwosInputToggled(bool b) { settings->evalops.parse_options.twos_complement = b; if(b != settings->default_signed) settings->default_signed = -1; emit expressionFormatUpdated(false); } void PreferencesDialog::hexTwosInputToggled(bool b) { settings->evalops.parse_options.hexadecimal_twos_complement = b; emit expressionFormatUpdated(false); } void PreferencesDialog::bitsChanged(int i) { settings->printops.binary_bits = qobject_cast(sender())->itemData(i).toInt(); settings->evalops.parse_options.binary_bits = settings->printops.binary_bits; settings->default_bits = -1; emit binaryBitsChanged(); if(settings->evalops.parse_options.hexadecimal_twos_complement || settings->evalops.parse_options.twos_complement) { emit expressionFormatUpdated(false); } else { emit resultDisplayUpdated(); } } void PreferencesDialog::lowerCaseToggled(bool b) { settings->printops.lower_case_numbers = b; emit resultDisplayUpdated(); } void PreferencesDialog::duodecimalSymbolsToggled(bool b) { settings->printops.duodecimal_symbols = b; emit resultDisplayUpdated(); } void PreferencesDialog::multiplicationDotToggled(bool b) { if(b) settings->printops.multiplication_sign = MULTIPLICATION_SIGN_ALTDOT; else settings->printops.multiplication_sign = MULTIPLICATION_SIGN_X; emit resultDisplayUpdated(); emit symbolsUpdated(); } void PreferencesDialog::divisionSlashToggled(bool b) { if(b) settings->printops.division_sign = DIVISION_SIGN_DIVISION_SLASH; else settings->printops.division_sign = DIVISION_SIGN_SLASH; emit resultDisplayUpdated(); emit symbolsUpdated(); } void PreferencesDialog::spellOutToggled(bool b) { settings->printops.spell_out_logical_operators = b; emit resultDisplayUpdated(); } void PreferencesDialog::eToggled(bool b) { if(b) settings->printops.exp_display = EXP_LOWERCASE_E; else settings->printops.exp_display = EXP_POWER_OF_10; emit resultDisplayUpdated(); } void PreferencesDialog::imaginaryJToggled(bool b) { Variable *v_i = CALCULATOR->getVariableById(VARIABLE_ID_I); if(!v_i || (b == (CALCULATOR->v_i->hasName("j") > 0))) return; if(b) { ExpressionName ename = v_i->getName(1); ename.name = "j"; ename.reference = false; v_i->addName(ename, 1, true); v_i->setChanged(false); } else { v_i->clearNonReferenceNames(); v_i->setChanged(false); } emit expressionFormatUpdated(false); emit symbolsUpdated(); } void PreferencesDialog::decimalCommaToggled(bool b) { settings->decimal_comma = b; if(b) { CALCULATOR->useDecimalComma(); ignoreCommaBox->hide(); ignoreDotBox->show(); } else { CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); ignoreCommaBox->show(); ignoreDotBox->hide(); } settings->dot_question_asked = true; emit expressionFormatUpdated(false); emit resultDisplayUpdated(); emit symbolsUpdated(); } void PreferencesDialog::ignoreDotToggled(bool b) { settings->evalops.parse_options.dot_as_separator = b; settings->dot_question_asked = true; emit expressionFormatUpdated(false); } void PreferencesDialog::ignoreCommaToggled(bool b) { settings->evalops.parse_options.comma_as_separator = b; CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); settings->dot_question_asked = true; emit expressionFormatUpdated(false); emit symbolsUpdated(); } void PreferencesDialog::colorizeToggled(bool b) { settings->colorize_result = b; emit historyExpressionTypeChanged(); } void PreferencesDialog::formatToggled(bool b) { settings->format_result = b; emit resultDisplayUpdated(); } void PreferencesDialog::parsingModeChanged(int i) { settings->evalops.parse_options.parsing_mode = (ParsingMode) qobject_cast(sender())->itemData(i).toInt(); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL || settings->evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST) settings->implicit_question_asked = true; rpnKeysBox->setEnabled(settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN); rpnKeysBox->blockSignals(true); rpnKeysBox->setChecked(settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN); rpnKeysBox->blockSignals(false); emit expressionFormatUpdated(false); } void PreferencesDialog::temperatureCalculationChanged(int i) { CALCULATOR->setTemperatureCalculationMode((TemperatureCalculationMode) qobject_cast(sender())->itemData(i).toInt()); emit expressionCalculationUpdated(0); } void PreferencesDialog::exratesToggled(bool b) { exratesSpin->setEnabled(b); settings->auto_update_exchange_rates = b ? exratesSpin->value() : 0; } void PreferencesDialog::exratesChanged(int i) { settings->auto_update_exchange_rates = i; QString str = tr("%n day(s)", "", i); int index = str.indexOf(QString::number(i)); if(index == 0) { str = str.mid(index + QString::number(i).length()); if(str == " day(s)") str = (i == 1 ? " day" : " days"); exratesSpin->setSuffix(str); } else { exratesSpin->setPrefix(str.right(index)); } } void PreferencesDialog::unitsToggled(bool b) { settings->evalops.parse_options.units_enabled = b; emit expressionFormatUpdated(false); } void PreferencesDialog::binaryPrefixesToggled(bool b) { CALCULATOR->useBinaryPrefixes(b ? 1 : 0); emit resultFormatUpdated(); } void PreferencesDialog::abbreviateNamesToggled(bool b) { settings->printops.abbreviate_names = b; emit resultFormatUpdated(); } void PreferencesDialog::simplifiedPercentageToggled(bool b) { settings->simplified_percentage = b; emit expressionFormatUpdated(true); } void PreferencesDialog::readPrecisionToggled(bool b) { if(b) settings->evalops.parse_options.read_precision = READ_PRECISION_WHEN_DECIMALS; else settings->evalops.parse_options.read_precision = DONT_READ_PRECISION; emit expressionFormatUpdated(true); } void PreferencesDialog::rpnKeysToggled(bool b) { settings->rpn_keys = b; } void PreferencesDialog::intervalCalculationChanged(int i) { settings->evalops.interval_calculation = (IntervalCalculation) qobject_cast(sender())->itemData(i).toInt(); emit expressionCalculationUpdated(0); } void PreferencesDialog::updateIntervalCalculation() { intervalCalculationCombo->blockSignals(true); intervalCalculationCombo->setCurrentIndex(intervalCalculationCombo->findData(settings->evalops.interval_calculation)); intervalCalculationCombo->blockSignals(false); } void PreferencesDialog::complexFormChanged(int i) { settings->evalops.complex_number_form = (ComplexNumberForm) qobject_cast(sender())->itemData(i).toInt(); settings->complex_angle_form = (settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS); emit expressionCalculationUpdated(0); } void PreferencesDialog::updateComplexForm() { complexFormCombo->blockSignals(true); complexFormCombo->setCurrentIndex(complexFormCombo->findData(settings->evalops.complex_number_form)); complexFormCombo->blockSignals(false); } void PreferencesDialog::roundingChanged(int i) { settings->printops.rounding = (RoundingMode) qobject_cast(sender())->itemData(i).toInt(); emit resultFormatUpdated(); } void PreferencesDialog::repeatingDecimalsToggled(bool b) { settings->printops.indicate_infinite_series = b; emit resultFormatUpdated(); } void PreferencesDialog::copyAsciiToggled(bool b) { settings->copy_ascii = b; } void PreferencesDialog::copyAsciiWithoutUnitsToggled(bool b) { settings->copy_ascii_without_units = b; } void PreferencesDialog::caretAsXorToggled(bool b) { settings->caret_as_xor = b; } void PreferencesDialog::automaticDigitGroupingToggled(bool b) { settings->automatic_digit_grouping = b; } void PreferencesDialog::closeWithEscToggled(bool b) { settings->close_with_esc = b; } void PreferencesDialog::disableCursorBlinkingToggled(bool b) { settings->disable_cursor_blinking = b; if(b) qApp->setCursorFlashTime(0); else qApp->setCursorFlashTime(1000); } void PreferencesDialog::mixedUnitsToggled(bool b) { if(b) settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_DEFAULT; else settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_NONE; emit expressionCalculationUpdated(0); } void PreferencesDialog::conversionChanged(int i) { settings->evalops.auto_post_conversion = (AutoPostConversion) qobject_cast(sender())->itemData(i).toInt(); emit expressionCalculationUpdated(0); } void PreferencesDialog::prefixesChanged(int i) { settings->prefixes_default = (i == 0); settings->printops.use_unit_prefixes = (i == 0 && (settings->printops.min_exp == EXP_PRECISION || settings->printops.min_exp == EXP_NONE)) || i >= 2; settings->printops.use_prefixes_for_all_units = (i == 4); settings->printops.use_prefixes_for_currencies = (i >= 3); emit resultFormatUpdated(); } void PreferencesDialog::allPrefixesToggled(bool b) { settings->printops.use_all_prefixes = b; emit resultFormatUpdated(); } void PreferencesDialog::denominatorPrefixToggled(bool b) { settings->printops.use_denominator_prefix = b; emit resultFormatUpdated(); } void PreferencesDialog::variableUnitsToggled(bool b) { CALCULATOR->setVariableUnitsEnabled(b); emit expressionCalculationUpdated(0); } void PreferencesDialog::updateVariableUnits() { variableUnitsBox->blockSignals(true); variableUnitsBox->setChecked(CALCULATOR->variableUnitsEnabled()); variableUnitsBox->blockSignals(false); } void PreferencesDialog::groupingChanged(int i) { settings->printops.digit_grouping = (DigitGrouping) qobject_cast(sender())->itemData(i).toInt(); emit resultFormatUpdated(); } void PreferencesDialog::intervalDisplayChanged(int i) { if(i == 0) { settings->printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; settings->adaptive_interval_display = true; } else { settings->printops.interval_display = (IntervalDisplay) qobject_cast(sender())->itemData(i).toInt(); settings->adaptive_interval_display = false; } emit resultFormatUpdated(); } void PreferencesDialog::updateIntervalDisplay() { intervalDisplayCombo->blockSignals(true); if(settings->adaptive_interval_display) intervalDisplayCombo->setCurrentIndex(0); else intervalDisplayCombo->setCurrentIndex(intervalDisplayCombo->findData(settings->printops.interval_display)); intervalDisplayCombo->blockSignals(false); } void PreferencesDialog::conciseUncertaintyInputToggled(bool b) { CALCULATOR->setConciseUncertaintyInputEnabled(b); emit expressionFormatUpdated(false); } void PreferencesDialog::updateConciseUncertaintyInput() { conciseUncertaintyInputBox->blockSignals(true); conciseUncertaintyInputBox->setChecked(CALCULATOR->conciseUncertaintyInputEnabled()); conciseUncertaintyInputBox->blockSignals(false); } void PreferencesDialog::limitImplicitToggled(bool b) { settings->evalops.parse_options.limit_implicit_multiplication = b; settings->printops.limit_implicit_multiplication = b; emit expressionFormatUpdated(true); } void PreferencesDialog::unknownsToggled(bool b) { settings->evalops.parse_options.unknowns_enabled = b; emit expressionFormatUpdated(false); } void PreferencesDialog::titleChanged(int i) { settings->title_type = qobject_cast(sender())->itemData(i).toInt(); emit titleTypeChanged(); } void PreferencesDialog::resultFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_result_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_result_font = true; settings->use_custom_result_font = true; settings->custom_result_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_result_font)); emit resultFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::resultFontToggled(bool b) { settings->use_custom_result_font = b; emit resultFontChanged(); } void PreferencesDialog::expressionFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_expression_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_expression_font = true; settings->use_custom_expression_font = true; settings->custom_expression_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_expression_font)); emit expressionFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::expressionFontToggled(bool b) { settings->use_custom_expression_font = b; emit expressionFontChanged(); } void PreferencesDialog::keypadFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_keypad_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_keypad_font = true; settings->use_custom_keypad_font = true; settings->custom_keypad_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_keypad_font)); emit keypadFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::keypadFontToggled(bool b) { settings->use_custom_keypad_font = b; emit keypadFontChanged(); } void PreferencesDialog::appFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_app_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_app_font = true; settings->use_custom_app_font = true; settings->custom_app_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_app_font)); emit appFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::appFontToggled(bool b) { settings->use_custom_app_font = b; emit appFontChanged(); } void PreferencesDialog::darkModeToggled(bool b) { if(b) settings->palette = 1; else settings->palette = -1; #ifdef _WIN32 if(b) { if(styleCombo->currentText().compare("windowsvista", Qt::CaseInsensitive) == 0) { for(int i = 1; i < styleCombo->count(); i++) { if(styleCombo->itemText(i).compare("Fusion", Qt::CaseInsensitive) == 0) { styleCombo->setCurrentIndex(i); break; } } } } #endif #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) settings->updatePalette(QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark); #else settings->updatePalette(); #endif } void PreferencesDialog::styleChanged(int i) { settings->style = (i == 0 ? "" : styleCombo->currentText()); settings->updateStyle(); } void PreferencesDialog::factorizeToggled(bool b) { if(b) settings->evalops.structuring = STRUCTURING_FACTORIZE; else settings->evalops.structuring = STRUCTURING_EXPAND; emit expressionCalculationUpdated(0); } void PreferencesDialog::closeEvent(QCloseEvent *e) { QDialog::closeEvent(e); emit dialogClosed(); } void PreferencesDialog::replaceExpressionChanged(int i) { settings->replace_expression = qobject_cast(sender())->itemData(i).toInt(); } void PreferencesDialog::autocopyResultToggled(bool b) { settings->autocopy_result = b; } void PreferencesDialog::historyExpressionChanged(int i) { settings->history_expression_type = qobject_cast(sender())->itemData(i).toInt(); emit historyExpressionTypeChanged(); } void PreferencesDialog::updateDot() { decimalCommaBox->blockSignals(true); ignoreCommaBox->blockSignals(true); ignoreDotBox->blockSignals(true); decimalCommaBox->setChecked(CALCULATOR->getDecimalPoint() == COMMA); ignoreCommaBox->setChecked(settings->evalops.parse_options.comma_as_separator); ignoreDotBox->setChecked(settings->evalops.parse_options.dot_as_separator); decimalCommaBox->blockSignals(false); ignoreCommaBox->blockSignals(false); ignoreDotBox->blockSignals(false); if(CALCULATOR->getDecimalPoint() == COMMA) ignoreCommaBox->hide(); if(CALCULATOR->getDecimalPoint() == DOT) ignoreDotBox->hide(); } void PreferencesDialog::updateParsingMode() { parseCombo->blockSignals(true); parseCombo->setCurrentIndex(parseCombo->findData(settings->evalops.parse_options.parsing_mode)); parseCombo->blockSignals(false); } void PreferencesDialog::updateExpressionStatus() { statusDelayWidget->blockSignals(true); calculateDelayWidget->blockSignals(true); statusCombo->blockSignals(true); if(!settings->display_expression_status) statusCombo->setCurrentIndex(0); else if(settings->status_in_history) statusCombo->setCurrentIndex(1); else statusCombo->setCurrentIndex(2); statusDelayWidget->setValue(settings->expression_status_delay); statusDelayWidget->setEnabled(settings->display_expression_status); calculateDelayWidget->setValue(settings->auto_calculate_delay); calculateDelayWidget->setEnabled(settings->status_in_history); statusDelayWidget->blockSignals(false); calculateDelayWidget->blockSignals(false); statusCombo->blockSignals(false); } void PreferencesDialog::updateTemperatureCalculation() { tcCombo->blockSignals(true); tcCombo->setCurrentIndex(tcCombo->findData(CALCULATOR->getTemperatureCalculationMode())); tcCombo->blockSignals(false); } qalculate-qt-5.5.1/src/preferencesdialog.h000066400000000000000000000105531475705355700205660ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef PREFERENCES_DIALOG_H #define PREFERENCES_DIALOG_H #include #include class QAbstractButton; class QCheckBox; class QSpinBox; class QComboBox; class PreferencesDialog : public QDialog { Q_OBJECT protected: QAbstractButton *decimalCommaBox, *ignoreCommaBox, *ignoreDotBox, *ignoreLocaleBox, *variableUnitsBox, *conciseUncertaintyInputBox, *rpnKeysBox; QCheckBox *preserveHeightBox; QSpinBox *exratesSpin, *statusDelayWidget, *calculateDelayWidget; QComboBox *styleCombo, *parseCombo, *tcCombo, *langCombo, *complexFormCombo, *intervalDisplayCombo, *intervalCalculationCombo, *statusCombo; void closeEvent(QCloseEvent*) override; protected slots: void ignoreLocaleToggled(bool); void keepAboveToggled(bool); void tooltipsChanged(int); void preserveHeightChanged(int); void statusModeChanged(int); void statusDelayChanged(int); void autocalcSelectionToggled(bool); void calculateDelayChanged(int); void binTwosToggled(bool); void hexTwosToggled(bool); void binTwosInputToggled(bool); void hexTwosInputToggled(bool); void bitsChanged(int); void lowerCaseToggled(bool); void duodecimalSymbolsToggled(bool); void multiplicationDotToggled(bool); void divisionSlashToggled(bool); void spellOutToggled(bool); void eToggled(bool); void imaginaryJToggled(bool); void decimalCommaToggled(bool); void ignoreCommaToggled(bool); void ignoreDotToggled(bool); void colorizeToggled(bool); void formatToggled(bool); void parsingModeChanged(int); void unknownsToggled(bool); void temperatureCalculationChanged(int); void exratesToggled(bool); void exratesChanged(int); void unitsToggled(bool); void binaryPrefixesToggled(bool); void readPrecisionToggled(bool); void simplifiedPercentageToggled(bool); void intervalCalculationChanged(int); void complexFormChanged(int); void roundingChanged(int); void repeatingDecimalsToggled(bool); void mixedUnitsToggled(bool); void abbreviateNamesToggled(bool); void conversionChanged(int); void prefixesChanged(int); void allPrefixesToggled(bool); void denominatorPrefixToggled(bool); void variableUnitsToggled(bool); void groupingChanged(int); void intervalDisplayChanged(int); void conciseUncertaintyInputToggled(bool); void limitImplicitToggled(bool); void titleChanged(int); void resultFontClicked(); void resultFontToggled(bool); void expressionFontClicked(); void expressionFontToggled(bool); void keypadFontClicked(); void keypadFontToggled(bool); void appFontClicked(); void appFontToggled(bool); void darkModeToggled(bool); void styleChanged(int); void langChanged(int); void factorizeToggled(bool); void rpnKeysToggled(bool); void replaceExpressionChanged(int); void autocopyResultToggled(bool); void multipleInstancesToggled(bool); void clearHistoryToggled(bool); void maxHistoryLinesChanged(int); void historyExpressionChanged(int); void copyAsciiToggled(bool); void copyAsciiWithoutUnitsToggled(bool); void caretAsXorToggled(bool); void automaticDigitGroupingToggled(bool); void closeWithEscToggled(bool); void disableCursorBlinkingToggled(bool); public: PreferencesDialog(QWidget *parent = NULL); virtual ~PreferencesDialog(); void updateDot(); void updateParsingMode(); void updateTemperatureCalculation(); void updateExpressionStatus(); void updateVariableUnits(); void updateComplexForm(); void updateIntervalDisplay(); void updateIntervalCalculation(); void updateConciseUncertaintyInput(); signals: void resultFormatUpdated(); void resultDisplayUpdated(); void expressionCalculationUpdated(int); void expressionFormatUpdated(bool); void alwaysOnTopChanged(); void enableTooltipsChanged(); void titleTypeChanged(); void resultFontChanged(); void expressionFontChanged(); void keypadFontChanged(); void appFontChanged(); void symbolsUpdated(); void historyExpressionTypeChanged(); void binaryBitsChanged(); void statusModeChanged(); void dialogClosed(); }; #endif //PREFERENCES_DIALOG_H qalculate-qt-5.5.1/src/qalculateqtsettings.cpp000066400000000000000000003251541475705355700215470ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include "qalculateqtsettings.h" #include #include #include #include #include #include #include #include #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # include #else # include #endif #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # include #endif #include #include "keypadwidget.h" #define PREFERENCES_VERSION_BEFORE(i1, i2, i3) (preferences_version[0] < i1 || (preferences_version[0] == i1 && (preferences_version[1] < i2 || (preferences_version[1] == i2 && preferences_version[2] < i3)))) #define PREFERENCES_VERSION_AFTER(i1, i2, i3) (preferences_version[0] > i1 || (preferences_version[0] == i1 && (preferences_version[1] > i2 || (preferences_version[1] == i2 && preferences_version[2] > i3)))) extern int b_busy; bool can_display_unicode_string_function(const char*, void*) { return true; } QRect get_screen_geometry(QWidget *widget) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QScreen *scr = widget->screen(); # else QScreen *scr = QGuiApplication::screenAt(pos); # endif if(!scr) scr = QGuiApplication::primaryScreen(); return scr->availableGeometry(); #else return QApplication::desktop()->availableGeometry(widget); #endif } bool try_resize(QWidget *win, int w, int h) { QSize size = get_screen_geometry(win).size(); if(w + 50 < size.width() && h + 50 < size.height()) { win->resize(w, h); return true; } return false; } std::string to_html_escaped(const std::string strpre) { std::string str = strpre; if(settings->printops.use_unicode_signs) { gsub(">=", SIGN_GREATER_OR_EQUAL, str); gsub("<=", SIGN_LESS_OR_EQUAL, str); gsub("!=", SIGN_NOT_EQUAL, str); gsub("...", "…", str); } gsub("&", "&", str); gsub("<", "<", str); gsub(">", ">", str); gsub("\n","
", str); return str; } bool string_is_less(std::string str1, std::string str2) { size_t i = 0; bool b_uni = false; while(i < str1.length() && i < str2.length()) { if(str1[i] == str2[i]) i++; else if((signed char) str1[i] < 0 || (signed char) str2[i] < 0) {b_uni = true; break;} else return str1[i] < str2[i]; } if(b_uni) return QString::fromStdString(str1).compare(QString::fromStdString(str2)) < 0; return str1 < str2; } bool item_in_calculator(ExpressionItem *item) { if(!CALCULATOR->stillHasVariable((Variable*) item) || !CALCULATOR->stillHasFunction((MathFunction*) item) || !CALCULATOR->stillHasUnit((Unit*) item)) return false; if(item->type() == TYPE_VARIABLE) return CALCULATOR->hasVariable((Variable*) item); if(item->type() == TYPE_UNIT) return CALCULATOR->hasUnit((Unit*) item); if(item->type() == TYPE_FUNCTION) return CALCULATOR->hasFunction((MathFunction*) item); return false; } void remove_spaces(std::string &str) { size_t i = 0; while(true) { i = str.find(' ', i); if(i != std::string::npos) str.erase(i, 1); else break; } i = 0; while(true) { i = str.find(THIN_SPACE, i); if(i != std::string::npos) str.erase(i, strlen(THIN_SPACE)); else break; } i = 0; while(true) { i = str.find(NNBSP, i); if(i != std::string::npos) str.erase(i, strlen(NNBSP)); else break; } i = 0; while(true) { i = str.find(NBSP, i); if(i != std::string::npos) str.erase(i, strlen(NBSP)); else break; } } long int get_fixed_denominator_qt2(const std::string &str, int &to_fraction, char sgn, const QString &localized_fraction, bool qalc_command) { long int fden = 0; if(!qalc_command && (equalsIgnoreCase(str, "fraction") || equalsIgnoreCase(str, localized_fraction.toStdString()))) { fden = -1; } else { if(str.length() > 2 && str[0] == '1' && str[1] == '/' && str.find_first_not_of(NUMBERS SPACES, 2) == std::string::npos) { fden = s2i(str.substr(2, str.length() - 2)); } else if(str.length() > 1 && str[0] == '/' && str.find_first_not_of(NUMBERS SPACES, 1) == std::string::npos) { fden = s2i(str.substr(1, str.length() - 1)); } else if(str == "3rds") { fden = 3; } else if(str == "halves") { fden = 2; } else if(str.length() > 3 && str.find("ths", str.length() - 3) != std::string::npos && str.find_first_not_of(NUMBERS SPACES) == str.length() - 3) { fden = s2i(str.substr(0, str.length() - 3)); } } if(fden == 1) fden = 0; if(fden != 0) { if(sgn == '-') to_fraction = 2; else if(fden > 0 && sgn == 0) to_fraction = -1; else to_fraction = 1; } return fden; } long int get_fixed_denominator_qt(const std::string &str, int &to_fraction, const QString &localized_fraction, bool qalc_command) { size_t n = 0; if(str[0] == '-' || str[0] == '+') n = 1; if(n > 0) return get_fixed_denominator_qt2(str.substr(n, str.length() - n), to_fraction, str[0], localized_fraction, qalc_command); return get_fixed_denominator_qt2(str, to_fraction, 0, localized_fraction, qalc_command); } size_t unformatted_length(const std::string &str) { size_t l = 0; bool intag = false; for(size_t i = 0; i < str.length(); i++) { if(intag) { if(str[i] == '>') intag = false; } else if(str[i] == '<') { intag = true; } else if((signed char) str[i] > 0 || (unsigned char) str[i] >= 0xC0) { l++; } } return l; } bool is_equation_solutions(const MathStructure &m) { if(m.isComparison()) { return m.comparisonType() == COMPARISON_EQUALS && m[0].isUnknown(); } else if(m.isLogicalAnd()) { bool b = false; for(size_t i = 0; i < m.size(); i++) { if(!m[i].isComparison()) { return false; } else if(m[i].comparisonType() == COMPARISON_EQUALS) { if(b || !m[i][0].isUnknown()) return false; b = true; } } return b; } else if(m.isLogicalOr()) { for(size_t i = 0; i < m.size(); i++) { if(m[i].isComparison()) { if(m[i].comparisonType() != COMPARISON_EQUALS || !m[i][0].isUnknown()) return false; } else if(m[i].isLogicalAnd()) { bool b = false; for(size_t i2 = 0; i2 < m[i].size(); i2++) { if(!m[i][i2].isComparison()) { return false; } else if(m[i][i2].comparisonType() == COMPARISON_EQUALS) { if(b || !m[i][i2][0].isUnknown()) return false; b = true; } } if(!b) return false; } else { return false; } } return true; } return false; } AnswerFunction::AnswerFunction() : MathFunction("answer", 1, 1, "", QApplication::tr("History Answer Value").toStdString()) { if(QApplication::tr("answer") != "answer") addName(QApplication::tr("answer").toStdString(), 1); VectorArgument *arg = new VectorArgument(QApplication::tr("History Index(es)").toStdString()); arg->addArgument(new IntegerArgument("", ARGUMENT_MIN_MAX_NONZERO, true, true, INTEGER_TYPE_SINT)); setArgumentDefinition(1, arg); } int AnswerFunction::calculate(MathStructure &mstruct, const MathStructure &vargs, const EvaluationOptions&) { if(vargs[0].size() == 0) return 0; if(vargs[0].size() > 1) mstruct.clearVector(); for(size_t i = 0; i < vargs[0].size(); i++) { int index = vargs[0][i].number().intValue(); if(index < 0) index = (int) settings->history_answer.size() + 1 + index; if(index <= 0 || index > (int) settings->history_answer.size() || settings->history_answer[(size_t) index - 1] == NULL) { CALCULATOR->error(true, QApplication::tr("History index %s does not exist.").toUtf8().data(), vargs[0][i].print().c_str(), NULL); if(vargs[0].size() == 1) mstruct.setUndefined(); else mstruct.addChild(m_undefined); } else { if(is_equation_solutions(*settings->history_answer[(size_t) index - 1])) { MathStructure m(*settings->history_answer[(size_t) index - 1]); if(m.isLogicalAnd()) { for(size_t i = 0; i < m.size(); i++) { if(m[i].comparisonType() == COMPARISON_EQUALS) { m.setToChild(i + 1); break; } } m.setToChild(2); } else if(m.isLogicalOr()) { m.setType(STRUCT_VECTOR); for(size_t i = 0; i < m.size(); i++) { if(m[i].isLogicalAnd()) { for(size_t i2 = 0; i2 < m[i].size(); i2++) { if(m[i][i2].comparisonType() == COMPARISON_EQUALS) { m[i].setToChild(i2 + 1); break; } } m[i].setToChild(2); } else { m[i].setToChild(2); } } } else { m.setToChild(2); } if(vargs[0].size() == 1) mstruct.set(m); else mstruct.addChild(m); } else { if(vargs[0].size() == 1) mstruct.set(*settings->history_answer[(size_t) index - 1]); else mstruct.addChild(*settings->history_answer[(size_t) index - 1]); } } } return 1; } QalculateQtSettings::QalculateQtSettings() { ignore_locale = false; fetch_exchange_rates_at_startup = false; current_history_time = 0; allow_multiple_instances = -1; std::string filename = buildPath(getLocalDir(), "qalculate-qt.cfg"); FILE *file = fopen(filename.c_str(), "r"); char line[10000]; bool b1 = false, b2 = false; std::string stmp; if(file) { while(true) { if(fgets(line, 10000, file) == NULL) break; if(strcmp(line, "ignore_locale=1\n") == 0) { ignore_locale = true; b1 = true; if(b2) break; } else if(strcmp(line, "ignore_locale=0\n") == 0) { b1 = true; if(b2) break; } else if(strlen(line) > 9 && strncmp(line, "language=", 9) == 0) { custom_lang = (line + sizeof(char) * 9); custom_lang.chop(1); b1 = true; if(b2) break; } else if(strcmp(line, "allow_multiple_instances=1\n") == 0) { allow_multiple_instances = 1; b2 = true; if(b1) break; } else if(strcmp(line, "allow_multiple_instances=0\n") == 0) { allow_multiple_instances = 0; b2 = true; if(b1) break; } else if(strcmp(line, "allow_multiple_instances=-1\n") == 0) { b2 = true; if(b1) break; } } fclose(file); } wayland_platform = qApp->platformName().contains("wayland"); } QalculateQtSettings::~QalculateQtSettings() {} bool QalculateQtSettings::isAnswerVariable(Variable *v) { return v == vans[0] || v == vans[1] || v == vans[2] || v == vans[3] || v == vans[4]; } QIcon load_icon(const QString &str, QWidget *w) { QColor c = w->palette().buttonText().color(); if(c.red() + c.green() + c.blue() < 255) return QIcon(":/icons/actions/scalable/" + str + ".svg"); else return QIcon(":/icons/dark/actions/scalable/" + str + ".svg"); } void QalculateQtSettings::readPreferenceValue(const std::string &svar, const std::string &svalue, bool is_workspace) { int v = s2i(svalue); if(svar == "history_expression" || svar == "history_expression*") { v_expression.push_back(svalue); v_protected.push_back(svar[svar.length() - 1] == '*'); v_result.push_back(std::vector()); v_exact.push_back(std::vector()); v_value.push_back(std::vector()); v_messages.push_back(""); v_parseerror.push_back(false); v_time.push_back(current_history_time); } else if(svar == "history_parse") { if(v_expression.size() > v_parse.size()) { v_parse.push_back(svalue); v_pexact.push_back(true); } } else if(svar == "history_time") { current_history_time = (time_t) strtoll(svalue.c_str(), NULL, 10); } else if(svar == "history_parse_approximate") { if(v_expression.size() > v_parse.size()) { v_parse.push_back(svalue); v_pexact.push_back(false); } } else if(svar == "history_result" || svar == "history_result_approximate") { if(v_parse.size() < v_expression.size()) { v_parse.push_back(v_expression[v_expression.size() - 1]); v_expression[v_expression.size() - 1] = ""; v_pexact.push_back(true); } if(!v_result.empty()) { v_result[v_result.size() - 1].push_back(svalue); v_value[v_value.size() - 1].push_back(0); if(v_exact[v_exact.size() - 1].size() < v_result[v_result.size() - 1].size()) { v_exact[v_exact.size() - 1].push_back(svar.length() < 20); } } } else if(svar == "history_exact") { if(!v_exact.empty()) v_exact[settings->v_exact.size() - 1].push_back(v); } else if(svar == "expression_history") { expression_history.push_back(svalue); } else if(!is_workspace && svar == "favourite_function") { favourite_functions_pre.push_back(svalue); favourite_functions_changed = true; } else if(!is_workspace && svar == "recent_function") { recent_functions_pre.push_back(svalue); } else if(!is_workspace && svar == "favourite_unit") { favourite_units_pre.push_back(svalue); favourite_units_changed = true; } else if(!is_workspace && svar == "recent_unit") { recent_units_pre.push_back(svalue); } else if(!is_workspace && svar == "latest_button_unit") { latest_button_unit = svalue; } else if(!is_workspace && svar == "favourite_variable") { favourite_variables_pre.push_back(svalue); favourite_variables_changed = true; } else if(!is_workspace && svar == "recent_variable") { recent_variables_pre.push_back(svalue); } else if(!is_workspace && svar == "keyboard_shortcut") { default_shortcuts = false; char *str1 = new char[svalue.length()]; char *str2 = new char[svalue.length()]; int ks_type = 0; int n = sscanf(svalue.c_str(), "%s %i %[^\n]", str1, &ks_type, str2); if(n >= 2 && ks_type >= SHORTCUT_TYPE_FUNCTION && ks_type <= LAST_SHORTCUT_TYPE) { keyboard_shortcut *ks = NULL; for(size_t i = 0; i < keyboard_shortcuts.size(); i++) { if(keyboard_shortcuts[i]->key == str1) { ks = keyboard_shortcuts[i]; break; } } if(!ks || !PREFERENCES_VERSION_BEFORE(4, 7, 0)) { if(!ks) { ks = new keyboard_shortcut; ks->key = str1; ks->new_action = false; ks->action = NULL; keyboard_shortcuts.push_back(ks); } if(n == 3) { ks->value.push_back(str2); if(ks_type != SHORTCUT_TYPE_TEXT) remove_blank_ends(ks->value[ks->value.size() - 1]); } else { ks->value.push_back(""); } ks->type.push_back((shortcut_type) ks_type); } } delete[] str1; delete[] str2; } else if(!is_workspace && svar == "custom_button_label") { int c = 0, r = 0; char *str = new char[svalue.length()]; int n = sscanf(svalue.c_str(), "%i %i %[^\n]", &r, &c, str); if(n == 3 && c > 0 && r > 0) { size_t index = 0; for(size_t i = custom_buttons.size(); i > 0; i--) { if(custom_buttons[i - 1].r == r && custom_buttons[i - 1].c == c) { index = i; break; } } if(index == 0) { custom_button cb; cb.c = c; cb.r = r; cb.type[0] = -1; cb.type[1] = -1; cb.type[2] = -1; custom_buttons.push_back(cb); index = custom_buttons.size(); } index--; custom_buttons[index].label = QString::fromUtf8(str).trimmed(); } delete[] str; } else if(!is_workspace && svar == "custom_button") { int c = 0, r = 0; unsigned int bi = 0; char *str = new char[svalue.length()]; int cb_type = -1; int n = sscanf(svalue.c_str(), "%i %i %u %i %[^\n]", &c, &r, &bi, &cb_type, str); if((n == 4 || n == 5) && bi <= 2 && c > 0 && r > 0) { size_t index = 0; for(size_t i = custom_buttons.size(); i > 0; i--) { if(custom_buttons[i - 1].r == r && custom_buttons[i - 1].c == c) { index = i; break; } } if(index == 0) { custom_button cb; cb.c = c; cb.r = r; cb.type[0] = -1; cb.type[1] = -1; cb.type[2] = -1; custom_buttons.push_back(cb); index = custom_buttons.size(); } index--; custom_buttons[index].type[bi] = cb_type; if(n == 5) { custom_buttons[index].value[bi] = str; if(cb_type != SHORTCUT_TYPE_TEXT) remove_blank_ends(custom_buttons[index].value[bi]); } else { custom_buttons[index].value[bi] = ""; } } delete[] str; } else if(!is_workspace && svar == "show_all_units") { show_all_units = v; } else if(!is_workspace && svar == "show_all_functions") { show_all_functions = v; } else if(!is_workspace && svar == "show_all_variables") { show_all_variables = v; } else if(!is_workspace && svar == "use_function_dialog") { use_function_dialog = v; } else if(svar == "keypad_type") { if(v >= 0 && v <= 4) keypad_type = v; } else if(svar == "programming_base_changed") { if(keypad_type == KEYPAD_PROGRAMMING && show_keypad) programming_base_changed = v; } else if(svar == "toolbar_style") { if(v == Qt::ToolButtonIconOnly || v == Qt::ToolButtonTextOnly || v == Qt::ToolButtonTextBesideIcon || v == Qt::ToolButtonTextUnderIcon) toolbar_style = v; } else if(svar == "separate_keypad_menu_buttons") { separate_keypad_menu_buttons = v; } else if(svar == "hide_numpad") { hide_numpad = v; } else if(svar == "show_keypad") { show_keypad = v; } else if(svar == "show_bases") { show_bases = v; } else if(svar == "version") { parse_qalculate_version(svalue, preferences_version); } else if(svar == "min_deci") { printops.min_decimals = v; } else if(svar == "use_min_deci") { printops.use_min_decimals = v; } else if(svar == "max_deci") { printops.max_decimals = v; } else if(svar == "use_max_deci") { printops.use_max_decimals = v; } else if(svar == "precision") { CALCULATOR->setPrecision(v); } else if(svar == "previous_precision") { previous_precision = v; } else if(svar == "min_exp") { printops.min_exp = v; } else if(svar == "interval_arithmetic") { CALCULATOR->useIntervalArithmetic(v); } else if(svar == "interval_display") { if(v == 0) { printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; adaptive_interval_display = true; } else { v--; if(v >= INTERVAL_DISPLAY_SIGNIFICANT_DIGITS && v <= INTERVAL_DISPLAY_RELATIVE) { printops.interval_display = (IntervalDisplay) v; adaptive_interval_display = false; } } } else if(svar == "negative_exponents") { printops.negative_exponents = v; } else if(svar == "sort_minus_last") { printops.sort_options.minus_last = v; } else if(svar == "place_units_separately") { printops.place_units_separately = v; } else if(svar == "use_prefixes") { printops.use_unit_prefixes = v; } else if(svar == "use_prefixes_for_all_units") { printops.use_prefixes_for_all_units = v; } else if(svar == "use_prefixes_for_currencies") { printops.use_prefixes_for_currencies = v; } else if(svar == "prefixes_default") { prefixes_default = v; } else if(svar == "number_fraction_format") { if(v >= FRACTION_DECIMAL && v <= FRACTION_COMBINED) { printops.number_fraction_format = (NumberFractionFormat) v; printops.restrict_fraction_length = (v == FRACTION_FRACTIONAL || v == FRACTION_COMBINED); dual_fraction = 0; } else if(v == FRACTION_COMBINED + 1) { printops.number_fraction_format = FRACTION_FRACTIONAL; printops.restrict_fraction_length = PREFERENCES_VERSION_AFTER(4, 8, 1); dual_fraction = 0; } else if(v == FRACTION_COMBINED + 2) { printops.number_fraction_format = FRACTION_DECIMAL; dual_fraction = 1; } else if(v < 0) { printops.number_fraction_format = FRACTION_DECIMAL; dual_fraction = -1; } else if(v <= FRACTION_PERMYRIAD + 2) { printops.number_fraction_format = (NumberFractionFormat) (v - 2); dual_fraction = 0; } } else if(svar == "number_fraction_denominator") { CALCULATOR->setFixedDenominator(v); } else if(svar == "complex_number_form") { if(v == COMPLEX_NUMBER_FORM_CIS + 1) { evalops.complex_number_form = COMPLEX_NUMBER_FORM_CIS; complex_angle_form = true; } else if(v >= COMPLEX_NUMBER_FORM_RECTANGULAR && v <= COMPLEX_NUMBER_FORM_CIS) { evalops.complex_number_form = (ComplexNumberForm) v; complex_angle_form = false; } } else if(svar == "number_base") { printops.base = v; } else if(svar == "custom_number_base") { CALCULATOR->beginTemporaryStopMessages(); MathStructure m; CALCULATOR->calculate(&m, svalue, 500); CALCULATOR->endTemporaryStopMessages(); CALCULATOR->setCustomOutputBase(m.number()); } else if(svar == "number_base_expression") { evalops.parse_options.base = v; } else if(svar == "custom_number_base_expression") { CALCULATOR->beginTemporaryStopMessages(); MathStructure m; CALCULATOR->calculate(&m, svalue, 500); CALCULATOR->endTemporaryStopMessages(); CALCULATOR->setCustomInputBase(m.number()); } else if(svar == "read_precision") { if(v >= DONT_READ_PRECISION && v <= READ_PRECISION_WHEN_DECIMALS) { evalops.parse_options.read_precision = (ReadPrecisionMode) v; } } else if(svar == "assume_denominators_nonzero") { evalops.assume_denominators_nonzero = v; } else if(svar == "warn_about_denominators_assumed_nonzero") { evalops.warn_about_denominators_assumed_nonzero = v; } else if(svar == "structuring") { if(v >= STRUCTURING_NONE && v <= STRUCTURING_FACTORIZE) { evalops.structuring = (StructuringMode) v; printops.allow_factorization = (evalops.structuring == STRUCTURING_FACTORIZE); } } else if(svar == "angle_unit") { if(v >= ANGLE_UNIT_NONE && v <= ANGLE_UNIT_CUSTOM) { evalops.parse_options.angle_unit = (AngleUnit) v; } } else if(svar == "custom_angle_unit") { custom_angle_unit = svalue; } else if(svar == "functions_enabled") { evalops.parse_options.functions_enabled = v; } else if(svar == "variables_enabled") { evalops.parse_options.variables_enabled = v; } else if(svar == "donot_calculate_variables") { evalops.calculate_variables = !v; } else if(svar == "calculate_variables") { evalops.calculate_variables = v; } else if(svar == "variable_units_enabled") { CALCULATOR->setVariableUnitsEnabled(v); } else if(svar == "calculate_functions") { evalops.calculate_functions = v; } else if(svar == "sync_units") { evalops.sync_units = v; } else if(svar == "unknownvariables_enabled") { evalops.parse_options.unknowns_enabled = v; } else if(svar == "units_enabled") { evalops.parse_options.units_enabled = v; } else if(svar == "allow_complex") { evalops.allow_complex = v; } else if(svar == "allow_infinite") { evalops.allow_infinite = v; } else if(svar == "use_short_units") { printops.abbreviate_names = v; } else if(svar == "abbreviate_names") { printops.abbreviate_names = v; } else if(svar == "all_prefixes_enabled") { printops.use_all_prefixes = v; } else if(svar == "denominator_prefix_enabled") { printops.use_denominator_prefix = v; } else if(svar == "auto_post_conversion") { if(v >= POST_CONVERSION_NONE && v <= POST_CONVERSION_OPTIMAL) { evalops.auto_post_conversion = (AutoPostConversion) v; } } else if(svar == "mixed_units_conversion") { if(v >= MIXED_UNITS_CONVERSION_NONE || v <= MIXED_UNITS_CONVERSION_FORCE_ALL) { evalops.mixed_units_conversion = (MixedUnitsConversion) v; } } else if(svar == "local_currency_conversion") { evalops.local_currency_conversion = v; } else if(svar == "use_binary_prefixes") { CALCULATOR->useBinaryPrefixes(v); } else if(svar == "indicate_infinite_series") { printops.indicate_infinite_series = v; } else if(svar == "show_ending_zeroes") { printops.show_ending_zeroes = v; } else if(svar == "digit_grouping") { if(v >= DIGIT_GROUPING_NONE && v <= DIGIT_GROUPING_LOCALE) { printops.digit_grouping = (DigitGrouping) v; } } else if(svar == "round_halfway_to_even") { if(v) printops.rounding = ROUNDING_HALF_TO_EVEN; } else if(svar == "rounding_mode") { if(v >= ROUNDING_HALF_AWAY_FROM_ZERO && v <= ROUNDING_DOWN) { if(!PREFERENCES_VERSION_AFTER(4, 9, 0) && v == 2) v = ROUNDING_TOWARD_ZERO; printops.rounding = (RoundingMode) v; } } else if(svar == "approximation") { if(v >= APPROXIMATION_EXACT && v <= APPROXIMATION_APPROXIMATE) { evalops.approximation = (ApproximationMode) v; dual_approximation = 0; } else if(v == APPROXIMATION_APPROXIMATE + 1) { evalops.approximation = APPROXIMATION_TRY_EXACT; dual_approximation = 1; } else if(v < 0) { evalops.approximation = APPROXIMATION_TRY_EXACT; dual_approximation = -1; } } else if(svar == "interval_calculation") { if(v >= INTERVAL_CALCULATION_NONE && v <= INTERVAL_CALCULATION_SIMPLE_INTERVAL_ARITHMETIC) { evalops.interval_calculation = (IntervalCalculation) v; } } else if(svar == "concise_uncertainty_input") { CALCULATOR->setConciseUncertaintyInputEnabled(v); } else if(svar == "chain_mode") { chain_mode = v; } else if(svar == "rpn_mode") { rpn_mode = v; } else if(svar == "limit_implicit_multiplication") { evalops.parse_options.limit_implicit_multiplication = v; printops.limit_implicit_multiplication = v; } else if(svar == "parsing_mode") { evalops.parse_options.parsing_mode = (ParsingMode) v; if(evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL || evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST) implicit_question_asked = true; } else if(svar == "simplified_percentage") { if(v > 0 && !PREFERENCES_VERSION_AFTER(5, 0, 0)) v = -1; simplified_percentage = v; } else if(svar == "default_assumption_type") { if(v >= ASSUMPTION_TYPE_NONE && v <= ASSUMPTION_TYPE_BOOLEAN) { CALCULATOR->defaultAssumptions()->setType((AssumptionType) v); } } else if(svar == "default_assumption_sign") { if(v >= ASSUMPTION_SIGN_UNKNOWN && v <= ASSUMPTION_SIGN_NONZERO) { CALCULATOR->defaultAssumptions()->setSign((AssumptionSign) v); } } else if(svar == "spacious") { printops.spacious = v; } else if(svar == "excessive_parenthesis") { printops.excessive_parenthesis = v; } else if(svar == "short_multiplication") { printops.short_multiplication = v; } else if(!is_workspace) { if(svar == "custom_button_rows") { if(v > 0 && v <= 100) custom_button_rows = v; } else if(svar == "custom_button_columns") { if(v > 0 && v <= 100) custom_button_columns = v; } else if(svar == "recent_workspace") { recent_workspaces.push_back(svalue); } else if(svar == "last_workspace") { current_workspace = svalue; } else if(svar == "save_workspace") { save_workspace = v; } else if(svar == "always_on_top") { always_on_top = v; } else if(svar == "keep_function_dialog_open") { keep_function_dialog_open = v; } else if(svar == "save_mode_on_exit") { save_mode_on_exit = v; } else if(svar == "save_definitions_on_exit") { save_defs_on_exit = v; } else if(svar == "clear_history_on_exit") { clear_history_on_exit = v; } else if(svar == "max_history_lines") { max_history_lines = v; } else if(svar == "window_state") { window_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "preserve_history_height") { preserve_history_height = v; } else if(svar == "keypad_appended") { keypad_appended = v; } else if(svar == "bases_appended") { bases_appended = v; } else if(svar == "replace_expression") { replace_expression = v; } else if(svar == "autocopy_result") { autocopy_result = v; } else if(svar == "history_expression_type") { history_expression_type = v; } else if(svar == "window_geometry") { window_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "splitter_state") { splitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "functions_geometry") { functions_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "functions_vsplitter_state") { functions_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "functions_hsplitter_state") { functions_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "units_geometry") { units_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "units_vsplitter_state") { units_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "units_hsplitter_state") { units_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "variables_geometry") { variables_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "variables_vsplitter_state") { variables_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "variables_hsplitter_state") { variables_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "datasets_geometry") { datasets_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "datasets_vsplitter_state") { datasets_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "datasets_hsplitter_state") { datasets_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "style") { #if defined _WIN32 if(PREFERENCES_VERSION_BEFORE(4, 7, 0)) { } else { #else if(v >= 0 && v < QStyleFactory::keys().count()) style = QStyleFactory::keys().at(v); else style = ""; #endif #if defined _WIN32 } #endif } else if(svar == "style_name") { style = QString::fromStdString(svalue); } else if(svar == "palette") { #ifdef _WIN32 #if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) if(!PREFERENCES_VERSION_BEFORE(4, 7, 0) || (v == 1 && QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark)) palette = v; # else if(!PREFERENCES_VERSION_BEFORE(4, 7, 0)) palette = v; # endif #else palette = v; #endif } else if(svar == "disable_cursor_blinking") { disable_cursor_blinking = v; } else if(svar == "color") { colorize_result = v; } else if(svar == "format") { format_result = v; } else if(svar == "language") { custom_lang = QString::fromStdString(svalue); } else if(svar == "ignore_locale") { ignore_locale = v; } else if(svar == "window_title_mode") { if(v >= 0 && v <= 4) title_type = v; } else if(svar == "enable_tooltips") { enable_tooltips = v; if(enable_tooltips < 0) enable_tooltips = 1; else if(enable_tooltips > 2) enable_tooltips = 2; } else if(svar == "auto_update_exchange_rates") { auto_update_exchange_rates = v; } else if(svar == "display_expression_status") { display_expression_status = v; } else if(svar == "expression_status_delay") { if(v < 0) v = 0; expression_status_delay = v; } else if(svar == "enable_input_method") { enable_input_method = v; } else if(svar == "enable_completion") { enable_completion = v; } else if(svar == "enable_completion2") { enable_completion2 = v; } else if(svar == "completion_min") { if(v < 1) v = 1; completion_min = v; } else if(svar == "completion_min2") { if(v < 1) v = 1; completion_min2 = v; } else if(svar == "completion_delay") { if(v < 0) v = 0; completion_delay = v; } else if(svar == "use_custom_result_font") { use_custom_result_font = v; } else if(svar == "use_custom_expression_font") { use_custom_expression_font = v; } else if(svar == "use_custom_keypad_font") { use_custom_keypad_font = v; } else if(svar == "use_custom_application_font") { use_custom_app_font = v; } else if(svar == "custom_result_font") { custom_result_font = svalue; save_custom_result_font = true; } else if(svar == "custom_expression_font") { custom_expression_font = svalue; save_custom_expression_font = true; } else if(svar == "custom_keypad_font") { custom_keypad_font = svalue; save_custom_keypad_font = true; } else if(svar == "custom_application_font") { custom_app_font = svalue; save_custom_app_font = true; } else if(svar == "multiplication_sign") { if(v >= MULTIPLICATION_SIGN_ASTERISK && v <= MULTIPLICATION_SIGN_ALTDOT) { printops.multiplication_sign = (MultiplicationSign) v; } } else if(svar == "division_sign") { if(v >= DIVISION_SIGN_SLASH && v <= DIVISION_SIGN_DIVISION) printops.division_sign = (DivisionSign) v; } else if(svar == "plot_legend_placement") { if(v >= PLOT_LEGEND_NONE && v <= PLOT_LEGEND_OUTSIDE) default_plot_legend_placement = (PlotLegendPlacement) v; } else if(svar == "plot_style") { if(v >= PLOT_STYLE_LINES && v <= PLOT_STYLE_POLAR) default_plot_style = (PlotStyle) v; } else if(svar == "plot_smoothing") { if(v >= PLOT_SMOOTHING_NONE && v <= PLOT_SMOOTHING_SBEZIER) default_plot_smoothing = (PlotSmoothing) v; } else if(svar == "plot_display_grid") { default_plot_display_grid = v; } else if(svar == "plot_full_border") { default_plot_full_border = v; } else if(svar == "plot_min") { default_plot_min = svalue; } else if(svar == "plot_max") { default_plot_max = svalue; } else if(svar == "plot_step") { default_plot_step = svalue; } else if(svar == "plot_sampling_rate") { default_plot_sampling_rate = v; } else if(svar == "plot_use_sampling_rate") { default_plot_use_sampling_rate = v; } else if(svar == "plot_complex") { default_plot_complex = v; } else if(svar == "plot_variable") { default_plot_variable = svalue; } else if(svar == "plot_rows") { default_plot_rows = v; } else if(svar == "plot_type") { if(v >= 0 && v <= 2) default_plot_type = v; } else if(svar == "plot_color") { default_plot_color = v; } else if(svar == "plot_linewidth") { default_plot_linewidth = v; } else if(svar == "max_plot_time") { max_plot_time = v; } else if(svar == "check_version") { check_version = v; } else if(svar == "last_version_check") { last_version_check_date.set(svalue); } else if(svar == "last_found_version") { last_found_version = svalue; } else if(svar == "bit_width") { default_bits = v; } else if(svar == "signed_integer") { default_signed = v; } else if(svar == "rpn_keys") { rpn_keys = v; } else if(svar == "rpn_shown") { rpn_shown = v; } else if(svar == "use_unicode_signs") { printops.use_unicode_signs = v; } else if(svar == "e_notation") { if(!v) printops.exp_display = EXP_POWER_OF_10; else printops.exp_display = EXP_LOWERCASE_E; } else if(svar == "exp_display") { if(v >= EXP_UPPERCASE_E && v <= EXP_POWER_OF_10) printops.exp_display = (ExpDisplay) v; } else if(svar == "lower_case_numbers") { printops.lower_case_numbers = v; } else if(svar == "duodecimal_symbols") { printops.duodecimal_symbols = v; } else if(svar == "imaginary_j") { do_imaginary_j = v; } else if(svar == "base_display") { if(v >= BASE_DISPLAY_NONE && v <= BASE_DISPLAY_SUFFIX) printops.base_display = (BaseDisplay) v; } else if(svar == "binary_bits") { printops.binary_bits = v; evalops.parse_options.binary_bits = v; } else if(svar == "twos_complement") { printops.twos_complement = v; } else if(svar == "hexadecimal_twos_complement") { printops.hexadecimal_twos_complement = v; } else if(svar == "twos_complement_input") { evalops.parse_options.twos_complement = v; } else if(svar == "hexadecimal_twos_complement_input") { evalops.parse_options.hexadecimal_twos_complement = v; } else if(svar == "spell_out_logical_operators") { printops.spell_out_logical_operators = v; } else if(svar == "caret_as_xor") { caret_as_xor = v; } else if(svar == "automatic_digit_grouping") { automatic_digit_grouping = v; } else if(svar == "close_with_esc") { close_with_esc = v; } else if(svar == "copy_ascii") { copy_ascii = v; } else if(svar == "copy_ascii_without_units") { copy_ascii_without_units = v; } else if(svar == "decimal_comma") { decimal_comma = v; if(v == 0) CALCULATOR->useDecimalPoint(evalops.parse_options.comma_as_separator); else if(v > 0) CALCULATOR->useDecimalComma(); } else if(svar == "dot_as_separator") { if(v < 0) { evalops.parse_options.dot_as_separator = CALCULATOR->default_dot_as_separator; dot_question_asked = false; } else { evalops.parse_options.dot_as_separator = v; dot_question_asked = true; } } else if(svar == "comma_as_separator") { evalops.parse_options.comma_as_separator = v; if(CALCULATOR->getDecimalPoint() != COMMA) { CALCULATOR->useDecimalPoint(evalops.parse_options.comma_as_separator); } } else if(svar == "temperature_calculation") { CALCULATOR->setTemperatureCalculationMode((TemperatureCalculationMode) v); tc_set = true; } else if(svar == "sinc_function") { if(v == 1) { CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, "pi"); sinc_set = true; } else if(v == 0) { sinc_set = true; } } else if(svar == "implicit_question_asked") { implicit_question_asked = true; } else if(svar == "calculate_as_you_type") { auto_calculate = v; } else if(svar == "calculate_as_you_type_delay") { auto_calculate_delay = v; } else if(svar == "status_in_history") { status_in_history = v; } else if(svar == "autocalc_selection") { autocalc_selection = v; } } } void QalculateQtSettings::loadPreferences() { f_answer = CALCULATOR->addFunction(new AnswerFunction()); CALCULATOR->setPrecision(10); previous_precision = 0; CALCULATOR->useIntervalArithmetic(true); CALCULATOR->setTemperatureCalculationMode(TEMPERATURE_CALCULATION_HYBRID); CALCULATOR->useBinaryPrefixes(0); CALCULATOR->setConciseUncertaintyInputEnabled(false); current_workspace = ""; save_workspace = -1; printops.multiplication_sign = MULTIPLICATION_SIGN_X; printops.division_sign = DIVISION_SIGN_DIVISION_SLASH; printops.is_approximate = new bool(false); printops.prefix = NULL; printops.use_min_decimals = false; printops.use_denominator_prefix = true; printops.min_decimals = 0; printops.use_max_decimals = false; printops.max_decimals = 2; printops.base = 10; printops.min_exp = EXP_PRECISION; printops.negative_exponents = false; printops.sort_options.minus_last = true; printops.indicate_infinite_series = false; printops.show_ending_zeroes = true; printops.round_halfway_to_even = false; printops.rounding = ROUNDING_HALF_AWAY_FROM_ZERO; printops.number_fraction_format = FRACTION_DECIMAL; printops.restrict_fraction_length = false; printops.abbreviate_names = true; printops.use_unicode_signs = true; printops.digit_grouping = DIGIT_GROUPING_STANDARD; printops.use_unit_prefixes = true; printops.use_prefixes_for_currencies = false; printops.use_prefixes_for_all_units = false; printops.spacious = true; printops.short_multiplication = true; printops.place_units_separately = true; printops.use_all_prefixes = false; printops.excessive_parenthesis = false; printops.allow_non_usable = false; printops.lower_case_numbers = false; printops.duodecimal_symbols = false; printops.lower_case_e = false; printops.base_display = BASE_DISPLAY_SUFFIX; printops.twos_complement = true; printops.hexadecimal_twos_complement = false; printops.limit_implicit_multiplication = false; printops.can_display_unicode_string_function = &can_display_unicode_string_function; printops.can_display_unicode_string_arg = NULL; printops.allow_factorization = false; printops.spell_out_logical_operators = true; printops.exp_to_root = true; printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; evalops.approximation = APPROXIMATION_TRY_EXACT; evalops.sync_units = true; evalops.structuring = STRUCTURING_SIMPLIFY; evalops.parse_options.unknowns_enabled = false; evalops.parse_options.read_precision = DONT_READ_PRECISION; evalops.parse_options.base = BASE_DECIMAL; evalops.allow_complex = true; evalops.allow_infinite = true; evalops.auto_post_conversion = POST_CONVERSION_OPTIMAL; evalops.assume_denominators_nonzero = true; evalops.warn_about_denominators_assumed_nonzero = true; evalops.parse_options.limit_implicit_multiplication = false; evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; evalops.parse_options.angle_unit = ANGLE_UNIT_RADIANS; custom_angle_unit = ""; evalops.parse_options.dot_as_separator = CALCULATOR->default_dot_as_separator; evalops.parse_options.comma_as_separator = false; evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_DEFAULT; evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; evalops.local_currency_conversion = true; evalops.interval_calculation = INTERVAL_CALCULATION_VARIANCE_FORMULA; title_type = TITLE_APP; programming_base_changed = false; auto_calculate = true; status_in_history = true; autocalc_selection = false; dot_question_asked = false; implicit_question_asked = false; complex_angle_form = false; decimal_comma = -1; adaptive_interval_display = true; tc_set = false; sinc_set = false; dual_fraction = -1; dual_approximation = -1; auto_update_exchange_rates = 7; close_with_esc = false; rpn_mode = false; rpn_keys = true; rpn_shown = false; caret_as_xor = false; automatic_digit_grouping = false; copy_ascii = false; copy_ascii_without_units = false; do_imaginary_j = false; simplified_percentage = -1; color = 1; colorize_result = true; format_result = true; enable_tooltips = 1; chain_mode = false; enable_input_method = false; enable_completion = true; enable_completion2 = true; completion_min = 1; completion_min2 = 1; completion_delay = 500; always_on_top = false; display_expression_status = true; expression_status_delay = 1000; auto_calculate_delay = 500; prefixes_default = true; keypad_type = 0; toolbar_style = Qt::ToolButtonIconOnly; separate_keypad_menu_buttons = false; show_keypad = -1; hide_numpad = false; show_bases = -1; use_custom_result_font = false; use_custom_expression_font = false; use_custom_keypad_font = false; use_custom_app_font = false; save_custom_result_font = false; save_custom_expression_font = false; save_custom_keypad_font = false; save_custom_app_font = false; custom_result_font = ""; custom_expression_font = ""; custom_keypad_font = ""; custom_app_font = ""; style = ""; palette = -1; disable_cursor_blinking = false; replace_expression = KEEP_EXPRESSION; autocopy_result = false; save_mode_on_exit = true; save_defs_on_exit = true; clear_history_on_exit = false; max_history_lines = 300; history_expression_type = 0; keep_function_dialog_open = false; #ifdef _WIN32 check_version = true; #else check_version = false; #endif last_version_check_date.setToCurrentDate(); current_workspace = ""; recent_workspaces.clear(); v_expression.clear(); v_parse.clear(); v_value.clear(); v_protected.clear(); current_history_time = 0; v_time.clear(); v_result.clear(); v_exact.clear(); v_pexact.clear(); v_messages.clear(); v_parseerror.clear(); expression_history.clear(); preserve_history_height = -1; keypad_appended = false; bases_appended = false; default_shortcuts = true; for(size_t i = 0; i < keyboard_shortcuts.size(); i++) delete keyboard_shortcuts[i]; keyboard_shortcuts.clear(); custom_buttons.clear(); custom_button_rows = 5; custom_button_columns = 4; default_signed = -1; default_bits = -1; favourite_functions_changed = false; favourite_variables_changed = false; favourite_units_changed = false; show_all_functions = false; show_all_variables = false; show_all_units = false; use_function_dialog = true; FILE *file = NULL; std::string filename = buildPath(getLocalDir(), "qalculate-qt.cfg"); file = fopen(filename.c_str(), "r"); default_plot_legend_placement = PLOT_LEGEND_TOP_RIGHT; default_plot_display_grid = true; default_plot_full_border = false; default_plot_min = "0"; default_plot_max = "10"; default_plot_step = "1"; default_plot_sampling_rate = 1001; default_plot_linewidth = 2; default_plot_rows = false; default_plot_type = 0; default_plot_style = PLOT_STYLE_LINES; default_plot_smoothing = PLOT_SMOOTHING_NONE; default_plot_variable = "x"; default_plot_color = true; default_plot_use_sampling_rate = true; default_plot_complex = -1; max_plot_time = 5; preferences_version[0] = 5; preferences_version[1] = 5; preferences_version[2] = 1; if(file) { char line[1000000L]; std::string stmp, svalue, svar; size_t i; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp = line; remove_blank_ends(stmp); if((i = stmp.find_first_of("=")) != std::string::npos) { svar = stmp.substr(0, i); remove_blank_ends(svar); svalue = stmp.substr(i + 1); remove_blank_ends(svalue); readPreferenceValue(svar, svalue); } } fclose(file); first_time = false; } else { first_time = true; } while(v_expression.size() > v_parse.size()) { v_parse.push_back(""); v_pexact.push_back(true); } keyboard_shortcut *ks; #define ADD_SHORTCUT(k, t, v) ks = new keyboard_shortcut; ks->key = k; ks->type.push_back(t); ks->value.push_back(v); ks->action = NULL; ks->new_action = false; keyboard_shortcuts.push_back(ks); if(default_shortcuts) { #ifdef _WIN32 ADD_SHORTCUT("Ctrl+Q", SHORTCUT_TYPE_QUIT, "") #else ADD_SHORTCUT(QKeySequence(QKeySequence::Quit).toString(), SHORTCUT_TYPE_QUIT, "") #endif ADD_SHORTCUT(QKeySequence(QKeySequence::HelpContents).toString(), SHORTCUT_TYPE_HELP, "") ADD_SHORTCUT("Ctrl+Alt+C", SHORTCUT_TYPE_COPY_RESULT, "") ADD_SHORTCUT(QKeySequence(QKeySequence::Save).toString(), SHORTCUT_TYPE_STORE, "") ADD_SHORTCUT("Ctrl+M", SHORTCUT_TYPE_MANAGE_VARIABLES, "") ADD_SHORTCUT("Ctrl+F", SHORTCUT_TYPE_MANAGE_FUNCTIONS, "") ADD_SHORTCUT("Ctrl+U", SHORTCUT_TYPE_MANAGE_UNITS, "") ADD_SHORTCUT("Ctrl+P", SHORTCUT_TYPE_PLOT, "") ADD_SHORTCUT("Ctrl+R", SHORTCUT_TYPE_RPN_MODE, "") ADD_SHORTCUT("Ctrl+K", SHORTCUT_TYPE_KEYPAD, "") ADD_SHORTCUT("Alt+K", SHORTCUT_TYPE_KEYPAD, "") ADD_SHORTCUT("Ctrl+T", SHORTCUT_TYPE_CONVERT, "") ADD_SHORTCUT("Ctrl+B", SHORTCUT_TYPE_NUMBER_BASES, "") ADD_SHORTCUT("Ctrl+-", SHORTCUT_TYPE_NEGATE, "") ADD_SHORTCUT("Ctrl+Enter", SHORTCUT_TYPE_APPROXIMATE, "") ADD_SHORTCUT("Ctrl+Return", SHORTCUT_TYPE_APPROXIMATE, "") ADD_SHORTCUT("Alt+M", SHORTCUT_TYPE_MODE, "") ADD_SHORTCUT("Alt+F", SHORTCUT_TYPE_FUNCTIONS_MENU, "") ADD_SHORTCUT("Alt+U", SHORTCUT_TYPE_UNITS_MENU, "") ADD_SHORTCUT("Alt+V", SHORTCUT_TYPE_VARIABLES_MENU, "") ADD_SHORTCUT("F10", SHORTCUT_TYPE_MENU, "") ADD_SHORTCUT("Ctrl+)", SHORTCUT_TYPE_SMART_PARENTHESES, "") ADD_SHORTCUT("Ctrl+(", SHORTCUT_TYPE_SMART_PARENTHESES, "") ADD_SHORTCUT("Ctrl+Up", SHORTCUT_TYPE_RPN_UP, "") ADD_SHORTCUT("Ctrl+Down", SHORTCUT_TYPE_RPN_DOWN, "") ADD_SHORTCUT("Ctrl+Right", SHORTCUT_TYPE_RPN_SWAP, "") ADD_SHORTCUT("Ctrl+Left", SHORTCUT_TYPE_RPN_LASTX, "") ADD_SHORTCUT("Ctrl+Shift+C", SHORTCUT_TYPE_RPN_COPY, "") ADD_SHORTCUT("Ctrl+Delete", SHORTCUT_TYPE_RPN_DELETE, "") ADD_SHORTCUT("Ctrl+Shift+Delete", SHORTCUT_TYPE_RPN_CLEAR, "") ADD_SHORTCUT("Tab", SHORTCUT_TYPE_COMPLETE, "") } else if(PREFERENCES_VERSION_BEFORE(4, 1, 2)) { ADD_SHORTCUT("Tab", SHORTCUT_TYPE_COMPLETE, "") } else if(PREFERENCES_VERSION_BEFORE(4, 8, 1)) { bool b1 = false, b2 = false, b3 = false; for(size_t i = 0; i < keyboard_shortcuts.size(); i++) { if(keyboard_shortcuts[i]->key == "Alt+F") b1 = true; else if(keyboard_shortcuts[i]->key == "Alt+U") b2 = true; else if(keyboard_shortcuts[i]->key == "Alt+V") b3 = true; } if(!b1) {ADD_SHORTCUT("Alt+F", SHORTCUT_TYPE_FUNCTIONS_MENU, "")} if(!b2) {ADD_SHORTCUT("Alt+U", SHORTCUT_TYPE_UNITS_MENU, "")} if(!b3) {ADD_SHORTCUT("Alt+V", SHORTCUT_TYPE_VARIABLES_MENU, "")} } updateMessagePrintOptions(); std::string ans_str = "ans"; vans[0] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str, m_undefined, QApplication::tr("Last Answer").toStdString(), false, true)); vans[0]->setDescription(tr("Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution).").toStdString()); vans[0]->addName(QApplication::tr("answer").toStdString()); vans[0]->addName(ans_str + "1"); vans[1] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "2", m_undefined, QApplication::tr("Answer 2").toStdString(), false, true)); vans[2] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "3", m_undefined, QApplication::tr("Answer 3").toStdString(), false, true)); vans[3] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "4", m_undefined, QApplication::tr("Answer 4").toStdString(), false, true)); vans[4] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "5", m_undefined, QApplication::tr("Answer 5").toStdString(), false, true)); v_memory = new KnownVariable(CALCULATOR->temporaryCategory(), "", m_zero, QApplication::tr("Memory").toStdString(), false, true); ExpressionName ename; ename.name = "MR"; ename.case_sensitive = true; ename.abbreviation = true; v_memory->addName(ename); ename.name = "MRC"; v_memory->addName(ename); CALCULATOR->addVariable(v_memory); #ifdef _WIN32 updateStyle(); #else if(!style.isEmpty()) updateStyle(); else if(palette >= 0) updatePalette(); #endif if(!current_workspace.empty()) { if(!loadWorkspace(current_workspace.c_str())) current_workspace = ""; } } void QalculateQtSettings::setCustomAngleUnit() { if(!custom_angle_unit.empty()) { CALCULATOR->setCustomAngleUnit(CALCULATOR->getActiveUnit(custom_angle_unit)); if(CALCULATOR->customAngleUnit()) custom_angle_unit = CALCULATOR->customAngleUnit()->referenceName(); } if(evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && !CALCULATOR->customAngleUnit()) evalops.parse_options.angle_unit = ANGLE_UNIT_NONE; } void QalculateQtSettings::updateFavourites() { if(favourite_functions_pre.empty()) { for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isLocal() && !CALCULATOR->functions[i]->isHidden()) favourite_functions.push_back(CALCULATOR->functions[i]); } } else { for(size_t i = 0; i < favourite_functions_pre.size(); i++) { MathFunction *f = CALCULATOR->getActiveFunction(favourite_functions_pre[i]); if(f) favourite_functions.push_back(f); } } for(size_t i = 0; i < recent_functions_pre.size(); i++) { MathFunction *f = CALCULATOR->getActiveFunction(recent_functions_pre[i]); if(f) recent_functions.push_back(f); } if(favourite_units_pre.empty()) { const char *si_units[] = {"m", "kg_c", "s", "A", "K", "mol", "cd"}; for(size_t i = 0; i < 7; i++) { Unit *u = CALCULATOR->getActiveUnit(si_units[i]); if(!u) u = CALCULATOR->getCompositeUnit(si_units[i]); if(u) favourite_units.push_back(u); } for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isLocal() && !CALCULATOR->units[i]->isHidden()) favourite_units.push_back(CALCULATOR->units[i]); } } else { for(size_t i = 0; i < favourite_units_pre.size(); i++) { Unit *u = CALCULATOR->getActiveUnit(favourite_units_pre[i]); if(!u) u = CALCULATOR->getCompositeUnit(favourite_units_pre[i]); if(u) favourite_units.push_back(u); } } for(size_t i = 0; i < recent_units_pre.size(); i++) { Unit *u = CALCULATOR->getActiveUnit(recent_units_pre[i]); if(!u) u = CALCULATOR->getCompositeUnit(recent_units_pre[i]); if(u) recent_units.push_back(u); } if(favourite_variables_pre.empty()) { favourite_variables.push_back(CALCULATOR->getVariableById(VARIABLE_ID_PI)); favourite_variables.push_back(CALCULATOR->getVariableById(VARIABLE_ID_E)); favourite_variables.push_back(CALCULATOR->getVariableById(VARIABLE_ID_EULER)); Variable *v = CALCULATOR->getActiveVariable("golden"); if(v) favourite_variables.push_back(v); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal() && !CALCULATOR->variables[i]->isHidden()) favourite_variables.push_back(CALCULATOR->variables[i]); } } else { for(size_t i = 0; i < favourite_variables_pre.size(); i++) { Variable *v = CALCULATOR->getActiveVariable(favourite_variables_pre[i]); if(v) favourite_variables.push_back(v); } } for(size_t i = 0; i < recent_variables_pre.size(); i++) { Variable *v = CALCULATOR->getActiveVariable(recent_variables_pre[i]); if(v) recent_variables.push_back(v); } } #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) void QalculateQtSettings::updatePalette(bool force_update) { if(!force_update && palette != 1 && QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark && (style.isEmpty() || !QStyleFactory::keys().contains(style) || style.compare("Fusion", Qt::CaseInsensitive) == 0)) return; QPalette p; if(palette == 1 && QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark) { #else void QalculateQtSettings::updatePalette(bool) { QPalette p; if(palette == 1) { #endif p.setColor(QPalette::Active, QPalette::Window, QColor(42, 46, 50)); p.setColor(QPalette::Active, QPalette::WindowText, QColor(252, 252, 252)); p.setColor(QPalette::Active, QPalette::Base, QColor(27, 30, 32)); p.setColor(QPalette::Active, QPalette::AlternateBase, QColor(35, 38, 41)); p.setColor(QPalette::Active, QPalette::ToolTipBase, QColor(49, 54, 59)); p.setColor(QPalette::Active, QPalette::ToolTipText, QColor(252, 252, 252)); #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) p.setColor(QPalette::Active, QPalette::PlaceholderText, QColor(161, 169, 177)); #endif p.setColor(QPalette::Active, QPalette::Text, QColor(252, 252, 252)); p.setColor(QPalette::Active, QPalette::Button, QColor(49, 54, 59)); p.setColor(QPalette::Active, QPalette::ButtonText, QColor(252, 252, 252)); p.setColor(QPalette::Active, QPalette::BrightText, QColor(39, 174, 96)); p.setColor(QPalette::Inactive, QPalette::Window, QColor(42, 46, 50)); p.setColor(QPalette::Inactive, QPalette::WindowText, QColor(252, 252, 252)); p.setColor(QPalette::Inactive, QPalette::Base, QColor(27, 30, 32)); p.setColor(QPalette::Inactive, QPalette::AlternateBase, QColor(35, 38, 41)); p.setColor(QPalette::Inactive, QPalette::ToolTipBase, QColor(49, 54, 59)); p.setColor(QPalette::Inactive, QPalette::ToolTipText, QColor(252, 252, 252)); #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) p.setColor(QPalette::Inactive, QPalette::PlaceholderText, QColor(161, 169, 177)); #endif p.setColor(QPalette::Inactive, QPalette::Text, QColor(252, 252, 252)); p.setColor(QPalette::Inactive, QPalette::Button, QColor(49, 54, 59)); p.setColor(QPalette::Inactive, QPalette::ButtonText, QColor(252, 252, 252)); p.setColor(QPalette::Inactive, QPalette::BrightText, QColor(39, 174, 96)); p.setColor(QPalette::Disabled, QPalette::Window, QColor(42, 46, 50)); p.setColor(QPalette::Disabled, QPalette::WindowText, QColor(101, 101, 101)); p.setColor(QPalette::Disabled, QPalette::Base, QColor(27, 30, 32)); p.setColor(QPalette::Disabled, QPalette::AlternateBase, QColor(35, 38, 41)); p.setColor(QPalette::Disabled, QPalette::ToolTipBase, QColor(49, 54, 59)); p.setColor(QPalette::Disabled, QPalette::ToolTipText, QColor(252, 252, 252)); #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) p.setColor(QPalette::Disabled, QPalette::PlaceholderText, QColor(161, 169, 177)); #endif p.setColor(QPalette::Disabled, QPalette::Text, QColor(101, 101, 101)); p.setColor(QPalette::Disabled, QPalette::Button, QColor(47, 52, 56)); p.setColor(QPalette::Disabled, QPalette::ButtonText,QColor(101, 101, 101)); p.setColor(QPalette::Disabled, QPalette::BrightText, QColor(39, 174, 96)); } else { #ifdef _WIN32 QStyle *s = NULL; #if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) if(QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark || style.isEmpty() || !QStyleFactory::keys().contains(style) || style.compare("windowsvista", Qt::CaseInsensitive) != 0) s = QStyleFactory::create("fusion"); #else s = QStyleFactory::create("fusion"); #endif if(!s) s = QApplication::style(); p = s->standardPalette(); #else p = QApplication::style()->standardPalette(); #endif } QApplication::setPalette(p); } void QalculateQtSettings::updateStyle() { if(!style.isEmpty() && QStyleFactory::keys().contains(style)) { QStyle *s = QStyleFactory::create(style); if(s) QApplication::setStyle(s); } #ifdef _WIN32 else { QStyle *s = QStyleFactory::create("fusion"); if(s) QApplication::setStyle(s); } #endif updatePalette(); } int QalculateQtSettings::savePreferences(bool save_mode) { std::string homedir = getLocalDir(); recursiveMakeDir(homedir); std::string filename = buildPath(homedir, "qalculate-qt.cfg"); while(!savePreferences(filename.c_str(), false, save_mode)) { int answer = QMessageBox::critical(NULL, QApplication::tr("Error"), QApplication::tr("Couldn't write preferences to\n%1").arg(QString::fromStdString(filename)), QMessageBox::Retry | QMessageBox::Ignore | QMessageBox::Cancel); if(answer == QMessageBox::Ignore) return 0; else if(answer == QMessageBox::Cancel) return -1; } return 1; } bool QalculateQtSettings::savePreferences(const char *filename, bool is_workspace, bool) { std::string shistory, smode, sgeneral; bool read_default = !is_workspace && !current_workspace.empty(); if(read_default && fileExists(filename)) { FILE *file = fopen(filename, "r"); if(!file) return false; char line[1000000L]; std::string stmp, svalue, svar; size_t i; bool b_mode = false, b_history = false; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp = line; remove_blank_ends(stmp); if(!stmp.empty()) { if(stmp[0] == '[') { b_mode = false; b_history = false; } else if(b_mode) { smode += stmp; smode += "\n"; } else if(b_history) { shistory += stmp; shistory += "\n"; } if(!b_mode && !b_history) { if(stmp == "[Mode]") { b_mode = true; } else if(!clear_history_on_exit && stmp == "[History]") { b_history = true; } else if((i = stmp.find_first_of("=")) != std::string::npos) { if(stmp.substr(0, i) == "keypad_type" || stmp.substr(0, i) == "hide_numpad" || stmp.substr(0, i) == "show_keypad" || stmp.substr(0, i) == "show_bases") { sgeneral += stmp; sgeneral += "\n"; } } } } } fclose(file); } FILE *file = fopen(filename, "w+"); if(!file) return false; if(is_workspace) fputs("QALCULATE WORKSPACE FILE\n", file); fprintf(file, "\n[General]\n"); fprintf(file, "version=%s\n", qApp->applicationVersion().toUtf8().data()); if(!is_workspace) { fprintf(file, "allow_multiple_instances=%i\n", allow_multiple_instances); if(!custom_lang.isEmpty()) fprintf(file, "language=%s\n", custom_lang.toUtf8().data()); fprintf(file, "ignore_locale=%i\n", ignore_locale); fprintf(file, "check_version=%i\n", check_version); if(check_version) { fprintf(file, "last_version_check=%s\n", last_version_check_date.toISOString().c_str()); if(!last_found_version.empty()) fprintf(file, "last_found_version=%s\n", last_found_version.c_str()); } if(!window_state.isEmpty()) fprintf(file, "window_state=%s\n", window_state.toBase64().data()); if(!window_geometry.isEmpty()) fprintf(file, "window_geometry=%s\n", window_geometry.toBase64().data()); fprintf(file, "preserve_history_height=%i\n", preserve_history_height); if(keypad_appended) fprintf(file, "keypad_appended=%i\n", keypad_appended); if(bases_appended) fprintf(file, "bases_appended=%i\n", bases_appended); if(rpn_shown) fprintf(file, "rpn_shown=%i\n", rpn_shown); fprintf(file, "splitter_state=%s\n", splitter_state.toBase64().data()); if(!functions_geometry.isEmpty()) fprintf(file, "functions_geometry=%s\n", functions_geometry.toBase64().data()); if(!functions_vsplitter_state.isEmpty()) fprintf(file, "functions_vsplitter_state=%s\n", functions_vsplitter_state.toBase64().data()); if(!functions_hsplitter_state.isEmpty()) fprintf(file, "functions_hsplitter_state=%s\n", functions_hsplitter_state.toBase64().data()); fprintf(file, "keep_function_dialog_open=%i\n", keep_function_dialog_open); if(!units_geometry.isEmpty()) fprintf(file, "units_geometry=%s\n", units_geometry.toBase64().data()); if(!units_vsplitter_state.isEmpty()) fprintf(file, "units_vsplitter_state=%s\n", units_vsplitter_state.toBase64().data()); if(!units_hsplitter_state.isEmpty()) fprintf(file, "units_hsplitter_state=%s\n", units_hsplitter_state.toBase64().data()); if(!variables_geometry.isEmpty()) fprintf(file, "variables_geometry=%s\n", variables_geometry.toBase64().data()); if(!variables_vsplitter_state.isEmpty()) fprintf(file, "variables_vsplitter_state=%s\n", variables_vsplitter_state.toBase64().data()); if(!variables_hsplitter_state.isEmpty()) fprintf(file, "variables_hsplitter_state=%s\n", variables_hsplitter_state.toBase64().data()); if(!datasets_geometry.isEmpty()) fprintf(file, "datasets_geometry=%s\n", datasets_geometry.toBase64().data()); if(!datasets_vsplitter_state.isEmpty()) fprintf(file, "datasets_vsplitter_state=%s\n", datasets_vsplitter_state.toBase64().data()); if(!datasets_hsplitter_state.isEmpty()) fprintf(file, "datasets_hsplitter_state=%s\n", datasets_hsplitter_state.toBase64().data()); fprintf(file, "always_on_top=%i\n", always_on_top); if(title_type != TITLE_APP) fprintf(file, "window_title_mode=%i\n", title_type); fprintf(file, "save_mode_on_exit=%i\n", save_mode_on_exit); fprintf(file, "save_definitions_on_exit=%i\n", save_defs_on_exit); fprintf(file, "clear_history_on_exit=%i\n", clear_history_on_exit); if(max_history_lines != 300) fprintf(file, "max_history_lines=%i\n", max_history_lines); fprintf(file, "enable_input_method=%i\n", enable_input_method); fprintf(file, "enable_tooltips=%i\n", enable_tooltips); fprintf(file, "display_expression_status=%i\n", display_expression_status); fprintf(file, "expression_status_delay=%i\n", expression_status_delay); fprintf(file, "enable_completion=%i\n", enable_completion); fprintf(file, "enable_completion2=%i\n", enable_completion2); fprintf(file, "completion_min=%i\n", completion_min); fprintf(file, "completion_min2=%i\n", completion_min2); fprintf(file, "completion_delay=%i\n", completion_delay); if(!style.isEmpty()) fprintf(file, "style_name=%s\n", style.toUtf8().data()); if(toolbar_style != Qt::ToolButtonIconOnly) fprintf(file, "toolbar_style=%i\n", toolbar_style); fprintf(file, "separate_keypad_menu_buttons=%i\n", separate_keypad_menu_buttons); fprintf(file, "palette=%i\n", palette); fprintf(file, "color=%i\n", colorize_result); if(disable_cursor_blinking) fprintf(file, "disable_cursor_blinking=%i\n", disable_cursor_blinking); if(!format_result) fprintf(file, "format=%i\n", format_result); fprintf(file, "use_custom_result_font=%i\n", use_custom_result_font); fprintf(file, "use_custom_expression_font=%i\n", use_custom_expression_font); fprintf(file, "use_custom_keypad_font=%i\n", use_custom_keypad_font); fprintf(file, "use_custom_application_font=%i\n", use_custom_app_font); if(use_custom_result_font || save_custom_result_font) fprintf(file, "custom_result_font=%s\n", custom_result_font.c_str()); if(use_custom_expression_font || save_custom_expression_font) fprintf(file, "custom_expression_font=%s\n", custom_expression_font.c_str()); if(use_custom_keypad_font || save_custom_keypad_font) fprintf(file, "custom_keypad_font=%s\n", custom_keypad_font.c_str()); if(use_custom_app_font || save_custom_app_font) fprintf(file, "custom_application_font=%s\n", custom_app_font.c_str()); if(printops.multiplication_sign != MULTIPLICATION_SIGN_X) fprintf(file, "multiplication_sign=%i\n", printops.multiplication_sign); if(printops.division_sign != DIVISION_SIGN_DIVISION_SLASH) fprintf(file, "division_sign=%i\n", printops.division_sign); if(implicit_question_asked) fprintf(file, "implicit_question_asked=%i\n", implicit_question_asked); fprintf(file, "replace_expression=%i\n", replace_expression); fprintf(file, "autocopy_result=%i\n", autocopy_result); fprintf(file, "history_expression_type=%i\n", history_expression_type); } if(read_default) { fputs(sgeneral.c_str(), file); } else { fprintf(file, "keypad_type=%i\n", keypad_type); if(show_keypad >= 0) fprintf(file, "show_keypad=%i\n", show_keypad); if(programming_base_changed) fprintf(file, "programming_base_changed=%i\n", programming_base_changed); fprintf(file, "hide_numpad=%i\n", hide_numpad); fprintf(file, "show_bases=%i\n", show_bases); } if(!is_workspace) { fprintf(file, "rpn_keys=%i\n", rpn_keys); fprintf(file, "show_all_functions=%i\n", show_all_functions); fprintf(file, "show_all_units=%i\n", show_all_units); fprintf(file, "show_all_variables=%i\n", show_all_variables); fprintf(file, "use_function_dialog=%i\n", use_function_dialog); if(!current_workspace.empty()) fprintf(file, "last_workspace=%s\n", current_workspace.c_str()); if(save_workspace >= 0) fprintf(file, "save_workspace=%i\n", save_workspace); for(size_t i = 0; i < recent_workspaces.size(); i++) { fprintf(file, "recent_workspace=%s\n", recent_workspaces[i].c_str()); } if(!custom_buttons.empty()) { fprintf(file, "custom_button_columns=%i\n", custom_button_columns); fprintf(file, "custom_button_rows=%i\n", custom_button_rows); for(unsigned int i = 0; i < custom_buttons.size(); i++) { if(!custom_buttons[i].label.isEmpty()) fprintf(file, "custom_button_label=%i %i %s\n", custom_buttons[i].r, custom_buttons[i].c, custom_buttons[i].label.toUtf8().data()); for(unsigned int bi = 0; bi <= 2; bi++) { if(custom_buttons[i].type[bi] != -1) { if(custom_buttons[i].value[bi].empty()) fprintf(file, "custom_button=%i %i %u %i\n", custom_buttons[i].c, custom_buttons[i].r, bi, custom_buttons[i].type[bi]); else fprintf(file, "custom_button=%i %i %u %i %s\n", custom_buttons[i].c, custom_buttons[i].r, bi, custom_buttons[i].type[bi], custom_buttons[i].value[bi].c_str()); } } } } if(!default_shortcuts) { for(size_t i = 0; i < keyboard_shortcuts.size(); i++) { for(size_t i2 = 0; i2 < keyboard_shortcuts[i]->type.size(); i2++) { if(keyboard_shortcuts[i]->value[i2].empty()) fprintf(file, "keyboard_shortcut=%s %i\n", keyboard_shortcuts[i]->key.toUtf8().data(), keyboard_shortcuts[i]->type[i2]); else fprintf(file, "keyboard_shortcut=%s %i %s\n", keyboard_shortcuts[i]->key.toUtf8().data(), keyboard_shortcuts[i]->type[i2], keyboard_shortcuts[i]->value[i2].c_str()); } } } if(favourite_functions_changed) { for(size_t i = 0; i < favourite_functions.size(); i++) { if(CALCULATOR->stillHasFunction(favourite_functions[i]) && favourite_functions[i]->isActive() && favourite_functions[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "favourite_function=%s\n", favourite_functions[i]->referenceName().c_str()); } } } for(size_t i = 0; i < recent_functions.size(); i++) { if(CALCULATOR->stillHasFunction(recent_functions[i]) && recent_functions[i]->isActive() && recent_functions[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "recent_function=%s\n", recent_functions[i]->referenceName().c_str()); } } if(favourite_units_changed) { for(size_t i = 0; i < favourite_units.size(); i++) { if(CALCULATOR->stillHasUnit(favourite_units[i]) && favourite_units[i]->isActive() && favourite_units[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "favourite_unit=%s\n", favourite_units[i]->referenceName().c_str()); } } } for(size_t i = 0; i < recent_units.size(); i++) { if(CALCULATOR->stillHasUnit(recent_units[i]) && recent_units[i]->isActive() && recent_units[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "recent_unit=%s\n", recent_units[i]->referenceName().c_str()); } } if(!latest_button_unit.empty()) fprintf(file, "latest_button_unit=%s\n", latest_button_unit.c_str()); if(favourite_variables_changed) { for(size_t i = 0; i < favourite_variables.size(); i++) { if(CALCULATOR->stillHasVariable(favourite_variables[i]) && favourite_variables[i]->isActive() && favourite_variables[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "favourite_variable=%s\n", favourite_variables[i]->referenceName().c_str()); } } } for(size_t i = 0; i < recent_variables.size(); i++) { if(CALCULATOR->stillHasVariable(recent_variables[i]) && recent_variables[i]->isActive() && recent_variables[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "recent_variable=%s\n", recent_variables[i]->referenceName().c_str()); } } if(default_bits >= 0) fprintf(file, "bit_width=%i\n", default_bits); if(default_signed >= 0) fprintf(file, "signed_integer=%i\n", default_signed); fprintf(file, "spell_out_logical_operators=%i\n", printops.spell_out_logical_operators); fprintf(file, "caret_as_xor=%i\n", caret_as_xor); fprintf(file, "automatic_digit_grouping=%i\n", automatic_digit_grouping); fprintf(file, "close_with_esc=%i\n", close_with_esc); fprintf(file, "copy_ascii=%i\n", copy_ascii); fprintf(file, "copy_ascii_without_units=%i\n", copy_ascii_without_units); fprintf(file, "digit_grouping=%i\n", printops.digit_grouping); fprintf(file, "decimal_comma=%i\n", decimal_comma); fprintf(file, "dot_as_separator=%i\n", dot_question_asked ? evalops.parse_options.dot_as_separator : -1); fprintf(file, "comma_as_separator=%i\n", evalops.parse_options.comma_as_separator); fprintf(file, "twos_complement=%i\n", printops.twos_complement); fprintf(file, "hexadecimal_twos_complement=%i\n", printops.hexadecimal_twos_complement); fprintf(file, "twos_complement_input=%i\n", evalops.parse_options.twos_complement); fprintf(file, "hexadecimal_twos_complement_input=%i\n", evalops.parse_options.hexadecimal_twos_complement); fprintf(file, "use_unicode_signs=%i\n", printops.use_unicode_signs); fprintf(file, "lower_case_numbers=%i\n", printops.lower_case_numbers); fprintf(file, "duodecimal_symbols=%i\n", printops.duodecimal_symbols); fprintf(file, "exp_display=%i\n", printops.exp_display); fprintf(file, "imaginary_j=%i\n", CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0); fprintf(file, "base_display=%i\n", printops.base_display); if(printops.binary_bits != 0) fprintf(file, "binary_bits=%i\n", printops.binary_bits); if(tc_set) fprintf(file, "temperature_calculation=%i\n", CALCULATOR->getTemperatureCalculationMode()); if(sinc_set) fprintf(file, "sinc_function=%i\n", CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->getDefaultValue(2) == "pi" ? 1 : 0); fprintf(file, "auto_update_exchange_rates=%i\n", auto_update_exchange_rates); fprintf(file, "local_currency_conversion=%i\n", evalops.local_currency_conversion); fprintf(file, "use_binary_prefixes=%i\n", CALCULATOR->usesBinaryPrefixes()); fprintf(file, "calculate_as_you_type=%i\n", auto_calculate); fprintf(file, "calculate_as_you_type_delay=%i\n", auto_calculate_delay); fprintf(file, "status_in_history=%i\n", status_in_history); fprintf(file, "autocalc_selection=%i\n", autocalc_selection); if(previous_precision > 0) fprintf(file, "previous_precision=%i\n", previous_precision); } if(read_default) { fprintf(file, "\n[Mode]\n"); fputs(smode.c_str(), file); } else { fprintf(file, "\n[Mode]\n"); fprintf(file, "min_deci=%i\n", printops.min_decimals); fprintf(file, "use_min_deci=%i\n", printops.use_min_decimals); fprintf(file, "max_deci=%i\n", printops.max_decimals); fprintf(file, "use_max_deci=%i\n", printops.use_max_decimals); fprintf(file, "precision=%i\n", CALCULATOR->getPrecision()); fprintf(file, "interval_display=%i\n", adaptive_interval_display ? 0 : printops.interval_display + 1); fprintf(file, "min_exp=%i\n", printops.min_exp); fprintf(file, "negative_exponents=%i\n", printops.negative_exponents); fprintf(file, "sort_minus_last=%i\n", printops.sort_options.minus_last); int v = printops.number_fraction_format; if(dual_fraction < 0) v = -1; else if(dual_fraction > 0) v = FRACTION_COMBINED + 2; else if(!printops.restrict_fraction_length && printops.number_fraction_format == FRACTION_FRACTIONAL) v = FRACTION_COMBINED + 1; else if(printops.number_fraction_format >= FRACTION_FRACTIONAL_FIXED_DENOMINATOR) v += 2; fprintf(file, "number_fraction_format=%i\n", v); if(v == FRACTION_COMBINED_FIXED_DENOMINATOR + 2 || v == FRACTION_FRACTIONAL_FIXED_DENOMINATOR + 2) fprintf(file, "number_fraction_denominator=%li\n", CALCULATOR->fixedDenominator()); fprintf(file, "complex_number_form=%i\n", (complex_angle_form && evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) ? evalops.complex_number_form + 1 : evalops.complex_number_form); fprintf(file, "use_prefixes=%i\n", printops.use_unit_prefixes); fprintf(file, "use_prefixes_for_all_units=%i\n", printops.use_prefixes_for_all_units); fprintf(file, "use_prefixes_for_currencies=%i\n", printops.use_prefixes_for_currencies); fprintf(file, "use_binary_prefixes=%i\n", CALCULATOR->usesBinaryPrefixes()); fprintf(file, "prefixes_default=%i\n", prefixes_default); fprintf(file, "abbreviate_names=%i\n", printops.abbreviate_names); fprintf(file, "all_prefixes_enabled=%i\n", printops.use_all_prefixes); fprintf(file, "denominator_prefix_enabled=%i\n", printops.use_denominator_prefix); fprintf(file, "place_units_separately=%i\n", printops.place_units_separately); fprintf(file, "auto_post_conversion=%i\n", evalops.auto_post_conversion); fprintf(file, "mixed_units_conversion=%i\n", evalops.mixed_units_conversion); fprintf(file, "number_base=%i\n", printops.base); if(!CALCULATOR->customOutputBase().isZero()) fprintf(file, "custom_number_base=%s\n", CALCULATOR->customOutputBase().print(CALCULATOR->save_printoptions).c_str()); fprintf(file, "number_base_expression=%i\n", evalops.parse_options.base); if(!CALCULATOR->customInputBase().isZero()) fprintf(file, "custom_number_base_expression=%s\n", CALCULATOR->customInputBase().print(CALCULATOR->save_printoptions).c_str()); fprintf(file, "read_precision=%i\n", evalops.parse_options.read_precision); fprintf(file, "assume_denominators_nonzero=%i\n", evalops.assume_denominators_nonzero); fprintf(file, "warn_about_denominators_assumed_nonzero=%i\n", evalops.warn_about_denominators_assumed_nonzero); fprintf(file, "structuring=%i\n", evalops.structuring); fprintf(file, "angle_unit=%i\n", evalops.parse_options.angle_unit); if(evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && CALCULATOR->customAngleUnit()) fprintf(file, "custom_angle_unit=%s\n", CALCULATOR->customAngleUnit()->referenceName().c_str()); fprintf(file, "functions_enabled=%i\n", evalops.parse_options.functions_enabled); fprintf(file, "variables_enabled=%i\n", evalops.parse_options.variables_enabled); fprintf(file, "calculate_functions=%i\n", evalops.calculate_functions); fprintf(file, "calculate_variables=%i\n", evalops.calculate_variables); fprintf(file, "variable_units_enabled=%i\n", CALCULATOR->variableUnitsEnabled()); fprintf(file, "sync_units=%i\n", evalops.sync_units); fprintf(file, "unknownvariables_enabled=%i\n", evalops.parse_options.unknowns_enabled); fprintf(file, "units_enabled=%i\n", evalops.parse_options.units_enabled); fprintf(file, "allow_complex=%i\n", evalops.allow_complex); fprintf(file, "allow_infinite=%i\n", evalops.allow_infinite); fprintf(file, "indicate_infinite_series=%i\n", printops.indicate_infinite_series); fprintf(file, "show_ending_zeroes=%i\n", printops.show_ending_zeroes); fprintf(file, "rounding_mode=%i\n", printops.rounding); if(dual_approximation < 0) fprintf(file, "approximation=%i\n", -1); else if(dual_approximation > 0) fprintf(file, "approximation=%i\n", APPROXIMATION_APPROXIMATE + 1); else fprintf(file, "approximation=%i\n", evalops.approximation); fprintf(file, "concise_uncertainty_input=%i\n", CALCULATOR->conciseUncertaintyInputEnabled()); fprintf(file, "interval_calculation=%i\n", evalops.interval_calculation); fprintf(file, "rpn_mode=%i\n", rpn_mode); fprintf(file, "chain_mode=%i\n", chain_mode); fprintf(file, "limit_implicit_multiplication=%i\n", evalops.parse_options.limit_implicit_multiplication); fprintf(file, "parsing_mode=%i\n", evalops.parse_options.parsing_mode); fprintf(file, "simplified_percentage=%i\n", simplified_percentage); fprintf(file, "spacious=%i\n", printops.spacious); fprintf(file, "excessive_parenthesis=%i\n", printops.excessive_parenthesis); fprintf(file, "default_assumption_type=%i\n", CALCULATOR->defaultAssumptions()->type()); if(CALCULATOR->defaultAssumptions()->type() != ASSUMPTION_TYPE_BOOLEAN) fprintf(file, "default_assumption_sign=%i\n", CALCULATOR->defaultAssumptions()->sign()); } if(!is_workspace) { fprintf(file, "\n[Plotting]\n"); fprintf(file, "plot_legend_placement=%i\n", default_plot_legend_placement); fprintf(file, "plot_style=%i\n", default_plot_style); fprintf(file, "plot_smoothing=%i\n", default_plot_smoothing); fprintf(file, "plot_display_grid=%i\n", default_plot_display_grid); fprintf(file, "plot_full_border=%i\n", default_plot_full_border); fprintf(file, "plot_min=%s\n", default_plot_min.c_str()); fprintf(file, "plot_max=%s\n", default_plot_max.c_str()); fprintf(file, "plot_step=%s\n", default_plot_step.c_str()); fprintf(file, "plot_sampling_rate=%i\n", default_plot_sampling_rate); fprintf(file, "plot_use_sampling_rate=%i\n", default_plot_use_sampling_rate); if(default_plot_complex >= 0) fprintf(file, "plot_complex=%i\n", default_plot_complex); fprintf(file, "plot_variable=%s\n", default_plot_variable.c_str()); fprintf(file, "plot_rows=%i\n", default_plot_rows); fprintf(file, "plot_type=%i\n", default_plot_type); fprintf(file, "plot_color=%i\n", default_plot_color); fprintf(file, "plot_linewidth=%i\n", default_plot_linewidth); if(max_plot_time != 5) fprintf(file, "max_plot_time=%i\n", max_plot_time); } if(read_default) { fprintf(file, "\n[History]\n"); fputs(shistory.c_str(), file); } else if(!clear_history_on_exit || is_workspace) { fprintf(file, "\n[History]\n"); if(!v_expression.empty()) { long int n = 0; size_t i = v_expression.size() - 1; while(true) { n++; for(size_t i2 = 0; i2 < v_result[i].size(); i2++) { if(v_result[i][i2].length() > 300 && unformatted_length(v_result[i][i2]) <= 5000) { n += v_result[i][i2].length() / 300; } n++; } if(n >= max_history_lines || i == 0) break; i--; } size_t i_first = i; long long int history_time_prev = 0; for(i = 0; i < v_expression.size(); i++) { if(i >= i_first || v_protected[i]) { if(v_time[i] != history_time_prev) { history_time_prev = v_time[i]; fprintf(file, "history_time=%lli\n", (long long int) history_time_prev); } if(v_expression[i].empty()) { if(v_protected[i]) fprintf(file, "history_expression*=%s\n", v_parse[i].c_str()); else fprintf(file, "history_expression=%s\n", v_parse[i].c_str()); } else { if(v_protected[i]) fprintf(file, "history_expression*=%s\n", v_expression[i].c_str()); else fprintf(file, "history_expression=%s\n", v_expression[i].c_str()); if(!v_parse[i].empty()) { if(v_pexact[i]) fprintf(file, "history_parse=%s\n", v_parse[i].c_str()); else fprintf(file, "history_parse_approximate=%s\n", v_parse[i].c_str()); } } n++; for(size_t i2 = 0; i2 < v_result[i].size(); i2++) { if(v_exact[i][i2]) fprintf(file, "history_result"); else fprintf(file, "history_result_approximate"); if(unformatted_length(v_result[i][i2]) > 5000 && !v_protected[i]) { std::string str = unhtmlize(v_result[i][i2]); int index = 50; size_t i3 = str.find("\n", 40); if(i3 != std::string::npos && i3 < (size_t) index + 1) { fprintf(file, "=%s
…\n", str.substr(0, i3).c_str()); } else { if(i3 != std::string::npos) gsub("\n", "
", str); while(index >= 0 && (signed char) str[index] < 0 && (unsigned char) str[index + 1] < 0xC0) index--; if(is_not_in(NUMBERS, str[index]) || is_not_in(NUMBERS, str[index + 1])) { str[index + 1] = ' '; index++; } fprintf(file, "=%s…\n", str.substr(0, index + 1).c_str()); } } else { fprintf(file, "=%s\n", v_result[i][i2].c_str()); } } } } } for(size_t i = 0; i < expression_history.size(); i++) { gsub("\n", " ", expression_history[i]); fprintf(file, "expression_history=%s\n", expression_history[i].c_str()); } } if(is_workspace) { fprintf(file, "\n[Definitions]\n"); fputs(CALCULATOR->saveTemporaryDefinitions().c_str(), file); } fclose(file); return true; } const char *QalculateQtSettings::multiplicationSign(bool units) { if(!printops.use_unicode_signs) return "*"; switch(printops.multiplication_sign) { case MULTIPLICATION_SIGN_X: {if(units) {return SIGN_MIDDLEDOT;} return SIGN_MULTIPLICATION;} case MULTIPLICATION_SIGN_DOT: {return SIGN_MULTIDOT;} case MULTIPLICATION_SIGN_ALTDOT: {return SIGN_MIDDLEDOT;} default: {return "*";} } } const char *QalculateQtSettings::divisionSign(bool output) { if(printops.division_sign == DIVISION_SIGN_DIVISION && printops.use_unicode_signs) return SIGN_DIVISION; else if(output && printops.division_sign == DIVISION_SIGN_DIVISION_SLASH && printops.use_unicode_signs) return SIGN_DIVISION_SLASH; return "/"; } std::string QalculateQtSettings::localizeExpression(std::string str, bool unit_expression) { ParseOptions pa = evalops.parse_options; pa.base = 10; str = CALCULATOR->localizeExpression(str, pa); gsub("*", multiplicationSign(unit_expression), str); gsub("/", divisionSign(false), str); gsub("-", SIGN_MINUS, str); return str; } std::string QalculateQtSettings::unlocalizeExpression(std::string str) { ParseOptions pa = evalops.parse_options; pa.base = 10; str = CALCULATOR->unlocalizeExpression(str, pa); CALCULATOR->parseSigns(str); return str; } void QalculateQtSettings::updateMessagePrintOptions() { PrintOptions message_printoptions = printops; message_printoptions.is_approximate = NULL; message_printoptions.interval_display = INTERVAL_DISPLAY_PLUSMINUS; message_printoptions.show_ending_zeroes = false; message_printoptions.base = 10; if(printops.min_exp < -10 || printops.min_exp > 10 || ((printops.min_exp == EXP_PRECISION || printops.min_exp == EXP_NONE) && PRECISION > 10)) message_printoptions.min_exp = 10; else if(printops.min_exp == EXP_NONE) message_printoptions.min_exp = EXP_PRECISION; if(PRECISION > 10) { message_printoptions.use_max_decimals = true; message_printoptions.max_decimals = 10; } CALCULATOR->setMessagePrintOptions(message_printoptions); } MathLineEdit::MathLineEdit(QWidget *parent, bool unit_expression, bool function_expression) : QLineEdit(parent), b_unit(unit_expression), b_function(function_expression) { #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif } MathLineEdit::~MathLineEdit() {} void MathLineEdit::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Asterisk: { insert(settings->multiplicationSign(b_unit)); return; } case Qt::Key_Slash: { insert(settings->divisionSign(false)); return; } case Qt::Key_Minus: { insert(SIGN_MINUS); return; } case Qt::Key_Dead_Circumflex: { insert(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { insert("~"); return; } case Qt::Key_AsciiCircum: { if(settings->caret_as_xor) { insert(" xor "); return; } break; } case Qt::Key_BraceLeft: { if(!b_function) {return;} break; } case Qt::Key_BraceRight: { if(!b_function) {return;} break; } } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { insert("^"); return; } QLineEdit::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } bool QalculateQtSettings::checkExchangeRates(QWidget *parent) { int i = CALCULATOR->exchangeRatesUsed(); if(i == 0) return false; if(auto_update_exchange_rates == 0) return false; if(CALCULATOR->checkExchangeRatesDate(auto_update_exchange_rates > 0 ? auto_update_exchange_rates : 7, false, auto_update_exchange_rates == 0, i)) return false; if(auto_update_exchange_rates == 0) return false; bool b = false; if(auto_update_exchange_rates < 0) { int days = (int) floor(difftime(time(NULL), CALCULATOR->getExchangeRatesTime(i)) / 86400); if(QMessageBox::question(parent, tr("Update exchange rates?"), tr("It has been %n day(s) since the exchange rates last were updated.\n\nDo you wish to update the exchange rates now?", "", days), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { b = true; } } if(b || auto_update_exchange_rates > 0) { if(auto_update_exchange_rates <= 0) i = -1; fetchExchangeRates(b ? 15 : 8, i); CALCULATOR->loadExchangeRates(); return true; } return false; } class FetchExchangeRatesThread : public Thread { protected: void run() { int timeout = 15; int n = -1; if(!read(&timeout)) return; if(!read(&n)) return; CALCULATOR->fetchExchangeRates(timeout, n); } }; void QalculateQtSettings::fetchExchangeRates(int timeout, int n, QWidget *parent) { b_busy++; FetchExchangeRatesThread fetch_thread; if(fetch_thread.start() && fetch_thread.write(timeout) && fetch_thread.write(n)) { if(fetch_thread.running) { QProgressDialog *dialog = new QProgressDialog(tr("Fetching exchange rates…"), QString(), 0, 0, parent); dialog->setWindowTitle(tr("Fetching exchange rates…")); dialog->setWindowModality(Qt::WindowModal); dialog->setMinimumDuration(200); while(fetch_thread.running) { qApp->processEvents(); sleep_ms(10); } dialog->cancel(); dialog->deleteLater(); } } b_busy--; } bool QalculateQtSettings::displayMessages(QWidget *parent) { if(!CALCULATOR->message()) return false; std::string str = ""; int index = 0; MessageType mtype, mtype_highest = MESSAGE_INFORMATION; while(true) { mtype = CALCULATOR->message()->type(); if(CALCULATOR->message()->category() != MESSAGE_CATEGORY_IMPLICIT_MULTIPLICATION || !implicit_question_asked) { if(index > 0) { if(index == 1) str = "• " + str; str += "\n• "; } str += CALCULATOR->message()->message(); if(mtype == MESSAGE_ERROR || (mtype_highest != MESSAGE_ERROR && mtype == MESSAGE_WARNING)) { mtype_highest = mtype; } index++; } if(!CALCULATOR->nextMessage()) break; } if(!str.empty()) { if(mtype_highest == MESSAGE_ERROR) QMessageBox::critical(parent, tr("Error"), QString::fromStdString(str), QMessageBox::Ok); else if(mtype_highest == MESSAGE_WARNING) QMessageBox::warning(parent, tr("Warning"), QString::fromStdString(str), QMessageBox::Ok); else QMessageBox::information(parent, tr("Information"), QString::fromStdString(str), QMessageBox::Ok); } return false; } #ifdef AUTO_UPDATE # include void QalculateQtSettings::autoUpdate(std::string new_version, QWidget *parent) { char selfpath[1000]; ssize_t n = readlink("/proc/self/exe", selfpath, 999); if(n < 0 || n >= 999) { QMessageBox::critical(parent, tr("Error"), tr("Path of executable not found.")); return; } selfpath[n] = '\0'; std::string selfdir = selfpath; size_t i = selfdir.rfind("/"); if(i != string::npos) selfdir.substr(0, i); FILE *pipe = popen("curl --version 1>/dev/null", "w"); if(!pipe) { QMessageBox::critical(parent, tr("Error"), tr("curl not found.")); return; } pclose(pipe); std::string tmpdir = getLocalTmpDir(); recursiveMakeDir(tmpdir); string script = "#!/bin/sh\n\n"; script += "echo \"Updating Qalculate!...\";\n"; script += "sleep 1;\n"; script += "new_version="; script += new_version; script += ";\n"; script += "if cd \""; script += tmpdir; script += "\"; then\n"; script += "\tif curl -L -o qalculate-${new_version}-x86_64.tar.xz https://github.com/Qalculate/qalculate-qt/releases/download/v${new_version}/qalculate-${new_version}-x86_64.tar.xz; then\n"; script += "\t\techo \"Extracting files...\";\n"; script += "\t\tif tar -xJf qalculate-${new_version}-x86_64.tar.xz; then\n"; script += "\t\t\tcd qalculate-${new_version};\n"; script += "\t\t\tif cp -f qalculate-qt \""; script += selfpath; script += "\"; then\n"; script += "\t\t\t\tcp -f qalc \""; script += selfdir; script += "/\";\n"; script += "\t\t\t\tcd ..;\n\t\t\trm -r qalculate-${new_version};\n\t\t\trm qalculate-${new_version}-x86_64.tar.xz;\n"; script += "\t\t\t\texit 0;\n"; script += "\t\t\tfi\n"; script += "\t\t\tcd ..;\n\t\trm -r qalculate-${new_version};\n"; script += "\t\tfi\n"; script += "\t\trm qalculate-${new_version}-x86_64.tar.xz;\n"; script += "\tfi\n"; script += "fi\n"; script += "echo \"Update failed\";\n"; script += "echo \"Press Enter to continue\";\n"; script += "read _;\n"; script += "exit 1\n"; std::ofstream ofs; std::string scriptpath = tmpdir; scriptpath += "/update.sh"; ofs.open(scriptpath.c_str(), std::ofstream::out | std::ofstream::trunc); ofs << script; ofs.close(); chmod(scriptpath.c_str(), S_IRWXU); std::string termcom = "#!/bin/sh\n\n"; termcom += "if [ $(command -v gnome-terminal) ]; then\n"; termcom += "\tif gnome-terminal --wait --version; then\n\t\tdetected_term=\"gnome-terminal --wait -- \";\n"; termcom += "\telse\n\t\tdetected_term=\"gnome-terminal --disable-factory -- \";\n\tfi\n"; termcom += "elif [ $(command -v xfce4-terminal) ]; then\n\tdetected_term=\"xfce4-terminal --disable-server -e \";\n"; termcom += "else\n"; termcom += "\tfor t in x-terminal-emulator konsole alacritty qterminal xterm urxvt rxvt kitty sakura terminology termite tilix; do\n\t\tif [ $(command -v $t) ]; then\n\t\t\tdetected_term=\"$t -e \";\n\t\t\tbreak\n\t\tfi\n\tdone\nfi\n"; termcom += "$detected_term "; termcom += scriptpath; termcom += ";\n"; termcom += "exec "; termcom += selfpath; termcom += "\n"; std::ofstream ofs2; std::string scriptpath2 = tmpdir; scriptpath2 += "/terminal.sh"; ofs2.open(scriptpath2.c_str(), std::ofstream::out | std::ofstream::trunc); ofs2 << termcom; ofs2.close(); chmod(scriptpath2.c_str(), S_IRWXU); if(QProcess::execute(scriptpath2.c_str()) != 0) { QMessageBox::critical(parent, tr("Error"), tr("Failed to run update script.\n%1").arg(error->message)); return; } qApp->closeAllWindows(); } #else void QalculateQtSettings::autoUpdate(std::string, QWidget*) {} #endif void QalculateQtSettings::checkVersion(bool force, QWidget *parent) { if(!force) { if(!check_version) return; QalculateDateTime next_version_check_date(last_version_check_date); next_version_check_date.addDays(14); if(next_version_check_date.isFutureDate()) return; } std::string new_version; #ifdef _WIN32 std::string url; int ret = checkAvailableVersion("windows", qApp->applicationVersion().toUtf8().data(), &new_version, &url, force ? 10 : 5); #else int ret = checkAvailableVersion("qalculate-qt", qApp->applicationVersion().toUtf8().data(), &new_version, force ? 10 : 5); #endif if(force && ret <= 0) { if(ret < 0) QMessageBox::critical(parent, tr("Error"), tr("Failed to check for updates.")); else QMessageBox::information(parent, tr("Information"), tr("No updates found.")); if(ret < 0) return; } if(ret > 0 && (force || new_version != last_found_version)) { last_found_version = new_version; #ifdef AUTO_UPDATE if(QMessageBox::question(parent, tr("Information"), "
" + tr("A new version of %1 is available at %2.\n\nDo you wish to update to version %3?").arg("Qalculate!").arg("qalculate.github.io").arg(QString::fromStdString(new_version)) == QMessageBox::Yes) + "
") { autoUpdate(new_version); } #else # ifdef _WIN32 QMessageBox *dialog = new QMessageBox(QMessageBox::Information, tr("Information"), "
" + tr("A new version of %1 is available.\n\nYou can get version %3 at %2.").arg("Qalculate!").arg("qalculate.github.io").arg(QString::fromStdString(new_version)) + "
", QMessageBox::Ok, parent); if(always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); QAbstractButton *downloadButton = NULL; if(!url.empty()) dialog->addButton(tr("Download"), QMessageBox::YesRole); dialog->exec(); if(!url.empty() && dialog->clickedButton() == downloadButton) { QDesktopServices::openUrl(QUrl(QString::fromStdString(url))); } dialog->deleteLater(); # else QMessageBox::information(parent, tr("Information"), "
" + tr("A new version of %1 is available.\n\nYou can get version %3 at %2.").arg("Qalculate!").arg("qalculate.github.io").arg(QString::fromStdString(new_version)) + "
"); # endif #endif } last_version_check_date.setToCurrentDate(); } QString QalculateQtSettings::shortcutText(const std::vector &type, const std::vector &value) { if(type.size() == 1) return shortcutText(type[0], value[0]); QString str; for(size_t i = 0; i < type.size(); i++) { if(!str.isEmpty()) str += ", "; str += shortcutText(type[i], value[i]); } return str; } QString QalculateQtSettings::shortcutText(int type, const std::string &value) { if(type < 0) return QString(); switch(type) { case SHORTCUT_TYPE_FUNCTION: { MathFunction *f = CALCULATOR->getActiveFunction(value); if(!f) break; return QString::fromStdString(f->title(true, printops.use_unicode_signs)); } case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: { MathFunction *f = CALCULATOR->getActiveFunction(value); if(!f) break; return QString::fromStdString(f->title(true, printops.use_unicode_signs)); } case SHORTCUT_TYPE_VARIABLE: { Variable *v = CALCULATOR->getActiveVariable(value); if(!v) break; return QString::fromStdString(v->title(true, printops.use_unicode_signs)); } case SHORTCUT_TYPE_UNIT: { Unit *u = CALCULATOR->getActiveUnit(value); if(!u) { CALCULATOR->beginTemporaryStopMessages(); CompositeUnit cu("", "", "", value); CALCULATOR->endTemporaryStopMessages(); if(cu.countUnits() == 0) break; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->subtype() == SUBTYPE_COMPOSITE_UNIT) { CompositeUnit *cu2 = (CompositeUnit*) CALCULATOR->units[i]; if(cu2->countUnits() == cu.countUnits()) { bool b = true; for(size_t i2 = 1; i2 <= cu.countUnits(); i2++) { int exp1 = 1, exp2 = 1; Prefix *p1 = NULL, *p2 = NULL; if(cu.get(i2, &exp1, &p1) != cu2->get(i2, &exp2, &p2) || exp1 != exp2 || p1 != p2) { b = false; break; } } if(b) return QString::fromStdString(cu2->title(true, printops.use_unicode_signs)); } } } return QString::fromStdString(cu.print(false, true, printops.use_unicode_signs)); } return QString::fromStdString(u->title(true, printops.use_unicode_signs)); } default: {} } if(value.empty() || type == SHORTCUT_TYPE_COPY_RESULT) return shortcutTypeText((shortcut_type) type); return tr("%1: %2").arg(shortcutTypeText((shortcut_type) type)).arg(QString::fromStdString(value)); } QString QalculateQtSettings::shortcutTypeText(shortcut_type type) { switch(type) { case SHORTCUT_TYPE_FUNCTION: {return tr("Insert function");} case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: {return tr("Insert function (dialog)");} case SHORTCUT_TYPE_VARIABLE: {return tr("Insert variable");} case SHORTCUT_TYPE_APPROXIMATE: {return tr("Approximate result");} case SHORTCUT_TYPE_NEGATE: {return tr("Negate");} case SHORTCUT_TYPE_INVERT: {return tr("Invert");} case SHORTCUT_TYPE_UNIT: {return tr("Insert unit");} case SHORTCUT_TYPE_TEXT: {return tr("Insert text");} case SHORTCUT_TYPE_OPERATOR: {return tr("Insert operator");} case SHORTCUT_TYPE_DATE: {return tr("Insert date");} case SHORTCUT_TYPE_MATRIX: {return tr("Insert matrix");} case SHORTCUT_TYPE_SMART_PARENTHESES: {return tr("Insert smart parentheses");} case SHORTCUT_TYPE_CONVERT_TO: {return tr("Convert to unit");} case SHORTCUT_TYPE_CONVERT: {return tr("Convert");} case SHORTCUT_TYPE_OPTIMAL_UNIT: {return tr("Convert to optimal unit");} case SHORTCUT_TYPE_BASE_UNITS: {return tr("Convert to base units");} case SHORTCUT_TYPE_OPTIMAL_PREFIX: {return tr("Convert to optimal prefix");} case SHORTCUT_TYPE_TO_NUMBER_BASE: {return tr("Convert to number base");} case SHORTCUT_TYPE_FACTORIZE: {return tr("Factorize result");} case SHORTCUT_TYPE_EXPAND: {return tr("Expand result");} case SHORTCUT_TYPE_PARTIAL_FRACTIONS: {return tr("Expand partial fractions");} case SHORTCUT_TYPE_RPN_DOWN: {return tr("RPN: down");} case SHORTCUT_TYPE_RPN_UP: {return tr("RPN: up");} case SHORTCUT_TYPE_RPN_SWAP: {return tr("RPN: swap");} case SHORTCUT_TYPE_RPN_COPY: {return tr("RPN: copy");} case SHORTCUT_TYPE_RPN_LASTX: {return tr("RPN: lastx");} case SHORTCUT_TYPE_RPN_DELETE: {return tr("RPN: delete register");} case SHORTCUT_TYPE_RPN_CLEAR: {return tr("RPN: clear stack");} case SHORTCUT_TYPE_INPUT_BASE: {return tr("Set expression base");} case SHORTCUT_TYPE_OUTPUT_BASE: {return tr("Set result base");} case SHORTCUT_TYPE_DEGREES: {return tr("Set angle unit to degrees");} case SHORTCUT_TYPE_RADIANS: {return tr("Set angle unit to radians");} case SHORTCUT_TYPE_GRADIANS: {return tr("Set angle unit to gradians");} case SHORTCUT_TYPE_NORMAL_NOTATION: {return tr("Active normal display mode");} case SHORTCUT_TYPE_SCIENTIFIC_NOTATION: {return tr("Activate scientific display mode");} case SHORTCUT_TYPE_ENGINEERING_NOTATION: {return tr("Activate engineering display mode");} case SHORTCUT_TYPE_SIMPLE_NOTATION: {return tr("Activate simple display mode");} case SHORTCUT_TYPE_PRECISION: {return tr("Toggle precision");} case SHORTCUT_TYPE_MAX_DECIMALS: {return tr("Toggle max decimals");} case SHORTCUT_TYPE_MIN_DECIMALS: {return tr("Toggle min decimals");} case SHORTCUT_TYPE_MINMAX_DECIMALS: {return tr("Toggle max/min decimals");} case SHORTCUT_TYPE_RPN_MODE: {return tr("Toggle RPN mode");} case SHORTCUT_TYPE_GENERAL_KEYPAD: {return tr("Show general keypad");} case SHORTCUT_TYPE_PROGRAMMING_KEYPAD: {return tr("Toggle programming keypad");} case SHORTCUT_TYPE_ALGEBRA_KEYPAD: {return tr("Toggle algebra keypad");} case SHORTCUT_TYPE_CUSTOM_KEYPAD: {return tr("Toggle custom keypad");} case SHORTCUT_TYPE_KEYPAD: {return tr("Show/hide keypad");} case SHORTCUT_TYPE_HISTORY_SEARCH: {return tr("Search history");} case SHORTCUT_TYPE_HISTORY_CLEAR: {return tr("Clear history");} case SHORTCUT_TYPE_MANAGE_VARIABLES: {return tr("Show variables");} case SHORTCUT_TYPE_MANAGE_FUNCTIONS: {return tr("Show functions");} case SHORTCUT_TYPE_MANAGE_UNITS: {return tr("Show units");} case SHORTCUT_TYPE_MANAGE_DATA_SETS: {return tr("Show data sets");} case SHORTCUT_TYPE_STORE: {return tr("Store result");} case SHORTCUT_TYPE_MEMORY_CLEAR: {return tr("MC (memory clear)");} case SHORTCUT_TYPE_MEMORY_RECALL: {return tr("MR (memory recall)");} case SHORTCUT_TYPE_MEMORY_STORE: {return tr("MS (memory store)");} case SHORTCUT_TYPE_MEMORY_ADD: {return tr("M+ (memory plus)");} case SHORTCUT_TYPE_MEMORY_SUBTRACT: {return tr("M− (memory minus)");} case SHORTCUT_TYPE_NEW_VARIABLE: {return tr("New variable");} case SHORTCUT_TYPE_NEW_FUNCTION: {return tr("New function");} case SHORTCUT_TYPE_PLOT: {return tr("Open plot functions/data");} case SHORTCUT_TYPE_NUMBER_BASES: {return tr("Open convert number bases");} case SHORTCUT_TYPE_FLOATING_POINT: {return tr("Open floating point conversion");} case SHORTCUT_TYPE_CALENDARS: {return tr("Open calender conversion");} case SHORTCUT_TYPE_PERCENTAGE_TOOL: {return tr("Open percentage calculation tool");} case SHORTCUT_TYPE_PERIODIC_TABLE: {return tr("Open periodic table");} case SHORTCUT_TYPE_UPDATE_EXRATES: {return tr("Update exchange rates");} case SHORTCUT_TYPE_COPY_RESULT: {return tr("Copy result");} case SHORTCUT_TYPE_INSERT_RESULT: {return tr("Insert result");} case SHORTCUT_TYPE_MODE: {return tr("Open mode menu");} case SHORTCUT_TYPE_MENU: {return tr("Open menu");} case SHORTCUT_TYPE_HELP: {return tr("Help");} case SHORTCUT_TYPE_QUIT: {return tr("Quit");} case SHORTCUT_TYPE_CHAIN_MODE: {return tr("Toggle chain mode");} case SHORTCUT_TYPE_ALWAYS_ON_TOP: {return tr("Toggle keep above");} case SHORTCUT_TYPE_COMPLETE: {return tr("Show completion (activate first item)");} case SHORTCUT_TYPE_EXPRESSION_CLEAR: {return tr("Clear expression");} case SHORTCUT_TYPE_EXPRESSION_DELETE: {return tr("Delete");} case SHORTCUT_TYPE_EXPRESSION_BACKSPACE: {return tr("Backspace");} case SHORTCUT_TYPE_EXPRESSION_START: {return tr("Home");} case SHORTCUT_TYPE_EXPRESSION_END: {return tr("End");} case SHORTCUT_TYPE_EXPRESSION_RIGHT: {return tr("Right");} case SHORTCUT_TYPE_EXPRESSION_LEFT: {return tr("Left");} case SHORTCUT_TYPE_EXPRESSION_UP: {return tr("Up");} case SHORTCUT_TYPE_EXPRESSION_DOWN: {return tr("Down");} case SHORTCUT_TYPE_EXPRESSION_UNDO: {return tr("Undo");} case SHORTCUT_TYPE_EXPRESSION_REDO: {return tr("Redo");} case SHORTCUT_TYPE_CALCULATE_EXPRESSION: {return tr("Calculate expression");} case SHORTCUT_TYPE_EXPRESSION_HISTORY_NEXT: {return tr("Expression history next");} case SHORTCUT_TYPE_EXPRESSION_HISTORY_PREVIOUS: {return tr("Expression history previous");} case SHORTCUT_TYPE_FUNCTIONS_MENU: {return tr("Open functions menu");} case SHORTCUT_TYPE_UNITS_MENU: {return tr("Open units menu");} case SHORTCUT_TYPE_VARIABLES_MENU: {return tr("Open variables menu");} case SHORTCUT_TYPE_TOGGLE_FRACTION: {return tr("Toggle fraction format in current result");} } return "-"; } void QalculateQtSettings::updateActionValueTexts() { if(copy_action_value_texts.isEmpty()) { copy_action_value_texts << tr("Default") << tr("Formatted result") << tr("Unformatted ASCII result") << tr("Unformatted ASCII result without units") << tr("Formatted expression") << tr("Unformatted ASCII expression") << tr("Formatted expression + result") << tr("Unformatted ASCII expression + result"); } } bool QalculateQtSettings::testShortcutValue(int type, QString &value, QWidget *w) { if(type != SHORTCUT_TYPE_TEXT) value = value.trimmed(); switch(type) { case SHORTCUT_TYPE_FUNCTION: {} case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: { if(value.length() > 2 && value.right(2) == "()") value.chop(2); if(!CALCULATOR->getActiveFunction(value.toStdString())) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Function not found."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_VARIABLE: { if(!CALCULATOR->getActiveVariable(value.toStdString())) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Variable not found."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_UNIT: { if(!CALCULATOR->getActiveUnit(value.toStdString())) { CALCULATOR->beginTemporaryStopMessages(); CompositeUnit cu("", "", "", value.toStdString()); int n = 0; if(CALCULATOR->endTemporaryStopMessages(NULL, &n) || n) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unit not found."), QMessageBox::Ok); return false; } } break; } case SHORTCUT_TYPE_OPERATOR: { break; } case SHORTCUT_TYPE_TO_NUMBER_BASE: {} case SHORTCUT_TYPE_INPUT_BASE: {} case SHORTCUT_TYPE_OUTPUT_BASE: { Number nbase; int base; base_from_string(value.toStdString(), base, nbase, type == SHORTCUT_TYPE_INPUT_BASE); if(base == BASE_CUSTOM && nbase.isZero()) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unsupported base."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_PRECISION: {} case SHORTCUT_TYPE_MIN_DECIMALS: {} case SHORTCUT_TYPE_MAX_DECIMALS: {} case SHORTCUT_TYPE_MINMAX_DECIMALS: { bool ok = false; int v = value.toInt(&ok, 10); if(!ok || v < -1 || (type == SHORTCUT_TYPE_PRECISION && v < 2)) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unsupported value."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_COPY_RESULT: { if(value.isEmpty()) break; int v = -1; if(value.length() > 1) { updateActionValueTexts(); v = copy_action_value_texts.indexOf(value); if(v >= 0) value = QString::number(v); } else { bool ok = false; v = value.toInt(&ok, 10); if(!ok) v = -1; } if(v < 0 || v > 7) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unsupported value."), QMessageBox::Ok); value = ""; return false; } break; } } return true; } bool QalculateQtSettings::loadWorkspace(const char *filename) { FILE *file = NULL; std::string stmp, svalue, svar; char line[1000000L]; if(!filename || strlen(filename) == 0) { file = fopen(buildPath(getLocalDir(), "qalculate-qt.cfg").c_str(), "r"); if(!file) return false; } else { file = fopen(filename, "r"); if(!file) return false; if(fgets(line, 1000000L, file) == NULL) return false; stmp = line; if(stmp.find("QALCULATE") == std::string::npos) return false; } size_t i; v_expression.clear(); v_parse.clear(); v_value.clear(); v_protected.clear(); v_time.clear(); current_history_time = 0; v_messages.clear(); v_parseerror.clear(); v_result.clear(); v_exact.clear(); v_pexact.clear(); expression_history.clear(); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal() && CALCULATOR->variables[i]->category() == CALCULATOR->temporaryCategory()) CALCULATOR->variables[i]->destroy(); } for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isLocal() && CALCULATOR->functions[i]->category() == CALCULATOR->temporaryCategory()) CALCULATOR->functions[i]->destroy(); } for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isLocal() && CALCULATOR->units[i]->category() == CALCULATOR->temporaryCategory()) CALCULATOR->units[i]->destroy(); } for(size_t i = 0; i < history_answer.size(); i++) { history_answer[i]->unref(); } history_answer.clear(); current_result = NULL; v_memory->set(m_zero); programming_base_changed = false; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp = line; remove_blank_ends(stmp); if((i = stmp.find_first_of("=")) != std::string::npos) { svar = stmp.substr(0, i); remove_blank_ends(svar); svalue = stmp.substr(i + 1); remove_blank_ends(svalue); readPreferenceValue(svar, svalue, true); } else if(stmp == "[Definitions]") { stmp = ""; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp += line; } remove_blank_ends(stmp); CALCULATOR->loadDefinitions(stmp.c_str(), true); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal() && !CALCULATOR->variables[i]->isHidden() && CALCULATOR->variables[i]->isActive() && CALCULATOR->variables[i]->category() == CALCULATOR->temporaryCategory()) favourite_variables.push_back(CALCULATOR->variables[i]); } for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isLocal() && !CALCULATOR->functions[i]->isHidden() && CALCULATOR->functions[i]->isActive() && CALCULATOR->functions[i]->category() == CALCULATOR->temporaryCategory()) favourite_functions.push_back(CALCULATOR->functions[i]); } for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isLocal() && !CALCULATOR->units[i]->isHidden() && CALCULATOR->units[i]->isActive() && CALCULATOR->units[i]->category() == CALCULATOR->temporaryCategory()) favourite_units.push_back(CALCULATOR->units[i]); } } } while(v_expression.size() > v_parse.size()) { v_parse.push_back(""); v_pexact.push_back(true); } if(!filename || strlen(filename) == 0) { current_workspace = ""; } else { current_workspace = filename; for(size_t i = 0; i < recent_workspaces.size(); i++) { if(recent_workspaces[i] == current_workspace) { recent_workspaces.erase(recent_workspaces.begin() + i); break; } } if(recent_workspaces.size() >= 9) recent_workspaces.erase(recent_workspaces.begin()); recent_workspaces.push_back(filename); } fclose(file); return true; } bool QalculateQtSettings::saveWorkspace(const char *filename) { if(savePreferences(filename, true)) { current_workspace = filename; for(size_t i = 0; i < recent_workspaces.size(); i++) { if(recent_workspaces[i] == current_workspace) { recent_workspaces.erase(recent_workspaces.begin() + i); break; } } if(recent_workspaces.size() >= 9) recent_workspaces.erase(recent_workspaces.begin()); recent_workspaces.push_back(filename); return true; } return false; } QString QalculateQtSettings::workspaceTitle() { if(current_workspace.empty()) return QString(); #ifdef _WIN32 size_t index = current_workspace.rfind('\\'); #else size_t index = current_workspace.rfind('/'); #endif if(index != std::string::npos) return QString::fromStdString(current_workspace.substr(index + 1)); return QString::fromStdString(current_workspace); } qalculate-qt-5.5.1/src/qalculateqtsettings.h000066400000000000000000000314161475705355700212070ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef QALCULATE_Q_SETTINGS_H #define QALCULATE_Q_SETTINGS_H #include #include #include #include class QWidget; class QWindow; class QByteArray; class QAction; class QFont; bool can_display_unicode_string_function(const char *str, void *w); #define EQUALS_IGNORECASE_AND_LOCAL(x,y,z) (equalsIgnoreCase(x, y) || equalsIgnoreCase(x, z.toStdString())) #define EQUALS_IGNORECASE_AND_LOCAL_NR(x,y,z,a) (equalsIgnoreCase(x, y a) || (x.length() == z.length() + strlen(a) && equalsIgnoreCase(x.substr(0, x.length() - strlen(a)), z.toStdString()) && equalsIgnoreCase(x.substr(x.length() - strlen(a)), a))) #define LOAD_APP_ICON(x) QIcon(":/icons/apps/scalable/" x ".svg") #define LOAD_ICON(x) load_icon(x, this) #define USE_QUOTES(arg, f) (arg && (arg->suggestsQuotes() || arg->type() == ARGUMENT_TYPE_TEXT) && f->id() != FUNCTION_ID_BASE && f->id() != FUNCTION_ID_BIN && f->id() != FUNCTION_ID_OCT && f->id() != FUNCTION_ID_DEC && f->id() != FUNCTION_ID_HEX) QRect get_screen_geometry(QWidget *w); bool try_resize(QWidget *win, int w, int h); std::string to_html_escaped(const std::string str); std::string unhtmlize(std::string str, bool b_ascii = false); QString unhtmlize(QString str, bool b_ascii = false); std::string unformat(std::string str, bool restorable = false); size_t unformatted_length(const std::string &str); std::string uncolorize(std::string str, bool remove_class = true); std::string replace_first_minus(const std::string &str); QIcon load_icon(const QString &str, QWidget*); bool last_is_operator(std::string str, bool allow_exp = false); bool string_is_less(std::string str1, std::string str2); bool item_in_calculator(ExpressionItem *item); bool name_matches(ExpressionItem *item, const std::string &str); bool country_matches(Unit *u, const std::string &str, size_t minlength = 0); bool title_matches(ExpressionItem *item, const std::string &str, size_t minlength = 0); void remove_spaces(std::string &str); bool contains_plot_or_save(const std::string &str); void base_from_string(std::string str, int &base, Number &nbase, bool input_base = false); long int get_fixed_denominator_qt(const std::string &str, int &to_fraction, const QString &localized_fraction, bool qalc_command = false); bool is_equation_solutions(const MathStructure &m); enum { TITLE_APP, TITLE_RESULT, TITLE_APP_RESULT, TITLE_WORKSPACE, TITLE_APP_WORKSPACE }; enum { KEEP_EXPRESSION, REPLACE_EXPRESSION_WITH_RESULT, REPLACE_EXPRESSION_WITH_RESULT_IF_SHORTER, CLEAR_EXPRESSION }; typedef enum { SHORTCUT_TYPE_FUNCTION, SHORTCUT_TYPE_FUNCTION_WITH_DIALOG, SHORTCUT_TYPE_VARIABLE, SHORTCUT_TYPE_UNIT, SHORTCUT_TYPE_OPERATOR, SHORTCUT_TYPE_TEXT, SHORTCUT_TYPE_DATE, SHORTCUT_TYPE_MATRIX, SHORTCUT_TYPE_SMART_PARENTHESES, SHORTCUT_TYPE_CONVERT_TO, SHORTCUT_TYPE_CONVERT, SHORTCUT_TYPE_OPTIMAL_UNIT, SHORTCUT_TYPE_BASE_UNITS, SHORTCUT_TYPE_OPTIMAL_PREFIX, SHORTCUT_TYPE_TO_NUMBER_BASE, SHORTCUT_TYPE_FACTORIZE, SHORTCUT_TYPE_EXPAND, SHORTCUT_TYPE_PARTIAL_FRACTIONS, SHORTCUT_TYPE_APPROXIMATE, SHORTCUT_TYPE_NEGATE, SHORTCUT_TYPE_INVERT, SHORTCUT_TYPE_RPN_UP, SHORTCUT_TYPE_RPN_DOWN, SHORTCUT_TYPE_RPN_SWAP, SHORTCUT_TYPE_RPN_COPY, SHORTCUT_TYPE_RPN_LASTX, SHORTCUT_TYPE_RPN_DELETE, SHORTCUT_TYPE_RPN_CLEAR, SHORTCUT_TYPE_OUTPUT_BASE, SHORTCUT_TYPE_INPUT_BASE, SHORTCUT_TYPE_DEGREES, SHORTCUT_TYPE_RADIANS, SHORTCUT_TYPE_GRADIANS, SHORTCUT_TYPE_NORMAL_NOTATION, SHORTCUT_TYPE_SCIENTIFIC_NOTATION, SHORTCUT_TYPE_ENGINEERING_NOTATION, SHORTCUT_TYPE_SIMPLE_NOTATION, SHORTCUT_TYPE_COPY_RESULT, SHORTCUT_TYPE_INSERT_RESULT, SHORTCUT_TYPE_RPN_MODE, SHORTCUT_TYPE_CHAIN_MODE, SHORTCUT_TYPE_GENERAL_KEYPAD, SHORTCUT_TYPE_PROGRAMMING_KEYPAD, SHORTCUT_TYPE_ALGEBRA_KEYPAD, SHORTCUT_TYPE_CUSTOM_KEYPAD, SHORTCUT_TYPE_KEYPAD, SHORTCUT_TYPE_HISTORY_SEARCH, SHORTCUT_TYPE_ALWAYS_ON_TOP, SHORTCUT_TYPE_COMPLETE, SHORTCUT_TYPE_STORE, SHORTCUT_TYPE_NEW_VARIABLE, SHORTCUT_TYPE_NEW_FUNCTION, SHORTCUT_TYPE_MANAGE_VARIABLES, SHORTCUT_TYPE_MANAGE_FUNCTIONS, SHORTCUT_TYPE_MANAGE_UNITS, SHORTCUT_TYPE_MANAGE_DATA_SETS, SHORTCUT_TYPE_MEMORY_CLEAR, SHORTCUT_TYPE_MEMORY_RECALL, SHORTCUT_TYPE_MEMORY_STORE, SHORTCUT_TYPE_MEMORY_ADD, SHORTCUT_TYPE_MEMORY_SUBTRACT, SHORTCUT_TYPE_EXPRESSION_CLEAR, SHORTCUT_TYPE_EXPRESSION_DELETE, SHORTCUT_TYPE_EXPRESSION_BACKSPACE, SHORTCUT_TYPE_EXPRESSION_START, SHORTCUT_TYPE_EXPRESSION_END, SHORTCUT_TYPE_EXPRESSION_RIGHT, SHORTCUT_TYPE_EXPRESSION_LEFT, SHORTCUT_TYPE_EXPRESSION_UP, SHORTCUT_TYPE_EXPRESSION_DOWN, SHORTCUT_TYPE_EXPRESSION_HISTORY_NEXT, SHORTCUT_TYPE_EXPRESSION_HISTORY_PREVIOUS, SHORTCUT_TYPE_EXPRESSION_UNDO, SHORTCUT_TYPE_EXPRESSION_REDO, SHORTCUT_TYPE_CALCULATE_EXPRESSION, SHORTCUT_TYPE_PLOT, SHORTCUT_TYPE_NUMBER_BASES, SHORTCUT_TYPE_FLOATING_POINT, SHORTCUT_TYPE_CALENDARS, SHORTCUT_TYPE_PERCENTAGE_TOOL, SHORTCUT_TYPE_PERIODIC_TABLE, SHORTCUT_TYPE_UPDATE_EXRATES, SHORTCUT_TYPE_MODE, SHORTCUT_TYPE_MENU, SHORTCUT_TYPE_HELP, SHORTCUT_TYPE_QUIT, SHORTCUT_TYPE_HISTORY_CLEAR, SHORTCUT_TYPE_PRECISION, SHORTCUT_TYPE_MIN_DECIMALS, SHORTCUT_TYPE_MAX_DECIMALS, SHORTCUT_TYPE_MINMAX_DECIMALS, SHORTCUT_TYPE_FUNCTIONS_MENU, SHORTCUT_TYPE_UNITS_MENU, SHORTCUT_TYPE_VARIABLES_MENU, SHORTCUT_TYPE_TOGGLE_FRACTION } shortcut_type; #define LAST_SHORTCUT_TYPE SHORTCUT_TYPE_TOGGLE_FRACTION #define SHORTCUT_REQUIRES_VALUE(x) (x == SHORTCUT_TYPE_FUNCTION || x == SHORTCUT_TYPE_FUNCTION_WITH_DIALOG || x == SHORTCUT_TYPE_UNIT || x == SHORTCUT_TYPE_VARIABLE || x == SHORTCUT_TYPE_TEXT || x == SHORTCUT_TYPE_OPERATOR || x == SHORTCUT_TYPE_CONVERT_TO || x == SHORTCUT_TYPE_TO_NUMBER_BASE || x == SHORTCUT_TYPE_INPUT_BASE || x == SHORTCUT_TYPE_OUTPUT_BASE || x == SHORTCUT_TYPE_PRECISION || x == SHORTCUT_TYPE_MAX_DECIMALS || x == SHORTCUT_TYPE_MIN_DECIMALS || x == SHORTCUT_TYPE_MINMAX_DECIMALS) #define SHORTCUT_USES_VALUE(x) (SHORTCUT_REQUIRES_VALUE(x) || x == SHORTCUT_TYPE_COPY_RESULT) struct keyboard_shortcut { QString key; std::vector type; std::vector value; QAction *action; bool new_action; }; struct custom_button { int c, r; int type[3]; std::string value[3]; QString label; }; DECLARE_BUILTIN_FUNCTION(AnswerFunction, 0) class QalculateQtSettings : QObject { Q_OBJECT public: QalculateQtSettings(); ~QalculateQtSettings(); void loadPreferences(); void readPreferenceValue(const std::string &svar, const std::string &svalue, bool is_workspace = false); int savePreferences(bool save_mode = true); bool savePreferences(const char *filename, bool is_workspace = false, bool save_mode = true); void updateStyle(); void updatePalette(bool force_update = false); void updateMessagePrintOptions(); void updateFavourites(); void setCustomAngleUnit(); bool checkExchangeRates(QWidget *parent); void fetchExchangeRates(int timeout, int n = -1, QWidget *parent = NULL); bool displayMessages(QWidget *parent); bool isAnswerVariable(Variable *v); QString shortcutTypeText(shortcut_type type); QString shortcutText(int type, const std::string &value); QString shortcutText(const std::vector &type, const std::vector &value); void updateActionValueTexts(); bool testShortcutValue(int type, QString &value, QWidget *parent = NULL); void checkVersion(bool force, QWidget *parent); void autoUpdate(std::string new_version, QWidget *parent); const char *multiplicationSign(bool units = false); const char *divisionSign(bool output = true); std::string localizeExpression(std::string, bool unit_expression = false); std::string unlocalizeExpression(std::string); bool loadWorkspace(const char *filename); bool saveWorkspace(const char *filename); QString workspaceTitle(); QStringList copy_action_value_texts; EvaluationOptions evalops; PrintOptions printops; bool complex_angle_form, dot_question_asked, implicit_question_asked, adaptive_interval_display, tc_set, rpn_mode, chain_mode, caret_as_xor, ignore_locale, do_imaginary_j, fetch_exchange_rates_at_startup, always_on_top, display_expression_status, prefixes_default, rpn_keys, sinc_set; bool automatic_digit_grouping; int simplified_percentage; bool programming_base_changed; int previous_precision; std::string custom_angle_unit; QString custom_lang; int rounding_mode; int allow_multiple_instances; int decimal_comma, dual_fraction, dual_approximation, auto_update_exchange_rates, title_type; int completion_delay, expression_status_delay, auto_calculate_delay; int completion_min, completion_min2; QString style; int palette; bool enable_completion, enable_completion2; int enable_tooltips; int color; bool colorize_result; bool format_result; bool first_time; bool enable_input_method; bool use_custom_result_font, use_custom_expression_font, use_custom_keypad_font, use_custom_app_font; bool save_custom_result_font, save_custom_expression_font, save_custom_keypad_font, save_custom_app_font; QFont saved_app_font; int replace_expression; bool autocopy_result; int default_signed = -1, default_bits = -1; int keypad_type; bool separate_keypad_menu_buttons; int toolbar_style; int show_keypad; int show_bases; bool hide_numpad; bool keep_function_dialog_open; bool save_defs_on_exit, save_mode_on_exit, clear_history_on_exit; int max_history_lines; bool rpn_shown; bool auto_calculate, status_in_history, autocalc_selection; int history_expression_type; bool copy_ascii, copy_ascii_without_units; bool close_with_esc; std::string custom_result_font, custom_expression_font, custom_keypad_font, custom_app_font; KnownVariable *vans[5], *v_memory; MathStructure *current_result; MathFunction *f_answer; std::vector history_answer; std::vector expression_history; QByteArray window_geometry, window_state, splitter_state; QByteArray functions_geometry, functions_vsplitter_state, functions_hsplitter_state; QByteArray units_geometry, units_vsplitter_state, units_hsplitter_state; QByteArray variables_geometry, variables_vsplitter_state, variables_hsplitter_state; QByteArray datasets_geometry, datasets_vsplitter_state, datasets_hsplitter_state; bool disable_cursor_blinking; bool wayland_platform; int preserve_history_height; bool keypad_appended, bases_appended; std::string volume_category; std::vector alternative_volume_categories; PlotLegendPlacement default_plot_legend_placement; PlotStyle default_plot_style; PlotSmoothing default_plot_smoothing; bool default_plot_display_grid, default_plot_full_border, default_plot_use_sampling_rate, default_plot_rows, default_plot_color; std::string default_plot_min, default_plot_max, default_plot_step, default_plot_variable; int default_plot_sampling_rate, default_plot_linewidth, default_plot_type, max_plot_time, default_plot_complex; QalculateDateTime last_version_check_date; bool check_version; std::string last_found_version; int preferences_version[3]; std::string current_workspace; std::vector recent_workspaces; int save_workspace; std::vector v_expression; std::vector v_parse; std::vector v_pexact; std::vector v_protected; std::vector v_time; std::vector > v_result; std::vector > v_exact; std::vector > v_value; std::vector v_messages; std::vector v_parseerror; std::vector favourite_functions, recent_functions; std::vector favourite_variables, recent_variables; std::vector favourite_units, recent_units; std::string latest_button_unit; std::vector favourite_functions_pre, recent_functions_pre; std::vector favourite_variables_pre, recent_variables_pre; std::vector favourite_units_pre, recent_units_pre; bool default_shortcuts; std::vector keyboard_shortcuts; int custom_button_columns, custom_button_rows; std::vector custom_buttons; bool favourite_functions_changed, favourite_variables_changed, favourite_units_changed; bool show_all_functions, show_all_variables, show_all_units, use_function_dialog; long long int current_history_time; }; class MathLineEdit : public QLineEdit { public: MathLineEdit(QWidget *parent = NULL, bool unit_expression = false, bool function_expression = false); virtual ~MathLineEdit(); protected: bool b_unit, b_function; void keyPressEvent(QKeyEvent*) override; }; extern QalculateQtSettings *settings; #endif //QALCULATE_Q_SETTINGS_H qalculate-qt-5.5.1/src/qalculatewindow.cpp000066400000000000000000015774231475705355700206620ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021-2024 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # include #endif #include #include "qalculatewindow.h" #include "qalculateqtsettings.h" #include "expressionedit.h" #include "historyview.h" #include "keypadwidget.h" #include "unknowneditdialog.h" #include "variableeditdialog.h" #include "uniteditdialog.h" #include "functioneditdialog.h" #include "preferencesdialog.h" #include "datasetsdialog.h" #include "functionsdialog.h" #include "variablesdialog.h" #include "unitsdialog.h" #include "fpconversiondialog.h" #include "percentagecalculationdialog.h" #include "plotdialog.h" #include "periodictabledialog.h" #include "calendarconversiondialog.h" #include "matrixwidget.h" #include "csvdialog.h" class ViewThread : public Thread { protected: virtual void run(); }; class CommandThread : public Thread { protected: virtual void run(); }; enum { COMMAND_FACTORIZE, COMMAND_EXPAND_PARTIAL_FRACTIONS, COMMAND_EXPAND, COMMAND_CONVERT_UNIT, COMMAND_CONVERT_STRING, COMMAND_CONVERT_BASE, COMMAND_CONVERT_OPTIMAL, COMMAND_CALCULATE, COMMAND_EVAL }; #ifdef _WIN32 # define DEFAULT_HEIGHT 600 # define DEFAULT_WIDTH 550 #else # define DEFAULT_HEIGHT 650 # define DEFAULT_WIDTH 600 #endif std::vector alt_results; int b_busy = 0, block_result_update = 0; bool exact_comparison, command_aborted; std::string original_expression, result_text, parsed_text, exact_text, previous_expression; bool had_to_expression = false; MathStructure *mstruct, *parsed_mstruct, *parsed_tostruct, matrix_mstruct, mstruct_exact, prepend_mstruct, lastx; QString lastx_text, current_status; std::string command_convert_units_string; Unit *command_convert_unit; bool block_expression_history = false; int to_fraction = 0; long int to_fixed_fraction = 0; char to_prefix = 0; int to_base = 0; bool to_duo_syms = false; int to_caf = -1; unsigned int to_bits = 0; Number to_nbase; std::string result_bin, result_oct, result_dec, result_hex; std::string auto_expression, auto_result, current_status_expression; bool auto_calculation_updated = false, auto_format_updated = false, auto_error = false; bool bases_is_result = false; Number max_bases, min_bases; bool title_modified = false; MathStructure mauto, mauto_parsed; bool contains_unknown_variable(const MathStructure &m) { if(m.isVariable()) return !m.variable()->isKnown(); for(size_t i = 0; i < m.size(); i++) { if(contains_unknown_variable(m[i])) return true; } return false; } QAction *find_child_data(QObject *parent, const QString &name, int v) { QActionGroup *group = parent->findChild(name); if(!group) return NULL; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == v) return actions.at(i); } return NULL; } bool contains_rand_function(const MathStructure &m) { if(m.isFunction() && m.function()->category() == CALCULATOR->getFunctionById(FUNCTION_ID_RAND)->category()) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_rand_function(m[i])) return true; } return false; } bool contains_fraction_qt(const MathStructure &m) { if(m.isNumber()) return !m.number().isInteger(); for(size_t i = 0; i < m.size(); i++) { if(contains_fraction_qt(m[i])) return true; } return false; } std::string print_with_evalops(const Number &nr) { PrintOptions po; po.is_approximate = NULL; po.base = settings->evalops.parse_options.base; po.base_display = BASE_DISPLAY_NONE; po.twos_complement = settings->evalops.parse_options.twos_complement; po.hexadecimal_twos_complement = settings->evalops.parse_options.hexadecimal_twos_complement; if(((po.base == 2 && po.twos_complement) || (po.base == 16 && po.hexadecimal_twos_complement)) && nr.isNegative()) po.binary_bits = settings->evalops.parse_options.binary_bits; po.min_exp = EXP_NONE; Number nr_base; if(po.base == BASE_CUSTOM) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } if(po.base == BASE_CUSTOM && CALCULATOR->customInputBase().isInteger() && (CALCULATOR->customInputBase() > 1 || CALCULATOR->customInputBase() < -1)) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } else if((po.base < BASE_CUSTOM && po.base != BASE_UNICODE && po.base != BASE_BIJECTIVE_26 && po.base != BASE_BINARY_DECIMAL) || (po.base == BASE_CUSTOM && CALCULATOR->customInputBase() <= 12 && CALCULATOR->customInputBase() >= -12)) { po.base = 10; std::string str = "dec("; str += nr.print(po); str += ")"; return str; } else if(po.base == BASE_CUSTOM) { po.base = 10; } std::string str = nr.print(po); if(po.base == BASE_CUSTOM) CALCULATOR->setCustomOutputBase(nr_base); return str; } std::string unhtmlize(std::string str, bool b_ascii) { size_t i = 0, i2; while(true) { i = str.find("<", i); if(i == std::string::npos || i == str.length() - 1) break; i2 = str.find(">", i + 1); if(i2 == std::string::npos) break; if((i2 - i == 3 && str.substr(i + 1, 2) == "br") || (i2 - i == 4 && str.substr(i + 1, 3) == "/tr")) { str.replace(i, i2 - i + 1, "\n"); continue; } else if(i2 - i == 5 && str.substr(i + 1, 4) == "head") { size_t i3 = str.find("", i2 + 1); if(i3 != std::string::npos) { i2 = i3 + 6; } } else if(i2 - i == 4) { if(str.substr(i + 1, 3) == "sup") { size_t i3 = str.find("", i2 + 1); if(i3 != std::string::npos) { std::string str2 = unhtmlize(str.substr(i + 5, i3 - i - 5), b_ascii); if(!b_ascii && str2.length() == 1 && str2[0] == '2') str.replace(i, i3 - i + 6, SIGN_POWER_2); else if(!b_ascii && str2.length() == 1 && str2[0] == '3') str.replace(i, i3 - i + 6, SIGN_POWER_3); else if((str.length() == i3 + 6 || (str.length() == i3 + 13 && str.find("
", i3) != std::string::npos)) && (unicode_length(str2) == 1 || str2.find_first_not_of(NUMBERS) == std::string::npos)) str.replace(i, i3 - i + 6, std::string("^") + str2); else str.replace(i, i3 - i + 6, std::string("^(") + str2 + ")"); continue; } } else if(str.substr(i + 1, 3) == "sub") { size_t i3 = str.find("", i + 4); if(i3 != std::string::npos) { if(i3 - i2 > 16 && str.substr(i2 + 1, 7) == "" && str.substr(i3 - 8, 8) == "") str.erase(i, i3 - i + 6); else str.replace(i, i3 - i + 6, std::string("_") + unhtmlize(str.substr(i + 5, i3 - i - 5), b_ascii)); continue; } } } else if(i2 - i == 17 && str.substr(i + 1, 16) == "i class=\"symbol\"") { size_t i3 = str.find("
", i2 + 1); if(i3 != std::string::npos) { std::string name = unhtmlize(str.substr(i2 + 1, i3 - i2 - 1), b_ascii); if(name.length() == 1 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z'))) { name.insert(0, 1, '\\'); } else { name.insert(0, 1, '\"'); name += '\"'; } str.replace(i, i3 - i + 4, name); continue; } } str.erase(i, i2 - i + 1); } gsub(" " SIGN_DIVISION_SLASH " ", "/", str); gsub("&", "&", str); gsub(">", ">", str); gsub("<", "<", str); gsub(""", "\"", str); gsub(" ", "", str); gsub(" ", " ", str); gsub(" ", THIN_SPACE, str); gsub(" ", NNBSP, str); return str; } void base_from_string(std::string str, int &base, Number &nbase, bool input_base) { if(equalsIgnoreCase(str, "golden") || equalsIgnoreCase(str, "golden ratio") || str == "φ") base = BASE_GOLDEN_RATIO; else if(equalsIgnoreCase(str, "roman") || equalsIgnoreCase(str, "roman")) base = BASE_ROMAN_NUMERALS; else if(!input_base && (equalsIgnoreCase(str, "time") || equalsIgnoreCase(str, "time"))) base = BASE_TIME; else if(str == "b26" || str == "B26") base = BASE_BIJECTIVE_26; else if(equalsIgnoreCase(str, "bcd")) base = BASE_BINARY_DECIMAL; else if(equalsIgnoreCase(str, "unicode")) base = BASE_UNICODE; else if(equalsIgnoreCase(str, "supergolden") || equalsIgnoreCase(str, "supergolden ratio") || str == "ψ") base = BASE_SUPER_GOLDEN_RATIO; else if(equalsIgnoreCase(str, "pi") || str == "π") base = BASE_PI; else if(str == "e") base = BASE_E; else if(str == "sqrt(2)" || str == "sqrt 2" || str == "sqrt2" || str == "√2") base = BASE_SQRT2; else { EvaluationOptions eo = settings->evalops; eo.parse_options.base = 10; MathStructure m; eo.approximation = APPROXIMATION_TRY_EXACT; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(str, eo.parse_options), 350, eo); if(CALCULATOR->endTemporaryStopMessages()) { base = BASE_CUSTOM; nbase.clear(); } else if(m.isInteger() && m.number() >= 2 && m.number() <= 36) { base = m.number().intValue(); } else { base = BASE_CUSTOM; nbase = m.number(); } } } QalculateToolButton::QalculateToolButton(QWidget *parent) : QToolButton(parent), longPressTimer(NULL), b_longpress(false) {} QalculateToolButton::~QalculateToolButton() {} void QalculateToolButton::mousePressEvent(QMouseEvent *e) { b_longpress = false; if(e->button() == Qt::LeftButton) { if(!longPressTimer) { longPressTimer = new QTimer(this); longPressTimer->setSingleShot(true); connect(longPressTimer, SIGNAL(timeout()), this, SLOT(longPressTimeout())); } longPressTimer->start(500); } QToolButton::mousePressEvent(e); } void QalculateToolButton::longPressTimeout() { b_longpress = true; showMenu(); } void QalculateToolButton::mouseReleaseEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) { showMenu(); } else { if(longPressTimer && longPressTimer->isActive() && e->button() == Qt::LeftButton) { longPressTimer->stop(); } else if(b_longpress && e->button() == Qt::LeftButton) { b_longpress = false; blockSignals(true); QToolButton::mouseReleaseEvent(e); blockSignals(false); return; } QToolButton::mouseReleaseEvent(e); } } QalculateDockWidget::QalculateDockWidget(const QString &name, QWidget *parent, ExpressionEdit *editwidget) : QDockWidget(name, parent), expressionEdit(editwidget) {} QalculateDockWidget::QalculateDockWidget(QWidget *parent, ExpressionEdit *editwidget) : QDockWidget(parent), expressionEdit(editwidget) {} QalculateDockWidget::~QalculateDockWidget() {} void QalculateDockWidget::keyPressEvent(QKeyEvent *e) { QDockWidget::keyPressEvent(e); if(!e->isAccepted() && isFloating()) { expressionEdit->setFocus(); expressionEdit->keyPressEvent(e); } } void QalculateDockWidget::closeEvent(QCloseEvent *e) { emit dockClosed(); QDockWidget::closeEvent(e); } class QalculateTableWidget : public QTableWidget { public: QalculateTableWidget(QWidget *parent) : QTableWidget(parent) {} virtual ~QalculateTableWidget() {} protected: void keyPressEvent(QKeyEvent *e) override { if(state() != EditingState) { e->ignore(); return; } QTableWidget::keyPressEvent(e); } }; #define ADD_SECTION(str) \ if(!menu->style()->styleHint(QStyle::SH_Menu_SupportsSections)) { \ aw = new QWidgetAction(this); \ QLabel *label = new QLabel(str, this); \ label->setAlignment(Qt::AlignCenter); \ aw->setDefaultWidget(label); \ menu->addSeparator(); \ menu->addAction(aw); \ menu->addSeparator(); \ } else { \ menu->addSection(str); \ } #define SET_BINARY_BITS \ int binary_bits = settings->printops.binary_bits;\ if(binary_bits <= 0) binary_bits = 64;\ else if(binary_bits > 32 && binary_bits % 32 != 0) binary_bits += (32 - binary_bits % 32); QalculateWindow::QalculateWindow() : QMainWindow() { init_in_progress = true; QWidget *w_top = new QWidget(this); setCentralWidget(w_top); send_event = true; workspace_changed = false; ecTimer = NULL; emhTimer = NULL; resizeTimer = NULL; rfTimer = NULL; decimalsTimer = NULL; autoCalculateTimer = NULL; shortcutsDialog = NULL; preferencesDialog = NULL; functionsDialog = NULL; datasetsDialog = NULL; variablesDialog = NULL; unitsDialog = NULL; fpConversionDialog = NULL; percentageDialog = NULL; plotDialog = NULL; periodicTableDialog = NULL; calendarConversionDialog = NULL; mauto.setAborted(); QVBoxLayout *topLayout = new QVBoxLayout(w_top); topLayout->setContentsMargins(0, 0, 0, 0); tb = addToolBar("Toolbar"); tb->setContextMenuPolicy(Qt::CustomContextMenu); tb->setObjectName("Toolbar"); tb->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); tb->setFloatable(false); tb->setMovable(false); tb->toggleViewAction()->setVisible(false); tbAction = new QAction(tr("Show toolbar"), this); tbAction->setCheckable(true); connect(tbAction, SIGNAL(triggered(bool)), tb, SLOT(setVisible(bool))); tmenu = NULL; connect(tb, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showToolbarContextMenu(const QPoint&))); ehSplitter = new QSplitter(Qt::Vertical, this); topLayout->addWidget(ehSplitter, 1); QAction *action; QActionGroup *group; QMenu *menu, *menu2; int w, w2; QWidgetAction *aw; QWidget *aww; QHBoxLayout *awl; QFont appfont; if(settings->use_custom_app_font) appfont.fromString(QString::fromStdString(settings->custom_app_font)); menuAction_t = new QToolButton(this); menuAction_t->setIcon(LOAD_ICON("menu")); menuAction_t->setText(tr("Menu")); menuAction_t->setPopupMode(QToolButton::InstantPopup); menu = new QMenu(tr("Menu"), this); menuAction_t->setMenu(menu); menu2 = menu; menu = menu2->addMenu(tr("New")); newFunctionAction = menu->addAction(tr("Function…"), this, SLOT(newFunction())); newVariableAction = menu->addAction(tr("Variable/Constant…"), this, SLOT(newVariable())); menu->addAction(tr("Unknown Variable…"), this, SLOT(newUnknown())); menu->addAction(tr("Matrix…"), this, SLOT(newMatrix())); menu->addAction(tr("Unit…"), this, SLOT(newUnit())); menu = menu2->addMenu(tr("Workspaces")); openWSAction = menu->addAction(tr("Open…"), this, SLOT(openWorkspace())); defaultWSAction = menu->addAction(tr("Open default"), this, SLOT(openDefaultWorkspace())); menu->addSeparator(); saveWSAction = menu->addAction(tr("Save"), this, SLOT(saveWorkspace())); saveWSAsAction = menu->addAction(tr("Save As…"), this, SLOT(saveWorkspaceAs())); recentWSMenu = menu; recentWSSeparator = NULL; updateWSActions(); menu = menu2; menu->addSeparator(); menu->addAction(tr("Import CSV File…"), this, SLOT(importCSV())); menu->addAction(tr("Export CSV File…"), this, SLOT(exportCSV())); menu->addSeparator(); functionsAction = menu->addAction(tr("Functions"), this, SLOT(openFunctions())); variablesAction = menu->addAction(tr("Variables and Constants"), this, SLOT(openVariables())); unitsAction = menu->addAction(tr("Units"), this, SLOT(openUnits())); datasetsAction = menu->addAction(tr("Data Sets"), this, SLOT(openDatasets())); menu->addSeparator(); plotAction = menu->addAction(tr("Plot Functions/Data"), this, SLOT(openPlot())); fpAction = menu->addAction(tr("Floating Point Conversion (IEEE 754)"), this, SLOT(openFPConversion())); calendarsAction = menu->addAction(tr("Calendar Conversion"), this, SLOT(openCalendarConversion())); percentageAction = menu->addAction(tr("Percentage Calculation Tool"), this, SLOT(openPercentageCalculation())); periodicTableAction = menu->addAction(tr("Periodic Table"), this, SLOT(openPeriodicTable())); menu->addSeparator(); exratesAction = menu->addAction(tr("Update Exchange Rates"), this, SLOT(fetchExchangeRates())); menu->addSeparator(); group = new QActionGroup(this); action = menu->addAction(tr("Normal Mode"), this, SLOT(normalModeActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_normalmode"); if(!settings->rpn_mode && !settings->chain_mode) action->setChecked(true); action = menu->addAction(tr("RPN Mode"), this, SLOT(rpnModeActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_rpnmode"); if(settings->rpn_mode) action->setChecked(true); rpnAction = action; action = menu->addAction(tr("Chain Mode"), this, SLOT(chainModeActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_chainmode"); if(settings->chain_mode) action->setChecked(true); chainAction = action; menu->addSeparator(); menu->addAction(tr("Keyboard Shortcuts"), this, SLOT(editKeyboardShortcuts())); menu->addAction(tr("Preferences"), this, SLOT(editPreferences())); menu->addAction(tr("Open Settings Folder(s)", "", getLocalDir() == getLocalDataDir() ? 1 : 2), this, SLOT(openSettingsFolder())); menu->addSeparator(); helpAction = menu->addAction(tr("Help"), this, SLOT(help())); menu->addAction(tr("Report a Bug"), this, SLOT(reportBug())); menu->addAction(tr("Check for Updates"), this, SLOT(checkVersion())); menu->addAction(tr("About %1").arg("Qt"), qApp, SLOT(aboutQt())); menu->addAction(tr("About %1").arg("Qalculate!"), this, SLOT(showAbout())); menu->addSeparator(); quitAction = menu->addAction(tr("Quit"), qApp, SLOT(closeAllWindows())); modeAction_t = new QToolButton(this); modeAction_t->setIcon(LOAD_ICON("configure")); modeAction_t->setText(tr("Mode")); modeAction_t->setPopupMode(QToolButton::InstantPopup); menu = new QMenu(tr("Mode"), this); modeAction_t->setMenu(menu); ADD_SECTION(tr("General Display Mode")); QFontMetrics fm1(settings->use_custom_app_font ? appfont : menu->font()); menu->setToolTipsVisible(true); w = fm1.boundingRect(tr("General Display Mode")).width() * 1.5; group = new QActionGroup(this); group->setObjectName("group_general"); action = menu->addAction(tr("Normal"), this, SLOT(normalActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("500 000
5 × 1014
50 km/s
y − x
erf(10) ≈ 1.000 000 000"); normalAction = action; action->setData(EXP_PRECISION); if(settings->printops.min_exp == EXP_PRECISION) action->setChecked(true); action = menu->addAction(tr("Scientific"), this, SLOT(scientificActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("5 × 105
5 × 104 m·s−1
−y + x
erf(10) ≈ 1.000 000 000"); sciAction = action; action->setData(EXP_SCIENTIFIC); if(settings->printops.min_exp == EXP_SCIENTIFIC) action->setChecked(true); action = menu->addAction(tr("Engineering"), this, SLOT(engineeringActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("500 × 103
50 × 103 m/s
−y + x
erf(10) ≈ 1.000 000 000"); engAction = action; action->setData(EXP_BASE_3); if(settings->printops.min_exp == EXP_BASE_3) action->setChecked(true); action = menu->addAction(tr("Simple"), this, SLOT(simpleActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("500 000 000 000 000
50 km/s
y − x
erf(10) ≈ 1"); simpleAction = action; action->setData(EXP_NONE); if(settings->printops.min_exp == EXP_NONE) action->setChecked(true); ADD_SECTION(tr("Angle Unit")); w2 = fm1.boundingRect(tr("Angle Unit")).width() * 1.5; if(w2 > w) w = w2; group = new QActionGroup(this); group->setObjectName("group_angleunit"); action = menu->addAction(tr("Radians"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_radians"); radAction = action; action->setData(ANGLE_UNIT_RADIANS); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_RADIANS) action->setChecked(true); action = menu->addAction(tr("Degrees"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_degrees"); degAction = action; action->setData(ANGLE_UNIT_DEGREES); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_DEGREES) action->setChecked(true); action = menu->addAction(tr("Gradians"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_gradians"); graAction = action; action->setData(ANGLE_UNIT_GRADIANS); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_GRADIANS) action->setChecked(true); menu2 = menu; angleMenu = menu2->addMenu(tr("Other")); menu = menu2; ADD_SECTION(tr("Approximation")); w2 = fm1.boundingRect(tr("Approximation")).width() * 1.5; if(w2 > w) w = w2; group = new QActionGroup(this); action = menu->addAction(tr("Automatic", "Automatic approximation"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_autoappr"); action->setData(-1); assumptionTypeActions[0] = action; if(settings->dual_approximation < 0) action->setChecked(true); action = menu->addAction(tr("Dual", "Dual approximation"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_dualappr"); action->setData(-2); assumptionTypeActions[0] = action; if(settings->dual_approximation > 0) action->setChecked(true); action = menu->addAction(tr("Exact", "Exact approximation"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setData(APPROXIMATION_EXACT); assumptionTypeActions[0] = action; if(settings->dual_approximation == 0 && settings->evalops.approximation == APPROXIMATION_EXACT) action->setChecked(true); action->setObjectName("action_exact"); action = menu->addAction(tr("Approximate"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setData(APPROXIMATION_TRY_EXACT); assumptionTypeActions[0] = action; if(settings->dual_approximation == 0 && (settings->evalops.approximation == APPROXIMATION_APPROXIMATE || settings->evalops.approximation == APPROXIMATION_TRY_EXACT)) action->setChecked(true); action->setObjectName("action_approximate"); menu->addSeparator(); menu2 = menu; menu = menu2->addMenu(tr("Assumptions")); ADD_SECTION(tr("Type", "Assumptions type")); group = new QActionGroup(this); group->setObjectName("group_type"); action = menu->addAction(tr("Number"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_NUMBER); assumptionTypeActions[0] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_NUMBER) action->setChecked(true); action = menu->addAction(tr("Real"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_REAL); assumptionTypeActions[1] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_REAL) action->setChecked(true); action = menu->addAction(tr("Rational"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_RATIONAL); assumptionTypeActions[2] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_RATIONAL) action->setChecked(true); action = menu->addAction(tr("Integer"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_INTEGER); assumptionTypeActions[3] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_INTEGER) action->setChecked(true); action = menu->addAction(tr("Boolean"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_BOOLEAN); assumptionTypeActions[4] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_BOOLEAN) action->setChecked(true); ADD_SECTION(tr("Sign", "Assumptions sign")); group = new QActionGroup(this); group->setObjectName("group_sign"); action = menu->addAction(tr("Unknown", "Unknown assumptions sign"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_UNKNOWN); assumptionSignActions[0] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_UNKNOWN) action->setChecked(true); action = menu->addAction(tr("Non-zero"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONZERO); assumptionSignActions[1] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NONZERO) action->setChecked(true); action = menu->addAction(tr("Positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_POSITIVE); assumptionSignActions[2] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_POSITIVE) action->setChecked(true); action = menu->addAction(tr("Non-negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONNEGATIVE); assumptionSignActions[3] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NONNEGATIVE) action->setChecked(true); action = menu->addAction(tr("Negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NEGATIVE); assumptionSignActions[4] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NEGATIVE) action->setChecked(true); action = menu->addAction(tr("Non-positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONPOSITIVE); assumptionSignActions[5] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NONPOSITIVE) action->setChecked(true); menu = menu2; ADD_SECTION(tr("Result Base")); w2 = fm1.boundingRect(tr("Result Base")).width() * 1.5; if(w2 > w) w = w2; bool base_checked = false; group = new QActionGroup(this); group->setObjectName("group_outbase"); action = menu->addAction(tr("Binary"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY); if(settings->printops.base == BASE_BINARY) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Octal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_OCTAL); if(settings->printops.base == BASE_OCTAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Decimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DECIMAL); if(settings->printops.base == BASE_DECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Hexadecimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_HEXADECIMAL); if(settings->printops.base == BASE_HEXADECIMAL) {base_checked = true; action->setChecked(true);} menu2 = menu; menu = menu2->addMenu(tr("Other")); action = menu->addAction(tr("Duodecimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DUODECIMAL); if(settings->printops.base == BASE_DUODECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Sexagesimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SEXAGESIMAL); if(settings->printops.base == BASE_SEXAGESIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Time format"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_TIME); if(settings->printops.base == BASE_TIME) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Roman numerals"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_ROMAN_NUMERALS); if(settings->printops.base == BASE_ROMAN_NUMERALS) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Unicode"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_UNICODE); if(settings->printops.base == BASE_UNICODE) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Bijective base-26"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BIJECTIVE_26); if(settings->printops.base == BASE_BIJECTIVE_26) action->setChecked(true); action = menu->addAction("Float", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_FP32); if(settings->printops.base == BASE_FP32) {base_checked = true; action->setChecked(true);} action = menu->addAction("Double", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_FP64); if(settings->printops.base == BASE_FP64) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Binary-encoded decimal (BCD)"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY_DECIMAL); if(settings->printops.base == BASE_BINARY_DECIMAL) action->setChecked(true); action = menu->addAction("φ", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_GOLDEN_RATIO); if(settings->printops.base == BASE_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("ψ", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SUPER_GOLDEN_RATIO); if(settings->printops.base == BASE_SUPER_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("π", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_PI); if(settings->printops.base == BASE_PI) {base_checked = true; action->setChecked(true);} action = menu->addAction("e", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_E); if(settings->printops.base == BASE_E) {base_checked = true; action->setChecked(true);} action = menu->addAction("√2", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SQRT2); if(settings->printops.base == BASE_SQRT2) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Custom:", "Number base"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_CUSTOM); if(!base_checked) action->setChecked(true); customOutputBaseAction = action; aw = new QWidgetAction(this); aww = new QWidget(this); aw->setDefaultWidget(aww); awl = new QHBoxLayout(aww); customOutputBaseEdit = new QSpinBox(this); customOutputBaseEdit->setRange(INT_MIN, INT_MAX); customOutputBaseEdit->setValue(settings->printops.base == BASE_CUSTOM ? (CALCULATOR->customOutputBase().isZero() ? 10 : CALCULATOR->customOutputBase().intValue()) : ((settings->printops.base >= 2 && settings->printops.base <= 36) ? settings->printops.base : 10)); customOutputBaseEdit->setObjectName("spinbox_outbase"); customOutputBaseEdit->setAlignment(Qt::AlignRight); connect(customOutputBaseEdit, SIGNAL(valueChanged(int)), this, SLOT(onCustomOutputBaseChanged(int))); awl->addWidget(customOutputBaseEdit, 0); menu->addAction(aw); menu = menu2; ADD_SECTION(tr("Expression Base")); w2 = fm1.boundingRect(tr("Expression Base")).width() * 1.5; if(w2 > w) w = w2; base_checked = false; group = new QActionGroup(this); group->setObjectName("group_inbase"); action = menu->addAction(tr("Binary"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY); if(settings->evalops.parse_options.base == BASE_BINARY) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Octal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_OCTAL); if(settings->evalops.parse_options.base == BASE_OCTAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Decimal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DECIMAL); if(settings->evalops.parse_options.base == BASE_DECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Hexadecimal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_HEXADECIMAL); if(settings->evalops.parse_options.base == BASE_HEXADECIMAL) {base_checked = true; action->setChecked(true);} menu2 = menu; menu = menu2->addMenu(tr("Other")); action = menu->addAction(tr("Duodecimal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DUODECIMAL); if(settings->evalops.parse_options.base == BASE_DUODECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Roman numerals"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_ROMAN_NUMERALS); if(settings->evalops.parse_options.base == BASE_ROMAN_NUMERALS) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Unicode"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_UNICODE); if(settings->evalops.parse_options.base == BASE_UNICODE) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Bijective base-26"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BIJECTIVE_26); if(settings->evalops.parse_options.base == BASE_BIJECTIVE_26) action->setChecked(true); action = menu->addAction(tr("Binary-encoded decimal (BCD)"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY_DECIMAL); if(settings->evalops.parse_options.base == BASE_BINARY_DECIMAL) action->setChecked(true); action = menu->addAction("φ", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_GOLDEN_RATIO); if(settings->evalops.parse_options.base == BASE_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("ψ", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SUPER_GOLDEN_RATIO); if(settings->evalops.parse_options.base == BASE_SUPER_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("π", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_PI); if(settings->evalops.parse_options.base == BASE_PI) {base_checked = true; action->setChecked(true);} action = menu->addAction("e", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_E); if(settings->evalops.parse_options.base == BASE_E) {base_checked = true; action->setChecked(true);} action = menu->addAction("√2", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SQRT2); if(settings->evalops.parse_options.base == BASE_SQRT2) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Custom:", "Number base"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_CUSTOM); if(!base_checked) action->setChecked(true); customInputBaseAction = action; aw = new QWidgetAction(this); aww = new QWidget(this); aw->setDefaultWidget(aww); awl = new QHBoxLayout(aww); customInputBaseEdit = new QSpinBox(this); customInputBaseEdit->setRange(INT_MIN, INT_MAX); customInputBaseEdit->setValue(settings->evalops.parse_options.base == BASE_CUSTOM ? (CALCULATOR->customInputBase().isZero() ? 10 : CALCULATOR->customInputBase().intValue()) : ((settings->evalops.parse_options.base >= 2 && settings->evalops.parse_options.base <= 36) ? settings->evalops.parse_options.base : 10)); customInputBaseEdit->setObjectName("spinbox_inbase"); customInputBaseEdit->setAlignment(Qt::AlignRight); connect(customInputBaseEdit, SIGNAL(valueChanged(int)), this, SLOT(onCustomInputBaseChanged(int))); awl->addWidget(customInputBaseEdit, 0); menu->addAction(aw); menu = menu2; menu->addSeparator(); aw = new QWidgetAction(this); aww = new QWidget(this); aw->setDefaultWidget(aww); QGridLayout *awg = new QGridLayout(aww); awg->addWidget(new QLabel(tr("Precision:"), this), 0, 0); QSpinBox *precisionEdit = new QSpinBox(this); precisionEdit->setObjectName("spinbox_precision"); precisionEdit->setRange(2, 10000); precisionEdit->setValue(CALCULATOR->getPrecision()); precisionEdit->setAlignment(Qt::AlignRight); connect(precisionEdit, SIGNAL(valueChanged(int)), this, SLOT(onPrecisionChanged(int))); awg->addWidget(precisionEdit, 0, 1); awg->addWidget(new QLabel(tr("Min decimals:"), this), 1, 0); minDecimalsEdit = new QSpinBox(this); minDecimalsEdit->setObjectName("spinbox_mindecimals"); minDecimalsEdit->setRange(0, 10000); minDecimalsEdit->setValue(settings->printops.use_min_decimals ? settings->printops.min_decimals : 0); minDecimalsEdit->setAlignment(Qt::AlignRight); connect(minDecimalsEdit, SIGNAL(valueChanged(int)), this, SLOT(onMinDecimalsChanged(int))); awg->addWidget(minDecimalsEdit, 1, 1); awg->addWidget(new QLabel(tr("Max decimals:"), this), 2, 0); maxDecimalsEdit = new QSpinBox(this); maxDecimalsEdit->setObjectName("spinbox_maxdecimals"); maxDecimalsEdit->setRange(-1, 10000); maxDecimalsEdit->setSpecialValueText(tr("off", "Max decimals")); maxDecimalsEdit->setValue(settings->printops.use_max_decimals ? settings->printops.max_decimals : -1); maxDecimalsEdit->setAlignment(Qt::AlignRight); connect(maxDecimalsEdit, SIGNAL(valueChanged(int)), this, SLOT(onMaxDecimalsChanged(int))); awg->addWidget(maxDecimalsEdit, 2, 1); menu->addAction(aw); menu->setMinimumWidth(w); tb->addWidget(modeAction_t); modeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); toAction_t = new QalculateToolButton(this); toAction_t->setIcon(LOAD_ICON("convert")); toAction_t->setText(tr("Convert")); toAction_t->setEnabled(false); connect(toAction_t, SIGNAL(clicked()), this, SLOT(onToActivated())); toMenu = new QMenu(this); tb->addWidget(toAction_t); toAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); storeAction_t = new QalculateToolButton(this); storeAction_t->setIcon(LOAD_ICON("document-save")); storeAction_t->setText(tr("Store")); storeAction_t->setPopupMode(QToolButton::MenuButtonPopup); connect(storeAction_t, SIGNAL(clicked()), this, SLOT(onStoreActivated())); variablesMenu = new QMenu(this); storeAction_t->setMenu(variablesMenu); tb->addWidget(storeAction_t); storeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); functionsAction_t = new QalculateToolButton(this); functionsAction_t->setIcon(LOAD_ICON("function")); functionsAction_t->setText(tr("Functions")); functionsAction_t->setPopupMode(QToolButton::MenuButtonPopup); connect(functionsAction_t, SIGNAL(clicked()), this, SLOT(openFunctions())); functionsMenu = new QMenu(this); functionsAction_t->setMenu(functionsMenu); tb->addWidget(functionsAction_t); functionsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); unitsAction_t = new QalculateToolButton(this); unitsAction_t->setIcon(LOAD_ICON("units")); unitsAction_t->setText(tr("Units")); unitsAction_t->setPopupMode(QToolButton::MenuButtonPopup); connect(unitsAction_t, SIGNAL(clicked()), this, SLOT(openUnits())); unitsMenu = new QMenu(this); unitsAction_t->setMenu(unitsMenu); tb->addWidget(unitsAction_t); unitsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); if(CALCULATOR->canPlot()) { plotAction_t = new QAction(LOAD_ICON("plot"), tr("Plot"), this); connect(plotAction_t, SIGNAL(triggered(bool)), this, SLOT(openPlot())); tb->addAction(plotAction_t); } else { plotAction_t = NULL; } basesAction = new QAction(LOAD_ICON("number-bases"), tr("Number bases"), this); connect(basesAction, SIGNAL(triggered(bool)), this, SLOT(onBasesActivated(bool))); basesAction->setCheckable(true); tb->addAction(basesAction); keypadAction_t = new QToolButton(this); keypadAction_t->setIcon(LOAD_ICON("keypad")); keypadAction_t->setText(tr("Keypad")); keypadAction_t->setToolTip(tr("Keypad")); keypadAction_t->setPopupMode(QToolButton::InstantPopup); menu = new QMenu(this); keypadAction_t->setMenu(menu); group = new QActionGroup(this); group->setObjectName("group_keypad"); action = menu->addAction(tr("General"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_GENERAL); gKeypadAction = action; action = menu->addAction(tr("Programming"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_PROGRAMMING); pKeypadAction = action; action = menu->addAction(tr("Algebra"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_ALGEBRA); xKeypadAction = action; action = menu->addAction(tr("Custom"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_CUSTOM); cKeypadAction = action; action = menu->addAction(tr("Number Pad"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_NUMBERPAD); action->setEnabled(settings->hide_numpad); nKeypadAction = action; action = menu->addAction(tr("None"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(-1); action->setChecked(true); keypadAction = action; menu->addSeparator(); action = menu->addAction(tr("Always Show Number Pad"), this, SLOT(showNumpad(bool))); action->setCheckable(true); action->setChecked(!settings->hide_numpad); showNumpadAction = action; action = menu->addAction(tr("Separate Menu Buttons"), this, SLOT(showSeparateKeypadMenuButtons(bool))); action->setCheckable(true); action->setChecked(settings->separate_keypad_menu_buttons); action = menu->addAction(tr("Reset Keypad Position"), this, SLOT(resetKeypadPosition())); action->setEnabled(false); resetKeypadPositionAction = action; tb->addWidget(keypadAction_t); keypadAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); QWidget *spacer = new QWidget(); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); tb->addWidget(spacer); tb->addWidget(menuAction_t); menuAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); expressionEdit = new ExpressionEdit(this, tb); QFont font = expressionEdit->font(); if(font.pixelSize() >= 0) { font.setPixelSize(font.pixelSize() * 1.35); } else { font.setPointSize(font.pointSize() * 1.35); } expressionEdit->setFont(font); expressionEdit->setFocus(); ehSplitter->addWidget(expressionEdit); historyView = new HistoryView(this); historyView->expressionEdit = expressionEdit; ehSplitter->addWidget(historyView); ehSplitter->setStretchFactor(0, 0); ehSplitter->setStretchFactor(1, 1); ehSplitter->setCollapsible(0, false); ehSplitter->setCollapsible(1, false); basesDock = new QalculateDockWidget(tr("Number bases"), this, expressionEdit); basesDock->setObjectName("number-bases-dock"); QWidget *basesWidget = new QWidget(this); QGridLayout *basesGrid = new QGridLayout(basesWidget); binLabel = new QLabel(tr("Binary:")); basesGrid->addWidget(binLabel, 0, 0, Qt::AlignTop); octLabel = new QLabel(tr("Octal:")); basesGrid->addWidget(octLabel, 1, 0); decLabel = new QLabel(tr("Decimal:")); basesGrid->addWidget(decLabel, 2, 0); hexLabel = new QLabel(tr("Hexadecimal:")); basesGrid->addWidget(hexLabel, 3, 0); binEdit = new QLabel(); binEdit->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse | Qt::TextSelectableByKeyboard); binEdit->setFocusPolicy(Qt::NoFocus); updateBinEditSize(settings->use_custom_app_font ? &appfont : NULL); binEdit->setAlignment(Qt::AlignRight | Qt::AlignTop); basesGrid->addWidget(binEdit, 0, 1); octEdit = new QLabel("0"); QFontMetrics fm2(settings->use_custom_app_font ? appfont : octEdit->font()); octEdit->setAlignment(Qt::AlignRight); octEdit->setTextInteractionFlags(Qt::TextSelectableByMouse); octEdit->setFocusPolicy(Qt::NoFocus); octEdit->setMinimumHeight(fm2.lineSpacing()); basesGrid->addWidget(octEdit, 1, 1); decEdit = new QLabel("0"); decEdit->setAlignment(Qt::AlignRight); decEdit->setTextInteractionFlags(Qt::TextSelectableByMouse); decEdit->setFocusPolicy(Qt::NoFocus); decEdit->setMinimumHeight(fm2.lineSpacing()); basesGrid->addWidget(decEdit, 2, 1); hexEdit = new QLabel("0"); hexEdit->setAlignment(Qt::AlignRight); hexEdit->setTextInteractionFlags(Qt::TextSelectableByMouse); hexEdit->setFocusPolicy(Qt::NoFocus); hexEdit->setMinimumHeight(fm2.lineSpacing()); SET_BINARY_BITS result_bin = ""; result_hex = ""; for(int i = binary_bits; i > 0; i -= 4) { if(i < binary_bits) result_bin += " "; result_bin += "0000"; } for(int i = binary_bits > 128 ? 128 : binary_bits; i > 0; i -= 8) { if(i < binary_bits) result_hex += " "; result_hex += "00"; } result_oct = "0"; result_dec = "0"; updateResultBases(); basesGrid->addWidget(hexEdit, 3, 1); basesGrid->setRowStretch(4, 1); basesDock->setWidget(basesWidget); addDockWidget(Qt::TopDockWidgetArea, basesDock); basesDock->hide(); basesMenu = NULL; binEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(binEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); octEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(octEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); decEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(decEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); hexEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(hexEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); connect(binEdit, SIGNAL(linkActivated(const QString&)), this, SLOT(resultBasesLinkActivated(const QString&))); keypad = new KeypadWidget(this); keypadDock = new QalculateDockWidget(this, expressionEdit); keypadDock->setObjectName("keypad-dock"); keypadDock->setWidget(keypad); if(!settings->hide_numpad && get_screen_geometry(this).width() < keypad->sizeHint().width() + 50) { showNumpadAction->trigger(); if(settings->show_keypad) nKeypadAction->trigger(); } updateKeypadTitle(); keypadDock->setContextMenuPolicy(Qt::CustomContextMenu); connect(keypadDock, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showKeypadContextMenu(const QPoint&))); addDockWidget(Qt::BottomDockWidgetArea, keypadDock); QWidget *rpnWidget = new QWidget(this); rpnDock = new QalculateDockWidget(tr("RPN Stack"), this, expressionEdit); rpnDock->setObjectName("rpn-dock"); QHBoxLayout *rpnBox = new QHBoxLayout(rpnWidget); rpnView = new QalculateTableWidget(this); rpnView->setColumnCount(1); rpnView->setRowCount(0); rpnView->setSelectionBehavior(QAbstractItemView::SelectRows); rpnView->horizontalHeader()->setStretchLastSection(true); rpnView->horizontalHeader()->hide(); rpnView->verticalHeader()->setSectionsMovable(true); rpnView->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); rpnView->setSelectionMode(QAbstractItemView::SingleSelection); rpnView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked); connect(rpnView, SIGNAL(cellChanged(int, int)), this, SLOT(registerChanged(int))); rpnBox->addWidget(rpnView); QToolBar *rpnTB = new QToolBar(this); rpnTB->setToolButtonStyle(Qt::ToolButtonIconOnly); rpnTB->setOrientation(Qt::Vertical); rpnBox->addWidget(rpnTB); rpnUpAction = new QAction(LOAD_ICON("go-up"), "RPN Up", this); rpnUpAction->setEnabled(false); connect(rpnUpAction, SIGNAL(triggered(bool)), this, SLOT(registerUp())); rpnTB->addAction(rpnUpAction); rpnDownAction = new QAction(LOAD_ICON("go-down"), "RPN Down", this); rpnDownAction->setEnabled(false); connect(rpnDownAction, SIGNAL(triggered(bool)), this, SLOT(registerDown())); rpnTB->addAction(rpnDownAction); rpnSwapAction = new QAction(LOAD_ICON("rpn-swap"), "RPN Swap", this); rpnSwapAction->setEnabled(false); connect(rpnSwapAction, SIGNAL(triggered(bool)), this, SLOT(registerSwap())); rpnTB->addAction(rpnSwapAction); rpnCopyAction = new QAction(LOAD_ICON("edit-copy"), "RPN Copy", this); rpnCopyAction->setEnabled(false); connect(rpnCopyAction, SIGNAL(triggered(bool)), this, SLOT(copyRegister())); rpnTB->addAction(rpnCopyAction); rpnLastxAction = new QAction(LOAD_ICON("edit-undo"), "RPN LastX", this); rpnLastxAction->setEnabled(false); connect(rpnLastxAction, SIGNAL(triggered(bool)), this, SLOT(rpnLastX())); rpnTB->addAction(rpnLastxAction); rpnDeleteAction = new QAction(LOAD_ICON("edit-delete"), "RPN Delete", this); rpnDeleteAction->setEnabled(false); connect(rpnDeleteAction, SIGNAL(triggered(bool)), this, SLOT(deleteRegister())); rpnTB->addAction(rpnDeleteAction); rpnClearAction = new QAction(LOAD_ICON("edit-clear"), "RPN Clear", this); rpnClearAction->setEnabled(false); connect(rpnClearAction, SIGNAL(triggered(bool)), this, SLOT(clearStack())); rpnTB->addAction(rpnClearAction); rpnDock->setWidget(rpnWidget); addDockWidget(Qt::TopDockWidgetArea, rpnDock); if(!settings->rpn_mode) rpnDock->hide(); QLocalServer::removeServer("qalculate-qt"); server = new QLocalServer(this); server->listen("qalculate-qt"); connect(server, SIGNAL(newConnection()), this, SLOT(serverNewConnection())); mstruct = new MathStructure(); settings->current_result = NULL; mstruct_exact.setUndefined(); prepend_mstruct.setUndefined(); parsed_mstruct = new MathStructure(); parsed_tostruct = new MathStructure(); viewThread = new ViewThread; commandThread = new CommandThread; settings->printops.can_display_unicode_string_arg = (void*) historyView; b_busy = 0; expressionEdit->setFocus(); if(settings->custom_result_font.empty()) settings->custom_result_font = historyView->font().toString().toStdString(); if(settings->custom_expression_font.empty()) settings->custom_expression_font = expressionEdit->font().toString().toStdString(); if(settings->custom_keypad_font.empty()) settings->custom_keypad_font = keypad->font().toString().toStdString(); if(settings->custom_app_font.empty()) settings->custom_app_font = QApplication::font().toString().toStdString(); if(settings->use_custom_keypad_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_keypad_font)); keypad->setFont(font);} if(settings->use_custom_expression_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_expression_font)); expressionEdit->setFont(font);} if(settings->use_custom_result_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_result_font)); historyView->setFont(font); rpnView->setFont(font);} loadShortcuts(); connect(functionsMenu, SIGNAL(aboutToShow()), this, SLOT(initializeFunctionsMenu())); connect(variablesMenu, SIGNAL(aboutToShow()), this, SLOT(initializeVariablesMenu())); connect(unitsMenu, SIGNAL(aboutToShow()), this, SLOT(initializeUnitsMenu())); connect(historyView, SIGNAL(insertTextRequested(std::string)), this, SLOT(onInsertTextRequested(std::string))); connect(historyView, SIGNAL(insertValueRequested(int)), this, SLOT(onInsertValueRequested(int))); connect(historyView, SIGNAL(historyReloaded()), this, SLOT(onHistoryReloaded())); connect(expressionEdit, SIGNAL(returnPressed()), this, SLOT(calculate())); connect(expressionEdit, SIGNAL(calculateSelectionRequest()), this, SLOT(calculateSelection())); connect(expressionEdit, SIGNAL(textChanged()), this, SLOT(onExpressionChanged())); connect(expressionEdit, SIGNAL(statusChanged(QString, bool, bool, bool, bool)), this, SLOT(onStatusChanged(QString, bool, bool, bool, bool))); connect(expressionEdit, SIGNAL(toConversionRequested(std::string)), this, SLOT(onToConversionRequested(std::string))); connect(expressionEdit, SIGNAL(calculateRPNRequest(int)), this, SLOT(calculateRPN(int))); connect(expressionEdit, SIGNAL(expressionStatusModeChanged(bool)), this, SLOT(onExpressionStatusModeChanged(bool))); connect(tb, SIGNAL(visibilityChanged(bool)), this, SLOT(onToolbarVisibilityChanged(bool))); connect(keypadDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onKeypadVisibilityChanged(bool))); connect(basesDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onBasesVisibilityChanged(bool))); connect(rpnDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onRPNVisibilityChanged(bool))); connect(rpnDock, SIGNAL(dockClosed()), this, SLOT(onRPNClosed())); connect(keypad, SIGNAL(expressionCalculationUpdated(int)), this, SLOT(expressionCalculationUpdated(int))); connect(keypad, SIGNAL(expressionFormatUpdated(bool)), this, SLOT(expressionFormatUpdated(bool))); connect(keypad, SIGNAL(resultFormatUpdated(int)), this, SLOT(resultFormatUpdated(int))); connect(keypad, SIGNAL(expressionCalculationUpdated(int)), this, SLOT(keypadPreferencesChanged())); connect(keypad, SIGNAL(expressionFormatUpdated(bool)), this, SLOT(keypadPreferencesChanged())); connect(keypad, SIGNAL(resultFormatUpdated(int)), this, SLOT(keypadPreferencesChanged())); connect(keypad, SIGNAL(shortcutClicked(int, const QString&)), this, SLOT(shortcutClicked(int, const QString&))); connect(keypad, SIGNAL(symbolClicked(const QString&)), this, SLOT(onSymbolClicked(const QString&))); connect(keypad, SIGNAL(operatorClicked(const QString&)), this, SLOT(onOperatorClicked(const QString&))); connect(keypad, SIGNAL(functionClicked(MathFunction*)), this, SLOT(onFunctionClicked(MathFunction*))); connect(keypad, SIGNAL(variableClicked(Variable*)), this, SLOT(onVariableClicked(Variable*))); connect(keypad, SIGNAL(unitClicked(Unit*)), this, SLOT(onUnitClicked(Unit*))); connect(keypad, SIGNAL(prefixClicked(Prefix*)), this, SLOT(onPrefixClicked(Prefix*))); connect(keypad, SIGNAL(delClicked()), this, SLOT(onDelClicked())); connect(keypad, SIGNAL(clearClicked()), this, SLOT(onClearClicked())); connect(keypad, SIGNAL(equalsClicked()), this, SLOT(onEqualsClicked())); connect(keypad, SIGNAL(parenthesesClicked()), this, SLOT(onParenthesesClicked())); connect(keypad, SIGNAL(bracketsClicked()), this, SLOT(onBracketsClicked())); connect(keypad, SIGNAL(endClicked()), this, SLOT(onEndClicked())); connect(keypad, SIGNAL(startClicked()), this, SLOT(onStartClicked())); connect(keypad, SIGNAL(leftClicked()), this, SLOT(onLeftClicked())); connect(keypad, SIGNAL(rightClicked()), this, SLOT(onRightClicked())); connect(keypad, SIGNAL(backspaceClicked()), this, SLOT(onBackspaceClicked())); connect(keypad, SIGNAL(MSClicked()), this, SLOT(onMSClicked())); connect(keypad, SIGNAL(MRClicked()), this, SLOT(onMRClicked())); connect(keypad, SIGNAL(MCClicked()), this, SLOT(onMCClicked())); connect(keypad, SIGNAL(MPlusClicked()), this, SLOT(onMPlusClicked())); connect(keypad, SIGNAL(MMinusClicked()), this, SLOT(onMMinusClicked())); connect(keypad, SIGNAL(storeClicked()), this, SLOT(onStoreActivated())); connect(keypad, SIGNAL(newFunctionClicked()), this, SLOT(newFunction())); connect(keypad, SIGNAL(answerClicked()), this, SLOT(onAnswerClicked())); connect(keypad, SIGNAL(baseClicked(int, bool, bool)), this, SLOT(onBaseClicked(int, bool, bool))); connect(keypad, SIGNAL(factorizeClicked()), this, SLOT(onFactorizeClicked())); connect(keypad, SIGNAL(expandClicked()), this, SLOT(onExpandClicked())); connect(keypad, SIGNAL(expandPartialFractionsClicked()), this, SLOT(onExpandPartialFractionsClicked())); connect(keypad, SIGNAL(openVariablesRequest()), this, SLOT(openVariables())); connect(keypad, SIGNAL(openUnitsRequest()), this, SLOT(openUnits())); connect(keypad, SIGNAL(openPercentageCalculationRequest()), this, SLOT(openPercentageCalculation())); #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) connect(QGuiApplication::styleHints(), SIGNAL(colorSchemeChanged(Qt::ColorScheme)), this, SLOT(onColorSchemeChanged())); #endif if(settings->enable_tooltips != 1) onEnableTooltipsChanged(); if(!settings->window_geometry.isEmpty()) restoreGeometry(settings->window_geometry); if(settings->window_geometry.isEmpty() || (settings->preferences_version[0] == 3 && settings->preferences_version[1] < 22 && height() == 650 && width() == 600)) try_resize(this, DEFAULT_WIDTH, DEFAULT_HEIGHT); if(!settings->window_state.isEmpty()) restoreState(settings->window_state); if(!settings->splitter_state.isEmpty()) ehSplitter->restoreState(settings->splitter_state); if(settings->show_bases >= 0) basesDock->setVisible(settings->show_bases > 0); if(settings->show_keypad >= 0) keypadDock->setVisible(settings->show_keypad > 0); rpnDock->setVisible(settings->rpn_mode); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); if(settings->use_custom_app_font) { QTimer *timer = new QTimer(); timer->setSingleShot(true); connect(timer, SIGNAL(timeout()), this, SLOT(onAppFontTimer())); timer->start(1); } } QalculateWindow::~QalculateWindow() {} void QalculateWindow::initializeFunctionsMenu() { if(functionsMenu->isEmpty()) updateFunctionsMenu(); } void QalculateWindow::initializeVariablesMenu() { if(variablesMenu->isEmpty()) updateVariablesMenu(); } void QalculateWindow::initializeUnitsMenu() { if(unitsMenu->isEmpty()) updateUnitsMenu(); } void QalculateWindow::keypadPreferencesChanged() { if(preferencesDialog) { preferencesDialog->updateVariableUnits(); preferencesDialog->updateComplexForm(); preferencesDialog->updateIntervalDisplay(); preferencesDialog->updateIntervalCalculation(); preferencesDialog->updateConciseUncertaintyInput(); } } void QalculateWindow::updateKeypadTitle() { QString str = tr("Keypad") + " ("; if(settings->keypad_type == KEYPAD_GENERAL) str += tr("General"); else if(settings->keypad_type == KEYPAD_PROGRAMMING) str += tr("Programming"); else if(settings->keypad_type == KEYPAD_ALGEBRA) str += tr("Algebra"); else if(settings->keypad_type == KEYPAD_CUSTOM) str += tr("Custom"); else if(settings->keypad_type == KEYPAD_NUMBERPAD) str += tr("Number Pad"); str += ")"; keypadDock->setWindowTitle(str); } void QalculateWindow::showKeypadContextMenu(const QPoint &pos) { QPoint p = keypadDock->mapToGlobal(pos); if(p.y() < keypad->mapToGlobal(QPoint(0, 0)).y()) keypadAction_t->menu()->popup(p); } void QalculateWindow::showToolbarContextMenu(const QPoint &pos) { QWidget *w = tb->childAt(pos); if(w == storeAction_t || w == functionsAction_t || w == unitsAction_t) return; if(!tmenu) { tmenu = new QMenu(this); QActionGroup *group = new QActionGroup(this); QAction *action = tmenu->addAction(tr("Icons only"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonIconOnly); action->setData(Qt::ToolButtonIconOnly); group->addAction(action); action = tmenu->addAction(tr("Text only"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonTextOnly); action->setData(Qt::ToolButtonTextOnly); group->addAction(action); action = tmenu->addAction(tr("Text beside icons"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonTextBesideIcon); action->setData(Qt::ToolButtonTextBesideIcon); group->addAction(action); action = tmenu->addAction(tr("Text under icons"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonTextUnderIcon); action->setData(Qt::ToolButtonTextUnderIcon); group->addAction(action); tmenu->addSeparator(); tmenu->addAction(tbAction); } tmenu->popup(tb->mapToGlobal(pos)); } void QalculateWindow::showBasesContextMenu(const QPoint &pos) { if(((QLabel*) sender())->text().isEmpty()) return; if(!basesMenu) { basesMenu = new QMenu(this); copyBasesAction = basesMenu->addAction(tr("Copy"), this, SLOT(copyBases())); } copyBasesAction->setData(QVariant::fromValue((void*) sender())); basesMenu->popup(((QWidget*) sender())->mapToGlobal(pos)); } void QalculateWindow::copyBases() { QLabel *label = (QLabel*) copyBasesAction->data().value(); QApplication::clipboard()->setText(label->hasSelectedText() ? label->selectedText() : (label == binEdit ? QString::fromStdString(result_bin) : label->text())); } void QalculateWindow::setToolbarStyle() { QAction *action = qobject_cast(sender()); settings->toolbar_style = action->data().toInt(); tb->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); modeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); toAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); storeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); functionsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); unitsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); menuAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); keypadAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); } void QalculateWindow::loadShortcuts() { if(plotAction_t) plotAction_t->setToolTip(tr("Plot Functions/Data")); storeAction_t->setToolTip(tr("Store") + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); unitsAction_t->setToolTip(tr("Units") + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); functionsAction_t->setToolTip(tr("Functions") + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); basesAction->setToolTip(tr("Number Bases")); toAction_t->setToolTip(tr("Convert")); menuAction_t->setToolTip(tr("Menu")); modeAction_t->setToolTip(tr("Mode")); rpnUpAction->setToolTip(tr("Rotate the stack or move the selected register up")); rpnDownAction->setToolTip(tr("Rotate the stack or move the selected register down")); rpnSwapAction->setToolTip(tr("Swap the top two values or move the selected value to the top of the stack")); rpnDeleteAction->setToolTip(tr("Delete the top or selected value")); rpnLastxAction->setToolTip(tr("Enter the top value from before the last numeric operation")); rpnCopyAction->setToolTip(tr("Copy the selected or top value to the top of the stack")); rpnClearAction->setToolTip(tr("Clear the RPN stack")); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { keyboardShortcutAdded(settings->keyboard_shortcuts[i]); } } void QalculateWindow::keyboardShortcutRemoved(keyboard_shortcut *ks) { if(ks->type[0] == SHORTCUT_TYPE_COMPLETE && ks->key == "Tab") { expressionEdit->enableTabCompletion(false); return; } if(!ks->action) return; if(ks->new_action) { removeAction(ks->action); ks->action->deleteLater(); return; } QList shortcuts = ks->action->shortcuts(); shortcuts.removeAll(QKeySequence::fromString(ks->key)); ks->action->setShortcuts(shortcuts); if(ks->type[0] == SHORTCUT_TYPE_PLOT && plotAction_t) { plotAction_t->setToolTip(tr("Plot Functions/Data") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_STORE) { storeAction_t->setToolTip(tr("Store") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_UNITS) { unitsAction_t->setToolTip(tr("Units") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_FUNCTIONS) { functionsAction_t->setToolTip(tr("Functions") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_NUMBER_BASES) { basesAction->setToolTip(tr("Number Bases") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_CONVERT) { toAction_t->setToolTip(tr("Convert") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_MODE) { modeAction_t->setToolTip(tr("Mode") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_MENU) { menuAction_t->setToolTip(tr("Menu") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_UP) { rpnUpAction->setToolTip(tr("Rotate the stack or move the selected register up") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DOWN) { rpnDownAction->setToolTip(tr("Rotate the stack or move the selected register down") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_SWAP) { rpnSwapAction->setToolTip(tr("Swap the top two values or move the selected value to the top of the stack") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DELETE) { rpnDeleteAction->setToolTip(tr("Delete the top or selected value") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_LASTX) { rpnLastxAction->setToolTip(tr("Enter the top value from before the last numeric operation") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_COPY) { rpnCopyAction->setToolTip(tr("Copy the selected or top value to the top of the stack") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_CLEAR) { rpnClearAction->setToolTip(tr("Clear the RPN stack") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } } void QalculateWindow::keyboardShortcutAdded(keyboard_shortcut *ks) { if(ks->type.size() == 1 && ks->type[0] == SHORTCUT_TYPE_COMPLETE && ks->key == "Tab") { expressionEdit->enableTabCompletion(true); ks->new_action = false; return; } QAction *action = NULL; if(ks->type.size() == 1) { switch(ks->type[0]) { case SHORTCUT_TYPE_MANAGE_FUNCTIONS: {action = functionsAction; break;} case SHORTCUT_TYPE_MANAGE_VARIABLES: {action = variablesAction; break;} case SHORTCUT_TYPE_MANAGE_UNITS: {action = unitsAction; break;} case SHORTCUT_TYPE_MANAGE_DATA_SETS: {action = datasetsAction; break;} case SHORTCUT_TYPE_FLOATING_POINT: {action = fpAction; break;} case SHORTCUT_TYPE_CALENDARS: {action = calendarsAction; break;} case SHORTCUT_TYPE_PERIODIC_TABLE: {action = periodicTableAction; break;} case SHORTCUT_TYPE_PERCENTAGE_TOOL: {action = percentageAction; break;} case SHORTCUT_TYPE_NUMBER_BASES: {action = basesAction; break;} case SHORTCUT_TYPE_RPN_MODE: {action = rpnAction; break;} case SHORTCUT_TYPE_DEGREES: {action = degAction; break;} case SHORTCUT_TYPE_RADIANS: {action = radAction; break;} case SHORTCUT_TYPE_GRADIANS: {action = graAction; break;} case SHORTCUT_TYPE_NORMAL_NOTATION: {action = normalAction; break;} case SHORTCUT_TYPE_SCIENTIFIC_NOTATION: {action = sciAction; break;} case SHORTCUT_TYPE_ENGINEERING_NOTATION: {action = engAction; break;} case SHORTCUT_TYPE_SIMPLE_NOTATION: {action = simpleAction; break;} case SHORTCUT_TYPE_CHAIN_MODE: {action = chainAction; break;} case SHORTCUT_TYPE_KEYPAD: {action = keypadAction; break;} case SHORTCUT_TYPE_GENERAL_KEYPAD: {action = gKeypadAction; break;} case SHORTCUT_TYPE_PROGRAMMING_KEYPAD: {action = pKeypadAction; break;} case SHORTCUT_TYPE_ALGEBRA_KEYPAD: {action = xKeypadAction; break;} case SHORTCUT_TYPE_CUSTOM_KEYPAD: {action = cKeypadAction; break;} case SHORTCUT_TYPE_NEW_VARIABLE: {action = newVariableAction; break;} case SHORTCUT_TYPE_NEW_FUNCTION: {action = newFunctionAction; break;} case SHORTCUT_TYPE_PLOT: {action = plotAction; break;} case SHORTCUT_TYPE_UPDATE_EXRATES: {action = exratesAction; break;} case SHORTCUT_TYPE_HISTORY_SEARCH: {action = historyView->findAction; break;} case SHORTCUT_TYPE_HELP: {action = helpAction; break;} case SHORTCUT_TYPE_QUIT: {action = quitAction; break;} case SHORTCUT_TYPE_RPN_UP: {action = rpnUpAction; break;} case SHORTCUT_TYPE_RPN_DOWN: {action = rpnDownAction; break;} case SHORTCUT_TYPE_RPN_SWAP: {action = rpnSwapAction; break;} case SHORTCUT_TYPE_RPN_LASTX: {action = rpnLastxAction; break;} case SHORTCUT_TYPE_RPN_COPY: {action = rpnCopyAction; break;} case SHORTCUT_TYPE_RPN_DELETE: {action = rpnDeleteAction; break;} case SHORTCUT_TYPE_RPN_CLEAR: {action = rpnClearAction; break;} default: {} } } if(action) { ks->new_action = false; QList shortcuts = action->shortcuts(); shortcuts << QKeySequence::fromString(ks->key); addAction(action); action->setShortcuts(shortcuts); if(ks->type[0] == SHORTCUT_TYPE_PLOT) { if(plotAction_t) plotAction_t->setToolTip(tr("Plot Functions/Data") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_UNITS) { unitsAction_t->setToolTip(tr("Units") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_FUNCTIONS) { functionsAction_t->setToolTip(tr("Functions") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_NUMBER_BASES) { basesAction->setToolTip(tr("Number Bases") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_UP) { rpnUpAction->setToolTip(tr("Rotate the stack or move the selected register up") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DOWN) { rpnDownAction->setToolTip(tr("Rotate the stack or move the selected register down") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_SWAP) { rpnSwapAction->setToolTip(tr("Swap the top two values or move the selected value to the top of the stack") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DELETE) { rpnDeleteAction->setToolTip(tr("Delete the top or selected value") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_LASTX) { rpnLastxAction->setToolTip(tr("Enter the top value from before the last numeric operation") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_COPY) { rpnCopyAction->setToolTip(tr("Copy the selected or top value to the top of the stack") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_CLEAR) { rpnClearAction->setToolTip(tr("Clear the RPN stack") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } } else { if(ks->type[0] == SHORTCUT_TYPE_MODE) { modeAction_t->setToolTip(tr("Mode") + QStringLiteral(" (%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_MENU) { menuAction_t->setToolTip(tr("Menu") + QStringLiteral(" (%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_STORE) { storeAction_t->setToolTip(tr("Store") + QStringLiteral("(%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText)) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } if(ks->type.size() == 1 && ks->type[0] == SHORTCUT_TYPE_CONVERT) { toAction_t->setToolTip(tr("Convert") + QStringLiteral(" (%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText))); } ks->new_action = true; action = new QAction(this); action->setShortcut(ks->key); action->setData(QVariant::fromValue((void*) ks)); addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(shortcutActivated())); } ks->action = action; } void QalculateWindow::shortcutActivated() { keyboard_shortcut *ks = (keyboard_shortcut*) qobject_cast(sender())->data().value(); for(size_t i = 0; i < ks->type.size(); i++) { triggerShortcut(ks->type[i], ks->value[i]); } } void QalculateWindow::shortcutClicked(int type, const QString &value) { triggerShortcut((shortcut_type) type, value.toStdString()); } bool contains_prefix(const MathStructure &m) { if(m.isUnit() && (m.prefix() || m.unit()->subtype() == SUBTYPE_COMPOSITE_UNIT)) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_prefix(m[i])) return true; } return false; } void QalculateWindow::triggerShortcut(int type, const std::string &value) { switch(type) { case SHORTCUT_TYPE_NEGATE: { negate(); break; } case SHORTCUT_TYPE_INVERT: { onFunctionClicked(CALCULATOR->getActiveFunction("inv")); break; } case SHORTCUT_TYPE_APPROXIMATE: { approximateResult(); break; } case SHORTCUT_TYPE_TOGGLE_FRACTION: { toggleResultFraction(); break; } case SHORTCUT_TYPE_MODE: { modeAction_t->showMenu(); break; } case SHORTCUT_TYPE_FUNCTIONS_MENU: { functionsAction_t->showMenu(); break; } case SHORTCUT_TYPE_UNITS_MENU: { unitsAction_t->showMenu(); break; } case SHORTCUT_TYPE_VARIABLES_MENU: { storeAction_t->showMenu(); break; } case SHORTCUT_TYPE_MENU: { menuAction_t->showMenu(); break; } case SHORTCUT_TYPE_FUNCTION: { onFunctionClicked(CALCULATOR->getActiveFunction(value)); break; } case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: { insertFunction(CALCULATOR->getActiveFunction(value), this); break; } case SHORTCUT_TYPE_VARIABLE: { onVariableClicked(CALCULATOR->getActiveVariable(value)); break; } case SHORTCUT_TYPE_UNIT: { Unit *u = CALCULATOR->getActiveUnit(value); if(!u) { CALCULATOR->clearMessages(); CompositeUnit cu("", "", "", value); if(CALCULATOR->message()) { settings->displayMessages(this); } else { onUnitClicked(&cu); } } else { onUnitClicked(u); } break; } case SHORTCUT_TYPE_OPERATOR: { onOperatorClicked(QString::fromStdString(value)); break; } case SHORTCUT_TYPE_TEXT: { onSymbolClicked(QString::fromStdString(value)); break; } case SHORTCUT_TYPE_DATE: { expressionEdit->insertDate(); break; } case SHORTCUT_TYPE_MATRIX: { expressionEdit->insertMatrix(); break; } case SHORTCUT_TYPE_SMART_PARENTHESES: { expressionEdit->smartParentheses(); break; } case SHORTCUT_TYPE_CONVERT_TO: { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; executeCommand(COMMAND_CONVERT_STRING, true, CALCULATOR->unlocalizeExpression(value, pa)); break; } case SHORTCUT_TYPE_CONVERT: { onToActivated(false); break; } case SHORTCUT_TYPE_OPTIMAL_UNIT: { executeCommand(COMMAND_CONVERT_OPTIMAL); break; } case SHORTCUT_TYPE_BASE_UNITS: { executeCommand(COMMAND_CONVERT_BASE); break; } case SHORTCUT_TYPE_OPTIMAL_PREFIX: { to_prefix = 0; bool b_use_unit_prefixes = settings->printops.use_unit_prefixes; bool b_use_prefixes_for_all_units = settings->printops.use_prefixes_for_all_units; if((!expressionEdit->expressionHasChanged() || (settings->rpn_mode && CALCULATOR->RPNStackSize() != 0)) && contains_prefix(*mstruct)) { mstruct->unformat(settings->evalops); executeCommand(COMMAND_CALCULATE, false); } settings->printops.use_unit_prefixes = true; settings->printops.use_prefixes_for_all_units = true; setResult(NULL, true, false, true); settings->printops.use_unit_prefixes = b_use_unit_prefixes; settings->printops.use_prefixes_for_all_units = b_use_prefixes_for_all_units; break; } case SHORTCUT_TYPE_TO_NUMBER_BASE: { int save_base = settings->printops.base; Number save_nbase = CALCULATOR->customOutputBase(); to_base = 0; to_bits = 0; to_duo_syms = false; Number nbase; base_from_string(value, settings->printops.base, nbase); CALCULATOR->setCustomOutputBase(nbase); resultFormatUpdated(); settings->printops.base = save_base; CALCULATOR->setCustomOutputBase(save_nbase); break; } case SHORTCUT_TYPE_FACTORIZE: { executeCommand(COMMAND_FACTORIZE); break; } case SHORTCUT_TYPE_EXPAND: { executeCommand(COMMAND_EXPAND); break; } case SHORTCUT_TYPE_PARTIAL_FRACTIONS: { executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); break; } case SHORTCUT_TYPE_INPUT_BASE: { Number nbase; base_from_string(value, settings->evalops.parse_options.base, nbase, true); QAction *action = find_child_data(this, "group_inbase", settings->evalops.parse_options.base); if(!action) action = customInputBaseAction; if(action) action->setChecked(true); if(settings->evalops.parse_options.base == BASE_CUSTOM) CALCULATOR->setCustomInputBase(nbase); if(action == customInputBaseAction) customInputBaseEdit->setValue(settings->evalops.parse_options.base == BASE_CUSTOM ? CALCULATOR->customInputBase().intValue() : settings->evalops.parse_options.base); expressionFormatUpdated(false); keypad->updateBase(); break; } case SHORTCUT_TYPE_OUTPUT_BASE: { Number nbase; base_from_string(value, settings->printops.base, nbase, false); to_base = 0; to_bits = 0; to_duo_syms = false; QAction *action = find_child_data(this, "group_outbase", settings->printops.base); if(!action) action = customOutputBaseAction; if(action) action->setChecked(true); if(settings->printops.base == BASE_CUSTOM) CALCULATOR->setCustomOutputBase(nbase); if(action == customOutputBaseAction) customOutputBaseEdit->setValue(settings->printops.base == BASE_CUSTOM ? CALCULATOR->customOutputBase().intValue() : settings->printops.base); resultFormatUpdated(); keypad->updateBase(); break; } case SHORTCUT_TYPE_HISTORY_SEARCH: { historyView->findAction->trigger(); break; } case SHORTCUT_TYPE_HISTORY_CLEAR: { historyView->editClear(); expressionEdit->clearHistory(); break; } case SHORTCUT_TYPE_MEMORY_CLEAR: { onMCClicked(); break; } case SHORTCUT_TYPE_MEMORY_RECALL: { onMRClicked(); break; } case SHORTCUT_TYPE_MEMORY_STORE: { onMSClicked(); break; } case SHORTCUT_TYPE_MEMORY_ADD: { onMPlusClicked(); break; } case SHORTCUT_TYPE_MEMORY_SUBTRACT: { onMMinusClicked(); break; } case SHORTCUT_TYPE_COPY_RESULT: { if(settings->v_result.empty()) break; int v = s2i(value); if(v < 0 || v > 8) v = 0; bool b_ascii = (v != 1 && v != 4 && v != 6 && (v != 0 || settings->copy_ascii)); bool b_nounits = (v == 3 || v == 8 || (v == 0 && settings->copy_ascii && settings->copy_ascii_without_units)); QString str_ascii, str_html; if(v > 3) { if(settings->history_expression_type == 1 && !settings->v_expression[settings->v_expression.size() - 1].empty()) { if(b_ascii) { str_ascii += QString::fromStdString(unformat(settings->v_expression[settings->v_expression.size() - 1])); } else { str_ascii += QString::fromStdString(settings->v_expression[settings->v_expression.size() - 1]); if(v < 6) b_ascii = true; else str_html += QString::fromStdString(settings->v_expression[settings->v_expression.size() - 1]); } } else { if(b_ascii) { str_ascii += QString::fromStdString(unformat(unhtmlize(settings->v_parse[settings->v_parse.size() - 1], true))); } else { str_html += QString::fromStdString(uncolorize(settings->v_parse[settings->v_parse.size() - 1])); str_ascii += QString::fromStdString(unhtmlize(settings->v_parse[settings->v_parse.size() - 1])); } } } if(v <= 3 || v >= 6) { if(b_ascii) { if(v > 3) str_ascii += " = "; std::string str = settings->v_result[settings->v_result.size() - 1][0]; if(b_nounits) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } str_ascii += QString::fromStdString(unformat(unhtmlize(str, true))).trimmed(); } else { if(v > 3) { if(settings->v_exact[settings->v_exact.size() - 1][0]) { str_html += " = "; str_ascii += " = "; } else { str_html += " " SIGN_ALMOST_EQUAL " "; str_ascii += " " SIGN_ALMOST_EQUAL " "; } } str_html += QString::fromStdString(uncolorize(settings->v_result[settings->v_result.size() - 1][0])); str_ascii += QString::fromStdString(unhtmlize(settings->v_result[settings->v_result.size() - 1][0])); } } if(b_ascii) { QApplication::clipboard()->setText(str_ascii); } else { QMimeData *qm = new QMimeData(); qm->setHtml(str_html); qm->setText(str_ascii); if(v <= 3 || v >= 6) qm->setObjectName("history_result"); else qm->setObjectName("history_expression"); QApplication::clipboard()->setMimeData(qm); } break; } case SHORTCUT_TYPE_INSERT_RESULT: { if(!settings->v_result.empty()) { expressionEdit->blockCompletion(); expressionEdit->insertText(QString::fromStdString(unhtmlize(settings->v_result[settings->v_result.size() - 1][0]))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } break; } case SHORTCUT_TYPE_ALWAYS_ON_TOP: { settings->always_on_top = !settings->always_on_top; onAlwaysOnTopChanged(); break; } case SHORTCUT_TYPE_COMPLETE: { expressionEdit->completeOrActivateFirst(); break; } case SHORTCUT_TYPE_EXPRESSION_CLEAR: { expressionEdit->clear(); break; } case SHORTCUT_TYPE_EXPRESSION_DELETE: { expressionEdit->textCursor().deleteChar(); break; } case SHORTCUT_TYPE_EXPRESSION_BACKSPACE: { expressionEdit->textCursor().deletePreviousChar(); break; } case SHORTCUT_TYPE_EXPRESSION_START: { expressionEdit->moveCursor(QTextCursor::Start); break; } case SHORTCUT_TYPE_EXPRESSION_END: { expressionEdit->moveCursor(QTextCursor::End); break; } case SHORTCUT_TYPE_EXPRESSION_RIGHT: { expressionEdit->moveCursor(QTextCursor::NextCharacter); break; } case SHORTCUT_TYPE_EXPRESSION_LEFT: { expressionEdit->moveCursor(QTextCursor::PreviousCharacter); break; } case SHORTCUT_TYPE_EXPRESSION_UP: { expressionEdit->moveCursor(QTextCursor::PreviousRow); break; } case SHORTCUT_TYPE_EXPRESSION_DOWN: { expressionEdit->moveCursor(QTextCursor::NextRow); break; } case SHORTCUT_TYPE_EXPRESSION_UNDO: { expressionEdit->editUndo(); break; } case SHORTCUT_TYPE_EXPRESSION_REDO: { expressionEdit->editRedo(); break; } case SHORTCUT_TYPE_CALCULATE_EXPRESSION: { calculate(); break; } case SHORTCUT_TYPE_EXPRESSION_HISTORY_NEXT: { QKeyEvent e(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier); expressionEdit->keyPressEvent(&e); break; } case SHORTCUT_TYPE_EXPRESSION_HISTORY_PREVIOUS: { QKeyEvent e(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier); expressionEdit->keyPressEvent(&e); break; } case SHORTCUT_TYPE_PRECISION: { int v = s2i(value); if(settings->previous_precision > 0 && CALCULATOR->getPrecision() == v) { v = settings->previous_precision; settings->previous_precision = 0; } else { settings->previous_precision = CALCULATOR->getPrecision(); } QSpinBox *w = findChild("spinbox_precision"); if(w) { w->blockSignals(true); w->setValue(v); w->blockSignals(false); } CALCULATOR->setPrecision(v); expressionCalculationUpdated(); break; } case SHORTCUT_TYPE_MAX_DECIMALS: { int v = s2i(value); QSpinBox *w = findChild("spinbox_maxdecimals"); if(w) w->blockSignals(true); if(v < 0 || (settings->printops.use_max_decimals && settings->printops.max_decimals == v)) { if(w) w->setValue(-1); settings->printops.use_max_decimals = false; settings->printops.max_decimals = -1; } else { if(w) w->setValue(v); settings->printops.use_max_decimals = true; settings->printops.max_decimals = v; } if(w) w->blockSignals(false); resultFormatUpdated(true); break; } case SHORTCUT_TYPE_MIN_DECIMALS: { int v = s2i(value); QSpinBox *w = findChild("spinbox_mindecimals"); if(w) w->blockSignals(true); if(v < 0 || (settings->printops.use_min_decimals && settings->printops.min_decimals == v)) { if(w) w->setValue(0); settings->printops.use_min_decimals = false; settings->printops.min_decimals = 0; } else { if(w) w->setValue(v); settings->printops.use_min_decimals = true; settings->printops.min_decimals = v; } if(w) w->blockSignals(false); resultFormatUpdated(true); break; } case SHORTCUT_TYPE_MINMAX_DECIMALS: { int v = s2i(value); QSpinBox *w1 = findChild("spinbox_mindecimals"); QSpinBox *w2 = findChild("spinbox_maxdecimals"); if(w1) w1->blockSignals(true); if(w2) w2->blockSignals(true); if(v < 0 || (settings->printops.use_min_decimals && settings->printops.min_decimals == v && settings->printops.use_max_decimals && settings->printops.max_decimals == v)) { if(w1) w1->setValue(0); if(w2) w2->setValue(-1); settings->printops.use_min_decimals = false; settings->printops.min_decimals = 0; settings->printops.use_max_decimals = false; settings->printops.max_decimals = -1; } else { if(w1) w1->setValue(v); if(w2) w2->setValue(v); settings->printops.use_min_decimals = true; settings->printops.min_decimals = v; settings->printops.use_max_decimals = true; settings->printops.max_decimals = v; } if(w1) w1->blockSignals(false); if(w2) w2->blockSignals(false); resultFormatUpdated(true); break; } case SHORTCUT_TYPE_MANAGE_FUNCTIONS: {functionsAction->trigger(); break;} case SHORTCUT_TYPE_MANAGE_VARIABLES: {variablesAction->trigger(); break;} case SHORTCUT_TYPE_MANAGE_UNITS: {unitsAction->trigger(); break;} case SHORTCUT_TYPE_MANAGE_DATA_SETS: {datasetsAction->trigger(); break;} case SHORTCUT_TYPE_FLOATING_POINT: {fpAction->trigger(); break;} case SHORTCUT_TYPE_CALENDARS: {calendarsAction->trigger(); break;} case SHORTCUT_TYPE_PERIODIC_TABLE: {periodicTableAction->trigger(); break;} case SHORTCUT_TYPE_PERCENTAGE_TOOL: {percentageAction->trigger(); break;} case SHORTCUT_TYPE_NUMBER_BASES: {basesAction->trigger(); break;} case SHORTCUT_TYPE_RPN_MODE: {rpnAction->trigger(); break;} case SHORTCUT_TYPE_DEGREES: {degAction->trigger(); break;} case SHORTCUT_TYPE_RADIANS: {radAction->trigger(); break;} case SHORTCUT_TYPE_GRADIANS: {graAction->trigger(); break;} case SHORTCUT_TYPE_NORMAL_NOTATION: {normalAction->trigger(); break;} case SHORTCUT_TYPE_SCIENTIFIC_NOTATION: {sciAction->trigger(); break;} case SHORTCUT_TYPE_ENGINEERING_NOTATION: {engAction->trigger(); break;} case SHORTCUT_TYPE_SIMPLE_NOTATION: {simpleAction->trigger(); break;} case SHORTCUT_TYPE_CHAIN_MODE: {chainAction->trigger(); break;} case SHORTCUT_TYPE_KEYPAD: {keypadAction->trigger(); break;} case SHORTCUT_TYPE_GENERAL_KEYPAD: {gKeypadAction->trigger(); break;} case SHORTCUT_TYPE_PROGRAMMING_KEYPAD: {pKeypadAction->trigger(); break;} case SHORTCUT_TYPE_ALGEBRA_KEYPAD: {xKeypadAction->trigger(); break;} case SHORTCUT_TYPE_CUSTOM_KEYPAD: {cKeypadAction->trigger(); break;} case SHORTCUT_TYPE_STORE: {onStoreActivated(); break;} case SHORTCUT_TYPE_NEW_VARIABLE: {newVariableAction->trigger(); break;} case SHORTCUT_TYPE_NEW_FUNCTION: {newFunctionAction->trigger(); break;} case SHORTCUT_TYPE_PLOT: {plotAction->trigger(); break;} case SHORTCUT_TYPE_UPDATE_EXRATES: {exratesAction->trigger(); break;} case SHORTCUT_TYPE_HELP: {helpAction->trigger(); break;} case SHORTCUT_TYPE_QUIT: {quitAction->trigger(); break;} case SHORTCUT_TYPE_RPN_UP: {rpnUpAction->trigger(); break;} case SHORTCUT_TYPE_RPN_DOWN: {rpnDownAction->trigger(); break;} case SHORTCUT_TYPE_RPN_SWAP: {rpnSwapAction->trigger(); break;} case SHORTCUT_TYPE_RPN_LASTX: {rpnLastxAction->trigger(); break;} case SHORTCUT_TYPE_RPN_COPY: {rpnCopyAction->trigger(); break;} case SHORTCUT_TYPE_RPN_DELETE: {rpnDeleteAction->trigger(); break;} case SHORTCUT_TYPE_RPN_CLEAR: {rpnClearAction->trigger(); break;} } } bool sort_compare_item(ExpressionItem *o1, ExpressionItem *o2) { return o1->title(true, settings->printops.use_unicode_signs) < o2->title(true, settings->printops.use_unicode_signs); } void QalculateWindow::updateAngleUnitsMenu() { QActionGroup *group = findChild("group_angleunit"); if(!group) return; QMenu *menu = angleMenu; QAction *action = NULL; menu->clear(); Unit *u_rad = CALCULATOR->getRadUnit(); for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->baseUnit() == u_rad) { Unit *u = CALCULATOR->units[i]; if(u != u_rad && !u->isHidden() && u->isActive() && u->baseExponent() == 1 && !u->hasName("gra") && !u->hasName("deg")) { action = menu->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) menu)), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_angle_unit_" + QString::fromStdString(u->referenceName())); action->setData(ANGLE_UNIT_CUSTOM); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && CALCULATOR->customAngleUnit() == u) action->setChecked(true); } } } action = menu->addAction(tr("None"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_angle_unit_none"); action->setData(ANGLE_UNIT_NONE); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_NONE) action->setChecked(true); action = menu->addAction(tr("Other")); action->setCheckable(true); group->addAction(action); action->setObjectName("action_angle_unit_other"); action->setVisible(false); action->setData(-1); if(!group->checkedAction()) action->setChecked(true); } struct tree_struct_m { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; std::vector objects; tree_struct_m *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct_m &s1) const { return string_is_less(item, s1.item); } }; void QalculateWindow::updateFunctionsMenu() { functionsMenu->clear(); functionsMenu->addAction(tr("New Function…"), this, SLOT(newFunction())); functionsMenu->addSeparator(); for(size_t i = 0; i < settings->favourite_functions.size();) { if(!CALCULATOR->stillHasFunction(settings->favourite_functions[i]) || !settings->favourite_functions[i]->isActive()) { settings->favourite_functions.erase(settings->favourite_functions.begin() + i); } else { i++; } } for(size_t i = 0; i < settings->recent_functions.size();) { if(!CALCULATOR->stillHasFunction(settings->recent_functions[i]) || !settings->recent_functions[i]->isActive()) { settings->recent_functions.erase(settings->recent_functions.begin() + i); } else { i++; } } favouriteFunctionActions.clear(); recentFunctionActions.clear(); if(settings->show_all_functions) { tree_struct_m function_cats; std::vector user_functions; {size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; MathFunction *f = NULL; function_cats.items.clear(); function_cats.objects.clear(); function_cats.parent = NULL; user_functions.clear(); std::list::iterator it; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isActive() && !CALCULATOR->functions[i]->isHidden()) { if(CALCULATOR->functions[i]->isLocal() && !CALCULATOR->functions[i]->isBuiltin() && !CALCULATOR->functions[i]->isHidden()) { b = false; for(size_t i3 = 0; i3 < user_functions.size(); i3++) { f = user_functions[i3]; if(string_is_less(CALCULATOR->functions[i]->title(true, settings->printops.use_unicode_signs), f->title(true, settings->printops.use_unicode_signs))) { b = true; user_functions.insert(user_functions.begin() + i3, CALCULATOR->functions[i]); break; } } if(!b) user_functions.push_back(CALCULATOR->functions[i]); } tree_struct_m *item = &function_cats; if(!CALCULATOR->functions[i]->category().empty()) { cat = CALCULATOR->functions[i]->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct_m cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } b = false; for(size_t i3 = 0; i3 < item->objects.size(); i3++) { f = (MathFunction*) item->objects[i3]; if(string_is_less(CALCULATOR->functions[i]->title(true, settings->printops.use_unicode_signs), f->title(true, settings->printops.use_unicode_signs))) { b = true; item->objects.insert(item->objects.begin() + i3, (void*) CALCULATOR->functions[i]); break; } } if(!b) item->objects.push_back((void*) CALCULATOR->functions[i]); } } function_cats.sort();} favouriteFunctionsMenu = functionsMenu->addMenu(tr("Favorites")); recentFunctionsMenu = functionsMenu->addMenu(tr("Recent")); int first_index = 5; QMenu *sub = functionsMenu, *sub2, *sub3; QAction *action = NULL; sub2 = sub; MathFunction *f; tree_struct_m *titem, *titem2; function_cats.rit = function_cats.items.rbegin(); if(function_cats.rit != function_cats.items.rend()) { titem = &*function_cats.rit; ++function_cats.rit; titem->rit = titem->items.rbegin(); } else { titem = NULL; } std::stack menus; menus.push(sub); sub3 = sub; if(!user_functions.empty()) { sub = functionsMenu->addMenu(tr("User functions")); for(size_t i = 0; i < user_functions.size(); i++) { action = sub->addAction(QString::fromStdString(user_functions[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) user_functions[i])); } first_index++; } functionsMenu->addSeparator(); while(titem) { if(!titem->items.empty() || !titem->objects.empty()) { gsub("&", "&&", titem->item); sub = new QMenu(QString::fromStdString(titem->item)); sub3->insertMenu(sub3->actions().value(sub3 == functionsMenu ? first_index : 0), sub); menus.push(sub); sub3 = sub; for(size_t i = 0; i < titem->objects.size(); i++) { f = (MathFunction*) titem->objects[i]; action = sub->addAction(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) f)); } } else { titem = titem->parent; } while(titem && titem->rit == titem->items.rend()) { titem = titem->parent; menus.pop(); if(menus.size() > 0) sub3 = menus.top(); } if(titem) { titem2 = &*titem->rit; ++titem->rit; titem = titem2; titem->rit = titem->items.rbegin(); } } sub = sub2; for(size_t i = 0; i < function_cats.objects.size(); i++) { f = (MathFunction*) function_cats.objects[i]; if(!f->isLocal()) { action = sub->addAction(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) f)); } } functionsMenu->addSeparator(); } else { favouriteFunctionsMenu = functionsMenu; recentFunctionsMenu = functionsMenu; } QAction *action = functionsMenu->addAction(tr("Open dialog")); action->setCheckable(true); action->setChecked(settings->use_function_dialog); connect(action, SIGNAL(toggled(bool)), this, SLOT(useFunctionDialog(bool))); firstFunctionsMenuOptionAction = action; action = functionsMenu->addAction(tr("Show all functions")); action->setCheckable(true); action->setChecked(settings->show_all_functions); connect(action, SIGNAL(toggled(bool)), this, SLOT(showAllFunctions(bool))); updateRecentFunctions(); updateFavouriteFunctions(); } void QalculateWindow::useFunctionDialog(bool b) { settings->use_function_dialog = b; } void QalculateWindow::showAllFunctions(bool b) { settings->show_all_functions = b; updateFunctionsMenu(); } void QalculateWindow::updateFavouriteFunctions() { if(functionsMenu->isEmpty()) return; for(int i = 0; i < favouriteFunctionActions.size(); i++) { favouriteFunctionsMenu->removeAction(favouriteFunctionActions[i]); favouriteFunctionActions[i]->deleteLater(); } bool b_empty = settings->show_all_functions && favouriteFunctionActions.isEmpty(); favouriteFunctionActions.clear(); bool update_recent = false; if(!settings->favourite_functions.empty()) { std::sort(settings->favourite_functions.begin(), settings->favourite_functions.end(), sort_compare_item); for(size_t i = 0; i < settings->favourite_functions.size(); i++) { MathFunction *f = settings->favourite_functions[i]; if(!settings->show_all_functions) { for(size_t i2 = 0; i2 < settings->recent_functions.size(); i2++) { if(settings->recent_functions[i2] == f) { settings->recent_functions.erase(settings->recent_functions.begin() + i2); update_recent = true; break; } } } QAction *action = new QAction(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), favouriteFunctionsMenu); connect(action, SIGNAL(triggered()), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) f)); favouriteFunctionActions << action; } if(!settings->show_all_functions) { QAction *action = new QAction(favouriteFunctionsMenu); action->setSeparator(true); favouriteFunctionActions << action; } if(update_recent) updateRecentFunctions(); favouriteFunctionsMenu->insertActions(settings->show_all_functions ? NULL : (recentFunctionActions.isEmpty() ?firstFunctionsMenuOptionAction : recentFunctionActions.at(0)), favouriteFunctionActions); if(b_empty) { favouriteFunctionsMenu->hide(); favouriteFunctionsMenu->show(); favouriteFunctionsMenu->hide(); } } } void QalculateWindow::updateRecentFunctions() { if(functionsMenu->isEmpty()) return; for(int i = 0; i < recentFunctionActions.size(); i++) { recentFunctionsMenu->removeAction(recentFunctionActions[i]); recentFunctionActions[i]->deleteLater(); } bool b_empty = settings->show_all_functions && recentFunctionActions.isEmpty(); recentFunctionActions.clear(); if(!settings->recent_functions.empty()) { for(size_t i = 0; i < settings->recent_functions.size() && (i < 5 || settings->show_all_functions); i++) { QAction *action = new QAction(QString::fromStdString(settings->recent_functions[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), recentFunctionsMenu); connect(action, SIGNAL(triggered()), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) settings->recent_functions[i])); recentFunctionActions << action; } if(!settings->show_all_functions) { QAction *action = new QAction(recentFunctionsMenu); action->setSeparator(true); recentFunctionActions << action; } recentFunctionsMenu->insertActions(settings->show_all_functions ? NULL : firstFunctionsMenuOptionAction, recentFunctionActions); if(b_empty) { recentFunctionsMenu->hide(); recentFunctionsMenu->show(); recentFunctionsMenu->hide(); } } } void QalculateWindow::addToRecentFunctions(MathFunction *f) { if(!settings->show_all_functions) { for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == f) return; } } for(size_t i = 0; i < settings->recent_functions.size(); i++) { if(settings->recent_functions[i] == f) { if(i == 0) return; settings->recent_functions.erase(settings->recent_functions.begin() + i); break; } } if(settings->recent_functions.size() > 10) settings->recent_functions.pop_back(); settings->recent_functions.insert(settings->recent_functions.begin(), f); updateRecentFunctions(); } void QalculateWindow::updateUnitsMenu() { unitsMenu->clear(); for(size_t i = 0; i < settings->favourite_units.size();) { if(!CALCULATOR->stillHasUnit(settings->favourite_units[i]) || !settings->favourite_units[i]->isActive()) { settings->favourite_units.erase(settings->favourite_units.begin() + i); } else { i++; } } for(size_t i = 0; i < settings->recent_units.size();) { if(!CALCULATOR->stillHasUnit(settings->recent_units[i]) || !settings->recent_units[i]->isActive()) { settings->recent_units.erase(settings->recent_units.begin() + i); } else { i++; } } favouriteUnitActions.clear(); recentUnitActions.clear(); if(settings->show_all_units) { tree_struct_m unit_cats; std::vector user_units; {size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; Unit *u = NULL; unit_cats.items.clear(); unit_cats.objects.clear(); unit_cats.parent = NULL; user_units.clear(); std::list::iterator it; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isActive() && (!CALCULATOR->units[i]->isHidden() || CALCULATOR->units[i]->isCurrency())) { if(CALCULATOR->units[i]->isLocal() && !CALCULATOR->units[i]->isBuiltin()) { b = false; for(size_t i3 = 0; i3 < user_units.size(); i3++) { u = user_units[i3]; if(string_is_less(CALCULATOR->units[i]->title(true, settings->printops.use_unicode_signs), u->title(true, settings->printops.use_unicode_signs))) { b = true; user_units.insert(user_units.begin() + i3, CALCULATOR->units[i]); break; } } if(!b) user_units.push_back(CALCULATOR->units[i]); } tree_struct_m *item = &unit_cats; if(!CALCULATOR->units[i]->category().empty()) { cat = CALCULATOR->units[i]->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct_m cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } b = false; for(size_t i3 = 0; i3 < item->objects.size(); i3++) { u = (Unit*) item->objects[i3]; if(string_is_less(CALCULATOR->units[i]->title(true, settings->printops.use_unicode_signs), u->title(true, settings->printops.use_unicode_signs))) { b = true; item->objects.insert(item->objects.begin() + i3, (void*) CALCULATOR->units[i]); break; } } if(!b) item->objects.push_back((void*) CALCULATOR->units[i]); } } unit_cats.sort();} favouriteUnitsMenu = unitsMenu->addMenu(tr("Favorites")); recentUnitsMenu = unitsMenu->addMenu(tr("Recent")); int first_index = 3; QMenu *sub = unitsMenu, *sub2, *sub3; QAction *action = NULL; sub2 = sub; Unit *u; tree_struct_m *titem, *titem2; unit_cats.rit = unit_cats.items.rbegin(); if(unit_cats.rit != unit_cats.items.rend()) { titem = &*unit_cats.rit; ++unit_cats.rit; titem->rit = titem->items.rbegin(); } else { titem = NULL; } std::stack menus; menus.push(sub); sub3 = sub; if(!user_units.empty()) { sub = unitsMenu->addMenu(tr("User units")); for(size_t i = 0; i < user_units.size(); i++) { action = sub->addAction(QString::fromStdString(user_units[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) user_units[i])); } first_index++; } unitsMenu->addSeparator(); while(titem) { if(!titem->items.empty() || !titem->objects.empty()) { gsub("&", "&&", titem->item); sub = new QMenu(QString::fromStdString(titem->item)); sub3->insertMenu(sub3->actions().value(sub3 == unitsMenu ? first_index : 0), sub); menus.push(sub); sub3 = sub; bool is_currencies = false; for(size_t i = 0; i < titem->objects.size(); i++) { u = (Unit*) titem->objects[i]; if(!is_currencies && u->isCurrency()) is_currencies = true; if(!u->isHidden()) { action = sub->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) u)); } } if(is_currencies) { sub = sub3->addMenu(tr("more")); connect(sub3, SIGNAL(aboutToShow()), this, SLOT(addCurrencyFlagsToMenu())); connect(sub, SIGNAL(aboutToShow()), this, SLOT(addCurrencyFlagsToMenu())); for(size_t i = 0; i < titem->objects.size(); i++) { u = (Unit*) titem->objects[i]; if(u->isHidden()) { action = sub->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) u)); } } } } else { titem = titem->parent; } while(titem && titem->rit == titem->items.rend()) { titem = titem->parent; menus.pop(); if(menus.size() > 0) sub3 = menus.top(); } if(titem) { titem2 = &*titem->rit; ++titem->rit; titem = titem2; titem->rit = titem->items.rbegin(); } } sub = sub2; for(size_t i = 0; i < unit_cats.objects.size(); i++) { u = (Unit*) unit_cats.objects[i]; if(!u->isLocal()) { action = sub->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) u)); } } unitsMenu->addSeparator(); sub = unitsMenu->addMenu(tr("Prefixes")); int index = 0; Prefix *p = CALCULATOR->getPrefix(index); while(p) { QString str = QString::fromStdString(p->preferredDisplayName(false, true, false, false, &can_display_unicode_string_function, (void*) this).name); if(p->type() == PREFIX_DECIMAL) { str += " (10^"; str += QString::number(((DecimalPrefix*) p)->exponent()); str += ")"; } else if(p->type() == PREFIX_BINARY) { str += " (2^"; str += QString::number(((DecimalPrefix*) p)->exponent()); str += ")"; } action = sub->addAction(str, this, SLOT(prefixActivated())); action->setData(QVariant::fromValue((void*) p)); index++; p = CALCULATOR->getPrefix(index); } unitsMenu->addSeparator(); } else { favouriteUnitsMenu = unitsMenu; recentUnitsMenu = unitsMenu; } QAction *action = unitsMenu->addAction(tr("Show all units")); action->setCheckable(true); action->setChecked(settings->show_all_units); connect(action, SIGNAL(toggled(bool)), this, SLOT(showAllUnits(bool))); firstUnitsMenuOptionAction = action; updateRecentUnits(); updateFavouriteUnits(); updateAngleUnitsMenu(); } void QalculateWindow::addCurrencyFlagsToMenu() { QMenu *menu = qobject_cast(sender()); QList actions = menu->actions(); for(int i = 0; i < actions.count(); i++) { QAction *action = actions.at(i); Unit *u = (Unit*) action->data().value(); if(u && u->isCurrency() && QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) { action->setIcon(QIcon(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))); } } disconnect(menu, SIGNAL(aboutToShow()), this, SLOT(addCurrencyFlagsToMenu())); } void QalculateWindow::showAllUnits(bool b) { settings->show_all_units = b; updateUnitsMenu(); } void QalculateWindow::updateFavouriteUnits() { if(unitsMenu->isEmpty()) return; for(int i = 0; i < favouriteUnitActions.size(); i++) { favouriteUnitsMenu->removeAction(favouriteUnitActions[i]); favouriteUnitActions[i]->deleteLater(); } bool b_empty = settings->show_all_units && favouriteUnitActions.isEmpty(); favouriteUnitActions.clear(); bool update_recent = false; if(!settings->favourite_units.empty()) { std::sort(settings->favourite_units.begin(), settings->favourite_units.end(), sort_compare_item); for(size_t i = 0; i < settings->favourite_units.size(); i++) { Unit *u = settings->favourite_units[i]; if(!settings->show_all_units) { for(size_t i2 = 0; i2 < settings->recent_units.size(); i2++) { if(settings->recent_units[i2] == u) { settings->recent_units.erase(settings->recent_units.begin() + i2); update_recent = true; break; } } } QAction *action = new QAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), favouriteUnitsMenu); connect(action, SIGNAL(triggered()), this, SLOT(unitActivated())); if(u->isCurrency() && QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) { action->setIcon(QIcon(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))); } action->setData(QVariant::fromValue((void*) u)); favouriteUnitActions << action; } if(!settings->show_all_units) { QAction *action = new QAction(favouriteUnitsMenu); action->setSeparator(true); favouriteUnitActions << action; } if(update_recent) updateRecentUnits(); favouriteUnitsMenu->insertActions(settings->show_all_units ? NULL : (recentUnitActions.isEmpty() ? firstUnitsMenuOptionAction : recentUnitActions.at(0)), favouriteUnitActions); if(b_empty) { favouriteUnitsMenu->hide(); favouriteUnitsMenu->show(); favouriteUnitsMenu->hide(); } } } void QalculateWindow::updateRecentUnits() { if(unitsMenu->isEmpty()) return; for(int i = 0; i < recentUnitActions.size(); i++) { recentUnitsMenu->removeAction(recentUnitActions[i]); recentUnitActions[i]->deleteLater(); } bool b_empty = settings->show_all_units && recentUnitActions.isEmpty(); recentUnitActions.clear(); if(!settings->recent_units.empty()) { for(size_t i = 0; i < settings->recent_units.size() && (i < 5 || settings->show_all_units); i++) { Unit *u = settings->recent_units[i]; QAction *action = new QAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), recentUnitsMenu); connect(action, SIGNAL(triggered()), this, SLOT(unitActivated())); if(u->isCurrency() && QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) { action->setIcon(QIcon(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))); } action->setData(QVariant::fromValue((void*) u)); recentUnitActions << action; } if(!settings->show_all_units) { QAction *action = new QAction(recentUnitsMenu); action->setSeparator(true); recentUnitActions << action; } recentUnitsMenu->insertActions(settings->show_all_units ? NULL : firstUnitsMenuOptionAction, recentUnitActions); if(b_empty) { recentUnitsMenu->hide(); recentUnitsMenu->show(); recentUnitsMenu->hide(); } } } void QalculateWindow::addToRecentUnits(Unit *u) { if(!settings->show_all_units) { for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == u) return; } } for(size_t i = 0; i < settings->recent_units.size(); i++) { if(settings->recent_units[i] == u) { if(i == 0) return; settings->recent_units.erase(settings->recent_units.begin() + i); break; } } if(settings->recent_units.size() > 10) settings->recent_units.pop_back(); settings->recent_units.insert(settings->recent_units.begin(), u); updateRecentUnits(); } void QalculateWindow::updateVariablesMenu() { variablesMenu->clear(); variablesMenu->addAction(variablesAction); variablesMenu->addSeparator(); for(size_t i = 0; i < settings->favourite_variables.size();) { if(!CALCULATOR->stillHasVariable(settings->favourite_variables[i]) || !settings->favourite_variables[i]->isActive()) { settings->favourite_variables.erase(settings->favourite_variables.begin() + i); } else { i++; } } for(size_t i = 0; i < settings->recent_variables.size();) { if(!CALCULATOR->stillHasVariable(settings->recent_variables[i]) || !settings->recent_variables[i]->isActive()) { settings->recent_variables.erase(settings->recent_variables.begin() + i); } else { i++; } } favouriteVariableActions.clear(); recentVariableActions.clear(); if(settings->show_all_variables) { tree_struct_m variable_cats; std::vector user_variables; {size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; Variable *v = NULL; variable_cats.items.clear(); variable_cats.objects.clear(); variable_cats.parent = NULL; user_variables.clear(); std::list::iterator it; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isActive() && !CALCULATOR->variables[i]->isHidden()) { if(CALCULATOR->variables[i]->isLocal() && !CALCULATOR->variables[i]->isBuiltin()) { b = false; for(size_t i3 = 0; i3 < user_variables.size(); i3++) { v = user_variables[i3]; if(string_is_less(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs), v->title(true, settings->printops.use_unicode_signs))) { b = true; user_variables.insert(user_variables.begin() + i3, CALCULATOR->variables[i]); break; } } if(!b) user_variables.push_back(CALCULATOR->variables[i]); } tree_struct_m *item = &variable_cats; if(!CALCULATOR->variables[i]->category().empty()) { cat = CALCULATOR->variables[i]->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct_m cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } b = false; for(size_t i3 = 0; i3 < item->objects.size(); i3++) { v = (Variable*) item->objects[i3]; if(string_is_less(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs), v->title(true, settings->printops.use_unicode_signs))) { b = true; item->objects.insert(item->objects.begin() + i3, (void*) CALCULATOR->variables[i]); break; } } if(!b) item->objects.push_back((void*) CALCULATOR->variables[i]); } } variable_cats.sort();} favouriteVariablesMenu = variablesMenu->addMenu(tr("Favorites")); recentVariablesMenu = variablesMenu->addMenu(tr("Recent")); int first_index = 5; QMenu *sub = variablesMenu, *sub2, *sub3; QAction *action = NULL; sub2 = sub; Variable *v; tree_struct_m *titem, *titem2; variable_cats.rit = variable_cats.items.rbegin(); if(variable_cats.rit != variable_cats.items.rend()) { titem = &*variable_cats.rit; ++variable_cats.rit; titem->rit = titem->items.rbegin(); } else { titem = NULL; } std::stack menus; menus.push(sub); sub3 = sub; if(!user_variables.empty()) { sub = variablesMenu->addMenu(tr("User variables")); for(size_t i = 0; i < user_variables.size(); i++) { action = sub->addAction(QString::fromStdString(user_variables[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) user_variables[i])); } first_index++; } variablesMenu->addSeparator(); while(titem) { if(!titem->items.empty() || !titem->objects.empty()) { gsub("&", "&&", titem->item); sub = new QMenu(QString::fromStdString(titem->item)); sub3->insertMenu(sub3->actions().value(sub3 == variablesMenu ? first_index : 0), sub); menus.push(sub); sub3 = sub; for(size_t i = 0; i < titem->objects.size(); i++) { v = (Variable*) titem->objects[i]; action = sub->addAction(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) v)); } } else { titem = titem->parent; } while(titem && titem->rit == titem->items.rend()) { titem = titem->parent; menus.pop(); if(menus.size() > 0) sub3 = menus.top(); } if(titem) { titem2 = &*titem->rit; ++titem->rit; titem = titem2; titem->rit = titem->items.rbegin(); } } sub = sub2; for(size_t i = 0; i < variable_cats.objects.size(); i++) { v = (Variable*) variable_cats.objects[i]; if(!v->isLocal()) { action = sub->addAction(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) v)); } } variablesMenu->addSeparator(); } else { favouriteVariablesMenu = variablesMenu; recentVariablesMenu = variablesMenu; } QAction *action = variablesMenu->addAction(tr("Show all variables")); action->setCheckable(true); action->setChecked(settings->show_all_variables); connect(action, SIGNAL(toggled(bool)), this, SLOT(showAllVariables(bool))); firstVariablesMenuOptionAction = action; updateRecentVariables(); updateFavouriteVariables(); } void QalculateWindow::showAllVariables(bool b) { settings->show_all_variables = b; updateVariablesMenu(); } void QalculateWindow::updateFavouriteVariables() { if(variablesMenu->isEmpty()) return; for(int i = 0; i < favouriteVariableActions.size(); i++) { favouriteVariablesMenu->removeAction(favouriteVariableActions[i]); favouriteVariableActions[i]->deleteLater(); } bool b_empty = settings->show_all_variables && favouriteVariableActions.isEmpty(); favouriteVariableActions.clear(); bool update_recent = false; if(!settings->favourite_variables.empty()) { std::sort(settings->favourite_variables.begin(), settings->favourite_variables.end(), sort_compare_item); for(size_t i = 0; i < settings->favourite_variables.size(); i++) { Variable *v = settings->favourite_variables[i]; if(!settings->show_all_variables) { for(size_t i2 = 0; i2 < settings->recent_variables.size(); i2++) { if(settings->recent_variables[i2] == v) { settings->recent_variables.erase(settings->recent_variables.begin() + i2); update_recent = true; break; } } } QAction *action = new QAction(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), favouriteVariablesMenu); connect(action, SIGNAL(triggered()), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) v)); favouriteVariableActions << action; } if(!settings->show_all_variables) { QAction *action = new QAction(favouriteVariablesMenu); action->setSeparator(true); favouriteVariableActions << action; } if(update_recent) updateRecentVariables(); favouriteVariablesMenu->insertActions(settings->show_all_variables ? NULL : (recentVariableActions.isEmpty() ? firstVariablesMenuOptionAction : recentVariableActions.at(0)), favouriteVariableActions); if(b_empty) { favouriteVariablesMenu->hide(); favouriteVariablesMenu->show(); favouriteVariablesMenu->hide(); } } } void QalculateWindow::updateRecentVariables() { if(variablesMenu->isEmpty()) return; for(int i = 0; i < recentVariableActions.size(); i++) { recentVariablesMenu->removeAction(recentVariableActions[i]); recentVariableActions[i]->deleteLater(); } bool b_empty = settings->show_all_variables && recentVariableActions.isEmpty(); recentVariableActions.clear(); if(!settings->recent_variables.empty()) { for(size_t i = 0; i < settings->recent_variables.size() && (i < 5 || settings->show_all_variables); i++) { QAction *action = new QAction(QString::fromStdString(settings->recent_variables[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), recentVariablesMenu); connect(action, SIGNAL(triggered()), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) settings->recent_variables[i])); recentVariableActions << action; } if(!settings->show_all_variables) { QAction *action = new QAction(recentVariablesMenu); action->setSeparator(true); recentVariableActions << action; } recentVariablesMenu->insertActions(settings->show_all_variables ? NULL : firstVariablesMenuOptionAction, recentVariableActions); if(b_empty) { recentVariablesMenu->hide(); recentVariablesMenu->show(); recentVariablesMenu->hide(); } } } void QalculateWindow::addToRecentVariables(Variable *v) { if(!settings->show_all_variables) { for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == v) return; } } for(size_t i = 0; i < settings->recent_variables.size(); i++) { if(settings->recent_variables[i] == v) { if(i == 0) return; settings->recent_variables.erase(settings->recent_variables.begin() + i); break; } } if(settings->recent_variables.size() > 10) settings->recent_variables.pop_back(); settings->recent_variables.insert(settings->recent_variables.begin(), v); updateRecentVariables(); } void QalculateWindow::variableActivated() { Variable *v = (Variable*) ((QAction*) sender())->data().value(); onVariableClicked(v); addToRecentVariables(v); } void QalculateWindow::unitActivated() { onUnitActivated((Unit*) ((QAction*) sender())->data().value()); } void QalculateWindow::prefixActivated() { Prefix *p = (Prefix*) ((QAction*) sender())->data().value(); if(!p) return; expressionEdit->blockCompletion(); expressionEdit->insertText(QString::fromStdString(p->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(-1, true))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::functionActivated() { MathFunction *f = (MathFunction*) ((QAction*) sender())->data().value(); if(settings->use_function_dialog) insertFunction(f, this); else onFunctionClicked(f); addToRecentFunctions(f); } void QalculateWindow::registerUp() { if(CALCULATOR->RPNStackSize() <= 1) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item, *item2; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); if(index == 0) { CALCULATOR->moveRPNRegister(1, CALCULATOR->RPNStackSize()); item2 = rpnView->item(CALCULATOR->RPNStackSize() - 1, 0); } else { CALCULATOR->moveRPNRegisterUp(index + 1); item2 = rpnView->item(index - 1, 0); } if(item2) { QString str = item->text(); rpnView->blockSignals(true); item->setText(item2->text()); item2->setText(str); rpnView->blockSignals(false); } } void QalculateWindow::registerDown() { if(CALCULATOR->RPNStackSize() <= 1) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item, *item2; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); if(index + 1 == (int) CALCULATOR->RPNStackSize()) { CALCULATOR->moveRPNRegister(CALCULATOR->RPNStackSize(), 1); item2 = rpnView->item(0, 0); } else { CALCULATOR->moveRPNRegisterDown(index + 1); item2 = rpnView->item(index + 1, 0); } if(item2) { QString str = item->text(); rpnView->blockSignals(true); item->setText(item2->text()); item2->setText(str); rpnView->blockSignals(false); } } void QalculateWindow::registerSwap() { if(CALCULATOR->RPNStackSize() <= 1) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item, *item2; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); if(index == 0) { CALCULATOR->moveRPNRegister(1, 2); item2 = rpnView->item(1, 0); } else { CALCULATOR->moveRPNRegister(index + 1, 1); item2 = rpnView->item(0, 0); } if(item2) { QString str = item->text(); rpnView->blockSignals(true); item->setText(item2->text()); item2->setText(str); rpnView->blockSignals(false); } } void QalculateWindow::rpnLastX() { if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } CALCULATOR->RPNStackEnter(new MathStructure(lastx)); RPNRegisterAdded(lastx_text.toStdString(), 0); } void QalculateWindow::copyRegister() { if(CALCULATOR->RPNStackSize() == 0) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); CALCULATOR->RPNStackEnter(new MathStructure(*CALCULATOR->getRPNRegister(index + 1))); RPNRegisterAdded(item->text().toStdString(), 0); } void QalculateWindow::deleteRegister() { if(CALCULATOR->RPNStackSize() == 0) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); CALCULATOR->deleteRPNRegister(index + 1); RPNRegisterRemoved(index); } void QalculateWindow::clearStack() { CALCULATOR->clearRPNStack(); rpnView->clear(); rpnView->setRowCount(0); rpnCopyAction->setEnabled(false); rpnDeleteAction->setEnabled(false); rpnClearAction->setEnabled(false); rpnUpAction->setEnabled(false); rpnDownAction->setEnabled(false); rpnSwapAction->setEnabled(false); } void QalculateWindow::registerChanged(int index) { calculateExpression(true, false, OPERATION_ADD, NULL, true, index); } void QalculateWindow::onInsertTextRequested(std::string str) { expressionEdit->blockCompletion(); gsub("…", "", str); expressionEdit->insertText(QString::fromStdString(unhtmlize(str))); expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::showAbout() { QMessageBox::about(this, tr("About %1").arg(qApp->applicationDisplayName()), QStringLiteral("%1 v%4
%2
https://qalculate.github.io/

Copyright © 2003-2007, 2008, 2016-2024 Hanna Knutsson
%3").arg(qApp->applicationDisplayName()).arg(tr("Powerful and easy to use calculator")).arg(tr("License: GNU General Public License version 2 or later")).arg(qApp->applicationVersion())); } void QalculateWindow::onInsertValueRequested(int i) { expressionEdit->blockCompletion(); Number nr(i, 1, 0); expressionEdit->insertText(QStringLiteral("%1(%2)").arg(QString::fromStdString(settings->f_answer->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true))).arg(QString::fromStdString(print_with_evalops(nr)))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onSymbolClicked(const QString &str) { expressionEdit->blockCompletion(); expressionEdit->insertText(str); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onOperatorClicked(const QString &str) { QString s, s_low; if(str.length() >= 3) { s_low = str.toLower(); if(str == "NOT") s = "!"; else if(s_low == "not") s = str + " "; else if(s_low == "nor" || s_low == "mod" || s_low == "rem" || s_low == "comb" || s_low == "perm" || s_low == "xor" || s_low == "bitand" || s_low == "bitor" || s_low == "nand" || s_low == "cross" || s_low == "dot" || s_low == "and" || s_low == "or" || s_low == "per" || s_low == "times" || s_low == "minus" || s_low == "plus" || s_low == "div") s = " " + str + " "; else s = str; } else { s = str; } if(settings->rpn_mode && str != "NOT" && str != "not") { if(s != str || str == "%") { if(s_low == "mod") {onFunctionClicked(CALCULATOR->getFunctionById(FUNCTION_ID_MOD)); return;} else if(s_low == "rem" || str == "%") {onFunctionClicked(CALCULATOR->getFunctionById(FUNCTION_ID_REM)); return;} MathFunction *f = CALCULATOR->getActiveFunction(s_low.toStdString()); if(f) { onFunctionClicked(f); return; } } if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, str.toStdString()); return; } expressionEdit->blockCompletion(); bool do_exec = false; if(str == "~") { expressionEdit->wrapSelection(str, true, false); } else if(str == "!") { QTextCursor cur = expressionEdit->textCursor(); do_exec = (str == "!") && cur.hasSelection() && cur.selectionStart() == 0 && cur.selectionEnd() == expressionEdit->toPlainText().length(); if(do_exec) expressionEdit->blockParseStatus(); expressionEdit->wrapSelection(str); if(do_exec) expressionEdit->blockParseStatus(false); } else if(str == "E" || str == "e") { if(expressionEdit->textCursor().hasSelection() && !expressionEdit->overwriteMode()) expressionEdit->wrapSelection(QString::fromUtf8(settings->multiplicationSign()) + "10^"); else expressionEdit->insertText(settings->printops.exp_display == EXP_UPPERCASE_E ? "E" : "e"); } else { if((str == "//" || (s != str && (s_low == "mod" || s_low == "rem"))) && (settings->rpn_mode || expressionEdit->document()->isEmpty() || settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN || (expressionEdit->textCursor().atStart() && !expressionEdit->textCursor().hasSelection()))) { MathFunction *f; if(s_low == "mod") f = CALCULATOR->getFunctionById(FUNCTION_ID_MOD); else if(s_low == "rem") f = CALCULATOR->getFunctionById(FUNCTION_ID_REM); else f = CALCULATOR->getActiveFunction("div"); if(f) { expressionEdit->blockCompletion(false); onFunctionClicked(f); return; } } if(!expressionEdit->doChainMode(s)) expressionEdit->wrapSelection(s); } if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); if(do_exec) calculate(); expressionEdit->blockCompletion(false); } bool last_is_number(std::string str) { str = CALCULATOR->unlocalizeExpression(str, settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty()) return false; return is_not_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1]); } void QalculateWindow::onFunctionClicked(MathFunction *f) { if(!f) return; if(settings->rpn_mode && (f->minargs() <= 1 || (int) CALCULATOR->RPNStackSize() >= f->minargs())) { calculateRPN(f); return; } if(!settings->rpn_mode && settings->chain_mode && !expressionEdit->textCursor().hasSelection() && expressionEdit->textCursor().atEnd()) { QString str = expressionEdit->toPlainText(); std::string str2 = CALCULATOR->unlocalizeExpression(str.toStdString(), settings->evalops.parse_options); remove_blanks(str2); size_t par_n = 0, vec_n = 0; for(size_t i = 0; i < str2.length(); i++) { if(str2[i] == LEFT_PARENTHESIS_CH) par_n++; else if(par_n > 0 && str2[i] == RIGHT_PARENTHESIS_CH) par_n--; else if(str2[i] == LEFT_VECTOR_WRAP_CH) vec_n++; else if(vec_n > 0 && str2[i] == RIGHT_VECTOR_WRAP_CH) vec_n--; } if(par_n <= 0 && vec_n <= 0 && !str2.empty() && str2[0] != '/' && !CALCULATOR->hasToExpression(str2, true, settings->evalops) && !CALCULATOR->hasWhereExpression(str2, settings->evalops) && !last_is_operator(str2)) { int i = str.length() - 1; int nr_of_p = 0; bool prev_plusminus = false; while(i >= 0) { if(str[i] == LEFT_PARENTHESIS_CH) { if(nr_of_p == 0) { if(prev_plusminus) i--; break; } nr_of_p--; } else if(str[i] == RIGHT_PARENTHESIS_CH) { if(nr_of_p == 0 && i + 1 < str.length()) { if(prev_plusminus) i++; break; } nr_of_p++; } else if(nr_of_p == 0) { if(!str[i].isLetterOrNumber() && (signed char) str[i].toLatin1() <= 0) { str2 = str.mid(i, 1).toStdString(); CALCULATOR->parseSigns(str2); if(!str2.empty() && (signed char) str2[0] > 0) { if(is_in("+-", str2[0])) { prev_plusminus = true; } else if(is_in("*/&|=><^", str2[0])) { break; } else if(prev_plusminus) { i++; break; } } } else if(str[i] == '+' || str[i] == '-') { prev_plusminus = true; } else if(is_in("*/&|=><^", str[i].toLatin1())) { break; } else if(prev_plusminus) { i++; break; } } i--; } i++; QTextCursor cur = expressionEdit->textCursor(); cur.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor, str.length() - i); expressionEdit->setTextCursor(cur); } } QString sargs; bool b_text = USE_QUOTES(f->getArgumentDefinition(1), f); if(f->id() == FUNCTION_ID_CIRCULAR_SHIFT || f->id() == FUNCTION_ID_BIT_CMP) { Argument *arg_bits = f->getArgumentDefinition(f->id() == FUNCTION_ID_CIRCULAR_SHIFT ? 3 : 2); Argument *arg_steps = (f->id() == FUNCTION_ID_CIRCULAR_SHIFT ? f->getArgumentDefinition(2) : NULL); Argument *arg_signed = f->getArgumentDefinition(f->id() == FUNCTION_ID_CIRCULAR_SHIFT ? 4 : 3); MathSpinBox *spin = NULL; if(arg_bits && arg_signed && (f->id() != FUNCTION_ID_CIRCULAR_SHIFT || arg_steps)) { QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs))); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); if(arg_steps) { grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(arg_steps->name()))), 0, 0); int min = INT_MIN, max = INT_MAX; if(arg_steps->type() == ARGUMENT_TYPE_INTEGER) { IntegerArgument *iarg = (IntegerArgument*) arg_steps; if(iarg->min()) { min = iarg->min()->intValue(); } if(iarg->max()) { max = iarg->max()->intValue(); } } spin = new MathSpinBox(); spin->setRange(min, max); if(!f->getDefaultValue(2).empty()) { spin->setValue(s2i(f->getDefaultValue(2))); } else if(!arg_steps->zeroForbidden() && min <= 0 && max >= 0) { spin->setValue(0); } else { if(max < 0) { spin->setValue(max); } else if(min <= 1) { spin->setValue(1); } else { spin->setValue(min); } } grid->addWidget(spin, 0, 1); } grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(arg_bits->name()))), arg_steps ? 1 : 0, 0); QComboBox *combo = new QComboBox(dialog); combo->addItem("8", 8); combo->addItem("16", 16); combo->addItem("32", 32); combo->addItem("64", 64); combo->addItem("128", 128); combo->addItem("256", 256); combo->addItem("512", 512); combo->addItem("1024", 1024); int i = combo->findData(settings->default_bits >= 0 ? settings->default_bits : (settings->evalops.parse_options.binary_bits > 0 ? settings->evalops.parse_options.binary_bits : 32)); if(i < 0) i = 2; combo->setCurrentIndex(i); grid->addWidget(combo, arg_steps ? 1 : 0, 1); QCheckBox *button = new QCheckBox(QString::fromStdString(arg_signed->name())); button->setChecked(settings->default_signed > 0 || (settings->default_signed < 0 && (settings->evalops.parse_options.twos_complement || (f->id() == FUNCTION_ID_CIRCULAR_SHIFT && settings->printops.twos_complement)))); grid->addWidget(button, arg_steps ? 2 : 1, 0, 2, 1, Qt::AlignRight); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { Number bits = combo->currentData().toInt(); if(bits.isZero()) bits = 32; sargs = QString::fromStdString(CALCULATOR->getComma()); sargs += " "; if(spin) { if(settings->evalops.parse_options.base != BASE_DECIMAL) { Number nr(spin->value(), 1); sargs += QString::fromStdString(print_with_evalops(nr)); } else { sargs += spin->cleanText(); } sargs += QString::fromStdString(CALCULATOR->getComma()); sargs += " "; } sargs += QString::fromStdString(print_with_evalops(bits)); sargs += QString::fromStdString(CALCULATOR->getComma()); sargs += " "; if(button->isChecked()) sargs += "1"; else sargs += "0"; settings->default_bits = bits.intValue(); settings->default_signed = button->isChecked(); dialog->deleteLater(); } else { dialog->deleteLater(); return; } } } else if(f->id() == FUNCTION_ID_ROOT || f->id() == FUNCTION_ID_LOGN || (f->minargs() == 2 && ((f->getArgumentDefinition(2) && f->getArgumentDefinition(2)->type() == ARGUMENT_TYPE_INTEGER) xor (f->getArgumentDefinition(1) && f->getArgumentDefinition(1)->type() == ARGUMENT_TYPE_INTEGER)))) { size_t index = 2; if(f->id() != FUNCTION_ID_ROOT && f->id() != FUNCTION_ID_LOGN && f->getArgumentDefinition(1) && f->getArgumentDefinition(1)->type() == ARGUMENT_TYPE_INTEGER) index = 1; Argument *arg_n = f->getArgumentDefinition(index); if(arg_n) { QLineEdit *entry = NULL; MathSpinBox *spin = NULL; QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs))); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(arg_n->name()))), 0, 0); int min = INT_MIN, max = INT_MAX; if(arg_n->type() == ARGUMENT_TYPE_INTEGER) { IntegerArgument *iarg = (IntegerArgument*) arg_n; if(iarg->min()) { min = iarg->min()->intValue(); } if(iarg->max()) { max = iarg->max()->intValue(); } } if(settings->evalops.parse_options.base != BASE_DECIMAL || f->id() == FUNCTION_ID_ROOT || arg_n->type() == ARGUMENT_TYPE_INTEGER) { spin = new MathSpinBox(dialog); spin->setRange(min, max); if(f->id() == FUNCTION_ID_ROOT || f->id() == FUNCTION_ID_LOGN) { spin->setValue(2); } else if(!f->getDefaultValue(index).empty()) { spin->setValue(s2i(f->getDefaultValue(index))); } else if(!arg_n->zeroForbidden() && min <= 0 && max >= 0) { spin->setValue(0); } else { if(max < 0) { spin->setValue(max); } else if(min <= 1) { spin->setValue(1); } else { spin->setValue(min); } } grid->addWidget(spin, 0, 1); spin->setFocus(); connect(spin, SIGNAL(returnPressed()), dialog, SLOT(accept())); } else { entry = new MathLineEdit(dialog); entry->setText(QString::fromStdString(f->getDefaultValue(index))); grid->addWidget(entry, 0, 1); entry->setFocus(); connect(entry, SIGNAL(returnPressed()), dialog, SLOT(accept())); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { sargs = QString::fromStdString(CALCULATOR->getComma()); sargs += " "; if(spin && settings->evalops.parse_options.base != BASE_DECIMAL) { Number nr(spin->value(), 1); sargs += QString::fromStdString(print_with_evalops(nr)); } else if(spin) { sargs += spin->cleanText(); } else { sargs += entry->text(); } dialog->deleteLater(); } else { dialog->deleteLater(); return; } } } expressionEdit->blockCompletion(); QTextCursor cur = expressionEdit->textCursor(); bool do_exec = false; int minargs = f->minargs(); if(minargs == 1 && f->id() == FUNCTION_ID_LOGN) minargs = 2; if(cur.hasSelection()) { do_exec = (!sargs.isEmpty() || minargs <= 1) && cur.selectionStart() == 0 && cur.selectionEnd() == expressionEdit->toPlainText().length(); } else if(cur.atEnd() && last_is_number(expressionEdit->toPlainText().toStdString())) { QString str = expressionEdit->toPlainText(); size_t par_n = 0, vec_n = 0; for(int i = 0; i < str.length(); i++) { if(str[i] == LEFT_PARENTHESIS_CH) par_n++; else if(par_n > 0 && str[i] == RIGHT_PARENTHESIS_CH) par_n--; else if(str[i] == LEFT_VECTOR_WRAP_CH) vec_n++; else if(vec_n > 0 && str[i] == RIGHT_VECTOR_WRAP_CH) vec_n--; } if(par_n <= 0 && vec_n <= 0) { expressionEdit->selectAll(); do_exec = !sargs.isEmpty() || minargs <= 1; } } if(do_exec) expressionEdit->blockParseStatus(); expressionEdit->wrapSelection(f->referenceName() == "neg" ? SIGN_MINUS : QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)), true, true, minargs > 1 && sargs.isEmpty(), sargs, b_text); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); if(do_exec) expressionEdit->blockParseStatus(false); expressionEdit->blockCompletion(false); if(do_exec) calculate(); } void QalculateWindow::negate() { onFunctionClicked(CALCULATOR->getActiveFunction("neg")); } void QalculateWindow::onVariableClicked(Variable *v) { if(!v) return; expressionEdit->blockCompletion(); expressionEdit->insertText(QString::fromStdString(v->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_VARIABLE, true))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onUnitClicked(Unit *u) { if(!u) return; expressionEdit->blockCompletion(); if(u->subtype() == SUBTYPE_COMPOSITE_UNIT) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.can_display_unicode_string_arg = (void*) expressionEdit; expressionEdit->insertText(QString::fromStdString(((CompositeUnit*) u)->print(po, false, TAG_TYPE_HTML, true))); } else { expressionEdit->insertText(QString::fromStdString(u->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, true, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_UNIT, true))); } if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onPrefixClicked(Prefix *p) { if(!p) return; expressionEdit->blockCompletion(); expressionEdit->insertText(QString::fromStdString(p->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, true, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(-1, true))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onDelClicked() { expressionEdit->blockCompletion(); QTextCursor cur = expressionEdit->textCursor(); if(cur.atEnd()) cur.deletePreviousChar(); else cur.deleteChar(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onBackspaceClicked() { expressionEdit->blockCompletion(); QTextCursor cur = expressionEdit->textCursor(); if(!cur.atStart()) cur.deletePreviousChar(); else cur.deleteChar(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onClearClicked() { expressionEdit->blockCompletion(); expressionEdit->clear(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onEqualsClicked() { calculate(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onParenthesesClicked() { expressionEdit->blockCompletion(); expressionEdit->smartParentheses(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onBracketsClicked() { expressionEdit->blockCompletion(); expressionEdit->insertBrackets(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onLeftClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::PreviousCharacter); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onRightClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::NextCharacter); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onStartClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::Start); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onEndClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::End); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onMSClicked() { if(expressionEdit->expressionHasChanged()) calculate(); if(!mstruct) return; settings->v_memory->set(*mstruct); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onMRClicked() { bool b_exec = !expressionEdit->expressionHasChanged(); onVariableClicked(settings->v_memory); if(b_exec) calculate(); } void QalculateWindow::onMCClicked() { settings->v_memory->set(m_zero); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onMPlusClicked() { if(expressionEdit->expressionHasChanged()) calculate(); if(!mstruct) return; MathStructure m = settings->v_memory->get(); m.calculateAdd(*mstruct, settings->evalops); settings->v_memory->set(m); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onMMinusClicked() { if(expressionEdit->expressionHasChanged()) calculate(); if(!mstruct) return; MathStructure m = settings->v_memory->get(); m.calculateAdd(*mstruct, settings->evalops); settings->v_memory->set(m); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onAnswerClicked() { if(settings->history_answer.size() > 0) { onInsertValueRequested(settings->history_answer.size()); } } void QalculateWindow::onBaseClicked(int v, bool b, bool b_update) { if(b && v != settings->evalops.parse_options.base) { settings->evalops.parse_options.base = v; QAction *action = find_child_data(this, "group_inbase", v); if(action) action->setChecked(true); expressionFormatUpdated(false); } if(v != settings->printops.base) { settings->printops.base = v; to_base = 0; to_bits = 0; to_duo_syms = false; QAction *action = find_child_data(this, "group_outbase", v); if(action) action->setChecked(true); if(b_update) resultFormatUpdated(); } keypad->updateBase(); } void QalculateWindow::onFactorizeClicked() { executeCommand(COMMAND_FACTORIZE); } void QalculateWindow::onExpandClicked() { executeCommand(COMMAND_EXPAND); } void QalculateWindow::onExpandPartialFractionsClicked() { executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); } void QalculateWindow::serverNewConnection() { socket = server->nextPendingConnection(); if(socket) { connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyRead())); } } void QalculateWindow::socketReadyRead() { QString command = socket->readAll(); if(!command.isEmpty() && command[0] == '+') { settings->window_state = saveState(); settings->window_geometry = saveGeometry(); settings->splitter_state = ehSplitter->saveState(); settings->allow_multiple_instances = true; settings->show_bases = basesDock->isVisible(); settings->savePreferences(false); return; } setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); show(); qApp->processEvents(); raise(); activateWindow(); if(command.isEmpty()) return; if(command[0] == '-') { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); settings->allow_multiple_instances = false; settings->show_bases = basesDock->isVisible(); settings->savePreferences(false); command = command.mid(1).trimmed(); if(command.isEmpty()) return; } if(command[0] == 'f') { command = command.mid(1).trimmed(); if(!command.isEmpty()) { int i = command.indexOf(";"); if(i > 0) { QString file = command.left(i); executeFromFile(file); command = command.mid(i); } } } else if(command[0] == 'w') { command = command.mid(1).trimmed(); if(!command.isEmpty()) { int i = command.indexOf(";"); if(i > 0) { QString file = command.left(i); loadWorkspace(file); command = command.mid(i); } } } command = command.mid(1).trimmed(); if(!command.isEmpty()) {expressionEdit->setExpression(command); calculate();} } void QalculateWindow::onActivateRequested(const QStringList &arguments, const QString&) { if(!arguments.isEmpty()) { parser->process(arguments); QStringList args = parser->positionalArguments(); QString command; for(int i = 0; i < args.count(); i++) { if(i > 0) command += " "; command += args.at(i); } command = command.trimmed(); if(!command.isEmpty()) {expressionEdit->setExpression(command); calculate();} args.clear(); } setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); show(); qApp->processEvents(); raise(); activateWindow(); } void QalculateWindow::setCommandLineParser(QCommandLineParser *p) { parser = p; } void QalculateWindow::calculate() { calculateExpression(); } void QalculateWindow::calculate(const QString &expression) { expressionEdit->setExpression(expression); calculate(); } void QalculateWindow::setPreviousExpression() { if(settings->rpn_mode) { expressionEdit->clear(); } else { expressionEdit->blockCompletion(); expressionEdit->blockParseStatus(); expressionEdit->setExpression(QString::fromStdString(previous_expression)); expressionEdit->selectAll(); expressionEdit->setExpressionHasChanged(false); expressionEdit->blockCompletion(false); expressionEdit->blockParseStatus(false); historyView->clearTemporary(); } } void QalculateWindow::resultFormatUpdated(int delay) { if(rfTimer) rfTimer->stop(); if(block_result_update || (!expressionEdit->expressionHasChanged() && auto_expression.empty() && parsed_mstruct && parsed_mstruct->isFunction() && parsed_mstruct->function()->id() == FUNCTION_ID_MESSAGE)) return; if(delay > 0) { if(!rfTimer) { rfTimer = new QTimer(); rfTimer->setSingleShot(true); connect(rfTimer, SIGNAL(timeout()), this, SLOT(resultFormatUpdated())); } rfTimer->start(delay); return; } settings->updateMessagePrintOptions(); workspace_changed = true; setResult(NULL, true, false, false); auto_format_updated = true; if((!settings->status_in_history && !QToolTip::text().isEmpty()) || (settings->status_in_history && expressionEdit->expressionHasChanged())) expressionEdit->displayParseStatus(true); } void QalculateWindow::resultDisplayUpdated() { resultFormatUpdated(); } void QalculateWindow::expressionObjectsUpdated() { auto_calculation_updated = true; expressionEdit->displayParseStatus(true, !QToolTip::text().isEmpty()); } void QalculateWindow::expressionFormatUpdated(bool recalculate) { settings->updateMessagePrintOptions(); if(!expressionEdit->expressionHasChanged() && !recalculate && !settings->rpn_mode) { expressionEdit->clear(); } else if(!settings->rpn_mode && parsed_mstruct) { for(size_t i = 0; i < 5; i++) { if(parsed_mstruct->contains(settings->vans[i])) expressionEdit->clear(); } } workspace_changed = true; if(!settings->rpn_mode && recalculate && (expressionEdit->expressionHasChanged() || !parsed_mstruct || !parsed_mstruct->isFunction() || parsed_mstruct->function()->id() != FUNCTION_ID_MESSAGE)) { calculateExpression(false); } if(expressionEdit->expressionHasChanged()) expressionEdit->displayParseStatus(true, !QToolTip::text().isEmpty()); } void QalculateWindow::expressionCalculationUpdated(int delay) { if(ecTimer) ecTimer->stop(); if(delay > 0) { if(!ecTimer) { ecTimer = new QTimer(); ecTimer->setSingleShot(true); connect(ecTimer, SIGNAL(timeout()), this, SLOT(expressionCalculationUpdated())); } ecTimer->start(delay); return; } workspace_changed = true; auto_calculation_updated = true; settings->updateMessagePrintOptions(); if(!settings->rpn_mode && (expressionEdit->expressionHasChanged() || !parsed_mstruct || !parsed_mstruct->isFunction() || parsed_mstruct->function()->id() != FUNCTION_ID_MESSAGE)) { if(parsed_mstruct) { for(size_t i = 0; i < 5; i++) { if(parsed_mstruct->contains(settings->vans[i])) return; } } calculateExpression(false); } if(expressionEdit->expressionHasChanged()) expressionEdit->displayParseStatus(true, !QToolTip::text().isEmpty()); } int s2b(const std::string &str) { if(str.empty()) return -1; if(equalsIgnoreCase(str, "yes")) return 1; if(equalsIgnoreCase(str, "no")) return 0; if(equalsIgnoreCase(str, "true")) return 1; if(equalsIgnoreCase(str, "false")) return 0; if(equalsIgnoreCase(str, "on")) return 1; if(equalsIgnoreCase(str, "off")) return 0; if(str.find_first_not_of(SPACES NUMBERS) != std::string::npos) return -1; int i = s2i(str); if(i > 0) return 1; return 0; } void set_assumption(const std::string &str, AssumptionType &at, AssumptionSign &as, bool last_of_two = false) { if(equalsIgnoreCase(str, "none") || str == "0") { as = ASSUMPTION_SIGN_UNKNOWN; at = ASSUMPTION_TYPE_NUMBER; } else if(equalsIgnoreCase(str, "unknown")) { if(!last_of_two) as = ASSUMPTION_SIGN_UNKNOWN; else at = ASSUMPTION_TYPE_NUMBER; } else if(equalsIgnoreCase(str, "real")) { at = ASSUMPTION_TYPE_REAL; } else if(equalsIgnoreCase(str, "number") || equalsIgnoreCase(str, "complex") || str == "num" || str == "cplx") { at = ASSUMPTION_TYPE_NUMBER; } else if(equalsIgnoreCase(str, "rational") || str == "rat") { at = ASSUMPTION_TYPE_RATIONAL; } else if(equalsIgnoreCase(str, "integer") || str == "int") { at = ASSUMPTION_TYPE_INTEGER; } else if(equalsIgnoreCase(str, "boolean") || str == "bool") { at = ASSUMPTION_TYPE_BOOLEAN; } else if(equalsIgnoreCase(str, "non-zero") || str == "nz") { as = ASSUMPTION_SIGN_NONZERO; } else if(equalsIgnoreCase(str, "positive") || str == "pos") { as = ASSUMPTION_SIGN_POSITIVE; } else if(equalsIgnoreCase(str, "non-negative") || str == "nneg") { as = ASSUMPTION_SIGN_NONNEGATIVE; } else if(equalsIgnoreCase(str, "negative") || str == "neg") { as = ASSUMPTION_SIGN_NEGATIVE; } else if(equalsIgnoreCase(str, "non-positive") || str == "npos") { as = ASSUMPTION_SIGN_NONPOSITIVE; } else { CALCULATOR->error(true, "Unrecognized assumption: %s.", str.c_str(), NULL); } } #define SET_BOOL_D(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; resultDisplayUpdated();}} #define SET_BOOL_E(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionCalculationUpdated();}} #define SET_BOOL(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v;}} #define SET_BOOL_PV(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionFormatUpdated(v);}} #define SET_BOOL_PT(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionFormatUpdated(true);}} #define SET_BOOL_PF(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionFormatUpdated(false);}} void QalculateWindow::setOption(std::string str) { remove_blank_ends(str); gsub(SIGN_MINUS, "-", str); std::string svalue, svar; bool empty_value = false; size_t i_underscore = str.find("_"); size_t index; if(i_underscore != std::string::npos) { index = str.find_first_of(SPACES); if(index != std::string::npos && i_underscore > index) i_underscore = std::string::npos; } if(i_underscore == std::string::npos) index = str.find_last_of(SPACES); if(index != std::string::npos) { svar = str.substr(0, index); remove_blank_ends(svar); svalue = str.substr(index + 1); remove_blank_ends(svalue); } else { svar = str; } if(i_underscore != std::string::npos) gsub("_", " ", svar); if(svalue.empty()) { empty_value = true; svalue = "1"; } if(preferencesDialog) { preferencesDialog->hide(); preferencesDialog->deleteLater(); preferencesDialog = NULL; } set_option_place: if(equalsIgnoreCase(svar, "base") || equalsIgnoreCase(svar, "input base") || svar == "inbase" || equalsIgnoreCase(svar, "output base") || svar == "outbase") { int v = 0; bool b_in = equalsIgnoreCase(svar, "input base") || svar == "inbase"; bool b_out = equalsIgnoreCase(svar, "output base") || svar == "outbase"; if(equalsIgnoreCase(svalue, "roman")) v = BASE_ROMAN_NUMERALS; else if(equalsIgnoreCase(svalue, "bijective") || str == "b26" || str == "B26") v = BASE_BIJECTIVE_26; if(equalsIgnoreCase(svalue, "bcd")) v = BASE_BINARY_DECIMAL; else if(equalsIgnoreCase(svalue, "fp32") || equalsIgnoreCase(svalue, "binary32") || equalsIgnoreCase(svalue, "float")) {if(b_in) v = 0; else v = BASE_FP32;} else if(equalsIgnoreCase(svalue, "fp64") || equalsIgnoreCase(svalue, "binary64") || equalsIgnoreCase(svalue, "double")) {if(b_in) v = 0; else v = BASE_FP64;} else if(equalsIgnoreCase(svalue, "fp16") || equalsIgnoreCase(svalue, "binary16")) {if(b_in) v = 0; else v = BASE_FP16;} else if(equalsIgnoreCase(svalue, "fp80")) {if(b_in) v = 0; else v = BASE_FP80;} else if(equalsIgnoreCase(svalue, "fp128") || equalsIgnoreCase(svalue, "binary128")) {if(b_in) v = 0; else v = BASE_FP128;} else if(equalsIgnoreCase(svalue, "time")) {if(b_in) v = 0; else v = BASE_TIME;} else if(equalsIgnoreCase(svalue, "hex") || equalsIgnoreCase(svalue, "hexadecimal")) v = BASE_HEXADECIMAL; else if(equalsIgnoreCase(svalue, "golden") || equalsIgnoreCase(svalue, "golden ratio") || svalue == "φ") v = BASE_GOLDEN_RATIO; else if(equalsIgnoreCase(svalue, "supergolden") || equalsIgnoreCase(svalue, "supergolden ratio") || svalue == "ψ") v = BASE_SUPER_GOLDEN_RATIO; else if(equalsIgnoreCase(svalue, "pi") || svalue == "π") v = BASE_PI; else if(svalue == "e") v = BASE_E; else if(svalue == "sqrt(2)" || svalue == "sqrt 2" || svalue == "sqrt2" || svalue == "√2") v = BASE_SQRT2; else if(equalsIgnoreCase(svalue, "unicode")) v = BASE_UNICODE; else if(equalsIgnoreCase(svalue, "duo") || equalsIgnoreCase(svalue, "duodecimal")) v = 12; else if(equalsIgnoreCase(svalue, "bin") || equalsIgnoreCase(svalue, "binary")) v = BASE_BINARY; else if(equalsIgnoreCase(svalue, "oct") || equalsIgnoreCase(svalue, "octal")) v = BASE_OCTAL; else if(equalsIgnoreCase(svalue, "dec") || equalsIgnoreCase(svalue, "decimal")) v = BASE_DECIMAL; else if(equalsIgnoreCase(svalue, "sexa") || equalsIgnoreCase(svalue, "sexagesimal")) {if(b_in) v = 0; else v = BASE_SEXAGESIMAL;} else if(equalsIgnoreCase(svalue, "sexa2") || equalsIgnoreCase(svalue, "sexagesimal2")) {if(b_in) v = 0; else v = BASE_SEXAGESIMAL_2;} else if(equalsIgnoreCase(svalue, "sexa3") || equalsIgnoreCase(svalue, "sexagesimal3")) {if(b_in) v = 0; else v = BASE_SEXAGESIMAL_3;} else if(equalsIgnoreCase(svalue, "latitude")) {if(b_in) v = 0; else v = BASE_LATITUDE;} else if(equalsIgnoreCase(svalue, "latitude2")) {if(b_in) v = 0; else v = BASE_LATITUDE_2;} else if(equalsIgnoreCase(svalue, "longitude")) {if(b_in) v = 0; else v = BASE_LONGITUDE;} else if(equalsIgnoreCase(svalue, "longitude2")) {if(b_in) v = 0; else v = BASE_LONGITUDE_2;} else if(!b_in && !b_out && (index = svalue.find_first_of(SPACES)) != std::string::npos) { str = svalue; svalue = str.substr(index + 1, str.length() - (index + 1)); remove_blank_ends(svalue); svar += " "; str = str.substr(0, index); remove_blank_ends(str); svar += str; gsub("_", " ", svar); if(equalsIgnoreCase(svar, "base display")) { goto set_option_place; } setOption(std::string("inbase ") + svalue); setOption(std::string("outbase ") + str); return; } else if(!empty_value) { MathStructure m; EvaluationOptions eo = settings->evalops; eo.parse_options.base = 10; eo.approximation = APPROXIMATION_TRY_EXACT; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(svalue, eo.parse_options), 500, eo); if(CALCULATOR->endTemporaryStopMessages()) { v = 0; } else if(m.isInteger() && m.number() >= 2 && m.number() <= 36) { v = m.number().intValue(); } else if(m.isNumber() && (b_in || ((!m.number().isNegative() || m.number().isInteger()) && (m.number() > 1 || m.number() < -1)))) { v = BASE_CUSTOM; if(b_in) CALCULATOR->setCustomInputBase(m.number()); else CALCULATOR->setCustomOutputBase(m.number()); } } if(v == 0) { CALCULATOR->error(true, "Illegal base: %s.", svalue.c_str(), NULL); } else if(b_in) { if(v == BASE_CUSTOM || v != settings->evalops.parse_options.base) { settings->evalops.parse_options.base = v; QAction *action = find_child_data(this, "group_inbase", v); if(!action) action = find_child_data(this, "group_inbase", BASE_CUSTOM); if(action) { action->setChecked(true); if(action->data().toInt() == BASE_CUSTOM && (v == BASE_CUSTOM || (v >= 2 && v <= 36))) { QSpinBox *w = findChild("spinbox_inbase"); if(w) { w->blockSignals(true); w->setValue(v == BASE_CUSTOM ? (CALCULATOR->customInputBase().isZero() ? 10 : CALCULATOR->customInputBase().intValue()) : v); w->blockSignals(false); } } } expressionFormatUpdated(false); } } else { if(v == BASE_CUSTOM || v != settings->printops.base) { settings->printops.base = v; to_base = 0; to_bits = 0; to_duo_syms = false; QAction *action = find_child_data(this, "group_outbase", v); if(!action) action = find_child_data(this, "group_outbase", BASE_CUSTOM); if(action) { action->setChecked(true); if(action->data().toInt() == BASE_CUSTOM && (v == BASE_CUSTOM || (v >= 2 && v <= 36))) { QSpinBox *w = findChild("spinbox_outbase"); if(w) { w->blockSignals(true); w->setValue(v == BASE_CUSTOM ? (CALCULATOR->customOutputBase().isZero() ? 10 : CALCULATOR->customOutputBase().intValue()) : v); w->blockSignals(false); } } } resultFormatUpdated(); } } } else if(equalsIgnoreCase(svar, "assumptions") || svar == "ass" || svar == "asm") { size_t i = svalue.find_first_of(SPACES); AssumptionType at = CALCULATOR->defaultAssumptions()->type(); AssumptionSign as = CALCULATOR->defaultAssumptions()->sign(); if(i != std::string::npos) { set_assumption(svalue.substr(0, i), at, as, false); set_assumption(svalue.substr(i + 1, svalue.length() - (i + 1)), at, as, true); } else { set_assumption(svalue, at, as, false); } QAction *action = find_child_data(this, "group_type", CALCULATOR->defaultAssumptions()->type()); if(action) { action->setChecked(true); } action = find_child_data(this, "group_sign", CALCULATOR->defaultAssumptions()->sign()); if(action) { action->setChecked(true); } } else if(equalsIgnoreCase(svar, "all prefixes") || svar == "allpref") SET_BOOL_D(settings->printops.use_all_prefixes) else if(equalsIgnoreCase(svar, "complex numbers") || svar == "cplx") SET_BOOL_E(settings->evalops.allow_complex) else if(equalsIgnoreCase(svar, "excessive parentheses") || svar == "expar") SET_BOOL_D(settings->printops.excessive_parenthesis) else if(equalsIgnoreCase(svar, "functions") || svar == "func") SET_BOOL_PV(settings->evalops.parse_options.functions_enabled) else if(equalsIgnoreCase(svar, "infinite numbers") || svar == "inf") SET_BOOL_E(settings->evalops.allow_infinite) else if(equalsIgnoreCase(svar, "show negative exponents") || svar == "negexp") SET_BOOL_D(settings->printops.negative_exponents) else if(equalsIgnoreCase(svar, "minus last") || svar == "minlast") { {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(settings->printops.sort_options.minus_last != v) {settings->printops.sort_options.minus_last = v; resultDisplayUpdated();}} } else if(equalsIgnoreCase(svar, "assume nonzero denominators") || svar == "nzd") SET_BOOL_E(settings->evalops.assume_denominators_nonzero) else if(equalsIgnoreCase(svar, "warn nonzero denominators") || svar == "warnnzd") SET_BOOL_E(settings->evalops.warn_about_denominators_assumed_nonzero) else if(equalsIgnoreCase(svar, "prefixes") || svar == "pref") SET_BOOL_D(settings->printops.use_unit_prefixes) else if(equalsIgnoreCase(svar, "binary prefixes") || svar == "binpref") { bool b = CALCULATOR->usesBinaryPrefixes() > 0; SET_BOOL(b) if(b != (CALCULATOR->usesBinaryPrefixes() > 0)) { CALCULATOR->useBinaryPrefixes(b ? 1 : 0); resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "denominator prefixes") || svar == "denpref") SET_BOOL_D(settings->printops.use_denominator_prefix) else if(equalsIgnoreCase(svar, "place units separately") || svar == "unitsep") SET_BOOL_D(settings->printops.place_units_separately) else if(equalsIgnoreCase(svar, "calculate variables") || svar == "calcvar") SET_BOOL_E(settings->evalops.calculate_variables) else if(equalsIgnoreCase(svar, "calculate functions") || svar == "calcfunc") SET_BOOL_E(settings->evalops.calculate_functions) else if(equalsIgnoreCase(svar, "sync units") || svar == "sync") SET_BOOL_E(settings->evalops.sync_units) else if(equalsIgnoreCase(svar, "temperature calculation") || svar == "temp") { int v = -1; if(equalsIgnoreCase(svalue, "relative")) v = TEMPERATURE_CALCULATION_RELATIVE; else if(equalsIgnoreCase(svalue, "hybrid")) v = TEMPERATURE_CALCULATION_HYBRID; else if(equalsIgnoreCase(svalue, "absolute")) v = TEMPERATURE_CALCULATION_ABSOLUTE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { CALCULATOR->setTemperatureCalculationMode((TemperatureCalculationMode) v); settings->tc_set = true; expressionCalculationUpdated(); } } else if(svar == "sinc") { int v = -1; if(equalsIgnoreCase(svalue, "unnormalized")) v = 0; else if(equalsIgnoreCase(svalue, "normalized")) v = 1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { if(v == 0) CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, ""); else CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, "pi"); settings->sinc_set = true; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "round to even") || svar == "rndeven") { bool b = (settings->printops.rounding == ROUNDING_HALF_TO_EVEN); SET_BOOL(b) if(b != (settings->printops.rounding == ROUNDING_HALF_TO_EVEN)) { settings->printops.rounding = b ? ROUNDING_HALF_TO_EVEN : ROUNDING_HALF_AWAY_FROM_ZERO; resultFormatUpdated(); } } else if(equalsIgnoreCase(svar, "rounding")) { int v = -1; if(equalsIgnoreCase(svalue, "even") || equalsIgnoreCase(svalue, "round to even") || equalsIgnoreCase(svalue, "half to even")) v = ROUNDING_HALF_TO_EVEN; else if(equalsIgnoreCase(svalue, "standard") || equalsIgnoreCase(svalue, "half away from zero")) v = ROUNDING_HALF_AWAY_FROM_ZERO; else if(equalsIgnoreCase(svalue, "truncate") || equalsIgnoreCase(svalue, "toward zero")) v = ROUNDING_TOWARD_ZERO; else if(equalsIgnoreCase(svalue, "half to odd")) v = ROUNDING_HALF_TO_ODD; else if(equalsIgnoreCase(svalue, "half toward zero")) v = ROUNDING_HALF_TOWARD_ZERO; else if(equalsIgnoreCase(svalue, "half random")) v = ROUNDING_HALF_RANDOM; else if(equalsIgnoreCase(svalue, "half up")) v = ROUNDING_HALF_UP; else if(equalsIgnoreCase(svalue, "half down")) v = ROUNDING_HALF_DOWN; else if(equalsIgnoreCase(svalue, "up")) v = ROUNDING_UP; else if(equalsIgnoreCase(svalue, "down")) v = ROUNDING_DOWN; else if(equalsIgnoreCase(svalue, "away from zero")) v = ROUNDING_AWAY_FROM_ZERO; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); if(v == 2) v = ROUNDING_TOWARD_ZERO; else if(v > 2 && v <= ROUNDING_TOWARD_ZERO) v--; } if(v < ROUNDING_HALF_AWAY_FROM_ZERO || v > ROUNDING_DOWN) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v != settings->printops.rounding) { settings->printops.rounding = (RoundingMode) v; resultFormatUpdated(); } } else if(equalsIgnoreCase(svar, "rpn syntax") || svar == "rpnsyn") { bool b = (settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN); SET_BOOL(b) if(b != (settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN)) { if(b) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_RPN; } else { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } expressionFormatUpdated(false); } } else if(equalsIgnoreCase(svar, "rpn") && svalue.find(" ") == std::string::npos) { bool b = settings->rpn_mode; SET_BOOL(b) if(b != settings->rpn_mode) { QAction *w = NULL; if(b) w = findChild("action_rpnmode"); else w = findChild("action_normalmode"); if(w) w->setChecked(true); if(b) rpnModeActivated(); else normalModeActivated(); } } else if(equalsIgnoreCase(svar, "short multiplication") || svar == "shortmul") SET_BOOL_D(settings->printops.short_multiplication) else if(equalsIgnoreCase(svar, "simplified percentage") || svar == "percent") SET_BOOL_PT(settings->simplified_percentage) else if(equalsIgnoreCase(svar, "lowercase e") || svar == "lowe") { bool b = (settings->printops.exp_display == EXP_LOWERCASE_E); SET_BOOL(b) if(b != (settings->printops.exp_display == EXP_LOWERCASE_E)) { if(b) settings->printops.exp_display = EXP_LOWERCASE_E; else settings->printops.exp_display = EXP_UPPERCASE_E; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "lowercase numbers") || svar == "lownum") SET_BOOL_D(settings->printops.lower_case_numbers) else if(equalsIgnoreCase(svar, "duodecimal symbols") || svar == "duosyms") SET_BOOL_D(settings->printops.duodecimal_symbols) else if(equalsIgnoreCase(svar, "imaginary j") || svar == "imgj") { Variable *v_i = CALCULATOR->getVariableById(VARIABLE_ID_I); if(v_i) { bool b = v_i->hasName("j") > 0; SET_BOOL(b) if(b) { ExpressionName ename = v_i->getName(1); ename.name = "j"; ename.reference = false; v_i->addName(ename, 1, true); v_i->setChanged(false); } else { v_i->clearNonReferenceNames(); v_i->setChanged(false); } expressionFormatUpdated(false); } } else if(equalsIgnoreCase(svar, "base display") || svar == "basedisp") { int v = -1; if(equalsIgnoreCase(svalue, "none")) v = BASE_DISPLAY_NONE; else if(empty_value || equalsIgnoreCase(svalue, "normal")) v = BASE_DISPLAY_NORMAL; else if(equalsIgnoreCase(svalue, "alternative")) v = BASE_DISPLAY_ALTERNATIVE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.base_display = (BaseDisplay) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "two's complement") || svar == "twos") SET_BOOL_D(settings->printops.twos_complement) else if(equalsIgnoreCase(svar, "hexadecimal two's") || svar == "hextwos") SET_BOOL_D(settings->printops.hexadecimal_twos_complement) else if(equalsIgnoreCase(svar, "two's complement input") || svar == "twosin") { SET_BOOL_PF(settings->evalops.parse_options.twos_complement) if(settings->evalops.parse_options.twos_complement != settings->default_signed) settings->default_signed = -1; } else if(equalsIgnoreCase(svar, "hexadecimal two's input") || svar == "hextwosin") SET_BOOL_PF(settings->evalops.parse_options.hexadecimal_twos_complement) else if(equalsIgnoreCase(svar, "binary bits") || svar == "bits") { int v = -1; if(empty_value) { v = 0; } else if(svalue.find_first_not_of(SPACES MINUS NUMBERS) == std::string::npos) { v = s2i(svalue); if(v < 0) v = 0; } if(v < 0 || v == 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.binary_bits = v; settings->evalops.parse_options.binary_bits = v; settings->default_bits = -1; if(settings->evalops.parse_options.twos_complement || settings->evalops.parse_options.hexadecimal_twos_complement) expressionFormatUpdated(true); else resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "digit grouping") || svar =="group") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = DIGIT_GROUPING_NONE; else if(equalsIgnoreCase(svalue, "none")) v = DIGIT_GROUPING_NONE; else if(empty_value || equalsIgnoreCase(svalue, "standard") || equalsIgnoreCase(svalue, "on")) v = DIGIT_GROUPING_STANDARD; else if(equalsIgnoreCase(svalue, "locale")) v = DIGIT_GROUPING_LOCALE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < DIGIT_GROUPING_NONE || v > DIGIT_GROUPING_LOCALE) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.digit_grouping = (DigitGrouping) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "spell out logical") || svar == "spellout") SET_BOOL_D(settings->printops.spell_out_logical_operators) else if((equalsIgnoreCase(svar, "ignore dot") || svar == "nodot") && CALCULATOR->getDecimalPoint() != DOT) { SET_BOOL_PF(settings->evalops.parse_options.dot_as_separator) settings->dot_question_asked = true; } else if((equalsIgnoreCase(svar, "ignore comma") || svar == "nocomma") && CALCULATOR->getDecimalPoint() != COMMA) { SET_BOOL(settings->evalops.parse_options.comma_as_separator) CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); expressionFormatUpdated(false); } else if(equalsIgnoreCase(svar, "decimal comma")) { int v = -2; if(equalsIgnoreCase(svalue, "off")) v = 0; else if(empty_value || equalsIgnoreCase(svalue, "on")) v = 1; else if(equalsIgnoreCase(svalue, "locale")) v = -1; else if(svalue.find_first_not_of(SPACES MINUS NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < -1 || v > 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->decimal_comma = v; if(settings->decimal_comma > 0) CALCULATOR->useDecimalComma(); else if(settings->decimal_comma == 0) CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); if(v >= 0) { expressionFormatUpdated(false); resultDisplayUpdated(); } } } else if(equalsIgnoreCase(svar, "limit implicit multiplication") || svar == "limimpl") { int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str());} else {settings->printops.limit_implicit_multiplication = v; settings->evalops.parse_options.limit_implicit_multiplication = v; expressionFormatUpdated(true);} } else if(equalsIgnoreCase(svar, "spacious") || svar == "space") SET_BOOL_D(settings->printops.spacious) else if(equalsIgnoreCase(svar, "unicode") || svar == "uni") { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str()); } else { settings->printops.use_unicode_signs = v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "units") || svar == "unit") SET_BOOL_PV(settings->evalops.parse_options.units_enabled) else if(equalsIgnoreCase(svar, "unknowns") || svar == "unknown") SET_BOOL_PV(settings->evalops.parse_options.unknowns_enabled) else if(equalsIgnoreCase(svar, "variables") || svar == "var") SET_BOOL_PV(settings->evalops.parse_options.variables_enabled) else if(equalsIgnoreCase(svar, "abbreviations") || svar == "abbr" || svar == "abbrev") SET_BOOL_D(settings->printops.abbreviate_names) else if(equalsIgnoreCase(svar, "show ending zeroes") || svar == "zeroes") SET_BOOL_D(settings->printops.show_ending_zeroes) else if(equalsIgnoreCase(svar, "repeating decimals") || svar == "repdeci") SET_BOOL_D(settings->printops.indicate_infinite_series) else if(equalsIgnoreCase(svar, "angle unit") || svar == "angle") { int v = -1; if(equalsIgnoreCase(svalue, "rad") || equalsIgnoreCase(svalue, "radians")) v = ANGLE_UNIT_RADIANS; else if(equalsIgnoreCase(svalue, "deg") || equalsIgnoreCase(svalue, "degrees")) v = ANGLE_UNIT_DEGREES; else if(equalsIgnoreCase(svalue, "gra") || equalsIgnoreCase(svalue, "gradians")) v = ANGLE_UNIT_GRADIANS; else if(equalsIgnoreCase(svalue, "none")) v = ANGLE_UNIT_NONE; else if(equalsIgnoreCase(svalue, "custom")) v = ANGLE_UNIT_CUSTOM; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } else { Unit *u = CALCULATOR->getActiveUnit(svalue); if(u && u->baseUnit() == CALCULATOR->getRadUnit() && u->baseExponent() == 1 && u->isActive() && u->isRegistered() && !u->isHidden()) { if(u == CALCULATOR->getRadUnit()) v = ANGLE_UNIT_RADIANS; else if(u == CALCULATOR->getGraUnit()) v = ANGLE_UNIT_GRADIANS; else if(u == CALCULATOR->getDegUnit()) v = ANGLE_UNIT_DEGREES; else {v = ANGLE_UNIT_CUSTOM; CALCULATOR->setCustomAngleUnit(u);} } } if(v < 0 || v > 4) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v == ANGLE_UNIT_CUSTOM && !CALCULATOR->customAngleUnit()) { CALCULATOR->error(true, "Please specify a custom angle unit as argument (e.g. set angle arcsec).", NULL); } else { QAction *w; if(v == ANGLE_UNIT_CUSTOM) { w = findChild("action_angle_unit" + QString::fromStdString(CALCULATOR->customAngleUnit()->referenceName())); } else { w = find_child_data(this, "group_angleunit", v); } if(w) w->setChecked(true); settings->evalops.parse_options.angle_unit = (AngleUnit) v; expressionFormatUpdated(true); } } else if(equalsIgnoreCase(svar, "caret as xor") || equalsIgnoreCase(svar, "xor^")) SET_BOOL_PT(settings->caret_as_xor) else if(equalsIgnoreCase(svar, "concise uncertainty") || equalsIgnoreCase(svar, "concise")) { bool b = CALCULATOR->conciseUncertaintyInputEnabled(); SET_BOOL(b) if(b != CALCULATOR->conciseUncertaintyInputEnabled()) { CALCULATOR->setConciseUncertaintyInputEnabled(b); expressionFormatUpdated(false); } } else if(equalsIgnoreCase(svar, "parsing mode") || svar == "parse" || svar == "syntax") { int v = -1; if(equalsIgnoreCase(svalue, "adaptive")) v = PARSING_MODE_ADAPTIVE; else if(equalsIgnoreCase(svalue, "implicit first")) v = PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST; else if(equalsIgnoreCase(svalue, "conventional")) v = PARSING_MODE_CONVENTIONAL; else if(equalsIgnoreCase(svalue, "chain")) v = PARSING_MODE_CHAIN; else if(equalsIgnoreCase(svalue, "rpn")) v = PARSING_MODE_RPN; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < PARSING_MODE_ADAPTIVE || v > PARSING_MODE_RPN) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.parse_options.parsing_mode = (ParsingMode) v; settings->implicit_question_asked = (settings->evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL || settings->evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST); expressionFormatUpdated(true); } } else if(equalsIgnoreCase(svar, "update exchange rates") || svar == "upxrates") { int v = -2; if(equalsIgnoreCase(svalue, "never")) { settings->auto_update_exchange_rates = 0; } else if(equalsIgnoreCase(svalue, "ask")) { CALCULATOR->error(true, "Unsupported value: %s.", svalue.c_str(), NULL); } else { v = s2i(svalue); if(empty_value) v = 7; if(v < 0) CALCULATOR->error(true, "Unsupported value: %s.", svalue.c_str(), NULL); else settings->auto_update_exchange_rates = v; } } else if(equalsIgnoreCase(svar, "multiplication sign") || svar == "mulsign") { int v = -1; if(svalue == SIGN_MULTIDOT || svalue == ".") v = MULTIPLICATION_SIGN_DOT; else if(svalue == SIGN_MIDDLEDOT) v = MULTIPLICATION_SIGN_ALTDOT; else if(svalue == SIGN_MULTIPLICATION || svalue == "x") v = MULTIPLICATION_SIGN_X; else if(svalue == "*") v = MULTIPLICATION_SIGN_ASTERISK; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < MULTIPLICATION_SIGN_ASTERISK || v > MULTIPLICATION_SIGN_ALTDOT) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.multiplication_sign = (MultiplicationSign) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "division sign") || svar == "divsign") { int v = -1; if(svalue == SIGN_DIVISION_SLASH) v = DIVISION_SIGN_DIVISION_SLASH; else if(svalue == SIGN_DIVISION) v = DIVISION_SIGN_DIVISION; else if(svalue == "/") v = DIVISION_SIGN_SLASH; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.division_sign = (DivisionSign) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "approximation") || svar == "appr" || svar == "approx") { int v = -1; if(equalsIgnoreCase(svalue, "exact")) v = APPROXIMATION_EXACT; else if(equalsIgnoreCase(svalue, "auto")) v = -1; else if(equalsIgnoreCase(svalue, "dual")) v = APPROXIMATION_APPROXIMATE + 1; else if(empty_value || equalsIgnoreCase(svalue, "try exact") || svalue == "try") v = APPROXIMATION_TRY_EXACT; else if(equalsIgnoreCase(svalue, "approximate") || svalue == "approx") v = APPROXIMATION_APPROXIMATE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v > APPROXIMATION_APPROXIMATE + 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { QAction *w = NULL; if(v < 0) w = findChild("action_autoappr"); else if(v == APPROXIMATION_APPROXIMATE + 1) w = findChild("action_dualappr"); else if(v == APPROXIMATION_EXACT) w = findChild("action_exact"); else if(v == APPROXIMATION_TRY_EXACT) w = findChild("action_approximate"); else if(v == APPROXIMATION_APPROXIMATE) w = findChild("action_approximate"); if(w) { w->setChecked(true); } if(v < 0) { settings->evalops.approximation = APPROXIMATION_TRY_EXACT; settings->dual_approximation = -1; } else if(v == APPROXIMATION_APPROXIMATE + 1) { settings->evalops.approximation = APPROXIMATION_TRY_EXACT; settings->dual_approximation = 1; } else { settings->evalops.approximation = (ApproximationMode) v; settings->dual_approximation = 0; } expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "interval calculation") || svar == "ic" || equalsIgnoreCase(svar, "uncertainty propagation") || svar == "up") { int v = -1; if(equalsIgnoreCase(svalue, "variance formula") || equalsIgnoreCase(svalue, "variance")) v = INTERVAL_CALCULATION_VARIANCE_FORMULA; else if(equalsIgnoreCase(svalue, "interval arithmetic") || svalue == "iv") v = INTERVAL_CALCULATION_INTERVAL_ARITHMETIC; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < INTERVAL_CALCULATION_NONE || v > INTERVAL_CALCULATION_SIMPLE_INTERVAL_ARITHMETIC) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.interval_calculation = (IntervalCalculation) v; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "autoconversion") || svar == "conv") { int v = -1; MixedUnitsConversion muc = MIXED_UNITS_CONVERSION_DEFAULT; if(equalsIgnoreCase(svalue, "none")) {v = POST_CONVERSION_NONE; muc = MIXED_UNITS_CONVERSION_NONE;} else if(equalsIgnoreCase(svalue, "best")) v = POST_CONVERSION_OPTIMAL_SI; else if(equalsIgnoreCase(svalue, "optimalsi") || svalue == "si") v = POST_CONVERSION_OPTIMAL_SI; else if(empty_value || equalsIgnoreCase(svalue, "optimal")) v = POST_CONVERSION_OPTIMAL; else if(equalsIgnoreCase(svalue, "base")) v = POST_CONVERSION_BASE; else if(equalsIgnoreCase(svalue, "mixed")) v = POST_CONVERSION_OPTIMAL + 1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); if(v == 1) v = 3; else if(v == 3) v = 1; } if(v == POST_CONVERSION_OPTIMAL + 1) { v = POST_CONVERSION_NONE; muc = MIXED_UNITS_CONVERSION_DEFAULT; } else if(v == 0) { v = POST_CONVERSION_NONE; muc = MIXED_UNITS_CONVERSION_NONE; } if(v < 0 || v > POST_CONVERSION_OPTIMAL) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.auto_post_conversion = (AutoPostConversion) v; settings->evalops.mixed_units_conversion = muc; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "currency conversion") || svar == "curconv") SET_BOOL_E(settings->evalops.local_currency_conversion) else if(equalsIgnoreCase(svar, "algebra mode") || svar == "alg") { int v = -1; if(equalsIgnoreCase(svalue, "none")) v = STRUCTURING_NONE; else if(equalsIgnoreCase(svalue, "simplify") || equalsIgnoreCase(svalue, "expand")) v = STRUCTURING_SIMPLIFY; else if(equalsIgnoreCase(svalue, "factorize") || svalue == "factor") v = STRUCTURING_FACTORIZE; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > STRUCTURING_FACTORIZE) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.structuring = (StructuringMode) v; settings->printops.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "exact")) { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { setOption("approx exact"); } } else if(equalsIgnoreCase(svar, "ignore locale")) { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v != settings->ignore_locale) { if(v > 0) { settings->ignore_locale = true; } else { settings->ignore_locale = false; } CALCULATOR->error(false, "Please restart the program for the change to take effect.", NULL); } } else if(equalsIgnoreCase(svar, "save mode")) { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v > 0) { settings->save_mode_on_exit = true; } else { settings->save_mode_on_exit = false; } } else if(equalsIgnoreCase(svar, "save definitions") || svar == "save defs") { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v > 0) { settings->save_defs_on_exit = true; } else { settings->save_defs_on_exit = false; } } else if(equalsIgnoreCase(svar, "scientific notation") || svar == "exp mode" || svar == "exp" || svar == "exp display" || svar == "edisp") { int v = -1; bool valid = true; bool display = (svar == "exp display" || svar == "edisp"); if(!display && equalsIgnoreCase(svalue, "off")) v = EXP_NONE; else if(!display && equalsIgnoreCase(svalue, "auto")) v = EXP_PRECISION; else if(!display && equalsIgnoreCase(svalue, "pure")) v = EXP_PURE; else if(!display && (empty_value || svalue == "sci" || equalsIgnoreCase(svalue, "scientific"))) v = EXP_SCIENTIFIC; else if(!display && (svalue == "eng" || equalsIgnoreCase(svalue, "engineering"))) v = EXP_BASE_3; else if(svalue == "E" || (display && empty_value && settings->printops.exp_display == EXP_POWER_OF_10)) {v = EXP_UPPERCASE_E; display = true;} else if(svalue == "e") {v = EXP_LOWERCASE_E; display = true;} else if((display && svalue == "10") || (display && empty_value && settings->printops.exp_display != EXP_POWER_OF_10) || svalue == "pow" || svalue == "pow10" || equalsIgnoreCase(svalue, "power") || equalsIgnoreCase(svalue, "power of 10")) { v = EXP_POWER_OF_10; display = 1; } else if(svalue.find_first_not_of(SPACES NUMBERS MINUS) == std::string::npos) { v = s2i(svalue); if(display) v++; } else valid = false; if(display && valid && (v >= EXP_UPPERCASE_E && v <= EXP_POWER_OF_10)) { settings->printops.exp_display = (ExpDisplay) v; resultDisplayUpdated(); } else if(!display && valid) { settings->printops.min_exp = v; QAction *action = find_child_data(this, "group_general", v); if(action) { action->setChecked(true); } resultFormatUpdated(); } else { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } } else if(equalsIgnoreCase(svar, "precision") || svar == "prec") { int v = 0; if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); if(v < 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { QSpinBox *w = findChild("spinbox_precision"); if(w) { w->blockSignals(true); w->setValue(v); w->blockSignals(false); } CALCULATOR->setPrecision(v); settings->previous_precision = 0; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "interval display") || svar == "ivdisp") { int v = -1; if(equalsIgnoreCase(svalue, "adaptive")) v = 0; else if(equalsIgnoreCase(svalue, "significant")) v = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS + 1; else if(equalsIgnoreCase(svalue, "interval")) v = INTERVAL_DISPLAY_INTERVAL + 1; else if(empty_value || equalsIgnoreCase(svalue, "plusminus")) v = INTERVAL_DISPLAY_PLUSMINUS + 1; else if(equalsIgnoreCase(svalue, "midpoint")) v = INTERVAL_DISPLAY_MIDPOINT + 1; else if(equalsIgnoreCase(svalue, "upper")) v = INTERVAL_DISPLAY_UPPER + 1; else if(equalsIgnoreCase(svalue, "lower")) v = INTERVAL_DISPLAY_LOWER + 1; else if(equalsIgnoreCase(svalue, "concise")) v = INTERVAL_DISPLAY_CONCISE + 1; else if(equalsIgnoreCase(svalue, "relative")) v = INTERVAL_DISPLAY_RELATIVE + 1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v == 0) { settings->adaptive_interval_display = true; settings->printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; resultFormatUpdated(); } else { v--; if(v < INTERVAL_DISPLAY_SIGNIFICANT_DIGITS || v > INTERVAL_DISPLAY_RELATIVE) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->adaptive_interval_display = false; settings->printops.interval_display = (IntervalDisplay) v; resultFormatUpdated(); } } } else if(equalsIgnoreCase(svar, "interval arithmetic") || svar == "ia" || svar == "interval") { bool b = CALCULATOR->usesIntervalArithmetic(); SET_BOOL(b) if(b != CALCULATOR->usesIntervalArithmetic()) { CALCULATOR->useIntervalArithmetic(b); expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "variable units") || svar == "varunits") { bool b = CALCULATOR->variableUnitsEnabled(); SET_BOOL(b) if(b != CALCULATOR->variableUnitsEnabled()) { CALCULATOR->setVariableUnitsEnabled(b); expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "color")) { int v = -1; if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->colorize_result = v; } } else if(equalsIgnoreCase(svar, "calculate as you type") || svar == "autocalc") { bool b = settings->display_expression_status; SET_BOOL(b) if(b != settings->display_expression_status) { settings->display_expression_status = b; onExpressionStatusModeChanged(true); } } else if(equalsIgnoreCase(svar, "max decimals") || svar == "maxdeci") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = -1; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); QSpinBox *w = findChild("spinbox_maxdecimals"); if(w) { w->blockSignals(true); w->setValue(v < 0 ? -1 : v); w->blockSignals(false); } settings->printops.use_max_decimals = (v >= 0); settings->printops.max_decimals = v; resultFormatUpdated(); } else if(equalsIgnoreCase(svar, "min decimals") || svar == "mindeci") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = -1; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); QSpinBox *w = findChild("spinbox_mindecimals"); if(w) { w->blockSignals(true); w->setValue(v < 0 ? 0 : v); w->blockSignals(false); } settings->printops.use_min_decimals = (v > 0); settings->printops.min_decimals = v; resultFormatUpdated(); } else if(equalsIgnoreCase(svar, "digits")) { int v = -1; if(equalsIgnoreCase(svalue, "off") || equalsIgnoreCase(svalue, "auto") || equalsIgnoreCase(svalue, "precision")) v = -1; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); if(v < PRECISION) { QSpinBox *w = findChild("spinbox_maxdecimals"); if(w) { w->blockSignals(true); w->setValue(-1); w->blockSignals(false); } } if(v <= 0 || v == PRECISION) { settings->printops.max_decimals = -1; settings->printops.use_max_decimals = false; resultFormatUpdated(); } else if(v >= 2 && v < PRECISION) { settings->printops.max_decimals = -v; settings->printops.use_max_decimals = true; resultFormatUpdated(); } else { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } } else if(equalsIgnoreCase(svar, "fractions") || svar == "fr") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = FRACTION_DECIMAL; else if(equalsIgnoreCase(svalue, "exact")) v = FRACTION_DECIMAL_EXACT; else if(empty_value || equalsIgnoreCase(svalue, "on")) v = FRACTION_FRACTIONAL; else if(equalsIgnoreCase(svalue, "combined") || equalsIgnoreCase(svalue, "mixed")) v = FRACTION_COMBINED; else if(equalsIgnoreCase(svalue, "long")) v = FRACTION_PERMYRIAD + 1; else if(equalsIgnoreCase(svalue, "dual")) v = FRACTION_PERMYRIAD + 2; else if(equalsIgnoreCase(svalue, "auto")) v = -1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); if(v == FRACTION_COMBINED + 1) v = FRACTION_PERMYRIAD + 1; else if(v == FRACTION_COMBINED + 2) v = FRACTION_PERMYRIAD + 2; else if(v > FRACTION_COMBINED + 2) v -= 2; } else { Variable *var = CALCULATOR->getActiveVariable(svalue); if(var && var->referenceName() == "percent") { v = FRACTION_PERCENT; } else if(var && var->referenceName() == "permille") { v = FRACTION_PERMILLE; } else if(var && var->referenceName() == "permyriad") { v = FRACTION_PERMYRIAD; } else { int tofr = 0; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(svalue), tofr, QString(), true); if(fden != 0) { if(tofr == 1) v = FRACTION_FRACTIONAL_FIXED_DENOMINATOR; else v = FRACTION_COMBINED_FIXED_DENOMINATOR; if(fden > 0) CALCULATOR->setFixedDenominator(fden); } } } if(v > FRACTION_PERMYRIAD + 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.restrict_fraction_length = (v == FRACTION_FRACTIONAL || v == FRACTION_COMBINED); if(v < 0) settings->dual_fraction = -1; else if(v == FRACTION_PERMYRIAD + 2) settings->dual_fraction = 1; else settings->dual_fraction = 0; if(v == FRACTION_PERMYRIAD + 1) v = FRACTION_FRACTIONAL; else if(v < 0 || v == FRACTION_PERMYRIAD + 2) v = FRACTION_DECIMAL; settings->printops.number_fraction_format = (NumberFractionFormat) v; resultFormatUpdated(); } } else if(equalsIgnoreCase(svar, "complex form") || svar == "cplxform") { int v = -1; if(equalsIgnoreCase(svalue, "rectangular") || equalsIgnoreCase(svalue, "cartesian") || svalue == "rect") v = COMPLEX_NUMBER_FORM_RECTANGULAR; else if(equalsIgnoreCase(svalue, "exponential") || svalue == "exp") v = COMPLEX_NUMBER_FORM_EXPONENTIAL; else if(equalsIgnoreCase(svalue, "polar")) v = COMPLEX_NUMBER_FORM_POLAR; else if(equalsIgnoreCase(svalue, "angle") || equalsIgnoreCase(svalue, "phasor")) v = COMPLEX_NUMBER_FORM_CIS + 1; else if(svar == "cis") v = COMPLEX_NUMBER_FORM_CIS; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 4) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->complex_angle_form = (v > 3); if(v == 4) v--; settings->evalops.complex_number_form = (ComplexNumberForm) v; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "read precision") || svar == "readprec") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = DONT_READ_PRECISION; else if(equalsIgnoreCase(svalue, "always")) v = ALWAYS_READ_PRECISION; else if(empty_value || equalsIgnoreCase(svalue, "when decimals") || equalsIgnoreCase(svalue, "on")) v = READ_PRECISION_WHEN_DECIMALS; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.parse_options.read_precision = (ReadPrecisionMode) v; expressionFormatUpdated(true); } } else { if(i_underscore == std::string::npos) { if(index != std::string::npos) { if((index = svar.find_last_of(SPACES)) != std::string::npos) { svar = svar.substr(0, index); remove_blank_ends(svar); str = str.substr(index + 1); remove_blank_ends(str); svalue = str; gsub("_", " ", svar); goto set_option_place; } } if(!empty_value && !svalue.empty()) { svar += " "; svar += svalue; svalue = "1"; empty_value = true; goto set_option_place; } } CALCULATOR->error(true, "Unrecognized option: %s.", svar.c_str(), NULL); } } void QalculateWindow::calculateRPN(int op) { if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } calculateExpression(true, true, (MathOperation) op, NULL); } void QalculateWindow::calculateRPN(MathFunction *f) { if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } calculateExpression(true, true, OPERATION_ADD, f); } void QalculateWindow::RPNRegisterAdded(std::string text, int index) { rpnView->insertRow(index); QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(unhtmlize(text))); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); rpnView->setItem(index, 0, item); rpnCopyAction->setEnabled(true); rpnDeleteAction->setEnabled(true); rpnClearAction->setEnabled(true); if(CALCULATOR->RPNStackSize() >= 2) { rpnUpAction->setEnabled(true); rpnDownAction->setEnabled(true); rpnSwapAction->setEnabled(true); } } void QalculateWindow::RPNRegisterRemoved(int index) { rpnView->removeRow(index); if(CALCULATOR->RPNStackSize() == 0) { rpnCopyAction->setEnabled(false); rpnDeleteAction->setEnabled(false); rpnClearAction->setEnabled(false); } if(CALCULATOR->RPNStackSize() < 2) { rpnUpAction->setEnabled(false); rpnDownAction->setEnabled(false); rpnSwapAction->setEnabled(false); } } void QalculateWindow::RPNRegisterChanged(std::string text, int index) { QTableWidgetItem *item = rpnView->item(index, 0); if(item) { item->setText(QString::fromStdString(unhtmlize(text))); } else { item = new QTableWidgetItem(QString::fromStdString(unhtmlize(text))); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); rpnView->setItem(index, 0, item); } } void QalculateWindow::approximateResult() { ApproximationMode appr_bak = settings->evalops.approximation; NumberFractionFormat frac_bak = settings->printops.number_fraction_format; int dappr_bak = settings->dual_approximation; int dfrac_bak = settings->dual_fraction; settings->dual_approximation = 0; settings->dual_fraction = 0; settings->printops.number_fraction_format = FRACTION_DECIMAL; settings->evalops.approximation = APPROXIMATION_TRY_EXACT; executeCommand(COMMAND_EVAL); settings->evalops.approximation = appr_bak; settings->printops.number_fraction_format = frac_bak; settings->dual_approximation = dappr_bak; settings->dual_fraction = dfrac_bak; } void QalculateWindow::toggleResultFraction() { if(expressionEdit->expressionHasChanged()) { if(settings->status_in_history && !auto_result.empty()) { NumberFractionFormat frac_bak = settings->printops.number_fraction_format; int dfrac_bak = settings->dual_fraction; settings->dual_fraction = 0; if(unhtmlize(auto_result).find(settings->printops.decimalpoint()) != std::string::npos) settings->printops.number_fraction_format = FRACTION_COMBINED; else settings->printops.number_fraction_format = FRACTION_DECIMAL; auto_format_updated = true; expressionEdit->displayParseStatus(true); settings->printops.number_fraction_format = frac_bak; settings->dual_fraction = dfrac_bak; } } else if(!result_text.empty()) { if(unhtmlize(result_text).find(settings->printops.decimalpoint()) != std::string::npos) to_fraction = 2; else to_fraction = 3; to_fixed_fraction = 0; setResult(NULL, true, false, false); } } void QalculateWindow::calculateSelection() { if(!expressionEdit->textCursor().hasSelection()) return; calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", "", true, true); } void QalculateWindow::calculateExpression(bool force, bool do_mathoperation, MathOperation op, MathFunction *f, bool do_stack, size_t stack_index, std::string execute_str, std::string str, bool check_exrates, bool calculate_selection) { workspace_changed = true; std::string saved_execute_str = execute_str; if(b_busy) return; if(autoCalculateTimer) autoCalculateTimer->stop(); expressionEdit->hideCompletion(); b_busy++; bool do_factors = false, do_pfe = false, do_expand = false, do_bases = false, do_calendars = false; if(do_stack && !settings->rpn_mode) do_stack = false; if(do_stack && do_mathoperation && f && stack_index == 0) do_stack = false; if(!do_stack) stack_index = 0; if(execute_str.empty()) { to_fraction = 0; to_fixed_fraction = 0; to_prefix = 0; to_base = 0; to_duo_syms = false; to_bits = 0; to_nbase.clear(); to_caf = -1; } bool current_expr = false; if(str.empty() && !do_mathoperation) { if(do_stack) { QTableWidgetItem *item = rpnView->item(stack_index, 0); if(!item) {b_busy--; return;} str = item->text().toStdString(); } else if(calculate_selection) { str = expressionEdit->textCursor().selectedText().toStdString(); } else { current_expr = true; str = expressionEdit->toPlainText().toStdString(); if(!force && (expressionEdit->expressionHasChanged() || str.find_first_not_of(SPACES) == std::string::npos)) { b_busy--; return; } expressionEdit->setExpressionHasChanged(false); if(!do_mathoperation && !str.empty() && !block_expression_history) expressionEdit->addToHistory(); askDot(str); } } std::string to_str, str_conv; if(execute_str.empty()) { bool double_tag = false; to_str = CALCULATOR->parseComments(str, settings->evalops.parse_options, &double_tag); if(!to_str.empty()) { if(str.empty()) { if(!double_tag && settings->current_result) { expressionEdit->clear(); CALCULATOR->message(MESSAGE_INFORMATION, to_str.c_str(), NULL); historyView->addMessages(); b_busy--; return; } execute_str = CALCULATOR->getFunctionById(FUNCTION_ID_MESSAGE)->referenceName(); execute_str += "("; if(to_str.find("\"") == std::string::npos) {execute_str += "\""; execute_str += to_str; execute_str += "\"";} else if(to_str.find("\'") == std::string::npos) {execute_str += "\'"; execute_str += to_str; execute_str += "\'";} else execute_str += to_str; execute_str += ")"; } else { CALCULATOR->message(MESSAGE_INFORMATION, to_str.c_str(), NULL); } } // qalc command bool b_command = false; if(!calculate_selection && str[0] == '/' && str.length() > 1) { size_t i = str.find_first_not_of(SPACES, 1); if(i != std::string::npos && (signed char) str[i] > 0 && is_not_in(NUMBER_ELEMENTS OPERATORS, str[i])) { b_command = true; } } if(b_command) { str.erase(0, 1); remove_blank_ends(str); size_t slen = str.length(); size_t ispace = str.find_first_of(SPACES); std::string scom; if(ispace == std::string::npos) { scom = ""; } else { scom = str.substr(1, ispace); } if(equalsIgnoreCase(scom, "convert") || equalsIgnoreCase(scom, "to")) { str = std::string("to") + str.substr(ispace, slen - ispace); b_command = false; } else if((str.length() > 2 && str[0] == '-' && str[1] == '>') || (str.length() > 3 && str[0] == '\xe2' && ((str[1] == '\x86' && str[2] == '\x92') || (str[1] == '\x9e' && (unsigned char) str[2] >= 148 && (unsigned char) str[3] <= 191)))) { b_command = false; } else if(str == "M+" || str == "M-" || str == "M−" || str == "MS" || str == "MC") { b_command = false; } } if(b_command) { remove_blank_ends(str); size_t slen = str.length(); size_t ispace = str.find_first_of(SPACES); std::string scom; if(ispace == std::string::npos) { scom = ""; } else { scom = str.substr(0, ispace); } b_busy--; if(equalsIgnoreCase(scom, "set")) { if(current_expr) setPreviousExpression(); str = str.substr(ispace + 1, slen - (ispace + 1)); setOption(str); } else if(equalsIgnoreCase(scom, "save") || equalsIgnoreCase(scom, "store")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); if(equalsIgnoreCase(str, "mode")) { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); settings->show_bases = basesDock->isVisible(); settings->savePreferences(); if(current_expr) expressionEdit->clear(); } else if(equalsIgnoreCase(str, "definitions")) { if(!CALCULATOR->saveDefinitions()) { QMessageBox::critical(this, tr("Error"), tr("Couldn't write definitions"), QMessageBox::Ok); } else { if(current_expr) expressionEdit->clear(); } } else { std::string name = str, cat, title; if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { name = str.substr(1, i - 1); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { name = str.substr(0, i); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } bool catset = false; if(str.empty()) { cat = CALCULATOR->temporaryCategory(); } else { if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { cat = str.substr(1, i - 1); title = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(title); } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { cat = str.substr(0, i); title = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(title); } } catset = true; } bool b = true; if(!CALCULATOR->variableNameIsValid(name)) { CALCULATOR->error(true, "Illegal name: %s.", name.c_str(), NULL); b = false; } Variable *v = NULL; if(b) v = CALCULATOR->getActiveVariable(name, true); if(b && ((!v && CALCULATOR->variableNameTaken(name)) || (v && (!v->isKnown() || !v->isLocal())))) { CALCULATOR->error(true, "A unit or variable with the same name (%s) already exists.", name.c_str(), NULL); b = false; } if(b) { if(v && v->isLocal() && v->isKnown()) { if(catset) v->setCategory(cat); if(!title.empty()) v->setTitle(title); ((KnownVariable*) v)->set(*mstruct); if(v->countNames() == 0) { ExpressionName ename(name); ename.reference = true; v->setName(ename, 1); } else { v->setName(name, 1); } } else { CALCULATOR->addVariable(new KnownVariable(cat, name, *mstruct, title)); } expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(current_expr) expressionEdit->clear(); variablesMenu->clear(); unitsMenu->clear(); } } } } else if(equalsIgnoreCase(scom, "variable")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); std::string name = str, expr; if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { name = str.substr(1, i - 1); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { name = str.substr(0, i); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } if(str.length() >= 2 && str[0] == '\"' && str[str.length() - 1] == '\"') str = str.substr(1, str.length() - 2); expr = str; bool b = true; if(!CALCULATOR->variableNameIsValid(name)) { CALCULATOR->error(true, "Illegal name: %s.", name.c_str(), NULL); b = false; } Variable *v = NULL; if(b) v = CALCULATOR->getActiveVariable(name, true); if(b && ((!v && CALCULATOR->variableNameTaken(name)) || (v && (!v->isKnown() || !v->isLocal())))) { CALCULATOR->error(true, "A unit or variable with the same name (%s) already exists.", name.c_str(), NULL); b = false; } if(b) { if(v && v->isLocal() && v->isKnown()) { ((KnownVariable*) v)->set(expr); if(v->countNames() == 0) { ExpressionName ename(name); ename.reference = true; v->setName(ename, 1); } else { v->setName(name, 1); } } else { CALCULATOR->addVariable(new KnownVariable("", name, expr)); } expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(current_expr) expressionEdit->clear(); variablesMenu->clear(); unitsMenu->clear(); } } else if(equalsIgnoreCase(scom, "function")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); std::string name = str, expr; if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { name = str.substr(1, i - 1); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { name = str.substr(0, i); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } if(str.length() >= 2 && str[0] == '\"' && str[str.length() - 1] == '\"') str = str.substr(1, str.length() - 2); expr = str; bool b = true; if(!CALCULATOR->functionNameIsValid(name)) { CALCULATOR->error(true, "Illegal name: %s.", name.c_str(), NULL); b = false; } MathFunction *f = CALCULATOR->getActiveFunction(name, true); if(b && ((!f && CALCULATOR->functionNameTaken(name)) || (f && (!f->isLocal() || f->subtype() != SUBTYPE_USER_FUNCTION)))) { CALCULATOR->error(true, "A function with the same name (%s) already exists.", name.c_str(), NULL); b = false; } if(b) { if(expr.find("\\") == std::string::npos) { gsub("x", "\\x", expr); gsub("y", "\\y", expr); gsub("z", "\\z", expr); } if(f && f->isLocal() && f->subtype() == SUBTYPE_USER_FUNCTION) { ((UserFunction*) f)->setFormula(expr); if(f->countNames() == 0) { ExpressionName ename(name); ename.reference = true; f->setName(ename, 1); } else { f->setName(name, 1); } } else { CALCULATOR->addFunction(new UserFunction("", name, expr)); } expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); if(current_expr) expressionEdit->clear(); functionsMenu->clear(); } } else if(equalsIgnoreCase(scom, "delete")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); Variable *v = CALCULATOR->getActiveVariable(str); if(v && v->isLocal()) { v->destroy(); expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(current_expr) expressionEdit->clear(); } else { if(str.length() > 2 && str[str.length() - 2] == '(' && str[str.length() - 1] == ')') str = str.substr(0, str.length() - 2); MathFunction *f = CALCULATOR->getActiveFunction(str); if(f && f->isLocal()) { f->destroy(); expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); functionsMenu->clear(); if(current_expr) expressionEdit->clear(); } else { CALCULATOR->error(true, "No user-defined variable or function with the specified name (%s) exist.", str.c_str(), NULL); } } } else if(equalsIgnoreCase(scom, "keep") || equalsIgnoreCase(scom, "unkeep")) { bool unkeep = equalsIgnoreCase(scom, "unkeep"); str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); Variable *v = CALCULATOR->getActiveVariable(str); bool b = v && v->isLocal(); if(b && (v->category() == CALCULATOR->temporaryCategory()) == !unkeep) { if(unkeep) v->setCategory(CALCULATOR->temporaryCategory()); else v->setCategory(""); expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(current_expr) expressionEdit->clear(); variablesMenu->clear(); unitsMenu->clear(); } else { if(str.length() > 2 && str[str.length() - 2] == '(' && str[str.length() - 1] == ')') str = str.substr(0, str.length() - 2); MathFunction *f = CALCULATOR->getActiveFunction(str); if(f && f->isLocal()) { if((f->category() == CALCULATOR->temporaryCategory()) == !unkeep) { if(unkeep) f->setCategory(CALCULATOR->temporaryCategory()); else f->setCategory(""); expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); if(current_expr) expressionEdit->clear(); functionsMenu->clear(); } } else if(!b) { CALCULATOR->error(true, "No user-defined variable or function with the specified name (%s) exist.", str.c_str(), NULL); } } } else if(equalsIgnoreCase(scom, "base")) { if(current_expr) setPreviousExpression(); setOption(str); } else if(equalsIgnoreCase(scom, "assume")) { if(current_expr) setPreviousExpression(); std::string str2 = "assumptions "; setOption(str2 + str.substr(ispace + 1, slen - (ispace + 1))); } else if(equalsIgnoreCase(scom, "rpn")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); if(equalsIgnoreCase(str, "syntax")) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_RPN; QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); expressionFormatUpdated(false); } else if(equalsIgnoreCase(str, "stack")) { if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } QAction *w = findChild("action_rpnmode"); if(w) w->setChecked(true); } else { int v = s2b(str); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", str.c_str(), NULL); } else if(v) { QAction *w = findChild("action_rpnmode"); if(w) w->setChecked(true); settings->evalops.parse_options.parsing_mode = PARSING_MODE_RPN; expressionFormatUpdated(false); } else { if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); expressionFormatUpdated(false); } } } else if(equalsIgnoreCase(str, "exrates")) { if(current_expr) setPreviousExpression(); fetchExchangeRates(); } else if(equalsIgnoreCase(str, "stack")) { rpnDock->show(); rpnDock->raise(); } else if(equalsIgnoreCase(str, "swap")) { if(CALCULATOR->RPNStackSize() > 1) { rpnView->selectionModel()->clear(); registerSwap(); } } else if(equalsIgnoreCase(scom, "swap")) { if(CALCULATOR->RPNStackSize() > 1) { int index1 = 0, index2 = 0; str = str.substr(ispace + 1, slen - (ispace + 1)); std::string str2 = ""; remove_blank_ends(str); ispace = str.find_first_of(SPACES); if(ispace != std::string::npos) { str2 = str.substr(ispace + 1, str.length() - (ispace + 1)); str = str.substr(0, ispace); remove_blank_ends(str2); remove_blank_ends(str); } index1 = s2i(str); if(str2.empty()) index2 = 1; else index2 = s2i(str2); if(index1 < 0) index1 = (int) CALCULATOR->RPNStackSize() + 1 + index1; if(index2 < 0) index2 = (int) CALCULATOR->RPNStackSize() + 1 + index2; if(index1 <= 0 || index1 > (int) CALCULATOR->RPNStackSize() || (!str2.empty() && (index2 <= 0 || index2 > (int) CALCULATOR->RPNStackSize()))) { CALCULATOR->error(true, "Missing stack index: %s.", i2s(index1).c_str(), NULL); } else if(index2 != 1 && index1 != 1) { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } else if(index1 != index2) { if(index1 == 1) index1 = index2; QTableWidgetItem *item = rpnView->item(index1 - 1, 0); if(item) { rpnView->selectionModel()->clear(); item->setSelected(true); registerSwap(); } } } } else if(equalsIgnoreCase(scom, "move")) { CALCULATOR->error(true, "Unsupported command: %s.", scom.c_str(), NULL); } else if(equalsIgnoreCase(str, "rotate")) { if(CALCULATOR->RPNStackSize() > 1) { rpnView->selectionModel()->clear(); registerDown(); } } else if(equalsIgnoreCase(scom, "rotate")) { if(CALCULATOR->RPNStackSize() > 1) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); if(equalsIgnoreCase(str, "up")) { rpnView->selectionModel()->clear(); registerUp(); } else if(equalsIgnoreCase(str, "down")) { rpnView->selectionModel()->clear(); registerDown(); } else { CALCULATOR->error(true, "Illegal value: %s.", str.c_str(), NULL); } } } else if(equalsIgnoreCase(str, "copy")) { if(CALCULATOR->RPNStackSize() > 0) { rpnView->selectionModel()->clear(); copyRegister(); } } else if(equalsIgnoreCase(scom, "copy")) { if(CALCULATOR->RPNStackSize() > 0) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); int index1 = s2i(str); if(index1 < 0) index1 = (int) CALCULATOR->RPNStackSize() + 1 + index1; if(index1 <= 0 || index1 > (int) CALCULATOR->RPNStackSize()) { CALCULATOR->error(true, "Missing stack index: %s.", i2s(index1).c_str(), NULL); } else { QTableWidgetItem *item = rpnView->item(index1 - 1, 0); if(item) { rpnView->selectionModel()->clear(); item->setSelected(true); copyRegister(); } } } } else if(equalsIgnoreCase(str, "clear stack")) { if(CALCULATOR->RPNStackSize() > 0) clearStack(); } else if(equalsIgnoreCase(str, "pop")) { if(CALCULATOR->RPNStackSize() > 0) { rpnView->selectionModel()->clear(); deleteRegister(); } } else if(equalsIgnoreCase(scom, "pop")) { if(CALCULATOR->RPNStackSize() > 0) { str = str.substr(ispace + 1, slen - (ispace + 1)); int index1 = s2i(str); if(index1 < 0) index1 = (int) CALCULATOR->RPNStackSize() + 1 + index1; if(index1 <= 0 || index1 > (int) CALCULATOR->RPNStackSize()) { CALCULATOR->error(true, "Missing stack index: %s.", i2s(index1).c_str(), NULL); } else { QTableWidgetItem *item = rpnView->item(index1 - 1, 0); if(item) { rpnView->selectionModel()->clear(); item->setSelected(true); deleteRegister(); } } } } else if(equalsIgnoreCase(str, "factor")) { if(current_expr) setPreviousExpression(); executeCommand(COMMAND_FACTORIZE); } else if(equalsIgnoreCase(str, "partial fraction")) { if(current_expr) setPreviousExpression(); executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); } else if(equalsIgnoreCase(str, "simplify") || equalsIgnoreCase(str, "expand")) { if(current_expr) setPreviousExpression(); executeCommand(COMMAND_EXPAND); } else if(equalsIgnoreCase(str, "exact")) { if(current_expr) setPreviousExpression(); setOption("approx exact"); } else if(equalsIgnoreCase(str, "approximate") || str == "approx") { if(current_expr) setPreviousExpression(); setOption("approx try exact"); } else if(equalsIgnoreCase(str, "mode")) { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } else if(equalsIgnoreCase(str, "help") || str == "?") { help(); if(current_expr) expressionEdit->clear(); } else if(equalsIgnoreCase(str, "list")) { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } else if(equalsIgnoreCase(scom, "list") || equalsIgnoreCase(scom, "find") || equalsIgnoreCase(scom, "info") || equalsIgnoreCase(scom, "help")) { str = str.substr(ispace + 1); remove_blank_ends(str); char list_type = 0; if(equalsIgnoreCase(scom, "list") || equalsIgnoreCase(scom, "find")) { size_t i = str.find_first_of(SPACES); std::string str1, str2; if(i == std::string::npos) { str1 = str; } else { str1 = str.substr(0, i); str2 = str.substr(i + 1); remove_blank_ends(str2); } if(equalsIgnoreCase(str1, "currencies")) list_type = 'c'; else if(equalsIgnoreCase(str1, "functions")) list_type = 'f'; else if(equalsIgnoreCase(str1, "variables")) list_type = 'v'; else if(equalsIgnoreCase(str1, "units")) list_type = 'u'; else if(equalsIgnoreCase(str1, "prefixes")) list_type = 'p'; if(list_type == 'c') { openUnits(); unitsDialog->selectCategory(CALCULATOR->getUnitById(UNIT_ID_EURO)->category()); unitsDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'f') { openFunctions(); functionsDialog->selectCategory("All"); functionsDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'v') { openVariables(); variablesDialog->selectCategory("All"); variablesDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'u') { openUnits(); unitsDialog->selectCategory("All"); unitsDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'p') { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } } if(list_type == 0) { ExpressionItem *item = CALCULATOR->getActiveExpressionItem(str); if(item) { if(item->type() == TYPE_UNIT) { openUnits(); unitsDialog->selectCategory("All"); unitsDialog->setSearch(QString::fromStdString(str)); } else if(item->type() == TYPE_FUNCTION) { openFunctions(); functionsDialog->selectCategory("All"); functionsDialog->setSearch(QString::fromStdString(str)); } else if(item->type() == TYPE_VARIABLE) { openVariables(); variablesDialog->selectCategory("All"); variablesDialog->setSearch(QString::fromStdString(str)); } if(current_expr) expressionEdit->clear(); } else { CALCULATOR->error(true, "No function, variable, or unit with the specified name (%s) was found.", str.c_str(), NULL); } } else { if(current_expr) expressionEdit->clear(); } } else if(equalsIgnoreCase(str, "clear history")) { historyView->editClear(); expressionEdit->clearHistory(); } else if(equalsIgnoreCase(str, "clear")) { expressionEdit->clear(); } else if(equalsIgnoreCase(str, "quit") || equalsIgnoreCase(str, "exit")) { qApp->closeAllWindows(); return; } else { CALCULATOR->error(true, "Unknown command: %s.", str.c_str(), NULL); } displayMessages(); return; } } if(execute_str.empty() && !calculate_selection) { if(str == "MC") { b_busy--; if(current_expr) setPreviousExpression(); onMCClicked(); return; } else if(str == "MS") { b_busy--; if(current_expr) setPreviousExpression(); onMSClicked(); return; } else if(str == "M+") { b_busy--; if(current_expr) setPreviousExpression(); onMPlusClicked(); return; } else if(str == "M-" || str == "M−") { b_busy--; if(current_expr) setPreviousExpression(); onMMinusClicked(); return; } } ComplexNumberForm cnf_bak = settings->evalops.complex_number_form; ComplexNumberForm cnf = settings->evalops.complex_number_form; bool delay_complex = false; bool b_units_saved = settings->evalops.parse_options.units_enabled; AutoPostConversion save_auto_post_conversion = settings->evalops.auto_post_conversion; MixedUnitsConversion save_mixed_units_conversion = settings->evalops.mixed_units_conversion; had_to_expression = false; std::string from_str = str; bool last_is_space = !from_str.empty() && is_in(SPACES, from_str[from_str.length() - 1]); if(execute_str.empty() && CALCULATOR->separateToExpression(from_str, to_str, settings->evalops, true, !do_stack && !calculate_selection)) { remove_duplicate_blanks(to_str); had_to_expression = true; std::string str_left; std::string to_str1, to_str2; bool do_to = false; while(true) { if(!from_str.empty()) { if(last_is_space) to_str += " "; CALCULATOR->separateToExpression(to_str, str_left, settings->evalops, true, false); remove_blank_ends(to_str); } else if(!settings->current_result) { b_busy--; if(current_expr) setPreviousExpression(); return; } size_t ispace = to_str.find_first_of(SPACES); if(ispace != std::string::npos) { to_str1 = to_str.substr(0, ispace); remove_blank_ends(to_str1); to_str2 = to_str.substr(ispace + 1); remove_blank_ends(to_str2); } if(equalsIgnoreCase(to_str, "hex") || equalsIgnoreCase(to_str, "hexadecimal") || equalsIgnoreCase(to_str, tr("hexadecimal").toStdString())) { to_base = BASE_HEXADECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "oct") || equalsIgnoreCase(to_str, "octal") || equalsIgnoreCase(to_str, tr("octal").toStdString())) { to_base = BASE_OCTAL; do_to = true; } else if(equalsIgnoreCase(to_str, "dec") || equalsIgnoreCase(to_str, "decimal") || equalsIgnoreCase(to_str, tr("decimal").toStdString())) { to_base = BASE_DECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "duo") || equalsIgnoreCase(to_str, "duodecimal") || equalsIgnoreCase(to_str, tr("duodecimal").toStdString())) { to_base = BASE_DUODECIMAL; to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "doz") || equalsIgnoreCase(to_str, "dozenal")) { to_base = BASE_DUODECIMAL; to_duo_syms = true; do_to = true; } else if(equalsIgnoreCase(to_str, "bin") || equalsIgnoreCase(to_str, "binary") || equalsIgnoreCase(to_str, tr("binary").toStdString())) { to_base = BASE_BINARY; do_to = true; } else if(equalsIgnoreCase(to_str, "roman") || equalsIgnoreCase(to_str, tr("roman").toStdString())) { to_base = BASE_ROMAN_NUMERALS; do_to = true; } else if(equalsIgnoreCase(to_str, "bijective") || equalsIgnoreCase(to_str, tr("bijective").toStdString())) { to_base = BASE_BIJECTIVE_26; do_to = true; } else if(equalsIgnoreCase(to_str, "bcd")) { to_base = BASE_BINARY_DECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa") || equalsIgnoreCase(to_str, "sexagesimal") || equalsIgnoreCase(to_str, tr("sexagesimal").toStdString())) { to_base = BASE_SEXAGESIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa2") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "2")) { to_base = BASE_SEXAGESIMAL_2; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa3") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "3")) { to_base = BASE_SEXAGESIMAL_3; do_to = true; } else if(equalsIgnoreCase(to_str, "latitude") || equalsIgnoreCase(to_str, tr("latitude").toStdString())) { to_base = BASE_LATITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "latitude", tr("latitude"), "2")) { to_base = BASE_LATITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "longitude") || equalsIgnoreCase(to_str, tr("longitude").toStdString())) { to_base = BASE_LONGITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "longitude", tr("longitude"), "2")) { to_base = BASE_LONGITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "fp32") || equalsIgnoreCase(to_str, "binary32") || equalsIgnoreCase(to_str, "float")) { to_base = BASE_FP32; do_to = true; } else if(equalsIgnoreCase(to_str, "fp64") || equalsIgnoreCase(to_str, "binary64") || equalsIgnoreCase(to_str, "double")) { to_base = BASE_FP64; do_to = true; } else if(equalsIgnoreCase(to_str, "fp16") || equalsIgnoreCase(to_str, "binary16")) { to_base = BASE_FP16; do_to = true; } else if(equalsIgnoreCase(to_str, "fp80")) { to_base = BASE_FP80; do_to = true; } else if(equalsIgnoreCase(to_str, "fp128") || equalsIgnoreCase(to_str, "binary128")) { to_base = BASE_FP128; do_to = true; } else if(equalsIgnoreCase(to_str, "time") || equalsIgnoreCase(to_str, tr("time").toStdString())) { to_base = BASE_TIME; do_to = true; } else if(equalsIgnoreCase(to_str, "Unicode")) { to_base = BASE_UNICODE; do_to = true; } else if(equalsIgnoreCase(to_str, "utc") || equalsIgnoreCase(to_str, "gmt")) { settings->printops.time_zone = TIME_ZONE_UTC; if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); settings->printops.time_zone = TIME_ZONE_LOCAL; return; } do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "bin") && is_in(NUMBERS, to_str[3])) { to_base = BASE_BINARY; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "hex") && is_in(NUMBERS, to_str[3])) { to_base = BASE_HEXADECIMAL; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && (equalsIgnoreCase(to_str.substr(0, 3), "utc") || equalsIgnoreCase(to_str.substr(0, 3), "gmt"))) { to_str = to_str.substr(3); remove_blanks(to_str); bool b_minus = false; if(to_str[0] == '+') { to_str.erase(0, 1); } else if(to_str[0] == '-') { b_minus = true; to_str.erase(0, 1); } else if(to_str.find(SIGN_MINUS) == 0) { b_minus = true; to_str.erase(0, strlen(SIGN_MINUS)); } unsigned int tzh = 0, tzm = 0; int itz = 0; if(!to_str.empty() && sscanf(to_str.c_str(), "%2u:%2u", &tzh, &tzm) > 0) { itz = tzh * 60 + tzm; if(b_minus) itz = -itz; } else { CALCULATOR->error(true, tr("Time zone parsing failed.").toUtf8().data(), NULL); } settings->printops.time_zone = TIME_ZONE_CUSTOM; settings->printops.custom_time_zone = itz; if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); settings->printops.time_zone = TIME_ZONE_LOCAL; return; } do_to = true; } else if(to_str == "CET") { settings->printops.time_zone = TIME_ZONE_CUSTOM; settings->printops.custom_time_zone = 60; if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); settings->printops.time_zone = TIME_ZONE_LOCAL; return; } do_to = true; } else if(equalsIgnoreCase(to_str, "bases") || equalsIgnoreCase(to_str, tr("bases").toStdString())) { if(from_str.empty()) { b_busy--; if(current_expr) setPreviousExpression(); onBasesActivated(true); return; } do_bases = true; execute_str = from_str; } else if(equalsIgnoreCase(to_str, "calendars") || equalsIgnoreCase(to_str, tr("calendars").toStdString())) { if(from_str.empty()) { b_busy--; if(current_expr) setPreviousExpression(); openCalendarConversion(); return; } do_calendars = true; execute_str = from_str; } else if(equalsIgnoreCase(to_str, "rectangular") || equalsIgnoreCase(to_str, "cartesian") || equalsIgnoreCase(to_str, tr("rectangular").toStdString()) || equalsIgnoreCase(to_str, tr("cartesian").toStdString())) { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_RECTANGULAR; } else if(equalsIgnoreCase(to_str, "exponential") || equalsIgnoreCase(to_str, tr("exponential").toStdString())) { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_EXPONENTIAL; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_EXPONENTIAL; } else if(equalsIgnoreCase(to_str, "polar") || equalsIgnoreCase(to_str, tr("polar").toStdString())) { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_POLAR; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_POLAR; } else if(to_str == "cis") { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_CIS; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "phasor") || equalsIgnoreCase(to_str, tr("phasor").toStdString()) || equalsIgnoreCase(to_str, "angle") || equalsIgnoreCase(to_str, tr("angle").toStdString())) { to_caf = 1; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_CIS; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "optimal") || equalsIgnoreCase(to_str, tr("optimal").toStdString())) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_CONVERT_OPTIMAL); if(current_expr) setPreviousExpression(); return; } settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_OPTIMAL_SI; str_conv = ""; do_to = true; } else if(equalsIgnoreCase(to_str, "prefix") || equalsIgnoreCase(to_str, tr("prefix").toStdString())) { settings->evalops.parse_options.units_enabled = true; to_prefix = 1; do_to = true; } else if(equalsIgnoreCase(to_str, "base") || equalsIgnoreCase(to_str, tr("base").toStdString())) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_CONVERT_BASE); if(current_expr) setPreviousExpression(); return; } settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_BASE; str_conv = ""; do_to = true; } else if(equalsIgnoreCase(to_str, "mixed") || equalsIgnoreCase(to_str, tr("mixed").toStdString())) { settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_NONE; settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_FORCE_INTEGER; if(from_str.empty()) { b_busy--; if(!previous_expression.empty()) calculateExpression(force, do_mathoperation, op, f, do_stack, stack_index, previous_expression); if(current_expr) setPreviousExpression(); settings->evalops.auto_post_conversion = save_auto_post_conversion; settings->evalops.mixed_units_conversion = save_mixed_units_conversion; settings->evalops.parse_options.units_enabled = b_units_saved; return; } do_to = true; } else if(equalsIgnoreCase(to_str, "factors") || equalsIgnoreCase(to_str, tr("factors").toStdString()) || equalsIgnoreCase(to_str, "factor")) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_FACTORIZE); if(current_expr) setPreviousExpression(); return; } do_factors = true; execute_str = from_str; } else if(equalsIgnoreCase(to_str, "partial fraction") || equalsIgnoreCase(to_str, tr("partial fraction").toStdString())) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); if(current_expr) setPreviousExpression(); return; } do_pfe = true; execute_str = from_str; } else if(equalsIgnoreCase(to_str1, "base") || equalsIgnoreCase(to_str1, tr("base").toStdString())) { base_from_string(to_str2, to_base, to_nbase); to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "decimals") || equalsIgnoreCase(to_str, tr("decimals").toStdString())) { to_fixed_fraction = 0; to_fraction = 3; do_to = true; } else { do_to = true; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(to_str), to_fraction, tr("fraction")); if(fden != 0) { if(fden < 0) to_fixed_fraction = 0; else to_fixed_fraction = fden; } else if(from_str.empty()) { b_busy--; executeCommand(COMMAND_CONVERT_STRING, true, CALCULATOR->unlocalizeExpression(to_str, settings->evalops.parse_options)); if(current_expr) setPreviousExpression(); return; } else { if(to_str[0] == '?') { to_prefix = 1; } else if(to_str.length() > 1 && to_str[1] == '?' && (to_str[0] == 'b' || to_str[0] == 'a' || to_str[0] == 'd')) { to_prefix = to_str[0]; } Unit *u = CALCULATOR->getActiveUnit(to_str); if(delay_complex != (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS) && u && u->baseUnit() == CALCULATOR->getRadUnit() && u->baseExponent() == 1) delay_complex = !delay_complex; if(!str_conv.empty()) str_conv += " to "; str_conv += to_str; } } if(str_left.empty()) break; to_str = str_left; } if(do_to) { if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); return; } else { execute_str = from_str; if(!str_conv.empty()) { execute_str += " to "; execute_str += str_conv; } } } } if(!delay_complex || (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS)) { settings->evalops.complex_number_form = cnf; delay_complex = false; } else { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; } if(execute_str.empty()) { size_t i = str.find_first_of(SPACES); if(i != std::string::npos) { to_str = str.substr(0, i); if(to_str == "factor" || equalsIgnoreCase(to_str, "factorize") || equalsIgnoreCase(to_str, tr("factorize").toStdString())) { execute_str = str.substr(i + 1); do_factors = true; } else if(equalsIgnoreCase(to_str, "expand") || equalsIgnoreCase(to_str, tr("expand").toStdString())) { execute_str = str.substr(i + 1); do_expand = true; } } } size_t stack_size = 0; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); parsed_tostruct->setUndefined(); CALCULATOR->resetExchangeRatesUsed(); CALCULATOR->setSimplifiedPercentageUsed(false); if(do_stack) { stack_size = CALCULATOR->RPNStackSize(); if(do_mathoperation && f) { CALCULATOR->getRPNRegister(stack_index + 1)->transform(f); parsed_mstruct->set(*CALCULATOR->getRPNRegister(stack_index + 1)); CALCULATOR->calculateRPNRegister(stack_index + 1, 0, settings->evalops); } else { CALCULATOR->setRPNRegister(stack_index + 1, CALCULATOR->unlocalizeExpression(execute_str.empty() ? str : execute_str, settings->evalops.parse_options), 0, settings->evalops, parsed_mstruct, parsed_tostruct); } } else if(settings->rpn_mode) { stack_size = CALCULATOR->RPNStackSize(); if(do_mathoperation) { if(mstruct) { lastx = *mstruct; QTableWidgetItem *item = rpnView->item(0, 0); if(item) lastx_text = item->text(); } rpnLastxAction->setEnabled(true); if(f) CALCULATOR->calculateRPN(f, 0, settings->evalops, parsed_mstruct); else CALCULATOR->calculateRPN(op, 0, settings->evalops, parsed_mstruct); } else { std::string str2 = CALCULATOR->unlocalizeExpression(execute_str.empty() ? str : execute_str, settings->evalops.parse_options); transform_expression_for_equals_save(str2, settings->evalops.parse_options); CALCULATOR->parseSigns(str2); remove_blank_ends(str2); MathStructure lastx_bak(lastx); if(mstruct) lastx = *mstruct; if(str2.length() == 1) { do_mathoperation = true; switch(str2[0]) { case 'E': {CALCULATOR->calculateRPN(OPERATION_EXP10, 0, settings->evalops, parsed_mstruct); break;} case '^': {CALCULATOR->calculateRPN(OPERATION_RAISE, 0, settings->evalops, parsed_mstruct); break;} case '+': {CALCULATOR->calculateRPN(OPERATION_ADD, 0, settings->evalops, parsed_mstruct); break;} case '-': {CALCULATOR->calculateRPN(OPERATION_SUBTRACT, 0, settings->evalops, parsed_mstruct); break;} case '*': {CALCULATOR->calculateRPN(OPERATION_MULTIPLY, 0, settings->evalops, parsed_mstruct); break;} case '/': {CALCULATOR->calculateRPN(OPERATION_DIVIDE, 0, settings->evalops, parsed_mstruct); break;} case '&': {CALCULATOR->calculateRPN(OPERATION_BITWISE_AND, 0, settings->evalops, parsed_mstruct); break;} case '|': {CALCULATOR->calculateRPN(OPERATION_BITWISE_OR, 0, settings->evalops, parsed_mstruct); break;} case '~': {CALCULATOR->calculateRPNBitwiseNot(0, settings->evalops, parsed_mstruct); break;} case '!': {CALCULATOR->calculateRPN(CALCULATOR->getFunctionById(FUNCTION_ID_FACTORIAL), 0, settings->evalops, parsed_mstruct); break;} case '>': {CALCULATOR->calculateRPN(OPERATION_GREATER, 0, settings->evalops, parsed_mstruct); break;} case '<': {CALCULATOR->calculateRPN(OPERATION_LESS, 0, settings->evalops, parsed_mstruct); break;} case '=': {CALCULATOR->calculateRPN(OPERATION_EQUALS, 0, settings->evalops, parsed_mstruct); break;} case '\\': { MathFunction *fdiv = CALCULATOR->getActiveFunction("div"); if(fdiv) { CALCULATOR->calculateRPN(fdiv, 0, settings->evalops, parsed_mstruct); break; } do_mathoperation = false; break; } default: {do_mathoperation = false;} } } else if(str2.length() == 2) { if(str2 == "**") { CALCULATOR->calculateRPN(OPERATION_RAISE, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "!!") { CALCULATOR->calculateRPN(CALCULATOR->getFunctionById(FUNCTION_ID_DOUBLE_FACTORIAL), 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "!=" || str == "=!" || str == "<>") { CALCULATOR->calculateRPN(OPERATION_NOT_EQUALS, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "<=" || str == "=<") { CALCULATOR->calculateRPN(OPERATION_EQUALS_LESS, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == ">=" || str == "=>") { CALCULATOR->calculateRPN(OPERATION_EQUALS_GREATER, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "==") { CALCULATOR->calculateRPN(OPERATION_EQUALS, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "&&") { CALCULATOR->calculateRPN(OPERATION_LOGICAL_AND, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "||") { CALCULATOR->calculateRPN(OPERATION_LOGICAL_OR, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "//") { MathFunction *fdiv = CALCULATOR->getActiveFunction("div"); if(fdiv) { CALCULATOR->calculateRPN(fdiv, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } } } else if(str2.length() == 3) { if(str2 == "⊻") { CALCULATOR->calculateRPN(OPERATION_BITWISE_XOR, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } } if(!do_mathoperation) { bool had_nonnum = false, test_function = true; int in_par = 0; for(size_t i = 0; i < str2.length(); i++) { if(is_in(NUMBERS, str2[i])) { if(!had_nonnum || in_par) { test_function = false; break; } } else if(str2[i] == '(') { if(in_par || !had_nonnum) { test_function = false; break; } in_par = i; } else if(str2[i] == ')') { if(i != str2.length() - 1) { test_function = false; break; } } else if(str2[i] == ' ') { if(!in_par) { test_function = false; break; } } else if(is_in(NOT_IN_NAMES, str2[i])) { test_function = false; break; } else { if(in_par) { test_function = false; break; } had_nonnum = true; } } f = NULL; if(test_function) { if(in_par) f = CALCULATOR->getActiveFunction(str2.substr(0, in_par)); else f = CALCULATOR->getActiveFunction(str2); } if(f && f->minargs() > 0) { do_mathoperation = true; original_expression = ""; CALCULATOR->calculateRPN(f, 0, settings->evalops, parsed_mstruct); } else { original_expression = str2; CALCULATOR->RPNStackEnter(str2, 0, settings->evalops, parsed_mstruct, parsed_tostruct); } } if(do_mathoperation) { rpnLastxAction->setEnabled(true); QTableWidgetItem *item = rpnView->item(0, 0); if(item) lastx_text = item->text(); } else lastx = lastx_bak; } } else { original_expression = CALCULATOR->unlocalizeExpression(execute_str.empty() ? str : execute_str, settings->evalops.parse_options); transform_expression_for_equals_save(original_expression, settings->evalops.parse_options); CALCULATOR->calculate(mstruct, original_expression, 0, settings->evalops, parsed_mstruct, parsed_tostruct); } bool title_set = false, was_busy = false; QProgressDialog *dialog = NULL; int i = 0; while(CALCULATOR->busy() && i < 50) { sleep_ms(10); i++; } i = 0; if(CALCULATOR->busy() && !was_busy) { if(!do_stack && updateWindowTitle(tr("Calculating…"))) title_set = true; dialog = new QProgressDialog(tr("Calculating…"), tr("Cancel"), 0, 0, this); dialog->setWindowTitle(tr("Calculating…")); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); was_busy = true; } while(CALCULATOR->busy()) { qApp->processEvents(); sleep_ms(100); } if(was_busy) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); if(title_set) updateWindowTitle(); } if(delay_complex) { settings->evalops.complex_number_form = cnf; CALCULATOR->startControl(100); if(!settings->rpn_mode) { if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mstruct->complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mstruct->complexToPolarForm(settings->evalops); } else if(!do_stack) { MathStructure *mreg = CALCULATOR->getRPNRegister(do_stack ? stack_index + 1 : 1); if(mreg) { if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mreg->complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mreg->complexToPolarForm(settings->evalops); } } CALCULATOR->stopControl(); } if(settings->rpn_mode && !do_stack) { mstruct->unref(); mstruct = CALCULATOR->getRPNRegister(1); if(!mstruct) mstruct = new MathStructure(); else mstruct->ref(); settings->current_result = NULL; } if(do_stack) { } else if(settings->rpn_mode && do_mathoperation) { result_text = tr("RPN Operation").toStdString(); } else { result_text = str; } settings->printops.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); if(settings->rpn_mode && stack_index == 0) { expressionEdit->clear(); while(CALCULATOR->RPNStackSize() < stack_size) { RPNRegisterRemoved(1); stack_size--; } if(CALCULATOR->RPNStackSize() > stack_size) { RPNRegisterAdded(""); } } if(settings->rpn_mode && do_mathoperation && parsed_tostruct && !parsed_tostruct->isUndefined() && parsed_tostruct->isSymbolic()) { mstruct->set(CALCULATOR->convert(*mstruct, parsed_tostruct->symbol(), settings->evalops)); } // Always perform conversion to optimal (SI) unit when the expression is a number multiplied by a unit and input equals output if(!settings->rpn_mode && (!parsed_tostruct || parsed_tostruct->isUndefined()) && execute_str.empty() && !had_to_expression && (settings->evalops.approximation == APPROXIMATION_EXACT || settings->evalops.auto_post_conversion == POST_CONVERSION_OPTIMAL || settings->evalops.auto_post_conversion == POST_CONVERSION_NONE) && parsed_mstruct && mstruct) { convert_unchanged_quantity_with_unit(*parsed_mstruct, *mstruct, settings->evalops); } if(!do_mathoperation && (askTC(*parsed_mstruct) || askSinc(*parsed_mstruct) || askSinc(*mstruct) || askPercent() || (check_exrates && settings->checkExchangeRates(this)))) { b_busy--; calculateExpression(force, do_mathoperation, op, f, settings->rpn_mode, stack_index, saved_execute_str, str, false, calculate_selection); settings->evalops.complex_number_form = cnf_bak; settings->evalops.auto_post_conversion = save_auto_post_conversion; settings->evalops.parse_options.units_enabled = b_units_saved; settings->evalops.mixed_units_conversion = save_mixed_units_conversion; settings->printops.time_zone = TIME_ZONE_LOCAL; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); return; } //update "ans" variables if(stack_index == 0) { MathStructure m4(settings->vans[3]->get()); m4.replace(settings->vans[4], settings->vans[4]->get()); settings->vans[4]->set(m4); MathStructure m3(settings->vans[2]->get()); m3.replace(settings->vans[3], settings->vans[4]); settings->vans[3]->set(m3); MathStructure m2(settings->vans[1]->get()); m2.replace(settings->vans[2], settings->vans[3]); settings->vans[2]->set(m2); MathStructure m1(settings->vans[0]->get()); m1.replace(settings->vans[1], settings->vans[2]); settings->vans[1]->set(m1); mstruct->replace(settings->vans[0], settings->vans[1]); if(is_equation_solutions(*mstruct)) { if(mstruct->isLogicalAnd()) { for(size_t i = 0; i < mstruct->size(); i++) { if((*mstruct)[i].comparisonType() == COMPARISON_EQUALS) { settings->vans[0]->set((*mstruct)[i][1]); break; } } } else if(mstruct->isLogicalOr()) { MathStructure m(*mstruct); m.setType(STRUCT_VECTOR); for(size_t i = 0; i < m.size(); i++) { if(m[i].isLogicalAnd()) { for(size_t i2 = 0; i2 < m[i].size(); i2++) { if(m[i][i2].comparisonType() == COMPARISON_EQUALS) { m[i].setToChild(i2 + 1); break; } } m[i].setToChild(2); } else { m[i].setToChild(2); } } settings->vans[0]->set(m); } else { settings->vans[0]->set((*mstruct)[1]); } } else { settings->vans[0]->set(*mstruct); } } mstruct_exact.setUndefined(); if((!settings->rpn_mode || (!do_stack && !do_mathoperation)) && (!do_calendars || !mstruct->isDateTime()) && (settings->dual_approximation > 0 || settings->printops.base == BASE_DECIMAL) && !do_bases) { long int i_timeleft = 0; i_timeleft = mstruct->containsType(STRUCT_COMPARISON) ? 2000 : 1000; if(i_timeleft > 0) { if(delay_complex) settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; calculate_dual_exact(mstruct_exact, mstruct, original_expression, parsed_mstruct, settings->evalops, settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_approximation > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), i_timeleft, -1); if(delay_complex && !mstruct_exact.isUndefined()) { settings->evalops.complex_number_form = cnf; CALCULATOR->startControl(100); if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mstruct_exact.complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mstruct_exact.complexToPolarForm(settings->evalops); CALCULATOR->stopControl(); } } } b_busy--; if(do_factors || do_pfe || do_expand) { if(do_stack && stack_index != 0) { MathStructure *save_mstruct = mstruct; mstruct = CALCULATOR->getRPNRegister(stack_index + 1); if(do_factors && (mstruct->isNumber() || mstruct->isVector()) && to_fraction == 0 && to_fixed_fraction < 2) to_fraction = 2; executeCommand(do_pfe ? COMMAND_EXPAND_PARTIAL_FRACTIONS : (do_expand ? COMMAND_EXPAND : COMMAND_FACTORIZE), false); mstruct = save_mstruct; } else { if(do_factors && mstruct->isInteger() && !parsed_mstruct->isNumber()) prepend_mstruct = *mstruct; if(do_factors && (mstruct->isNumber() || mstruct->isVector()) && to_fraction == 0 && to_fixed_fraction < 2) to_fraction = 2; executeCommand(do_pfe ? COMMAND_EXPAND_PARTIAL_FRACTIONS : (do_expand ? COMMAND_EXPAND : COMMAND_FACTORIZE), false); if(!prepend_mstruct.isUndefined() && mstruct->isInteger()) prepend_mstruct.setUndefined(); } } if(stack_index == 0) { if(!mstruct_exact.isUndefined()) settings->history_answer.push_back(new MathStructure(mstruct_exact)); settings->history_answer.push_back(new MathStructure(*mstruct)); } if(!do_stack && !calculate_selection) previous_expression = execute_str.empty() ? str : execute_str; setResult(NULL, true, stack_index == 0, true, "", do_stack, stack_index, false, false, calculate_selection); prepend_mstruct.setUndefined(); if(do_bases) onBasesActivated(true); if(do_calendars) openCalendarConversion(); settings->evalops.complex_number_form = cnf_bak; settings->evalops.auto_post_conversion = save_auto_post_conversion; settings->evalops.parse_options.units_enabled = b_units_saved; settings->evalops.mixed_units_conversion = save_mixed_units_conversion; settings->printops.time_zone = TIME_ZONE_LOCAL; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); if(stack_index == 0) { if(unitsDialog && unitsDialog->isVisible()) { Unit *u = CALCULATOR->findMatchingUnit(*mstruct); if(u && !u->category().empty()) { unitsDialog->selectCategory(u->category()); } } if(!calculate_selection) { expressionEdit->blockCompletion(); expressionEdit->blockParseStatus(); if(settings->chain_mode) { if(exact_text == "0" || result_text == "0") expressionEdit->clear(); std::string str = unhtmlize(result_text); if(unicode_length(result_text) < 10000) expressionEdit->setExpression(QString::fromStdString(str)); } else if(settings->replace_expression == CLEAR_EXPRESSION) { expressionEdit->clear(); } else if(settings->replace_expression == REPLACE_EXPRESSION_WITH_RESULT || settings->replace_expression == REPLACE_EXPRESSION_WITH_RESULT_IF_SHORTER) { if(settings->replace_expression == REPLACE_EXPRESSION_WITH_RESULT || (!exact_text.empty() && unicode_length(exact_text) < unicode_length(from_str))) { if(exact_text == "0" || result_text == "0") expressionEdit->clear(); else if(exact_text.empty()) { std::string str = unhtmlize(result_text); if(unicode_length(result_text) < 10000) expressionEdit->setExpression(QString::fromStdString(str)); } else { if(settings->replace_expression != REPLACE_EXPRESSION_WITH_RESULT || unicode_length(exact_text) < 10000) expressionEdit->setExpression(QString::fromStdString(exact_text)); } } else { if(!execute_str.empty()) { from_str = execute_str; CALCULATOR->separateToExpression(from_str, str, settings->evalops, true, true); } expressionEdit->setExpression(QString::fromStdString(from_str)); } } if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->selectAll(); expressionEdit->blockCompletion(false); expressionEdit->blockParseStatus(false); expressionEdit->setExpressionHasChanged(false); } if(settings->autocopy_result) { if(settings->copy_ascii) { std::string str = result_text; if(settings->copy_ascii_without_units) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(str, true))).trimmed()); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(result_text))); qm->setText(QString::fromStdString(unhtmlize(result_text))); qm->setObjectName("history_result"); QApplication::clipboard()->setMimeData(qm); } } if(!do_calendars && calendarConversionDialog && mstruct->isDateTime() && calendarConversionDialog->isVisible()) calendarConversionDialog->setDate(*mstruct->datetime()); if(fpConversionDialog && mstruct->isNumber() && mstruct->number().isReal() && fpConversionDialog->isVisible()) fpConversionDialog->setValue(*mstruct); } if(CALCULATOR->checkSaveFunctionCalled()) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(functionsDialog) functionsDialog->updateFunctions(); unitsMenu->clear(); variablesMenu->clear(); functionsMenu->clear(); } } void CommandThread::run() { enableAsynchronousCancel(); while(true) { int command_type = 0; if(!read(&command_type)) break; void *x = NULL; if(!read(&x) || !x) break; void *x2 = NULL; if(!read(&x2)) break; CALCULATOR->startControl(); EvaluationOptions eo2 = settings->evalops; switch(command_type) { case COMMAND_FACTORIZE: { if(!((MathStructure*) x)->integerFactorize()) { ((MathStructure*) x)->structure(STRUCTURING_FACTORIZE, eo2, true); } if(x2 && !((MathStructure*) x2)->integerFactorize()) { eo2.approximation = APPROXIMATION_EXACT; ((MathStructure*) x2)->structure(STRUCTURING_FACTORIZE, eo2, true); } break; } case COMMAND_EXPAND_PARTIAL_FRACTIONS: { ((MathStructure*) x)->expandPartialFractions(eo2); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->expandPartialFractions(eo2); break; } case COMMAND_EXPAND: { ((MathStructure*) x)->expand(eo2); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->expand(eo2); break; } case COMMAND_CONVERT_STRING: { MathStructure pm_tmp(*parsed_mstruct); ((MathStructure*) x)->set(CALCULATOR->convert(*((MathStructure*) x), command_convert_units_string, eo2, NULL, true, &pm_tmp)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convert(*((MathStructure*) x2), command_convert_units_string, eo2, NULL, true)); break; } case COMMAND_CONVERT_UNIT: { MathStructure pm_tmp(*parsed_mstruct); ((MathStructure*) x)->set(CALCULATOR->convert(*((MathStructure*) x), command_convert_unit, eo2, false, true, true, &pm_tmp)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convert(*((MathStructure*) x2), command_convert_unit, eo2, false, true, true)); break; } case COMMAND_CONVERT_OPTIMAL: { ((MathStructure*) x)->set(CALCULATOR->convertToOptimalUnit(*((MathStructure*) x), eo2, true)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convertToOptimalUnit(*((MathStructure*) x2), eo2, true)); break; } case COMMAND_CONVERT_BASE: { ((MathStructure*) x)->set(CALCULATOR->convertToBaseUnits(*((MathStructure*) x), eo2)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convertToBaseUnits(*((MathStructure*) x2), eo2)); break; } case COMMAND_CALCULATE: { eo2.calculate_functions = false; eo2.sync_units = false; ((MathStructure*) x)->calculatesub(eo2, eo2, true); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->calculatesub(eo2, eo2, true); break; } case COMMAND_EVAL: { ((MathStructure*) x)->eval(eo2); if(x2) ((MathStructure*) x2)->eval(eo2); break; } } b_busy--; CALCULATOR->stopControl(); } } void QalculateWindow::executeCommand(int command_type, bool show_result, std::string ceu_str, Unit *u, int run) { if(run == 1) { if(expressionEdit->expressionHasChanged() && !settings->rpn_mode) { calculateExpression(); } if(b_busy) return; b_busy++; command_aborted = false; if(command_type >= COMMAND_CONVERT_UNIT) { CALCULATOR->resetExchangeRatesUsed(); command_convert_units_string = ceu_str; command_convert_unit = u; } if(command_type == COMMAND_CONVERT_UNIT || command_type == COMMAND_CONVERT_STRING || command_type == COMMAND_CONVERT_BASE || command_type == COMMAND_CONVERT_OPTIMAL) { to_prefix = 0; } } bool title_set = false, was_busy = false; QProgressDialog *dialog = NULL; int i = 0; MathStructure *mfactor = new MathStructure(*mstruct); MathStructure *mfactor2 = NULL; if(!mstruct_exact.isUndefined()) mfactor2 = new MathStructure(mstruct_exact); MathStructure parsebak(*parsed_mstruct); rerun_command: if((!commandThread->running && !commandThread->start()) || !commandThread->write(command_type) || !commandThread->write((void *) mfactor) || !commandThread->write((void *) mfactor2)) { commandThread->cancel(); mfactor->unref(); if(mfactor2) mfactor2->unref(); b_busy--; return; } while(b_busy && commandThread->running && i < 50) { sleep_ms(10); i++; } i = 0; if(!was_busy && b_busy && commandThread->running) { QString progress_str; switch(command_type) { case COMMAND_FACTORIZE: { progress_str = tr("Factorizing…"); break; } case COMMAND_EXPAND_PARTIAL_FRACTIONS: { progress_str = tr("Expanding partial fractions…"); break; } case COMMAND_EXPAND: { progress_str = tr("Expanding…"); break; } case COMMAND_EVAL: { progress_str = tr("Calculating…"); break; } default: { progress_str = tr("Converting…"); break; } } if(updateWindowTitle(progress_str)) title_set = true; dialog = new QProgressDialog(progress_str, tr("Cancel"), 0, 0, this); dialog->setWindowTitle(progress_str); connect(dialog, SIGNAL(canceled()), this, SLOT(abortCommand())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); was_busy = true; } while(b_busy && commandThread->running) { qApp->processEvents(); sleep_ms(100); } if(!commandThread->running) command_aborted = true; if(!command_aborted && run == 1 && command_type >= COMMAND_CONVERT_UNIT && settings->checkExchangeRates(this)) { b_busy++; parsed_mstruct->set(parsebak); mfactor->set(*mstruct); run = 2; goto rerun_command; } if(was_busy) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); if(title_set) updateWindowTitle(); } if(command_type == COMMAND_CONVERT_STRING && !ceu_str.empty()) { if(ceu_str[0] == '?') { to_prefix = 1; } else if(ceu_str.length() > 1 && ceu_str[1] == '?' && (ceu_str[0] == 'b' || ceu_str[0] == 'a' || ceu_str[0] == 'd')) { to_prefix = ceu_str[0]; } } if(!command_aborted) { if(mfactor2) {mstruct_exact.set(*mfactor2); mfactor2->unref();} mstruct->set(*mfactor); mfactor->unref(); switch(command_type) { case COMMAND_FACTORIZE: { settings->printops.allow_factorization = true; break; } case COMMAND_EXPAND: { settings->printops.allow_factorization = false; break; } default: { settings->printops.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); } } if(show_result) { if(!mstruct_exact.isUndefined()) settings->history_answer.push_back(new MathStructure(mstruct_exact)); settings->history_answer.push_back(new MathStructure(*mstruct)); setResult(NULL, true, !parsed_mstruct->equals(parsebak, true, true), true, ""); } } } void QalculateWindow::updateResultBases() { SET_BINARY_BITS if(result_bin.length() == (size_t) binary_bits + (binary_bits / 4) - 1) { QString sbin = ""; sbin += sbin_i; } if(i == 0) break; if(binary_bits <= 32) sbin_i = QString::fromStdString(result_bin); else sbin_i = QString::fromStdString(result_bin.substr(pos, pos > 0 ? 40 : 39)); if(pos == 0) pos = 39; else pos += 40; sbin_i.replace(" ", " "; i2 = sbin_i.length(); } sbin_i += ""; } sbin += "
", sbin_i; int i2 = 0; size_t pos = 0; QString link_color = binEdit->palette().text().color().name(); for(int i = binary_bits; i >= 0; i -= 8) { if(i % 32 == 0 || i == binary_bits) { if(!sbin_i.isEmpty()) { bool inhtml = false; int n = i + 1; for(; i2 >= 0; i2--) { if(sbin_i[i2] == '>') { inhtml = true; } else if(sbin_i[i2] == '<') { inhtml = false; } else if(!inhtml && (sbin_i[i2] == '0' || sbin_i[i2] == '1')) { sbin_i.replace(i2, 1, QStringLiteral("%2").arg(n).arg(sbin_i[i2]).arg(link_color)); n++; } } if(pos > 39) sbin += "
"); sbin_i += "
"; sbin_i += QString::number(i); sbin_i += "
"; binEdit->setText(sbin); } else { binEdit->setText(QString::fromStdString(result_bin)); } octEdit->setText(QString::fromStdString(result_oct)); decEdit->setText(QString::fromStdString(result_dec)); hexEdit->setText(QString::fromStdString(result_hex)); } void QalculateWindow::resultBasesLinkActivated(const QString &s) { size_t n = s.toInt(); n += (n - 1) / 4; if(n > result_bin.length()) return; n = result_bin.length() - n; if(result_bin[n] == '0') result_bin[n] = '1'; else if(result_bin[n] == '1') result_bin[n] = '0'; ParseOptions pa; pa.base = BASE_BINARY; pa.twos_complement = true; PrintOptions po; po.base = settings->evalops.parse_options.base; po.twos_complement = settings->evalops.parse_options.twos_complement; po.min_exp = 0; po.preserve_precision = true; po.base_display = BASE_DISPLAY_NONE; expressionEdit->setPlainText(QString::fromStdString(Number(result_bin, pa).print(po))); } void set_result_bases(const MathStructure &m) { result_bin = ""; result_oct = "", result_dec = "", result_hex = ""; SET_BINARY_BITS if(max_bases.isZero()) {max_bases = 2; max_bases ^= (binary_bits > 128 ? 128 : binary_bits); min_bases = 2; min_bases ^= (binary_bits > 128 ? 64 : binary_bits / 2); min_bases.negate();} if(!CALCULATOR->aborted() && ((m.isNumber() && m.number() < max_bases && m.number() > min_bases) || (m.isNegate() && m[0].isNumber() && m[0].number() < max_bases && m[0].number() > min_bases))) { Number nr; if(m.isNumber()) { nr = m.number(); } else { nr = m[0].number(); nr.negate(); } if(settings->rounding_mode == 2) nr.trunc(); else nr.round(settings->printops.round_halfway_to_even); PrintOptions po = settings->printops; po.is_approximate = NULL; po.show_ending_zeroes = false; po.base_display = BASE_DISPLAY_NORMAL; po.min_exp = 0; po.base = 2; po.binary_bits = binary_bits; result_bin = nr.print(po); if(result_bin.length() > po.binary_bits + (po.binary_bits / 4) && result_bin.find("1") >= po.binary_bits + (po.binary_bits / 4)) result_bin.erase(0, po.binary_bits + (po.binary_bits / 4)); po.base = 8; if(po.binary_bits > 128) po.binary_bits = 128; result_oct = nr.print(po); size_t i = result_oct.find_first_of(NUMBERS); if(i != std::string::npos && result_oct.length() > i + 1 && result_oct[i] == '0' && is_in(NUMBERS, result_oct[i + 1])) result_oct.erase(i, 1); po.base = 10; result_dec = nr.print(po); po.base = 16; result_hex = nr.print(po); gsub("0x", "", result_hex); size_t l = result_hex.length(); size_t i_after_minus = 0; if(nr.isNegative()) { if(l > 1 && result_hex[0] == '-') i_after_minus = 1; else if(result_hex.find("−") == 0) i_after_minus = strlen("−"); } for(int i = (int) l - 2; i > (int) i_after_minus; i -= 2) { result_hex.insert(i, 1, ' '); } if(result_hex.length() > i_after_minus + 1 && result_hex[i_after_minus + 1] == ' ') result_hex.insert(i_after_minus, 1, '0'); } } bool contains_plot_or_save(const std::string &str) { if(expression_contains_save_function(CALCULATOR->unlocalizeExpression(str, settings->evalops.parse_options), settings->evalops.parse_options, false)) return true; MathFunction *f = CALCULATOR->getFunctionById(FUNCTION_ID_PLOT); for(size_t i = 1; f && i <= f->countNames(); i++) { if(str.find(f->getName(i).name) != std::string::npos) return true; } return false; } void QalculateWindow::onExpressionChanged() { toAction_t->setEnabled(expressionEdit->expressionHasChanged() || !settings->history_answer.empty()); if(!basesDock->isVisible()) return; if(!expressionEdit->expressionHasChanged()) { if(!result_bin.empty() && !bases_is_result && expressionEdit->document()->isEmpty()) { set_result_bases(m_zero); bases_is_result = false; updateResultBases(); } return; } MathStructure m; EvaluationOptions eo = settings->evalops; eo.structuring = STRUCTURING_NONE; eo.mixed_units_conversion = MIXED_UNITS_CONVERSION_NONE; eo.auto_post_conversion = POST_CONVERSION_NONE; eo.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; eo.expand = -2; CALCULATOR->beginTemporaryStopMessages(); bases_is_result = false; std::string str = expressionEdit->toPlainText().toStdString(); if(contains_plot_or_save(str) || !CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(str, eo.parse_options), 100, eo)) { result_bin = ""; result_oct = "", result_dec = "", result_hex = ""; } else { set_result_bases(m); } CALCULATOR->endTemporaryStopMessages(); updateResultBases(); } void QalculateWindow::onHistoryReloaded() { if(settings->status_in_history && settings->display_expression_status) { historyView->clearTemporary(); auto_expression = ""; mauto.setAborted(); auto_error = false; if(autoCalculateTimer) autoCalculateTimer->stop(); if(!settings->status_in_history) updateWindowTitle(QString::fromStdString(unhtmlize(result_text)), true); if(expressionEdit->expressionHasChanged()) expressionEdit->displayParseStatus(true); } } void QalculateWindow::onStatusChanged(QString status, bool is_expression, bool had_error, bool had_warning, bool expression_from_history) { if(!settings->status_in_history || settings->rpn_mode) return; std::string current_text = expressionEdit->toPlainText().trimmed().toStdString(); bool last_op = false; if(expressionEdit->textCursor().atEnd()) last_op = last_is_operator(current_text); if(status.isEmpty() || current_text.empty() || (current_text.length() == 1 && current_text[0] == '#')) { if(autoCalculateTimer) autoCalculateTimer->stop(); historyView->clearTemporary(); auto_expression = ""; auto_result = ""; auto_error = false; mauto.setAborted(); updateWindowTitle(QString::fromStdString(unhtmlize(result_text)), true); } else if(!is_expression || !settings->auto_calculate || contains_plot_or_save(current_text) || current_text[0] == '#') { if(autoCalculateTimer) autoCalculateTimer->stop(); if(!had_error && (!had_warning || last_op) && !auto_error && auto_result.empty() && (auto_expression == status.toStdString() || (last_op && auto_expression.empty() && auto_result.empty()))) return; auto_error = had_error || had_warning; std::vector values; auto_expression = status.toStdString(); auto_result = ""; mauto.setAborted(); CALCULATOR->addMessages(&expressionEdit->status_messages); historyView->addResult(values, current_text, true, auto_expression, false, false, QString(), NULL, 0, 0, true); updateWindowTitle(QString(), true); } else { if(!had_error && (!had_warning || last_op) && !auto_error && !auto_calculation_updated && !auto_format_updated && (auto_expression == status.toStdString() || (last_op && auto_expression.empty() && auto_result.empty()))) { if(autoCalculateTimer && autoCalculateTimer->isActive()) { autoCalculateTimer->stop(); autoCalculateTimer->start(settings->auto_calculate_delay); } return; } current_status_expression = current_text; current_status = status; if(autoCalculateTimer) autoCalculateTimer->stop(); if(had_error || expression_from_history || settings->auto_calculate_delay > 0) { if(had_error || expression_from_history || had_warning || auto_error || !auto_result.empty() || auto_expression != status.toStdString()) { auto_result = ""; mauto.setAborted(); auto_expression = status.toStdString(); auto_error = had_error || had_warning; std::vector values; CALCULATOR->addMessages(&expressionEdit->status_messages); historyView->addResult(values, current_text, true, auto_expression, false, false, QString(), NULL, 0, 0, true); } if(had_error || expression_from_history) { updateWindowTitle(QString(), true); return; } if(!autoCalculateTimer) { autoCalculateTimer = new QTimer(this); autoCalculateTimer->setSingleShot(true); connect(autoCalculateTimer, SIGNAL(timeout()), this, SLOT(autoCalculateTimeout())); } autoCalculateTimer->start(settings->auto_calculate_delay); } else { autoCalculateTimeout(); } } } void QalculateWindow::autoCalculateTimeout() { mauto.setAborted(); bool is_approximate = false; PrintOptions po = settings->printops; po.is_approximate = &is_approximate; std::string str = current_status_expression, result, single_result; CALCULATOR->beginTemporaryStopMessages(); bool do_factors = false, do_pfe = false, do_expand = false, do_bases = false, do_calendars = false; to_fraction = 0; to_fixed_fraction = 0; to_prefix = 0; to_base = 0; to_duo_syms = false; to_bits = 0; to_nbase.clear(); to_caf = -1; std::string to_str, str_conv; CALCULATOR->parseComments(str, settings->evalops.parse_options); if(str.empty()) { CALCULATOR->endTemporaryStopMessages(); updateWindowTitle(QString::fromStdString(unhtmlize(result_text)), true); return; } ComplexNumberForm cnf_bak = settings->evalops.complex_number_form; ComplexNumberForm cnf = settings->evalops.complex_number_form; bool caf_bak = settings->complex_angle_form; bool delay_complex = false; bool b_units_saved = settings->evalops.parse_options.units_enabled; AutoPostConversion save_auto_post_conversion = settings->evalops.auto_post_conversion; MixedUnitsConversion save_mixed_units_conversion = settings->evalops.mixed_units_conversion; CALCULATOR->startControl(100); had_to_expression = false; std::string from_str = str; bool last_is_space = !from_str.empty() && is_in(SPACES, from_str[from_str.length() - 1]); if(CALCULATOR->separateToExpression(from_str, to_str, settings->evalops, true, true)) { if(from_str.empty()) { CALCULATOR->stopControl(); CALCULATOR->endTemporaryStopMessages(); updateWindowTitle(QString::fromStdString(unhtmlize(result_text)), true); return; } remove_duplicate_blanks(to_str); had_to_expression = true; std::string str_left; std::string to_str1, to_str2; bool do_to = false; while(true) { if(last_is_space) to_str += " "; CALCULATOR->separateToExpression(to_str, str_left, settings->evalops, true, false); remove_blank_ends(to_str); size_t ispace = to_str.find_first_of(SPACES); if(ispace != std::string::npos) { to_str1 = to_str.substr(0, ispace); remove_blank_ends(to_str1); to_str2 = to_str.substr(ispace + 1); remove_blank_ends(to_str2); } if(equalsIgnoreCase(to_str, "hex") || equalsIgnoreCase(to_str, "hexadecimal") || equalsIgnoreCase(to_str, tr("hexadecimal").toStdString())) { to_base = BASE_HEXADECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "oct") || equalsIgnoreCase(to_str, "octal") || equalsIgnoreCase(to_str, tr("octal").toStdString())) { to_base = BASE_OCTAL; do_to = true; } else if(equalsIgnoreCase(to_str, "dec") || equalsIgnoreCase(to_str, "decimal") || equalsIgnoreCase(to_str, tr("decimal").toStdString())) { to_base = BASE_DECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "duo") || equalsIgnoreCase(to_str, "duodecimal") || equalsIgnoreCase(to_str, tr("duodecimal").toStdString())) { to_base = BASE_DUODECIMAL; to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "doz") || equalsIgnoreCase(to_str, "dozenal")) { to_base = BASE_DUODECIMAL; to_duo_syms = true; do_to = true; } else if(equalsIgnoreCase(to_str, "bin") || equalsIgnoreCase(to_str, "binary") || equalsIgnoreCase(to_str, tr("binary").toStdString())) { to_base = BASE_BINARY; do_to = true; } else if(equalsIgnoreCase(to_str, "roman") || equalsIgnoreCase(to_str, tr("roman").toStdString())) { to_base = BASE_ROMAN_NUMERALS; do_to = true; } else if(equalsIgnoreCase(to_str, "bijective") || equalsIgnoreCase(to_str, tr("bijective").toStdString())) { to_base = BASE_BIJECTIVE_26; do_to = true; } else if(equalsIgnoreCase(to_str, "bcd")) { to_base = BASE_BINARY_DECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa") || equalsIgnoreCase(to_str, "sexagesimal") || equalsIgnoreCase(to_str, tr("sexagesimal").toStdString())) { to_base = BASE_SEXAGESIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa2") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "2")) { to_base = BASE_SEXAGESIMAL_2; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa3") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "3")) { to_base = BASE_SEXAGESIMAL_3; do_to = true; } else if(equalsIgnoreCase(to_str, "latitude") || equalsIgnoreCase(to_str, tr("latitude").toStdString())) { to_base = BASE_LATITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "latitude", tr("latitude"), "2")) { to_base = BASE_LATITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "longitude") || equalsIgnoreCase(to_str, tr("longitude").toStdString())) { to_base = BASE_LONGITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "longitude", tr("longitude"), "2")) { to_base = BASE_LONGITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "fp32") || equalsIgnoreCase(to_str, "binary32") || equalsIgnoreCase(to_str, "float")) { to_base = BASE_FP32; do_to = true; } else if(equalsIgnoreCase(to_str, "fp64") || equalsIgnoreCase(to_str, "binary64") || equalsIgnoreCase(to_str, "double")) { to_base = BASE_FP64; do_to = true; } else if(equalsIgnoreCase(to_str, "fp16") || equalsIgnoreCase(to_str, "binary16")) { to_base = BASE_FP16; do_to = true; } else if(equalsIgnoreCase(to_str, "fp80")) { to_base = BASE_FP80; do_to = true; } else if(equalsIgnoreCase(to_str, "fp128") || equalsIgnoreCase(to_str, "binary128")) { to_base = BASE_FP128; do_to = true; } else if(equalsIgnoreCase(to_str, "time") || equalsIgnoreCase(to_str, tr("time").toStdString())) { to_base = BASE_TIME; do_to = true; } else if(equalsIgnoreCase(to_str, "Unicode")) { to_base = BASE_UNICODE; do_to = true; } else if(equalsIgnoreCase(to_str, "utc") || equalsIgnoreCase(to_str, "gmt")) { po.time_zone = TIME_ZONE_UTC; do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "bin") && is_in(NUMBERS, to_str[3])) { to_base = BASE_BINARY; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "hex") && is_in(NUMBERS, to_str[3])) { to_base = BASE_HEXADECIMAL; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && (equalsIgnoreCase(to_str.substr(0, 3), "utc") || equalsIgnoreCase(to_str.substr(0, 3), "gmt"))) { to_str = to_str.substr(3); remove_blanks(to_str); bool b_minus = false; if(to_str[0] == '+') { to_str.erase(0, 1); } else if(to_str[0] == '-') { b_minus = true; to_str.erase(0, 1); } else if(to_str.find(SIGN_MINUS) == 0) { b_minus = true; to_str.erase(0, strlen(SIGN_MINUS)); } unsigned int tzh = 0, tzm = 0; int itz = 0; if(!to_str.empty() && sscanf(to_str.c_str(), "%2u:%2u", &tzh, &tzm) > 0) { itz = tzh * 60 + tzm; if(b_minus) itz = -itz; } else { CALCULATOR->error(true, tr("Time zone parsing failed.").toUtf8().data(), NULL); } po.time_zone = TIME_ZONE_CUSTOM; po.custom_time_zone = itz; do_to = true; } else if(to_str == "CET") { po.time_zone = TIME_ZONE_CUSTOM; po.custom_time_zone = 60; do_to = true; } else if(equalsIgnoreCase(to_str, "bases") || equalsIgnoreCase(to_str, tr("bases").toStdString())) { do_bases = true; str = from_str; } else if(equalsIgnoreCase(to_str, "calendars") || equalsIgnoreCase(to_str, tr("calendars").toStdString())) { do_calendars = true; str = from_str; } else if(equalsIgnoreCase(to_str, "rectangular") || equalsIgnoreCase(to_str, "cartesian") || equalsIgnoreCase(to_str, tr("rectangular").toStdString()) || equalsIgnoreCase(to_str, tr("cartesian").toStdString())) { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_RECTANGULAR; } else if(equalsIgnoreCase(to_str, "exponential") || equalsIgnoreCase(to_str, tr("exponential").toStdString())) { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_EXPONENTIAL; } else if(equalsIgnoreCase(to_str, "polar") || equalsIgnoreCase(to_str, tr("polar").toStdString())) { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_POLAR; } else if(to_str == "cis") { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "phasor") || equalsIgnoreCase(to_str, tr("phasor").toStdString()) || equalsIgnoreCase(to_str, "angle") || equalsIgnoreCase(to_str, tr("angle").toStdString())) { to_caf = 1; do_to = true; cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "optimal") || equalsIgnoreCase(to_str, tr("optimal").toStdString())) { settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_OPTIMAL_SI; str_conv = ""; do_to = true; } else if(equalsIgnoreCase(to_str, "prefix") || equalsIgnoreCase(to_str, tr("prefix").toStdString())) { settings->evalops.parse_options.units_enabled = true; to_prefix = 1; do_to = true; } else if(equalsIgnoreCase(to_str, "base") || equalsIgnoreCase(to_str, tr("base").toStdString())) { settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_BASE; str_conv = ""; do_to = true; } else if(equalsIgnoreCase(to_str, "mixed") || equalsIgnoreCase(to_str, tr("mixed").toStdString())) { settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_NONE; settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_FORCE_INTEGER; do_to = true; } else if(equalsIgnoreCase(to_str, "factors") || equalsIgnoreCase(to_str, tr("factors").toStdString()) || equalsIgnoreCase(to_str, "factor")) { do_factors = true; str = from_str; } else if(equalsIgnoreCase(to_str, "partial fraction") || equalsIgnoreCase(to_str, tr("partial fraction").toStdString())) { do_pfe = true; str = from_str; } else if(equalsIgnoreCase(to_str1, "base") || equalsIgnoreCase(to_str1, tr("base").toStdString())) { base_from_string(to_str2, to_base, to_nbase); to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "decimals") || equalsIgnoreCase(to_str, tr("decimals").toStdString())) { to_fixed_fraction = 0; to_fraction = 3; do_to = true; } else { do_to = true; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(to_str), to_fraction, tr("fraction")); if(fden != 0) { if(fden < 0) to_fixed_fraction = 0; else to_fixed_fraction = fden; } else { if(to_str[0] == '?') { to_prefix = 1; } else if(to_str.length() > 1 && to_str[1] == '?' && (to_str[0] == 'b' || to_str[0] == 'a' || to_str[0] == 'd')) { to_prefix = to_str[0]; } Unit *u = CALCULATOR->getActiveUnit(to_str); if(delay_complex != (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS) && u && u->baseUnit() == CALCULATOR->getRadUnit() && u->baseExponent() == 1) delay_complex = !delay_complex; if(!str_conv.empty()) str_conv += " to "; str_conv += to_str; } } if(str_left.empty()) break; to_str = str_left; } if(do_to) { str = from_str; if(!str_conv.empty()) { str += " to "; str += str_conv; } } } if(!delay_complex || (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS)) { settings->evalops.complex_number_form = cnf; delay_complex = false; } else { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; } size_t i = str.find_first_of(SPACES); if(i != std::string::npos) { to_str = str.substr(0, i); if(to_str == "factor" || equalsIgnoreCase(to_str, "factorize") || equalsIgnoreCase(to_str, tr("factorize").toStdString())) { str = str.substr(i + 1); do_factors = true; } else if(equalsIgnoreCase(to_str, "expand") || equalsIgnoreCase(to_str, tr("expand").toStdString())) { str = str.substr(i + 1); do_expand = true; } } if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); MathStructure mexact, mto; mexact.setUndefined(); po.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); if(do_calendars || do_bases) mauto.setAborted(); else mauto = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(str, settings->evalops.parse_options), settings->evalops, &mauto_parsed, &mto); if(mauto.isAborted() || CALCULATOR->aborted() || mauto.countTotalChildren(false) > 500) { mauto.setAborted(); result = ""; } if(!mauto.isAborted()) { if(settings->dual_approximation > 0 || po.base == BASE_DECIMAL) { if(delay_complex) settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; calculate_dual_exact(mexact, &mauto, CALCULATOR->unlocalizeExpression(str, settings->evalops.parse_options), &mauto_parsed, settings->evalops, settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_approximation > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), 0, -1); if(delay_complex && !mexact.isUndefined()) { settings->evalops.complex_number_form = cnf; if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mexact.complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mexact.complexToPolarForm(settings->evalops); } } if(CALCULATOR->aborted()) { CALCULATOR->stopControl(); CALCULATOR->startControl(20); } if(do_factors || do_pfe || do_expand) { if(do_factors) { if((mauto.isNumber() || mauto.isVector()) && to_fraction == 0 && to_fixed_fraction == 0) to_fraction = 2; if(!mauto.integerFactorize()) { mauto.structure(STRUCTURING_FACTORIZE, settings->evalops, true); po.allow_factorization = true; } } else if(do_pfe) { mauto.expandPartialFractions(settings->evalops); } else if(do_expand) { mauto.expand(settings->evalops); po.allow_factorization = false; } if(CALCULATOR->aborted() || mauto.countTotalChildren(false) > 500) mauto.setAborted(); } } int b_exact = true; std::vector values; if(!mauto.isAborted()) { // Always perform conversion to optimal (SI) unit when the expression is a number multiplied by a unit and input equals output if(mto.isUndefined() && !had_to_expression && (settings->evalops.approximation == APPROXIMATION_EXACT || settings->evalops.auto_post_conversion == POST_CONVERSION_OPTIMAL || settings->evalops.auto_post_conversion == POST_CONVERSION_NONE)) { convert_unchanged_quantity_with_unit(mauto_parsed, mauto, settings->evalops); } if(delay_complex) { settings->evalops.complex_number_form = cnf; if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mauto.complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mauto.complexToPolarForm(settings->evalops); } Number save_nbase; bool custom_base_set = false; int save_bin = CALCULATOR->usesBinaryPrefixes(); long int save_fden = CALCULATOR->fixedDenominator(); int save_dual = settings->dual_fraction; bool do_to = false; if(to_base != 0 || to_fraction > 0 || to_fixed_fraction >= 2 || to_prefix != 0 || (to_caf >= 0 && to_caf != settings->complex_angle_form)) { if(to_base != 0 && (to_base != po.base || to_bits != po.binary_bits || (to_base == BASE_CUSTOM && to_nbase != CALCULATOR->customOutputBase()) || (to_base == BASE_DUODECIMAL && to_duo_syms && !po.duodecimal_symbols))) { po.base = to_base; po.binary_bits = to_bits; if(to_duo_syms) po.duodecimal_symbols = true; if(to_base == BASE_CUSTOM) { custom_base_set = true; save_nbase = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(to_nbase); } do_to = true; } if(to_fixed_fraction >= 2) { if(to_fraction == 2 || (to_fraction < 0 && !contains_fraction_qt(mauto))) po.number_fraction_format = FRACTION_FRACTIONAL_FIXED_DENOMINATOR; else po.number_fraction_format = FRACTION_COMBINED_FIXED_DENOMINATOR; CALCULATOR->setFixedDenominator(to_fixed_fraction); settings->dual_fraction = 0; do_to = true; } else if(to_fraction > 0 && (settings->dual_fraction != 0 || po.restrict_fraction_length || (to_fraction != 2 && po.number_fraction_format != FRACTION_COMBINED) || (to_fraction == 2 && po.number_fraction_format != FRACTION_FRACTIONAL) || (to_fraction == 3 && po.number_fraction_format != FRACTION_DECIMAL))) { po.restrict_fraction_length = false; if(to_fraction == 3) po.number_fraction_format = FRACTION_DECIMAL; else if(to_fraction == 2) po.number_fraction_format = FRACTION_FRACTIONAL; else po.number_fraction_format = FRACTION_COMBINED; settings->dual_fraction = 0; do_to = true; } if(to_caf >= 0 && to_caf != settings->complex_angle_form) { settings->complex_angle_form = to_caf; do_to = true; } if(to_prefix != 0) { bool new_pre = po.use_unit_prefixes; bool new_cur = po.use_prefixes_for_currencies; bool new_allu = po.use_prefixes_for_all_units; bool new_all = po.use_all_prefixes; bool new_den = po.use_denominator_prefix; int new_bin = CALCULATOR->usesBinaryPrefixes(); new_pre = true; if(to_prefix == 'b') { int i = has_information_unit(mauto); new_bin = (i > 0 ? 1 : 2); if(i == 1) { new_den = false; } else if(i > 1) { new_den = true; } else { new_cur = true; new_allu = true; } } else { new_cur = true; new_allu = true; if(to_prefix == 'a') new_all = true; else if(to_prefix == 'd') new_bin = 0; } if(po.use_unit_prefixes != new_pre || po.use_prefixes_for_currencies != new_cur || po.use_prefixes_for_all_units != new_allu || po.use_all_prefixes != new_all || po.use_denominator_prefix != new_den || CALCULATOR->usesBinaryPrefixes() != new_bin) { po.use_unit_prefixes = new_pre; po.use_all_prefixes = new_all; po.use_prefixes_for_currencies = new_cur; po.use_prefixes_for_all_units = new_allu; po.use_denominator_prefix = new_den; CALCULATOR->useBinaryPrefixes(new_bin); do_to = true; } } } po.allow_non_usable = true; int max_length = -1; if(!mauto.isNumber() || !mauto.number().isRational() || mauto.number().denominator() >= 20 || mauto.number() >= 100 || mauto.number() <= -100) max_length = historyView->maxTemporaryCharacters(); print_dual(mauto, str, mauto_parsed, mexact, result, values, po, settings->evalops, settings->dual_fraction < 0 ? AUTOMATIC_FRACTION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_FRACTION_DUAL : AUTOMATIC_FRACTION_OFF), settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), settings->complex_angle_form, &exact_comparison, true, settings->format_result, settings->color, TAG_TYPE_HTML, max_length, had_to_expression); single_result = result; if(max_length >= 0) { size_t l = unformatted_length(result); for(size_t i = 0; i < values.size(); i++) { l += unformatted_length(values[i]); if(l > (size_t) max_length) { values.clear(); break; } } } b_exact = (exact_comparison || (!is_approximate && !mauto.isApproximate())); if(!values.empty()) { result = ""; for(size_t i = 0; i < values.size(); i++) { if(i > 0) result += " = "; result += values[i]; } if(!is_approximate && !mauto.isApproximate()) result += " = "; else result += " " SIGN_ALMOST_EQUAL " "; result += single_result; values.clear(); b_exact = true; } if(do_to) { settings->complex_angle_form = caf_bak; if(custom_base_set) CALCULATOR->setCustomOutputBase(save_nbase); CALCULATOR->useBinaryPrefixes(save_bin); CALCULATOR->setFixedDenominator(save_fden); settings->dual_fraction = save_dual; } } CALCULATOR->stopControl(); settings->evalops.complex_number_form = cnf_bak; settings->evalops.auto_post_conversion = save_auto_post_conversion; settings->evalops.parse_options.units_enabled = b_units_saved; settings->evalops.mixed_units_conversion = save_mixed_units_conversion; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); auto_format_updated = false; auto_calculation_updated = false; std::vector messages; CALCULATOR->endTemporaryStopMessages(false, &messages); bool b_error = false, b_warning = false; for(size_t i = 0; i < messages.size(); i++) { if(!mauto.isAborted() || messages[i].stage() != MESSAGE_STAGE_CALCULATION) { if(messages[i].type() == MESSAGE_ERROR) { b_error = true; break; } else if(messages[i].type() == MESSAGE_WARNING) { b_warning = true; } } } if(!b_error && !b_warning && !auto_error && !auto_calculation_updated && !auto_format_updated && auto_result == result && (settings->auto_calculate_delay > 0 || auto_expression == current_status.toStdString())) { if(result.empty()) updateWindowTitle(QString(), true); return; } auto_expression = current_status.toStdString(); auto_error = b_error || b_warning; QString flag; if(!b_error && !result.empty() && (mauto.countTotalChildren(false) < 10 || historyView->testTemporaryResultLength(result))) { auto_result = result; if((mauto.isMultiplication() && mauto.size() == 2 && mauto[1].isUnit() && mauto[1].unit()->isCurrency()) || (mauto.isUnit() && mauto.unit()->isCurrency())) { flag = ":/data/flags/" + QString::fromStdString(mauto.isUnit() ? mauto.unit()->referenceName() : mauto[1].unit()->referenceName()) + ".png"; if(!QFile::exists(flag)) flag.clear(); } gsub("\n", "
", result); if(mauto.isLogicalOr() && (mauto[0].isLogicalAnd() || mauto[0].isComparison())) { // add line break before or size_t i = 0; std::string or_str = " "; if(po.spell_out_logical_operators) or_str += CALCULATOR->logicalORString(); else or_str += LOGICAL_OR; or_str += " "; while(true) { i = result.find(or_str, i); if(i == std::string::npos) break; result.replace(i + or_str.length() - 1, 1, "
"); i += or_str.length(); } } values.push_back(result); } else { auto_result = ""; mauto.setAborted(); if(settings->auto_calculate_delay > 0) { updateWindowTitle(QString(), true); return; } } auto_expression = current_status.toStdString(); CALCULATOR->addMessages(&messages); if(!values.empty() && (mauto.isComparison() || ((mauto.isLogicalAnd() || mauto.isLogicalOr()) && mauto.containsType(STRUCT_COMPARISON, true, false, false))) && (exact_comparison || b_exact || values[0].find(SIGN_ALMOST_EQUAL) != std::string::npos)) b_exact = -1; historyView->addResult(values, "", true, auto_expression, b_exact, false, flag, NULL, 0, 0, true, values.empty() ? "" : single_result); updateWindowTitle(QString::fromStdString(unhtmlize(auto_result)), true); } void QalculateWindow::onBinaryBitsChanged() { if(basesDock->isVisible() && bases_is_result && settings->current_result) { CALCULATOR->beginTemporaryStopMessages(); set_result_bases(*settings->current_result); CALCULATOR->endTemporaryStopMessages(); updateResultBases(); } else { onExpressionChanged(); } updateBinEditSize(); } std::string ellipsize_result(const std::string &result_text, size_t length) { length /= 2; size_t index1 = result_text.find(SPACE, length); if(index1 == std::string::npos || index1 > length * 1.2) { index1 = result_text.find(THIN_SPACE, length); size_t index1b = result_text.find(NNBSP, length); if(index1b != std::string::npos && (index1 == std::string::npos || index1b < index1)) index1 = index1b; } if(index1 == std::string::npos || index1 > length * 1.2) { index1 = length; while(index1 > 0 && (signed char) result_text[index1] < 0 && (unsigned char) result_text[index1 + 1] < 0xC0) index1--; } size_t index2 = result_text.find(SPACE, result_text.length() - length); if(index2 == std::string::npos || index2 > result_text.length() - length * 0.8) { index2 = result_text.find(THIN_SPACE, result_text.length() - length); size_t index2b = result_text.find(NNBSP, result_text.length() - length); if(index2b != std::string::npos && (index2 == std::string::npos || index2b < index2)) index2 = index2b; } if(index2 == std::string::npos || index2 > result_text.length() - length * 0.8) { index2 = result_text.length() - length; while(index2 > index1 && (signed char) result_text[index2] < 0 && (unsigned char) result_text[index2 + 1] < 0xC0) index2--; } return result_text.substr(0, index1) + " (…) " + result_text.substr(index2, result_text.length() - index2); } bool contains_large_matrix(const MathStructure &m) { if((m.isVector() && m.size() > 500) || (m.isMatrix() && m.rows() * m.columns() > 500)) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_large_matrix(m[i])) return true; } return false; } void ViewThread::run() { while(true) { void *x = NULL; if(!read(&x) || !x) break; MathStructure *mresult = (MathStructure*) x; x = NULL; bool b_stack = false; if(!read(&b_stack)) break; if(!read(&x)) break; MathStructure *mm = (MathStructure*) x; if(!read(&x)) break; MathStructure *mparse = (MathStructure*) x; CALCULATOR->startControl(); PrintOptions po; if(mparse) { if(!read(&po.is_approximate)) break; if(!read(&po.preserve_format)) break; po.show_ending_zeroes = settings->evalops.parse_options.read_precision != DONT_READ_PRECISION && CALCULATOR->usesIntervalArithmetic() && settings->evalops.parse_options.base > BASE_CUSTOM; po.exp_display = settings->printops.exp_display; po.lower_case_numbers = settings->printops.lower_case_numbers; po.rounding = settings->printops.rounding; po.base_display = settings->printops.base_display; po.twos_complement = settings->printops.twos_complement; po.hexadecimal_twos_complement = settings->printops.hexadecimal_twos_complement; po.base = settings->evalops.parse_options.base; po.allow_non_usable = true; Number nr_base; if(po.base == BASE_CUSTOM && (CALCULATOR->usesIntervalArithmetic() || CALCULATOR->customInputBase().isRational()) && (CALCULATOR->customInputBase().isInteger() || !CALCULATOR->customInputBase().isNegative()) && (CALCULATOR->customInputBase() > 1 || CALCULATOR->customInputBase() < -1)) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } else if(po.base == BASE_CUSTOM || (po.base < BASE_CUSTOM && !CALCULATOR->usesIntervalArithmetic() && po.base != BASE_UNICODE)) { po.base = 10; po.min_exp = 6; po.use_max_decimals = true; po.max_decimals = 5; po.preserve_format = false; } po.abbreviate_names = false; po.digit_grouping = settings->printops.digit_grouping; po.use_unicode_signs = settings->printops.use_unicode_signs; po.multiplication_sign = settings->printops.multiplication_sign; po.division_sign = settings->printops.division_sign; po.short_multiplication = false; po.excessive_parenthesis = true; po.improve_division_multipliers = false; po.restrict_to_parent_precision = false; po.spell_out_logical_operators = settings->printops.spell_out_logical_operators; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; MathStructure mp(*mparse); mp.format(po); parsed_text = mp.print(po, settings->format_result, settings->color, TAG_TYPE_HTML); if(po.base == BASE_CUSTOM) { CALCULATOR->setCustomOutputBase(nr_base); } } if(mm && mresult->isMatrix()) { PrintOptions po = settings->printops; po.allow_non_usable = false; mm->set(*mresult); MathStructure mm2(*mresult); std::string mstr; int c = mm->columns(), r = mm->rows(); for(int index_r = 0; index_r < r; index_r++) { for(int index_c = 0; index_c < c; index_c++) { mm->getElement(index_r + 1, index_c + 1)->setAborted(); } } for(int index_r = 0; index_r < r; index_r++) { for(int index_c = 0; index_c < c; index_c++) { mm2.getElement(index_r + 1, index_c + 1)->format(po); mstr = mm2.getElement(index_r + 1, index_c + 1)->print(po); mm->getElement(index_r + 1, index_c + 1)->set(mstr); } } } po = settings->printops; po.allow_non_usable = true; print_dual(*mresult, original_expression, mparse ? *mparse : *parsed_mstruct, mstruct_exact, result_text, alt_results, po, settings->evalops, settings->dual_fraction < 0 ? AUTOMATIC_FRACTION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_FRACTION_DUAL : AUTOMATIC_FRACTION_OFF), settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), settings->complex_angle_form, &exact_comparison, mparse != NULL, settings->format_result, settings->color, TAG_TYPE_HTML, -1, had_to_expression); if(!prepend_mstruct.isUndefined() && !CALCULATOR->aborted()) { prepend_mstruct.format(po); po.min_exp = 0; alt_results.insert(alt_results.begin(), prepend_mstruct.print(po, settings->format_result, settings->color, TAG_TYPE_HTML)); } if(!b_stack) { set_result_bases(*mresult); bases_is_result = true; } for(size_t i = 0; i < alt_results.size();) { if(unformatted_length(alt_results[i]) > 20000) alt_results.erase(alt_results.begin() + i); else i++; } if(contains_large_matrix(*mresult)) { if(mresult->isMatrix() && result_text.length() > 1000000L) { result_text = "matrix ("; result_text += i2s(mresult->rows()); result_text += SIGN_MULTIPLICATION; result_text += i2s(mresult->columns()); result_text += ")"; } else if(unformatted_length(result_text) > 5000) { result_text = ellipsize_result(unhtmlize(result_text), 1000); } } else if(unformatted_length(result_text) > (mstruct->isNumber() ? 50000 : 20000)) { if(mstruct->isNumber()) { result_text = ellipsize_result(result_text, 5000); } else { result_text = ellipsize_result(unhtmlize(result_text), 2000); } } if(mresult->isLogicalOr() && (mresult->getChild(1)->isLogicalAnd() || mresult->getChild(1)->isComparison())) { // add line break before or size_t i = 0; std::string or_str = " "; if(po.spell_out_logical_operators) or_str += CALCULATOR->logicalORString(); else or_str += LOGICAL_OR; or_str += " "; while(true) { i = result_text.find(or_str, i); if(i == std::string::npos) break; result_text.replace(i + or_str.length() - 1, 1, "
"); i += or_str.length(); } } b_busy--; CALCULATOR->stopControl(); } } int intervals_are_relative(MathStructure &m) { int ret = -1; if(m.isFunction() && m.function()->id() == FUNCTION_ID_UNCERTAINTY && m.size() == 3) { if(m[2].isOne() && m[1].isMultiplication() && m[1].size() > 1 && m[1].last().isVariable() && (m[1].last().variable() == CALCULATOR->getVariableById(VARIABLE_ID_PERCENT) || m[1].last().variable() == CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE) || m[1].last().variable() == CALCULATOR->getVariableById(VARIABLE_ID_PERMYRIAD))) { ret = 1; } else { return 0; } } if(m.isFunction() && m.function()->id() == FUNCTION_ID_INTERVAL) return 0; for(size_t i = 0; i < m.size(); i++) { int ret_i = intervals_are_relative(m[i]); if(ret_i == 0) return 0; else if(ret_i > 0) ret = ret_i; } return ret; } void QalculateWindow::setResult(Prefix *prefix, bool update_history, bool update_parse, bool force, std::string transformation, bool do_stack, size_t stack_index, bool register_moved, bool supress_dialog, bool calculate_selection) { if(block_result_update) return; if(!calculate_selection && expressionEdit->expressionHasChanged() && (!settings->rpn_mode || CALCULATOR->RPNStackSize() == 0)) { if(!force) return; calculateExpression(); if(!prefix) return; } if(settings->rpn_mode && CALCULATOR->RPNStackSize() == 0) return; if(!settings->rpn_mode) {stack_index = 0; do_stack = false;} if(!do_stack && (settings->history_answer.empty() || !settings->current_result) && !register_moved && !update_parse && update_history) { return; } if(b_busy) return; workspace_changed = true; std::string prev_result_text = result_text; bool prev_approximate = *settings->printops.is_approximate; if(update_parse) { parsed_text = "aborted"; } if(do_stack) { update_history = true; update_parse = false; } if(register_moved) { update_history = true; update_parse = false; } b_busy++; if(!viewThread->running && !viewThread->start()) {b_busy--; return;} bool b_rpn_operation = false; if(update_history) { if(update_parse || register_moved) { if(register_moved) { result_text = tr("RPN Register Moved").toStdString(); } else { remove_blank_ends(result_text); gsub("\n", " ", result_text); if(result_text == tr("RPN Operation").toStdString()) { b_rpn_operation = true; } else { if(settings->adaptive_interval_display) { QString expression_str = expressionEdit->toPlainText(); if((parsed_mstruct && parsed_mstruct->containsFunctionId(FUNCTION_ID_UNCERTAINTY)) || expression_str.contains("+/-") || expression_str.contains("+/" SIGN_MINUS) || expression_str.contains("±")) { if(parsed_mstruct && intervals_are_relative(*parsed_mstruct) > 0) settings->printops.interval_display = INTERVAL_DISPLAY_RELATIVE; else settings->printops.interval_display = INTERVAL_DISPLAY_PLUSMINUS; } else if(parsed_mstruct && parsed_mstruct->containsFunctionId(FUNCTION_ID_INTERVAL)) settings->printops.interval_display = INTERVAL_DISPLAY_INTERVAL; else settings->printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; } } } } else if(!transformation.empty()) { } result_text = "?"; } if(update_parse) { parsed_text = "aborted"; } bool parsed_approx = false; bool title_set = false, was_busy = false; Number save_nbase; bool custom_base_set = false; int save_base = settings->printops.base; bool caf_bak = settings->complex_angle_form; unsigned int save_bits = settings->printops.binary_bits; bool save_pre = settings->printops.use_unit_prefixes; bool save_cur = settings->printops.use_prefixes_for_currencies; bool save_allu = settings->printops.use_prefixes_for_all_units; bool save_all = settings->printops.use_all_prefixes; bool save_den = settings->printops.use_denominator_prefix; int save_bin = CALCULATOR->usesBinaryPrefixes(); NumberFractionFormat save_format = settings->printops.number_fraction_format; long int save_fden = CALCULATOR->fixedDenominator(); bool save_restrict_fraction_length = settings->printops.restrict_fraction_length; int save_dual = settings->dual_fraction; bool save_duo_syms = settings->printops.duodecimal_symbols; bool do_to = false; if(!do_stack) { if(to_base != 0 || to_fraction > 0 || to_fixed_fraction >= 2 || to_prefix != 0 || (to_caf >= 0 && to_caf != settings->complex_angle_form)) { if(to_base != 0 && (to_base != settings->printops.base || to_bits != settings->printops.binary_bits || (to_base == BASE_CUSTOM && to_nbase != CALCULATOR->customOutputBase()) || (to_base == BASE_DUODECIMAL && to_duo_syms && !settings->printops.duodecimal_symbols))) { settings->printops.base = to_base; settings->printops.binary_bits = to_bits; if(to_duo_syms) settings->printops.duodecimal_symbols = true; if(to_base == BASE_CUSTOM) { custom_base_set = true; save_nbase = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(to_nbase); } do_to = true; } if(to_fixed_fraction >= 2) { if(to_fraction == 2 || (to_fraction < 0 && !contains_fraction_qt(*mstruct))) settings->printops.number_fraction_format = FRACTION_FRACTIONAL_FIXED_DENOMINATOR; else settings->printops.number_fraction_format = FRACTION_COMBINED_FIXED_DENOMINATOR; CALCULATOR->setFixedDenominator(to_fixed_fraction); settings->dual_fraction = 0; do_to = true; } else if(to_fraction > 0 && (settings->dual_fraction != 0 || settings->printops.restrict_fraction_length || (to_fraction != 2 && settings->printops.number_fraction_format != FRACTION_COMBINED) || (to_fraction == 2 && settings->printops.number_fraction_format != FRACTION_FRACTIONAL) || (to_fraction == 3 && settings->printops.number_fraction_format != FRACTION_DECIMAL))) { settings->printops.restrict_fraction_length = false; if(to_fraction == 3) settings->printops.number_fraction_format = FRACTION_DECIMAL; else if(to_fraction == 2) settings->printops.number_fraction_format = FRACTION_FRACTIONAL; else settings->printops.number_fraction_format = FRACTION_COMBINED; settings->dual_fraction = 0; do_to = true; } if(to_caf >= 0 && to_caf != settings->complex_angle_form) { settings->complex_angle_form = to_caf; do_to = true; } if(to_prefix != 0 && !prefix) { bool new_pre = settings->printops.use_unit_prefixes; bool new_cur = settings->printops.use_prefixes_for_currencies; bool new_allu = settings->printops.use_prefixes_for_all_units; bool new_all = settings->printops.use_all_prefixes; bool new_den = settings->printops.use_denominator_prefix; int new_bin = CALCULATOR->usesBinaryPrefixes(); new_pre = true; if(to_prefix == 'b') { int i = has_information_unit(*mstruct); new_bin = (i > 0 ? 1 : 2); if(i == 1) { new_den = false; } else if(i > 1) { new_den = true; } else { new_cur = true; new_allu = true; } } else { new_cur = true; new_allu = true; if(to_prefix == 'a') new_all = true; else if(to_prefix == 'd') new_bin = 0; } if(settings->printops.use_unit_prefixes != new_pre || settings->printops.use_prefixes_for_currencies != new_cur || settings->printops.use_prefixes_for_all_units != new_allu || settings->printops.use_all_prefixes != new_all || settings->printops.use_denominator_prefix != new_den || CALCULATOR->usesBinaryPrefixes() != new_bin) { settings->printops.use_unit_prefixes = new_pre; settings->printops.use_all_prefixes = new_all; settings->printops.use_prefixes_for_currencies = new_cur; settings->printops.use_prefixes_for_all_units = new_allu; settings->printops.use_denominator_prefix = new_den; CALCULATOR->useBinaryPrefixes(new_bin); do_to = true; } } } } settings->printops.prefix = prefix; if(!do_stack) { if(!viewThread->write((void*) mstruct)) {b_busy--; viewThread->cancel(); return;} } else { MathStructure *mreg = CALCULATOR->getRPNRegister(stack_index + 1); if(!viewThread->write((void*) mreg)) {b_busy--; viewThread->cancel(); return;} } if(!viewThread->write(do_stack || calculate_selection)) {b_busy--; viewThread->cancel(); return;} if(do_stack) { if(!viewThread->write((void*) NULL)) {b_busy--; viewThread->cancel(); return;} } else { matrix_mstruct.clear(); if(!mstruct->isMatrix() || mstruct->rows() * mstruct->columns() <= 16 || mstruct->columns() * mstruct->rows() > 10000) { if(!viewThread->write((void*) NULL)) {b_busy--; viewThread->cancel(); return;} } else { if(!viewThread->write((void*) &matrix_mstruct)) {b_busy--; viewThread->cancel(); return;} } } if(update_parse) { if(!viewThread->write((void*) parsed_mstruct)) {b_busy--; viewThread->cancel(); return;} bool *parsed_approx_p = &parsed_approx; if(!viewThread->write(parsed_approx_p)) {b_busy--; viewThread->cancel(); return;} if(!viewThread->write(!b_rpn_operation)) {b_busy--; viewThread->cancel(); return;} } else { if(settings->printops.base != BASE_DECIMAL && settings->dual_approximation <= 0) mstruct_exact.setUndefined(); if(!viewThread->write((void*) NULL)) {b_busy--; viewThread->cancel(); return;} } QProgressDialog *dialog = NULL; int i = 0; while(b_busy && viewThread->running && i < 50) { sleep_ms(10); i++; } i = 0; if(b_busy && viewThread->running) { if(!do_stack && updateWindowTitle(tr("Processing…"))) title_set = true; dialog = new QProgressDialog(tr("Processing…"), tr("Cancel"), 0, 0, this); dialog->setWindowTitle(tr("Processing…")); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); was_busy = true; } while(b_busy && viewThread->running) { qApp->processEvents(); sleep_ms(100); } b_busy++; if(was_busy) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); if(title_set) updateWindowTitle(); } if(!do_stack) { if(basesDock->isVisible()) updateResultBases(); updateWindowTitle(QString::fromStdString(unhtmlize(result_text)), true); } if(register_moved) { update_parse = true; parsed_text = result_text; } if(settings->history_answer.empty()) { update_parse = true; } if(do_stack) { RPNRegisterChanged(result_text, stack_index); if(supress_dialog) CALCULATOR->clearMessages(); else displayMessages(); } else if(update_history) { if(update_parse) {} } else { if(supress_dialog) CALCULATOR->clearMessages(); else displayMessages(); } if(register_moved) { update_parse = true; parsed_text = result_text; } bool implicit_warning = false; if(do_stack) { RPNRegisterChanged(result_text, stack_index); } else { if(settings->rpn_mode && !register_moved) { RPNRegisterChanged(result_text, stack_index); } if(mstruct->isAborted() || settings->printops.base != settings->evalops.parse_options.base || (settings->printops.base > 32 || settings->printops.base < 2)) { exact_text = ""; } else if(!mstruct->isApproximate() && !(*settings->printops.is_approximate)) { exact_text = unhtmlize(result_text); } else if(!alt_results.empty()) { exact_text = unhtmlize(alt_results[0]); } else { exact_text = ""; } if(update_parse && parsed_mstruct && alt_results.empty() && mstruct->isZero() && parsed_mstruct->isFunction() && (parsed_mstruct->function()->id() == FUNCTION_ID_ERROR || parsed_mstruct->function()->id() == FUNCTION_ID_WARNING || parsed_mstruct->function()->id() == FUNCTION_ID_MESSAGE || parsed_mstruct->function()->subtype() == SUBTYPE_DATA_SET) && CALCULATOR->message() && CALCULATOR->message()->type() == MESSAGE_INFORMATION) { if(prev_result_text.empty()) { expressionEdit->clear(); parsed_text = "#"; } result_text = ""; } else { alt_results.push_back(result_text); } for(size_t i = 0; i < alt_results.size(); i++) { gsub("\n", "
", alt_results[i]); } QString flag; if((mstruct->isMultiplication() && mstruct->size() == 2 && (*mstruct)[1].isUnit() && (*mstruct)[1].unit()->isCurrency()) || (mstruct->isUnit() && mstruct->unit()->isCurrency())) { flag = ":/data/flags/" + QString::fromStdString(mstruct->isUnit() ? mstruct->unit()->referenceName() : (*mstruct)[1].unit()->referenceName()) + ".png"; if(!QFile::exists(flag)) flag.clear(); } int b_exact = (update_parse || !prev_approximate) && (exact_comparison || (!(*settings->printops.is_approximate) && !mstruct->isApproximate())); if(alt_results.size() == 1 && (mstruct->isComparison() || ((mstruct->isLogicalAnd() || mstruct->isLogicalOr()) && mstruct->containsType(STRUCT_COMPARISON, true, false, false))) && (exact_comparison || b_exact || result_text.find(SIGN_ALMOST_EQUAL) != std::string::npos)) b_exact = -1; size_t index = settings->v_expression.size(); bool b_add = true; if(index > 0 && settings->current_result && !CALCULATOR->message() && (!update_parse || (settings->history_answer.size() > (mstruct_exact.isUndefined() ? 1 : 2) && !settings->rpn_mode && mstruct->equals(*settings->history_answer[settings->history_answer.size() - 1], true, true) && (mstruct_exact.isUndefined() || (settings->history_answer.size() > 1 && mstruct_exact.equals(*settings->history_answer[settings->history_answer.size() - 2], true, true))) && parsed_text == settings->v_parse[index - 1] && prev_result_text == settings->v_expression[index - 1] && parsed_approx != settings->v_pexact[index - 1] && !contains_rand_function(*parsed_mstruct))) && alt_results.size() <= settings->v_result[index - 1].size()) { b_add = false; for(size_t i = 0; i < alt_results.size(); i++) { if(settings->v_exact[index - 1][i] != (b_exact || i < alt_results.size() - 1) || settings->v_result[index - 1][i] != alt_results[i]) { b_add = true; break; } } } if(b_add) { auto_expression = ""; auto_result = ""; mauto.setAborted(); auto_error = false; if(autoCalculateTimer) autoCalculateTimer->stop(); historyView->addResult(alt_results, update_parse ? prev_result_text : "", !parsed_approx, update_parse ? parsed_text : "", b_exact, alt_results.size() > 1 && !mstruct_exact.isUndefined(), flag, !supress_dialog && update_parse && settings->evalops.parse_options.parsing_mode <= PARSING_MODE_CONVENTIONAL && update_history ? &implicit_warning : NULL); } else if(update_parse) { settings->history_answer.pop_back(); if(!mstruct_exact.isUndefined()) settings->history_answer.pop_back(); historyView->clearTemporary(); } } if(do_to) { settings->complex_angle_form = caf_bak; settings->printops.base = save_base; settings->printops.duodecimal_symbols = save_duo_syms; settings->printops.binary_bits = save_bits; if(custom_base_set) CALCULATOR->setCustomOutputBase(save_nbase); settings->printops.use_unit_prefixes = save_pre; settings->printops.use_all_prefixes = save_all; settings->printops.use_prefixes_for_currencies = save_cur; settings->printops.use_prefixes_for_all_units = save_allu; settings->printops.use_denominator_prefix = save_den; CALCULATOR->useBinaryPrefixes(save_bin); settings->printops.number_fraction_format = save_format; CALCULATOR->setFixedDenominator(save_fden); settings->dual_fraction = save_dual; settings->printops.restrict_fraction_length = save_restrict_fraction_length; } settings->printops.prefix = NULL; settings->current_result = mstruct; b_busy--; if(implicit_warning && askImplicit()) { calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", "", true, calculate_selection); return; } if(!supress_dialog && !register_moved && !do_stack && mstruct->isMatrix() && matrix_mstruct.isMatrix()) { QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Matrix")); QVBoxLayout *box = new QVBoxLayout(dialog); MatrixWidget *w = new MatrixWidget(dialog); w->setMatrixStrings(matrix_mstruct); w->setEditable(false); box->addWidget(w); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, dialog); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), dialog, SLOT(reject())); dialog->exec(); dialog->deleteLater(); } } bool QalculateWindow::eventFilter(QObject*, QEvent *e) { if(e->type() == QEvent::ToolTip) return true; return false; } void QalculateWindow::onColorSchemeChanged() { #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) settings->updatePalette(true); #endif } void QalculateWindow::changeEvent(QEvent *e) { if(e->type() == QEvent::PaletteChange || e->type() == QEvent::ApplicationPaletteChange) { QColor c = QApplication::palette().base().color(); if(c.red() + c.green() + c.blue() < 255) settings->color = 2; else settings->color = 1; menuAction_t->setIcon(LOAD_ICON("menu")); toAction_t->setIcon(LOAD_ICON("convert")); storeAction_t->setIcon(LOAD_ICON("document-save")); functionsAction_t->setIcon(LOAD_ICON("function")); unitsAction_t->setIcon(LOAD_ICON("units")); if(plotAction_t) plotAction_t->setIcon(LOAD_ICON("plot")); keypadAction_t->setIcon(LOAD_ICON("keypad")); basesAction->setIcon(LOAD_ICON("number-bases")); modeAction_t->setIcon(LOAD_ICON("configure")); rpnUpAction->setIcon(LOAD_ICON("go-up")); rpnDownAction->setIcon(LOAD_ICON("go-down")); rpnSwapAction->setIcon(LOAD_ICON("rpn-swap")); rpnCopyAction->setIcon(LOAD_ICON("edit-copy")); rpnLastxAction->setIcon(LOAD_ICON("edit-undo")); rpnDeleteAction->setIcon(LOAD_ICON("edit-delete")); rpnClearAction->setIcon(LOAD_ICON("edit-clear")); } else if(e->type() == QEvent::FontChange || e->type() == QEvent::ApplicationFontChange) { QFont font(QApplication::font()); updateBinEditSize(&font); if(!settings->use_custom_expression_font) { if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * 1.35); else font.setPointSize(font.pointSize() * 1.35); expressionEdit->setFont(font); } } QMainWindow::changeEvent(e); } void QalculateWindow::updateBinEditSize(QFont *font) { QFontMetrics fm2(font ? *font : binEdit->font()); SET_BINARY_BITS int rows = binary_bits / 32; if(binary_bits % 32 > 0) rows++; QString row_string; for(int i = binary_bits > 32 ? 32 : binary_bits; i > 0; i -= 4) { if(i < 32 && i < binary_bits) row_string += " "; row_string += "0000"; } binEdit->setMinimumWidth(fm2.boundingRect(row_string).width() + binEdit->frameWidth() * 2 + binEdit->contentsMargins().left() + binEdit->contentsMargins().right()); binEdit->setMinimumHeight(fm2.lineSpacing() * rows * 2 + binEdit->frameWidth() * 2 + binEdit->contentsMargins().top() + binEdit->contentsMargins().bottom()); } void QalculateWindow::fetchExchangeRates() { CALCULATOR->clearMessages(); settings->fetchExchangeRates(15, -1, this); CALCULATOR->loadExchangeRates(); displayMessages(); expressionCalculationUpdated(); } void QalculateWindow::abort() { CALCULATOR->abort(); } void QalculateWindow::abortCommand() { CALCULATOR->abort(); int msecs = 5000; while(b_busy && msecs > 0) { sleep_ms(10); msecs -= 10; } if(b_busy) { commandThread->cancel(); b_busy--; CALCULATOR->stopControl(); command_aborted = true; } } bool contains_temperature_unit_qt(const MathStructure &m) { if(m.isUnit()) { return m.unit() == CALCULATOR->getUnitById(UNIT_ID_CELSIUS) || m.unit() == CALCULATOR->getUnitById(UNIT_ID_FAHRENHEIT); } if(m.isVariable() && m.variable()->isKnown()) { return contains_temperature_unit_qt(((KnownVariable*) m.variable())->get()); } if(m.isFunction() && m.function()->id() == FUNCTION_ID_STRIP_UNITS) return false; for(size_t i = 0; i < m.size(); i++) { if(contains_temperature_unit_qt(m[i])) return true; } return false; } bool QalculateWindow::askTC(MathStructure &m) { if(settings->tc_set || !contains_temperature_unit_qt(m)) return false; MathStructure *mp = &m; if(m.isMultiplication() && m.size() == 2 && m[0].isMinusOne()) mp = &m[1]; else if(m.isNegate()) mp = &m[0]; if(mp->isUnit_exp()) return false; if(mp->isMultiplication() && mp->size() > 0 && mp->last().isUnit_exp()) { bool b = false; for(size_t i = 0; i < mp->size() - 1; i++) { if(contains_temperature_unit_qt((*mp)[i])) {b = true; break;} } if(!b) return false; } QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Temperature Calculation Mode")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("The expression is ambiguous.\nPlease select temperature calculation mode\n(the mode can later be changed in preferences).")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_abs = new QRadioButton(tr("Absolute")); group->addButton(w_abs); grid->addWidget(w_abs, 1, 0, Qt::AlignTop); grid->addWidget(new QLabel("1 °C + 1 °C ≈ 274 K + 274 K ≈ 548 K
1 °C + 5 °F ≈ 274 K + 258 K ≈ 532 K
2 °C − 1 °C = 1 K
1 °C − 5 °F = 16 K
1 °C + 1 K = 2 °C
"), 1, 1); QRadioButton *w_relative = new QRadioButton(tr("Relative")); group->addButton(w_relative); grid->addWidget(w_relative, 2, 0, Qt::AlignTop); grid->addWidget(new QLabel("1 °C + 1 °C = 2 °C
1 °C + 5 °F = 1 °C + 5 °R ≈ 4 °C ≈ 277 K
2 °C − 1 °C = 1 °C
1 °C − 5 °F = 1 °C - 5 °R ≈ −2 °C
1 °C + 1 K = 2 °C
"), 2, 1); QRadioButton *w_hybrid = new QRadioButton(tr("Hybrid")); group->addButton(w_hybrid); grid->addWidget(w_hybrid, 3, 0, Qt::AlignTop); grid->addWidget(new QLabel("1 °C + 1 °C ≈ 2 °C
1 °C + 5 °F ≈ 274 K + 258 K ≈ 532 K
2 °C − 1 °C = 1 °C
1 °C − 5 °F = 16 K
1 °C + 1 K = 2 °C
"), 3, 1); switch(CALCULATOR->getTemperatureCalculationMode()) { case TEMPERATURE_CALCULATION_ABSOLUTE: {w_abs->setChecked(true); break;} case TEMPERATURE_CALCULATION_RELATIVE: {w_relative->setChecked(true); break;} default: {w_hybrid->setChecked(true); break;} } dialog->exec(); TemperatureCalculationMode tc_mode = TEMPERATURE_CALCULATION_HYBRID; if(w_abs->isChecked()) tc_mode = TEMPERATURE_CALCULATION_ABSOLUTE; else if(w_relative->isChecked()) tc_mode = TEMPERATURE_CALCULATION_RELATIVE; dialog->deleteLater(); settings->tc_set = true; if(tc_mode != CALCULATOR->getTemperatureCalculationMode()) { CALCULATOR->setTemperatureCalculationMode(tc_mode); if(preferencesDialog) preferencesDialog->updateTemperatureCalculation(); return true; } return false; } bool QalculateWindow::askSinc(MathStructure &m) { if(settings->sinc_set || !m.containsFunctionId(FUNCTION_ID_SINC)) return false; QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Temperature Calculation Mode")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("Please select desired variant of the sinc function.")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_1 = new QRadioButton(tr("Unnormalized")); group->addButton(w_1); grid->addWidget(w_1, 1, 0, Qt::AlignTop); grid->addWidget(new QLabel("sinc(x) = sin(x)/x"), 1, 1); QRadioButton *w_pi = new QRadioButton(tr("Normalized")); group->addButton(w_pi); grid->addWidget(w_pi, 2, 0, Qt::AlignTop); grid->addWidget(new QLabel("sinc(x) = sinc(πx)/(πx)"), 2, 1); w_1->setChecked(true); dialog->exec(); bool b_pi = w_pi->isChecked(); dialog->deleteLater(); settings->sinc_set = true; if(b_pi) { CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, "pi"); return true; } return false; } bool QalculateWindow::askDot(const std::string &str) { if(settings->dot_question_asked || CALCULATOR->getDecimalPoint() == DOT) return false; size_t i = 0; bool b = false; while(true) { i = str.find(DOT, i); if(i == std::string::npos) return false; i = str.find_first_not_of(SPACES, i + 1); if(i == std::string::npos) return false; if(is_in(NUMBERS, str[i])) { b = true; break; } } if(!b) return false; QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Interpretation of dots")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("Please select interpretation of dots (\".\")\n(this can later be changed in preferences).")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_bothdeci = new QRadioButton(tr("Both dot and comma as decimal separators")); group->addButton(w_bothdeci); grid->addWidget(w_bothdeci, 1, 0); grid->addWidget(new QLabel("(1.2 = 1,2)"), 1, 1); QRadioButton *w_ignoredot = new QRadioButton(tr("Dot as thousands separator")); group->addButton(w_ignoredot); grid->addWidget(w_ignoredot, 2, 0); grid->addWidget(new QLabel("(1.000.000 = 1000000)"), 2, 1); QRadioButton *w_dotdeci = new QRadioButton(tr("Only dot as decimal separator")); group->addButton(w_dotdeci); grid->addWidget(w_dotdeci, 3, 0); grid->addWidget(new QLabel("(1.2 + root(16, 4) = 3.2)"), 3, 1); if(settings->evalops.parse_options.dot_as_separator) w_ignoredot->setChecked(true); else w_bothdeci->setChecked(true); dialog->exec(); settings->dot_question_asked = true; bool das = settings->evalops.parse_options.dot_as_separator; if(w_dotdeci->isChecked()) { settings->evalops.parse_options.dot_as_separator = false; settings->evalops.parse_options.comma_as_separator = false; settings->decimal_comma = false; CALCULATOR->useDecimalPoint(false); das = !settings->evalops.parse_options.dot_as_separator; } else if(w_ignoredot->isChecked()) { settings->evalops.parse_options.dot_as_separator = true; } else { settings->evalops.parse_options.dot_as_separator = false; } if(preferencesDialog) preferencesDialog->updateDot(); dialog->deleteLater(); return das != settings->evalops.parse_options.dot_as_separator; } bool QalculateWindow::askImplicit() { QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Parsing Mode")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("The expression is ambiguous.\nPlease select interpretation of expressions with implicit multiplication\n(this can later be changed in preferences).")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QLabel *label = new QLabel("1/2x = 1/(2x)"); int h = label->sizeHint().height(); QRadioButton *w_implicitfirst = new QRadioButton(tr("Implicit multiplication first")); group->addButton(w_implicitfirst); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST) w_implicitfirst->setChecked(true); grid->addWidget(w_implicitfirst, 1, 0, Qt::AlignTop | Qt::AlignLeft); w_implicitfirst->setMinimumHeight(h); label->setText("1/2x = 1/(2x)
5 m/2 s = (5 m)/(2 s)
"); grid->addWidget(label, 1, 1); QRadioButton *w_conventional = new QRadioButton(tr("Conventional")); group->addButton(w_conventional); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL) w_conventional->setChecked(true); grid->addWidget(w_conventional, 2, 0, Qt::AlignTop | Qt::AlignLeft); w_conventional->setMinimumHeight(h); grid->addWidget(new QLabel("1/2x = (1/2)x
5 m/2 s = (5 m/2)s
"), 2, 1); QRadioButton *w_adaptive = new QRadioButton(tr("Adaptive")); group->addButton(w_adaptive); grid->addWidget(w_adaptive, 3, 0, Qt::AlignTop | Qt::AlignLeft); w_adaptive->setMinimumHeight(h); grid->addWidget(new QLabel("1/2x = 1/(2x); 1/2 x = (1/2)x
5 m/2 s = (5 m)/(2 s)
"), 3, 1); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_ADAPTIVE) w_adaptive->setChecked(true); dialog->exec(); settings->implicit_question_asked = true; ParsingMode pm_bak = settings->evalops.parse_options.parsing_mode; if(w_implicitfirst->isChecked()) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST; } else if(w_conventional->isChecked()) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_CONVENTIONAL; } else { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } if(preferencesDialog) preferencesDialog->updateParsingMode(); dialog->deleteLater(); return pm_bak != settings->evalops.parse_options.parsing_mode; } bool QalculateWindow::askPercent() { if(settings->simplified_percentage >= 0 || !CALCULATOR->simplifiedPercentageUsed()) return false; QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Percentage Interpretation")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("Please select interpretation of percentage addition")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_1 = new QRadioButton(tr("Add percentage of original value")); group->addButton(w_1); grid->addWidget(w_1, 1, 0, Qt::AlignTop); std::string s_eg = "100 + 10% = 100 "; s_eg += settings->multiplicationSign(); s_eg += " 110% = 110)"; grid->addWidget(new QLabel(QString::fromStdString(s_eg)), 1, 1); QRadioButton *w_0 = new QRadioButton(tr("Add percentage multiplied by 1/100")); group->addButton(w_0); grid->addWidget(w_0, 2, 0, Qt::AlignTop); s_eg = "100 + 10% = 100 + (10 "; s_eg += settings->multiplicationSign(); s_eg += " 0.01) = 100.1)"; grid->addWidget(new QLabel(QString::fromStdString(CALCULATOR->localizeExpression(s_eg, settings->evalops.parse_options))), 2, 1); w_1->setChecked(true); dialog->exec(); if(w_0->isChecked()) settings->simplified_percentage = 0; else settings->simplified_percentage = 1; dialog->deleteLater(); return settings->simplified_percentage == 0; } void QalculateWindow::keyPressEvent(QKeyEvent *e) { if(e->matches(QKeySequence::Undo)) { expressionEdit->editUndo(); return; } if(e->matches(QKeySequence::Redo)) { expressionEdit->editRedo(); return; } QMainWindow::keyPressEvent(e); } void QalculateWindow::closeEvent(QCloseEvent *e) { if(!settings->current_workspace.empty()) { int i = askSaveWorkspace(); if(i < 0) return; } settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); settings->show_bases = basesDock->isVisible(); if(settings->savePreferences(settings->save_mode_on_exit) < 0) return; if(settings->save_defs_on_exit) { while(!CALCULATOR->saveDefinitions()) { int answer = QMessageBox::critical(this, tr("Error"), tr("Couldn't write definitions"), QMessageBox::Retry | QMessageBox::Ignore | QMessageBox::Cancel); if(answer == QMessageBox::Ignore) break; else if(answer == QMessageBox::Cancel) return; } } CALCULATOR->abort(); CALCULATOR->terminateThreads(); if(commandThread->running) { commandThread->write((int) 0); commandThread->write(NULL); } if(viewThread->running) { viewThread->write((int) 0); viewThread->write(NULL); } QMainWindow::closeEvent(e); qApp->closeAllWindows(); } void QalculateWindow::onToActivated(bool button) { QTextCursor cur = expressionEdit->textCursor(); int b_result = 0; if(!expressionEdit->expressionHasChanged() && settings->current_result) b_result = 1; else if(settings->status_in_history && !mauto.isAborted() && expressionEdit->expressionHasChanged()) b_result = 2; bool b_addto = (b_result != 1); if(b_addto && button && CALCULATOR->hasToExpression(expressionEdit->toPlainText().toStdString(), true, settings->evalops)) { std::string str = expressionEdit->toPlainText().toStdString(), to_str; CALCULATOR->separateToExpression(str, to_str, settings->evalops, true, true); if(to_str.empty()) b_addto = false; } if(b_result != 1) expressionEdit->blockCompletion(true, button); if(b_addto) { expressionEdit->blockParseStatus(); expressionEdit->moveCursor(QTextCursor::End); expressionEdit->insertText("➞"); expressionEdit->blockParseStatus(false); expressionEdit->displayParseStatus(true, false); } if(b_result || button) { expressionEdit->complete(b_result == 1 ? mstruct : (b_result == 2 ? &mauto : NULL), b_result == 1 ? parsed_mstruct : (b_result == 2 ? &mauto_parsed : NULL), toMenu, b_result == 2); if(!toMenu->isEmpty()) { toAction_t->setMenu(toMenu); toAction_t->showMenu(); toAction_t->setMenu(NULL); toMenu->clear(); } } else { expressionEdit->complete(); } if(b_result != 1) expressionEdit->blockCompletion(false); } void QalculateWindow::onToConversionRequested(std::string str) { str.insert(0, "➞"); if(str[str.length() - 1] == ' ' || str[str.length() - 1] == '/') expressionEdit->insertText(QString::fromStdString(str)); else calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", str); } void QalculateWindow::importCSV() { size_t n = CALCULATOR->variables.size(); if(CSVDialog::importCSVFile(this)) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); for(size_t i = n; i < CALCULATOR->variables.size(); i++) { if(!CALCULATOR->variables[i]->isHidden()) settings->favourite_variables.push_back(CALCULATOR->variables[i]); } expressionObjectsUpdated(); } } void QalculateWindow::exportCSV() { CSVDialog::exportCSVFile(this, !auto_result.empty() ? &mauto : mstruct); } void QalculateWindow::onStoreActivated() { ExpressionItem *replaced_item = NULL; KnownVariable *v = VariableEditDialog::newVariable(this, !auto_result.empty() ? &mauto : (expressionEdit->expressionHasChanged() || settings->history_answer.empty() ? NULL : (mstruct_exact.isUndefined() ? mstruct : &mstruct_exact)), !auto_result.empty() ? QString::fromStdString(unhtmlize(auto_result)) : (expressionEdit->expressionHasChanged() ? expressionEdit->toPlainText() : QString::fromStdString(exact_text)), &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); expressionObjectsUpdated(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); } } void QalculateWindow::newVariable() { ExpressionItem *replaced_item = NULL; KnownVariable *v = VariableEditDialog::newVariable(this, NULL, NULL, &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); expressionObjectsUpdated(); } } void QalculateWindow::newMatrix() { ExpressionItem *replaced_item = NULL; KnownVariable *v = VariableEditDialog::newMatrix(this, &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); expressionObjectsUpdated(); } } void QalculateWindow::newUnknown() { ExpressionItem *replaced_item = NULL; UnknownVariable *v = UnknownEditDialog::newVariable(this, &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); expressionObjectsUpdated(); } } void QalculateWindow::newUnit() { ExpressionItem *replaced_item = NULL; Unit *u = UnitEditDialog::newUnit(this, &replaced_item); if(u) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(u != replaced_item && !u->isHidden()) settings->favourite_units.push_back(u); expressionObjectsUpdated(); } } void QalculateWindow::newFunction() { MathFunction *replaced_item = NULL; MathFunction *f = FunctionEditDialog::newFunction(this, &replaced_item); if(f) { expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); functionsMenu->clear(); if(f != replaced_item && !f->isHidden()) settings->favourite_functions.push_back(f); expressionObjectsUpdated(); } } void QalculateWindow::showNumpad(bool b) { keypad->hideNumpad(!b); settings->hide_numpad = !b; workspace_changed = true; nKeypadAction->setEnabled(!b); if(b && settings->keypad_type == KEYPAD_NUMBERPAD) gKeypadAction->trigger(); } void QalculateWindow::showSeparateKeypadMenuButtons(bool b) { settings->separate_keypad_menu_buttons = b; keypad->showSeparateKeypadMenuButtons(b); } void QalculateWindow::resetKeypadPosition() { keypadDock->setFloating(false); if(dockWidgetArea(keypadDock) != Qt::BottomDockWidgetArea) { bool b = keypadDock->isVisible(); removeDockWidget(keypadDock); addDockWidget(Qt::BottomDockWidgetArea, keypadDock); keypadDock->setVisible(b); } } void QalculateWindow::initFinished() { init_in_progress = false; } #define DOCK_IN_WINDOW(dock) (!dock->isFloating() && (dockWidgetArea(dock) == Qt::BottomDockWidgetArea || dockWidgetArea(dock) == Qt::TopDockWidgetArea)) #define DOCK_VISIBLE_IN_WINDOW(dock) (dock->isVisible() && DOCK_IN_WINDOW(dock)) void QalculateWindow::beforeShowDockCleanUp(QDockWidget*) { if(emhTimer && emhTimer->isActive()) { emhTimer->stop(); onEMHTimeout(); } if(resizeTimer && resizeTimer->isActive()) { resizeTimer->stop(); onResizeTimeout(); } } void QalculateWindow::beforeShowDock(QDockWidget *w, bool b) { beforeShowDockCleanUp(w); if(!init_in_progress && b && DOCK_IN_WINDOW(w)) { expressionEdit->setMinimumHeight(expressionEdit->height()); if(!w->isVisible() && (settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && historyView->height() < w->sizeHint().height()))) { if(settings->preserve_history_height < 0) { if(w == keypadDock) settings->keypad_appended = true; else if(w == basesDock) settings->bases_appended = true; } historyView->setMinimumHeight(historyView->height()); } else { if(w == keypadDock) settings->keypad_appended = false; else if(w == basesDock) settings->bases_appended = false; } } } void QalculateWindow::afterShowDock(QDockWidget *w) { if(!init_in_progress && w->isVisible()) { if(!emhTimer) { emhTimer = new QTimer(); emhTimer->setSingleShot(true); connect(emhTimer, SIGNAL(timeout()), this, SLOT(onEMHTimeout())); } emhTimer->start(100); } } void QalculateWindow::onEMHTimeout() { expressionEdit->updateMinimumHeight(); historyView->updateMinimumHeight(); } void QalculateWindow::onResizeTimeout() { if(DOCK_VISIBLE_IN_WINDOW(basesDock)) basesDock->setMaximumHeight(QWIDGETSIZE_MAX); if(DOCK_VISIBLE_IN_WINDOW(keypadDock)) keypadDock->setMaximumHeight(QWIDGETSIZE_MAX); setMinimumWidth(0); setMaximumWidth(QWIDGETSIZE_MAX); centralWidget()->setMaximumHeight(QWIDGETSIZE_MAX); centralWidget()->setMinimumHeight(0); } // minimum width when dock is shown void QalculateWindow::keypadTypeActivated() { int v = qobject_cast(sender())->data().toInt(); beforeShowDock(keypadDock, v >= 0 || !keypadDock->isVisible()); if(v < 0) { bool b = !keypadDock->isVisible(); bool b_resize = (settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->keypad_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(keypadDock); if(b_resize) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(basesDock)) basesDock->setMaximumHeight(basesDock->height()); } keypadDock->setVisible(b); if(b) keypadDock->raise(); if(b_resize) { setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } settings->show_keypad = b ? 1 : 0; } else { if(settings->keypad_type == v && keypadDock->isVisible()) v = KEYPAD_GENERAL; settings->keypad_type = v; keypad->setKeypadType(v); keypadDock->setVisible(true); keypadDock->raise(); settings->show_keypad = 1; updateKeypadTitle(); } afterShowDock(keypadDock); resetKeypadPositionAction->setEnabled(keypadDock->isVisible() && (keypadDock->isFloating() || dockWidgetArea(keypadDock) != Qt::BottomDockWidgetArea)); workspace_changed = true; } void QalculateWindow::onKeypadVisibilityChanged(bool b) { beforeShowDockCleanUp(keypadDock); QAction *action = find_child_data(this, "group_keypad", b ? settings->keypad_type : -1); if(action) action->setChecked(true); settings->show_keypad = b ? 1 : 0; resetKeypadPositionAction->setEnabled(keypadDock->isVisible() && (keypadDock->isFloating() || dockWidgetArea(keypadDock) != Qt::BottomDockWidgetArea)); if(!b && settings->keypad_type == KEYPAD_PROGRAMMING && settings->programming_base_changed) { settings->programming_base_changed = false; onBaseClicked(BASE_DECIMAL, true, false); } if((settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->keypad_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(keypadDock)) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(basesDock)) basesDock->setMaximumHeight(basesDock->height()); setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } } void QalculateWindow::onToolbarVisibilityChanged(bool b) { expressionEdit->setMenuAndToolbarItems(b ? NULL : modeAction_t->menu(), b ? NULL : menuAction_t->menu(), b ? NULL : tbAction); historyView->setMenuAndToolbarItems(b ? NULL : modeAction_t->menu(), b ? NULL : menuAction_t->menu(), b ? NULL : tbAction); tbAction->setChecked(b); } void QalculateWindow::onBasesActivated(bool b) { if(b == basesDock->isVisible()) return; beforeShowDock(basesDock, b); bool b_resize = (settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->bases_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(basesDock); if(b_resize) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(keypadDock)) keypadDock->setMaximumHeight(keypadDock->height()); } basesDock->setVisible(b); if(b) basesDock->raise(); if(b_resize) { setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } afterShowDock(basesDock); } void QalculateWindow::onBasesVisibilityChanged(bool b) { beforeShowDockCleanUp(basesDock); basesAction->setChecked(b); if((settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->bases_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(basesDock)) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(keypadDock)) keypadDock->setMaximumHeight(keypadDock->height()); setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } if(b && expressionEdit->expressionHasChanged()) onExpressionChanged(); else if(b && !settings->history_answer.empty()) updateResultBases(); } bool QalculateWindow::displayMessages() { return settings->displayMessages(this); } bool QalculateWindow::updateWindowTitle(const QString &str, bool is_result, bool type_change) { if(title_modified) return false; if(type_change) { if(settings->title_type == TITLE_APP_RESULT || settings->title_type == TITLE_APP_WORKSPACE || settings->title_type == TITLE_APP) { qApp->setApplicationDisplayName("Qalculate!"); setWindowTitle(QString()); } else if(settings->title_type == TITLE_RESULT) { qApp->setApplicationDisplayName(QString()); setWindowTitle(QString()); } if(settings->title_type == TITLE_RESULT || settings->title_type == TITLE_APP_RESULT) { if(result_text.empty()) { if(!auto_result.empty()) setWindowTitle(QString::fromStdString(unhtmlize(auto_result))); else if(settings->title_type == TITLE_RESULT) setWindowTitle("Qalculate!"); } else { setWindowTitle(QString::fromStdString(unhtmlize(result_text))); } } } switch(settings->title_type) { case TITLE_RESULT: { if(str.isEmpty()) { if(is_result) { setWindowTitle("Qalculate!"); return true; } return false; } setWindowTitle(str); break; } case TITLE_APP_RESULT: { if(str.isEmpty() && !is_result) { return false; } setWindowTitle(str); break; } case TITLE_WORKSPACE: { if(is_result) return false; if(settings->workspaceTitle().isEmpty()) qApp->setApplicationDisplayName("Qalculate!"); else qApp->setApplicationDisplayName(settings->workspaceTitle()); setWindowTitle(str); break; } case TITLE_APP_WORKSPACE: { if(is_result) return false; if(str.isEmpty()) setWindowTitle(settings->workspaceTitle()); else setWindowTitle(str); break; } default: { if(is_result) return false; setWindowTitle(str); } } return true; } void QalculateWindow::angleUnitActivated() { QAction *action = qobject_cast(sender()); settings->evalops.parse_options.angle_unit = (AngleUnit) action->data().toInt(); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM) { CALCULATOR->setCustomAngleUnit(CALCULATOR->getActiveUnit(action->objectName().mid(18).toStdString())); } expressionFormatUpdated(true); } void QalculateWindow::normalActivated() { settings->printops.sort_options.minus_last = true; settings->printops.min_exp = EXP_PRECISION; settings->printops.show_ending_zeroes = true; if(settings->prefixes_default) settings->printops.use_unit_prefixes = true; settings->printops.negative_exponents = false; resultFormatUpdated(); } void QalculateWindow::scientificActivated() { settings->printops.sort_options.minus_last = false; settings->printops.min_exp = EXP_SCIENTIFIC; settings->printops.show_ending_zeroes = true; if(settings->prefixes_default) settings->printops.use_unit_prefixes = false; settings->printops.negative_exponents = true; resultFormatUpdated(); } void QalculateWindow::engineeringActivated() { settings->printops.sort_options.minus_last = false; settings->printops.min_exp = EXP_BASE_3; settings->printops.show_ending_zeroes = true; if(settings->prefixes_default) settings->printops.use_unit_prefixes = false; settings->printops.negative_exponents = false; resultFormatUpdated(); } void QalculateWindow::simpleActivated() { settings->printops.sort_options.minus_last = true; settings->printops.min_exp = EXP_NONE; settings->printops.show_ending_zeroes = false; if(settings->prefixes_default) settings->printops.use_unit_prefixes = true; settings->printops.negative_exponents = false; resultFormatUpdated(); } void QalculateWindow::onPrecisionChanged(int v) { CALCULATOR->setPrecision(v); settings->previous_precision = 0; expressionCalculationUpdated(500); } void QalculateWindow::syncDecimals() { if(settings->printops.use_min_decimals && settings->printops.use_max_decimals && settings->printops.max_decimals >= 0 && settings->printops.min_decimals > 0 && settings->printops.min_decimals > settings->printops.max_decimals) { settings->printops.min_decimals = settings->printops.max_decimals; minDecimalsEdit->blockSignals(true); minDecimalsEdit->setValue(settings->printops.min_decimals); minDecimalsEdit->blockSignals(false); } } void QalculateWindow::onMinDecimalsChanged(int v) { settings->printops.use_min_decimals = (v > 0); settings->printops.min_decimals = v; if(decimalsTimer) decimalsTimer->stop(); if(settings->printops.use_min_decimals && settings->printops.use_max_decimals && settings->printops.max_decimals >= 0 && settings->printops.min_decimals > 0 && settings->printops.min_decimals > settings->printops.max_decimals) { settings->printops.max_decimals = settings->printops.min_decimals; maxDecimalsEdit->blockSignals(true); maxDecimalsEdit->setValue(settings->printops.max_decimals); maxDecimalsEdit->blockSignals(false); } resultFormatUpdated(500); } void QalculateWindow::onMaxDecimalsChanged(int v) { settings->printops.use_max_decimals = (v >= 0); settings->printops.max_decimals = v; if(decimalsTimer) { decimalsTimer->stop(); } else { decimalsTimer = new QTimer(); decimalsTimer->setSingleShot(true); connect(decimalsTimer, SIGNAL(timeout()), this, SLOT(syncDecimals())); } decimalsTimer->start(2000); resultFormatUpdated(500); } void QalculateWindow::approximationActivated() { int v = qobject_cast(sender())->data().toInt(); if(v < 0) { settings->evalops.approximation = APPROXIMATION_TRY_EXACT; if(v == -2) {settings->dual_approximation = 1; settings->dual_fraction = 1;} else {settings->dual_approximation = -1; settings->dual_fraction = -1;} } else { settings->evalops.approximation = (ApproximationMode) v; settings->dual_fraction = 0; settings->dual_approximation = 0; } if(settings->evalops.approximation == APPROXIMATION_EXACT) settings->printops.number_fraction_format = FRACTION_DECIMAL_EXACT; else settings->printops.number_fraction_format = FRACTION_DECIMAL; expressionCalculationUpdated(); } void QalculateWindow::outputBaseActivated() { int v = qobject_cast(sender())->data().toInt(); to_base = 0; to_bits = 0; to_duo_syms = false; if(v == BASE_CUSTOM) { v = customOutputBaseEdit->value(); if(v > 2 && v <= 36) { settings->printops.base = v; } else { settings->printops.base = BASE_CUSTOM; CALCULATOR->setCustomOutputBase(v); } } else { settings->printops.base = v; } keypad->updateBase(); resultFormatUpdated(); } void QalculateWindow::onCustomOutputBaseChanged(int v) { customOutputBaseAction->setChecked(true); to_base = 0; to_bits = 0; to_duo_syms = false; if(v > 2 && v <= 36) { settings->printops.base = v; } else { settings->printops.base = BASE_CUSTOM; CALCULATOR->setCustomOutputBase(Number(v, 1)); } keypad->updateBase(); resultFormatUpdated(); } void QalculateWindow::inputBaseActivated() { int v = qobject_cast(sender())->data().toInt(); if(v == BASE_CUSTOM) { v = customOutputBaseEdit->value(); if(v > 2 && v <= 36) { settings->evalops.parse_options.base = v; } else { settings->evalops.parse_options.base = BASE_CUSTOM; CALCULATOR->setCustomInputBase(v); } } else { settings->evalops.parse_options.base = v; } keypad->updateBase(); expressionFormatUpdated(false); } void QalculateWindow::onCustomInputBaseChanged(int v) { customInputBaseAction->setChecked(true); if(v > 2 && v <= 36) { settings->evalops.parse_options.base = v; } else { settings->evalops.parse_options.base = BASE_CUSTOM; CALCULATOR->setCustomInputBase(Number(v, 1)); } keypad->updateBase(); expressionFormatUpdated(false); } void QalculateWindow::assumptionsTypeActivated() { int v = qobject_cast(sender())->data().toInt(); CALCULATOR->defaultAssumptions()->setType((AssumptionType) v); for(int i = 0; i < 5; i++) { if(assumptionSignActions[i]->data().toInt() == CALCULATOR->defaultAssumptions()->sign()) { assumptionSignActions[i]->setChecked(true); break; } } expressionCalculationUpdated(); } void QalculateWindow::assumptionsSignActivated() { int v = qobject_cast(sender())->data().toInt(); CALCULATOR->defaultAssumptions()->setSign((AssumptionSign) v); for(int i = 0; i < 4; i++) { if(assumptionTypeActions[i]->data().toInt() == CALCULATOR->defaultAssumptions()->type()) { assumptionTypeActions[i]->setChecked(true); break; } } expressionCalculationUpdated(); } void QalculateWindow::onAlwaysOnTopChanged() { if(settings->always_on_top) { setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); if(datasetsDialog) datasetsDialog->setWindowFlags(datasetsDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(functionsDialog) functionsDialog->setWindowFlags(functionsDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(variablesDialog) variablesDialog->setWindowFlags(variablesDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(unitsDialog) unitsDialog->setWindowFlags(unitsDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(fpConversionDialog) fpConversionDialog->setWindowFlags(fpConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(percentageDialog) percentageDialog->setWindowFlags(percentageDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(plotDialog) plotDialog->setWindowFlags(plotDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(calendarConversionDialog) calendarConversionDialog->setWindowFlags(calendarConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(preferencesDialog) preferencesDialog->setWindowFlags(preferencesDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(historyView->searchDialog) historyView->searchDialog->setWindowFlags(historyView->searchDialog->windowFlags() | Qt::WindowStaysOnTopHint); } else { setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); if(datasetsDialog) datasetsDialog->setWindowFlags(datasetsDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(functionsDialog) functionsDialog->setWindowFlags(functionsDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(variablesDialog) variablesDialog->setWindowFlags(variablesDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(unitsDialog) unitsDialog->setWindowFlags(unitsDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(fpConversionDialog) fpConversionDialog->setWindowFlags(fpConversionDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(percentageDialog) percentageDialog->setWindowFlags(percentageDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(plotDialog) plotDialog->setWindowFlags(plotDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(calendarConversionDialog) calendarConversionDialog->setWindowFlags(calendarConversionDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(preferencesDialog) preferencesDialog->setWindowFlags(preferencesDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(historyView->searchDialog) historyView->searchDialog->setWindowFlags(historyView->searchDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); } if(periodicTableDialog) periodicTableDialog->onAlwaysOnTopChanged(); show(); } void QalculateWindow::onEnableTooltipsChanged() { if(settings->enable_tooltips == 0) qApp->installEventFilter(this); else qApp->removeEventFilter(this); QList buttons = keypad->findChildren(); for(int i = 0; i < buttons.count(); i++) { if(settings->enable_tooltips > 1) buttons.at(i)->installEventFilter(this); else buttons.at(i)->removeEventFilter(this); } } void QalculateWindow::onTitleTypeChanged() { title_modified = false; updateWindowTitle(QString(), false, true); } void QalculateWindow::onPreferencesClosed() { preferencesDialog->deleteLater(); preferencesDialog = NULL; } void QalculateWindow::onResultFontChanged() { if(settings->use_custom_result_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_result_font)); historyView->setFont(font); rpnView->setFont(font);} else {historyView->setFont(QApplication::font()); rpnView->setFont(QApplication::font());} } void QalculateWindow::onExpressionFontChanged() { if(settings->use_custom_expression_font) { QFont font; font.fromString(QString::fromStdString(settings->custom_expression_font)); expressionEdit->setFont(font); } else { QFont font = QApplication::font(); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * 1.35); else font.setPointSize(font.pointSize() * 1.35); expressionEdit->setFont(font); } } void QalculateWindow::onKeypadFontChanged() { if(settings->use_custom_keypad_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_keypad_font)); keypad->setFont(font);} else keypad->setFont(QApplication::font()); } void QalculateWindow::onAppFontTimer() { onAppFontChanged(); loadInitialHistory(); } void QalculateWindow::onAppFontChanged() { if(settings->use_custom_app_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_app_font)); QApplication::setFont(font);} else QApplication::setFont(settings->saved_app_font); if(!settings->use_custom_expression_font) { QFont font = QApplication::font(); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * 1.35); else font.setPointSize(font.pointSize() * 1.35); expressionEdit->setFont(font); if(expressionEdit->completionInitialized()) expressionEdit->updateCompletion(); } if(!settings->use_custom_result_font) { historyView->setFont(QApplication::font()); rpnView->setFont(QApplication::font()); } if(!settings->use_custom_keypad_font) keypad->setFont(QApplication::font()); } void QalculateWindow::onExpressionStatusModeChanged(bool b) { if(preferencesDialog) preferencesDialog->updateExpressionStatus(); if(b) { if(!settings->status_in_history) historyView->clearTemporary(); auto_expression = ""; auto_error = ""; mauto.setAborted(); if(!settings->status_in_history) updateWindowTitle(QString::fromStdString(unhtmlize(result_text)), true); if(autoCalculateTimer) autoCalculateTimer->stop(); expressionEdit->displayParseStatus(true); } } void QalculateWindow::removeShortcutClicked() { QTreeWidgetItem *item = shortcutList->currentItem(); if(!item) return; keyboard_shortcut *ks = (keyboard_shortcut*) item->data(0, Qt::UserRole).value(); if(!ks) return; keyboardShortcutRemoved(ks); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { if(settings->keyboard_shortcuts[i] == ks) { settings->keyboard_shortcuts.erase(settings->keyboard_shortcuts.begin() + i); break; } } settings->default_shortcuts = false; delete ks; delete item; } void QalculateWindow::updateShortcutActionOK() { QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected()) { shortcutActionOKButton->setEnabled(edited_keyboard_shortcut->type.size() > 0); shortcutActionAddButton->setEnabled(false); } else if(!SHORTCUT_REQUIRES_VALUE(item->data(0, Qt::UserRole).toInt()) || !shortcutActionValueEdit->currentText().isEmpty()) { shortcutActionOKButton->setEnabled(true); shortcutActionAddButton->setEnabled(true); } else { shortcutActionOKButton->setEnabled(false); shortcutActionAddButton->setEnabled(false); } } void QalculateWindow::shortcutActionOKClicked() { QString value = shortcutActionValueEdit->currentText(); QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected()) { if(edited_keyboard_shortcut->type.size() > 0) shortcutActionDialog->accept(); return; } if(settings->testShortcutValue(item->data(0, Qt::UserRole).toInt(), value, shortcutActionDialog)) { edited_keyboard_shortcut->type.push_back((shortcut_type) shortcutActionList->currentItem()->data(0, Qt::UserRole).toInt()); edited_keyboard_shortcut->value.push_back(value.toStdString()); shortcutActionDialog->accept(); } else { shortcutActionValueEdit->setFocus(); } if(item->data(0, Qt::UserRole).toInt() == SHORTCUT_TYPE_COPY_RESULT) { int v = value.toInt(); if(v >= 0 && v < settings->copy_action_value_texts.size()) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { shortcutActionValueEdit->setCurrentText(value); } } void QalculateWindow::shortcutActionAddClicked() { QString value = shortcutActionValueEdit->currentText(); QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected()) return; if(settings->testShortcutValue(item->data(0, Qt::UserRole).toInt(), value, shortcutActionDialog)) { edited_keyboard_shortcut->type.push_back((shortcut_type) shortcutActionList->currentItem()->data(0, Qt::UserRole).toInt()); edited_keyboard_shortcut->value.push_back(value.toStdString()); shortcutActionValueEdit->clear(); shortcutActionList->setCurrentItem(NULL); shortcutActionAddButton->setText(tr("Add Action (%1)").arg(edited_keyboard_shortcut->type.size() + 1)); } else { shortcutActionValueEdit->setFocus(); if(item->data(0, Qt::UserRole).toInt() == SHORTCUT_TYPE_COPY_RESULT) { int v = value.toInt(); if(v >= 0 && v < settings->copy_action_value_texts.size()) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { shortcutActionValueEdit->setCurrentText(value); } } } void QalculateWindow::currentShortcutActionChanged() { QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected() || !SHORTCUT_USES_VALUE(item->data(0, Qt::UserRole).toInt())) { shortcutActionValueEdit->clear(); shortcutActionValueEdit->clearEditText(); shortcutActionValueEdit->setEnabled(false); shortcutActionValueLabel->setEnabled(false); return; } int i = item->data(0, Qt::UserRole).toInt(); shortcutActionValueEdit->setEnabled(true); shortcutActionValueLabel->setEnabled(true); if(i == SHORTCUT_TYPE_FUNCTION || i == SHORTCUT_TYPE_FUNCTION_WITH_DIALOG) { QStringList citems; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(f->isActive() && !f->isHidden()) citems << QString::fromStdString(f->referenceName()); } if(shortcutActionValueEdit->count() != citems.count()) { shortcutActionValueEdit->clear(); citems.sort(Qt::CaseInsensitive); shortcutActionValueEdit->addItems(citems); shortcutActionValueEdit->clearEditText(); } } else { shortcutActionValueEdit->clear(); if(i == SHORTCUT_TYPE_UNIT || i == SHORTCUT_TYPE_CONVERT_TO) { QStringList citems; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(u->isActive() && !u->isHidden()) citems << QString::fromStdString(u->referenceName()); } citems.sort(Qt::CaseInsensitive); shortcutActionValueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_VARIABLE) { QStringList citems; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(v->isActive() && !v->isHidden()) citems << QString::fromStdString(v->referenceName()); } citems.sort(Qt::CaseInsensitive); shortcutActionValueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_OPERATOR) { QStringList citems; citems << "+" << (settings->printops.use_unicode_signs ? SIGN_MINUS : "-") << settings->multiplicationSign(false) << settings->divisionSign(false) << "^" << ".+" << (QStringLiteral(".") + (settings->printops.use_unicode_signs ? SIGN_MINUS : "-")) << (QStringLiteral(".") + settings->multiplicationSign(false)) << (QStringLiteral(".") + settings->divisionSign(false)) << ".^" << "mod" << "rem" << "//" << "&" << "|" << "<<" << ">>" << "&&" << "||" << "xor" << "=" << SIGN_NOT_EQUAL << "<" << SIGN_LESS_OR_EQUAL << SIGN_GREATER_OR_EQUAL << ">"; shortcutActionValueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_COPY_RESULT) { settings->updateActionValueTexts(); shortcutActionValueEdit->addItems(settings->copy_action_value_texts); } if(i == SHORTCUT_TYPE_COPY_RESULT) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[0]); else shortcutActionValueEdit->clearEditText(); } } class QalculateKeySequenceEdit : public QKeySequenceEdit { public: QalculateKeySequenceEdit(QWidget *parent) : QKeySequenceEdit(parent) { installEventFilter(this); } protected: bool eventFilter(QObject*, QEvent *event) { if(event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if(keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) { keyPressEvent(keyEvent); return true; } return false; } else { return false; } } }; bool QalculateWindow::editKeyboardShortcut(keyboard_shortcut *new_ks, keyboard_shortcut *ks, int type) { if(!ks) type = 0; QDialog *dialog = NULL; shortcutActionList = NULL; shortcutActionValueEdit = NULL; shortcutActionDialog = NULL; new_ks->type.clear(); new_ks->value.clear(); edited_keyboard_shortcut = new_ks; if(type != 2) { dialog = new QDialog(this); shortcutActionDialog = dialog; if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(ks ? tr("Edit Keyboard Shortcut") : tr("New Keyboard Shortcut")); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); shortcutActionList = new QTreeWidget(dialog); shortcutActionList->setColumnCount(1); shortcutActionList->setHeaderLabel(tr("Action")); shortcutActionList->setSelectionMode(QAbstractItemView::SingleSelection); shortcutActionList->setRootIsDecorated(false); shortcutActionList->header()->setVisible(true); shortcutActionList->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); shortcutActionList->setSortingEnabled(true); shortcutActionList->sortByColumn(-1, Qt::AscendingOrder); grid->addWidget(shortcutActionList, 0, 0, 1, 2); for(int i = SHORTCUT_TYPE_FUNCTION; i <= SHORTCUT_TYPE_QUIT; i++) { if(i < SHORTCUT_TYPE_EXPRESSION_CLEAR || i > SHORTCUT_TYPE_CALCULATE_EXPRESSION) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText((shortcut_type) i))); item->setData(0, Qt::UserRole, i); if(new_ks->type.size() == 0 && ((!ks && i == 0) || (ks && i == ks->type[0]))) shortcutActionList->setCurrentItem(item); } if(i == SHORTCUT_TYPE_HISTORY_SEARCH) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText(SHORTCUT_TYPE_HISTORY_CLEAR))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_HISTORY_CLEAR); if(new_ks->type.size() == 0 && ks && ks->type[0] == SHORTCUT_TYPE_HISTORY_CLEAR) shortcutActionList->setCurrentItem(item); } else if(i == SHORTCUT_TYPE_SIMPLE_NOTATION) { for(int i2 = SHORTCUT_TYPE_PRECISION; i2 <= SHORTCUT_TYPE_MINMAX_DECIMALS; i2++) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText((shortcut_type) i2))); item->setData(0, Qt::UserRole, i2); if(new_ks->type.size() == 0 && ks && i2 == ks->type[0]) shortcutActionList->setCurrentItem(item); } } else if(i == SHORTCUT_TYPE_MENU) { for(int i2 = SHORTCUT_TYPE_FUNCTIONS_MENU; i2 <= SHORTCUT_TYPE_VARIABLES_MENU; i2++) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText((shortcut_type) i2))); item->setData(0, Qt::UserRole, i2); if(new_ks->type.size() == 0 && ks && i2 == ks->type[0]) shortcutActionList->setCurrentItem(item); } } else if(i == SHORTCUT_TYPE_APPROXIMATE) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText(SHORTCUT_TYPE_TOGGLE_FRACTION))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_TOGGLE_FRACTION); if(new_ks->type.size() == 0 && ks && ks->type[0] == SHORTCUT_TYPE_TOGGLE_FRACTION) shortcutActionList->setCurrentItem(item); } } shortcutActionValueLabel = new QLabel(tr("Value:"), dialog); grid->addWidget(shortcutActionValueLabel, 1, 0); shortcutActionValueEdit = new QComboBox(dialog); shortcutActionValueEdit->setEditable(true); shortcutActionValueEdit->setLineEdit(new MathLineEdit()); grid->addWidget(shortcutActionValueEdit, 1, 1); grid->setColumnStretch(1, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); shortcutActionAddButton = buttonBox->addButton(tr("Add Action (%1)").arg(1), QDialogButtonBox::ApplyRole); connect(shortcutActionAddButton, SIGNAL(clicked()), this, SLOT(shortcutActionAddClicked())); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(shortcutActionOKClicked())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); connect(shortcutActionList, SIGNAL(itemSelectionChanged()), this, SLOT(currentShortcutActionChanged()), Qt::QueuedConnection); connect(shortcutActionList, SIGNAL(itemSelectionChanged()), this, SLOT(updateShortcutActionOK()), Qt::QueuedConnection); connect(shortcutActionValueEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(updateShortcutActionOK())); shortcutActionOKButton = buttonBox->button(QDialogButtonBox::Ok); currentShortcutActionChanged(); if(ks) { if(ks->type[0] == SHORTCUT_TYPE_COPY_RESULT) { int v = s2i(ks->value[0]); if(v >= 0 && v < settings->copy_action_value_texts.size()) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { shortcutActionValueEdit->setCurrentText(QString::fromStdString(ks->value[0])); } } updateShortcutActionOK(); shortcutActionList->setFocus(); dialog->resize(dialog->sizeHint().width(), dialog->sizeHint().width() * 1.25); if(dialog->exec() != QDialog::Accepted) { dialog->deleteLater(); return false; } dialog->deleteLater(); } if(type == 1) { new_ks->key = ks->key; new_ks->action = NULL; new_ks->new_action = false; return true; } dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Set key combination")); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel("" + tr("Press the key combination you wish to use for the action.") + "", dialog), 0, 0); QKeySequenceEdit *keyEdit = new QalculateKeySequenceEdit(dialog); grid->addWidget(keyEdit, 1, 0); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel, Qt::Horizontal, dialog); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); connect(keyEdit, SIGNAL(editingFinished()), dialog, SLOT(accept())); keyEdit->setFocus(); while(dialog->exec() == QDialog::Accepted && !keyEdit->keySequence().isEmpty()) { QString key = keyEdit->keySequence().toString(); if(keyEdit->keySequence() == QKeySequence::Undo || keyEdit->keySequence() == QKeySequence::Redo || keyEdit->keySequence() == QKeySequence::Copy || keyEdit->keySequence() == QKeySequence::Paste || keyEdit->keySequence() == QKeySequence::Delete || keyEdit->keySequence() == QKeySequence::Cut || keyEdit->keySequence() == QKeySequence::SelectAll || #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) keyEdit->keySequence() == QKeySequence::Backspace || (keyEdit->keySequence().count() == 1 && keyEdit->keySequence()[0].keyboardModifiers() == Qt::NoModifier && keyEdit->keySequence()[0].key() != Qt::Key_Tab && keyEdit->keySequence()[0].key() != Qt::Key_Backtab && (keyEdit->keySequence()[0].key() < Qt::Key_F1 || (keyEdit->keySequence()[0].key() >= Qt::Key_Space && keyEdit->keySequence()[0].key() <= Qt::Key_ydiaeresis) || (keyEdit->keySequence()[0].key() >= Qt::Key_Multi_key && keyEdit->keySequence()[0].key() < Qt::Key_Back))) #else (keyEdit->keySequence().count() == 1 && keyEdit->keySequence()[0] != Qt::Key_Tab && keyEdit->keySequence()[0] != Qt::Key_Backtab && (keyEdit->keySequence()[0] < Qt::Key_F1 || (keyEdit->keySequence()[0] >= Qt::Key_Space && keyEdit->keySequence()[0] <= Qt::Key_ydiaeresis) || (keyEdit->keySequence()[0] >= Qt::Key_Multi_key && keyEdit->keySequence()[0] < Qt::Key_Back))) #endif ) { QMessageBox::critical(this, tr("Error"), tr("Reserved key combination"), QMessageBox::Ok); keyEdit->clear(); keyEdit->setFocus(); continue; } for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { if(settings->keyboard_shortcuts[i] != ks && settings->keyboard_shortcuts[i]->key == key) { if(QMessageBox::question(this, tr("Question"), tr("The key combination is already in use.\nDo you wish to replace the current action (%1)?").arg(settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { for(int index = 0; index < shortcutList->topLevelItemCount(); index++) { if(shortcutList->topLevelItem(index)->data(0, Qt::UserRole).value() == (void*) settings->keyboard_shortcuts[i]) { delete shortcutList->topLevelItem(index); break; } } keyboardShortcutRemoved(settings->keyboard_shortcuts[i]); delete settings->keyboard_shortcuts[i]; settings->keyboard_shortcuts.erase(settings->keyboard_shortcuts.begin() + i); settings->default_shortcuts = false; break; } else { dialog->deleteLater(); return false; } } } new_ks->key = key; if(type == 2) { new_ks->type = ks->type; new_ks->value = ks->value; } new_ks->action = NULL; new_ks->new_action = false; dialog->deleteLater(); return true; } dialog->deleteLater(); return false; } void QalculateWindow::addShortcutClicked() { keyboard_shortcut *ks = new keyboard_shortcut; if(editKeyboardShortcut(ks, NULL)) { settings->keyboard_shortcuts.push_back(ks); size_t i = settings->keyboard_shortcuts.size() - 1; keyboardShortcutAdded(settings->keyboard_shortcuts[i]); QTreeWidgetItem *item = new QTreeWidgetItem(shortcutList); item->setText(0, settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)); item->setText(1, QKeySequence::fromString(settings->keyboard_shortcuts[i]->key).toString()); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) settings->keyboard_shortcuts[i])); settings->default_shortcuts = false; } else { delete ks; } } void QalculateWindow::editShortcutClicked() { shortcutDoubleClicked(shortcutList->currentItem(), -1); } void QalculateWindow::currentShortcutChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { editShortcutButton->setEnabled(item != NULL); removeShortcutButton->setEnabled(item != NULL); } void QalculateWindow::shortcutDoubleClicked(QTreeWidgetItem *item, int c) { if(!item) return; keyboard_shortcut *ks_old = (keyboard_shortcut*) item->data(0, Qt::UserRole).value(); keyboard_shortcut *ks = new keyboard_shortcut; if(editKeyboardShortcut(ks, ks_old, c + 1)) { keyboardShortcutRemoved(ks_old); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { if(settings->keyboard_shortcuts[i] == ks_old) { settings->keyboard_shortcuts.erase(settings->keyboard_shortcuts.begin() + i); break; } } settings->keyboard_shortcuts.push_back(ks); size_t i = settings->keyboard_shortcuts.size() - 1; keyboardShortcutAdded(settings->keyboard_shortcuts[i]); item->setText(0, settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)); item->setText(1, QKeySequence::fromString(settings->keyboard_shortcuts[i]->key).toString()); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) settings->keyboard_shortcuts[i])); settings->default_shortcuts = false; } else { delete ks; } } void QalculateWindow::editKeyboardShortcuts() { if(shortcutsDialog) { shortcutsDialog->setWindowState((shortcutsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); shortcutsDialog->show(); qApp->processEvents(); shortcutsDialog->raise(); shortcutsDialog->activateWindow(); return; } shortcutsDialog = new QDialog(this); try_resize(shortcutsDialog, 700, 500); if(settings->always_on_top) shortcutsDialog->setWindowFlags(shortcutsDialog->windowFlags() | Qt::WindowStaysOnTopHint); shortcutsDialog->setWindowTitle(tr("Keyboard Shortcuts")); QVBoxLayout *box = new QVBoxLayout(shortcutsDialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); shortcutList = new QTreeWidget(shortcutsDialog); shortcutList->setSelectionMode(QAbstractItemView::SingleSelection); shortcutList->setRootIsDecorated(false); shortcutList->setColumnCount(2); QStringList list; list << tr("Action"); list << tr("Key combination"); shortcutList->setHeaderLabels(list); shortcutList->header()->setVisible(true); shortcutList->header()->setStretchLastSection(false); shortcutList->header()->setSectionResizeMode(0, QHeaderView::Stretch); shortcutList->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutList); item->setText(0, settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)); item->setText(1, QKeySequence::fromString(settings->keyboard_shortcuts[i]->key).toString()); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) settings->keyboard_shortcuts[i])); } shortcutList->setCurrentItem(NULL); shortcutList->setSortingEnabled(true); shortcutList->sortByColumn(1, Qt::AscendingOrder); connect(shortcutList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(shortcutDoubleClicked(QTreeWidgetItem*, int))); connect(shortcutList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(currentShortcutChanged(QTreeWidgetItem*, QTreeWidgetItem*))); grid->addWidget(shortcutList); QVBoxLayout *vbox = new QVBoxLayout(); grid->addLayout(vbox, 0, 1); addShortcutButton = new QPushButton(tr("Add…"), this); connect(addShortcutButton, SIGNAL(clicked()), this, SLOT(addShortcutClicked())); vbox->addWidget(addShortcutButton); editShortcutButton = new QPushButton(tr("Edit…"), this); editShortcutButton->setEnabled(false); connect(editShortcutButton, SIGNAL(clicked()), this, SLOT(editShortcutClicked())); vbox->addWidget(editShortcutButton); removeShortcutButton = new QPushButton(tr("Remove"), this); removeShortcutButton->setEnabled(false); connect(removeShortcutButton, SIGNAL(clicked()), this, SLOT(removeShortcutClicked())); vbox->addWidget(removeShortcutButton); vbox->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, shortcutsDialog); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), shortcutsDialog, SLOT(reject())); shortcutsDialog->show(); } void QalculateWindow::editPreferences() { if(preferencesDialog) { preferencesDialog->setWindowState((preferencesDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); preferencesDialog->show(); qApp->processEvents(); preferencesDialog->raise(); preferencesDialog->activateWindow(); return; } preferencesDialog = new PreferencesDialog(this); connect(preferencesDialog, SIGNAL(resultFormatUpdated()), this, SLOT(resultFormatUpdated())); connect(preferencesDialog, SIGNAL(resultDisplayUpdated()), this, SLOT(resultDisplayUpdated())); connect(preferencesDialog, SIGNAL(expressionFormatUpdated(bool)), this, SLOT(expressionFormatUpdated(bool))); connect(preferencesDialog, SIGNAL(expressionCalculationUpdated(int)), this, SLOT(expressionCalculationUpdated(int))); connect(preferencesDialog, SIGNAL(alwaysOnTopChanged()), this, SLOT(onAlwaysOnTopChanged())); connect(preferencesDialog, SIGNAL(enableTooltipsChanged()), this, SLOT(onEnableTooltipsChanged())); connect(preferencesDialog, SIGNAL(titleTypeChanged()), this, SLOT(onTitleTypeChanged())); connect(preferencesDialog, SIGNAL(resultFontChanged()), this, SLOT(onResultFontChanged())); connect(preferencesDialog, SIGNAL(expressionFontChanged()), this, SLOT(onExpressionFontChanged())); connect(preferencesDialog, SIGNAL(keypadFontChanged()), this, SLOT(onKeypadFontChanged())); connect(preferencesDialog, SIGNAL(appFontChanged()), this, SLOT(onAppFontChanged())); connect(preferencesDialog, SIGNAL(symbolsUpdated()), keypad, SLOT(updateSymbols())); connect(preferencesDialog, SIGNAL(historyExpressionTypeChanged()), historyView, SLOT(reloadHistory())); connect(preferencesDialog, SIGNAL(binaryBitsChanged()), this, SLOT(onBinaryBitsChanged())); connect(preferencesDialog, SIGNAL(statusModeChanged()), this, SLOT(onExpressionStatusModeChanged())); connect(preferencesDialog, SIGNAL(dialogClosed()), this, SLOT(onPreferencesClosed())); if(settings->always_on_top) preferencesDialog->setWindowFlags(preferencesDialog->windowFlags() | Qt::WindowStaysOnTopHint); preferencesDialog->show(); } void QalculateWindow::openSettingsFolder() { if(getLocalDir() != getLocalDataDir()) { std::string dir = buildPath(getLocalDataDir(), "definitions"); if(dirExists(dir) || recursiveMakeDir(dir)) QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(dir))); } std::string dir = getLocalDir(); if(dirExists(dir) || recursiveMakeDir(dir)) QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(dir))); } void QalculateWindow::onDatasetsChanged() { expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); functionsMenu->clear(); } void QalculateWindow::onFunctionsChanged() { expressionEdit->updateCompletion(); if(datasetsDialog) datasetsDialog->updateDatasets(); functionsMenu->clear(); } void QalculateWindow::insertProperty(DataObject *o, DataProperty *dp) { expressionEdit->blockCompletion(); DataSet *ds = dp->parentSet(); std::string str = ds->preferredDisplayName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true); str += "("; str += o->getProperty(ds->getPrimaryKeyProperty()); str += CALCULATOR->getComma(); str += " "; str += dp->getName(); str += ")"; expressionEdit->insertText(QString::fromStdString(str)); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::openDatasets() { if(datasetsDialog) { datasetsDialog->setWindowState((datasetsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); datasetsDialog->show(); qApp->processEvents(); datasetsDialog->raise(); datasetsDialog->activateWindow(); return; } datasetsDialog = new DataSetsDialog(); connect(datasetsDialog, SIGNAL(itemsChanged()), this, SLOT(onDatasetsChanged())); connect(datasetsDialog, SIGNAL(insertPropertyRequest(DataObject*, DataProperty*)), this, SLOT(insertProperty(DataObject*, DataProperty*))); if(settings->always_on_top) datasetsDialog->setWindowFlags(datasetsDialog->windowFlags() | Qt::WindowStaysOnTopHint); datasetsDialog->show(); } void QalculateWindow::applyFunction(MathFunction *f) { if(b_busy) return; if(settings->rpn_mode) { calculateRPN(f); return; } QString str = QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)); if(f->args() == 0) { str += "()"; } else { str += "("; str += expressionEdit->toPlainText(); str += ")"; } expressionEdit->blockParseStatus(); expressionEdit->setExpression(str); expressionEdit->blockParseStatus(false); calculate(); } void QalculateWindow::openFunctions() { if(functionsDialog) { functionsDialog->setWindowState((functionsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); functionsDialog->show(); qApp->processEvents(); functionsDialog->raise(); functionsDialog->activateWindow(); return; } functionsDialog = new FunctionsDialog(); connect(functionsDialog, SIGNAL(itemsChanged()), this, SLOT(onFunctionsChanged())); connect(functionsDialog, SIGNAL(itemsChanged()), this, SLOT(expressionObjectsUpdated())); connect(functionsDialog, SIGNAL(favouritesChanged()), this, SLOT(updateFavouriteFunctions())); connect(functionsDialog, SIGNAL(applyFunctionRequest(MathFunction*)), this, SLOT(applyFunction(MathFunction*))); connect(functionsDialog, SIGNAL(applyFunctionRequest(MathFunction*)), this, SLOT(addToRecentFunctions(MathFunction*))); connect(functionsDialog, SIGNAL(insertFunctionRequest(MathFunction*)), this, SLOT(onInsertFunctionRequested(MathFunction*))); connect(functionsDialog, SIGNAL(insertFunctionRequest(MathFunction*)), this, SLOT(addToRecentFunctions(MathFunction*))); connect(functionsDialog, SIGNAL(calculateFunctionRequest(MathFunction*)), this, SLOT(onCalculateFunctionRequested(MathFunction*))); connect(functionsDialog, SIGNAL(calculateFunctionRequest(MathFunction*)), this, SLOT(addToRecentFunctions(MathFunction*))); if(settings->always_on_top) functionsDialog->setWindowFlags(functionsDialog->windowFlags() | Qt::WindowStaysOnTopHint); functionsDialog->show(); } void QalculateWindow::onUnitRemoved(Unit *u) { if(unitsDialog) unitsDialog->unitRemoved(u); } void QalculateWindow::onUnitDeactivated(Unit *u) { if(unitsDialog) unitsDialog->unitDeactivated(u); } void QalculateWindow::resetUnitsAndVariablesMenus() { unitsMenu->clear(); variablesMenu->clear(); } void QalculateWindow::openVariables() { if(variablesDialog) { variablesDialog->setWindowState((variablesDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); variablesDialog->show(); qApp->processEvents(); variablesDialog->raise(); variablesDialog->activateWindow(); return; } variablesDialog = new VariablesDialog(); connect(variablesDialog, SIGNAL(itemsChanged()), expressionEdit, SLOT(updateCompletion())); connect(variablesDialog, SIGNAL(itemsChanged()), this, SLOT(resetUnitsAndVariablesMenus())); connect(variablesDialog, SIGNAL(itemsChanged()), this, SLOT(expressionObjectsUpdated())); connect(variablesDialog, SIGNAL(favouritesChanged()), this, SLOT(updateFavouriteVariables())); connect(variablesDialog, SIGNAL(unitRemoved(Unit*)), this, SLOT(onUnitRemoved(Unit*))); connect(variablesDialog, SIGNAL(unitDeactivated(Unit*)), this, SLOT(onUnitDeactivated(Unit*))); connect(variablesDialog, SIGNAL(insertVariableRequest(Variable*)), this, SLOT(onVariableClicked(Variable*))); connect(variablesDialog, SIGNAL(insertVariableRequest(Variable*)), this, SLOT(addToRecentVariables(Variable*))); if(settings->always_on_top) variablesDialog->setWindowFlags(variablesDialog->windowFlags() | Qt::WindowStaysOnTopHint); variablesDialog->show(); } void QalculateWindow::onVariableRemoved(Variable *v) { if(variablesDialog) variablesDialog->variableRemoved(v); } void QalculateWindow::onVariableDeactivated(Variable *v) { if(variablesDialog) variablesDialog->variableDeactivated(v); } void QalculateWindow::openUnits() { Unit *u = NULL; if(!expressionEdit->expressionHasChanged() && !settings->history_answer.empty()) { u = CALCULATOR->findMatchingUnit(*mstruct); } else if(!auto_result.empty()) { u = CALCULATOR->findMatchingUnit(mauto); } if(unitsDialog) { if(u && !u->category().empty()) unitsDialog->selectCategory(u->category()); else unitsDialog->selectCategory("All"); unitsDialog->setWindowState((unitsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); unitsDialog->show(); qApp->processEvents(); unitsDialog->raise(); unitsDialog->activateWindow(); return; } unitsDialog = new UnitsDialog(); if(u && !u->category().empty()) unitsDialog->selectCategory(u->category()); connect(unitsDialog, SIGNAL(itemsChanged()), expressionEdit, SLOT(updateCompletion())); connect(unitsDialog, SIGNAL(itemsChanged()), this, SLOT(expressionObjectsUpdated())); connect(unitsDialog, SIGNAL(itemsChanged()), this, SLOT(resetUnitsAndVariablesMenus())); connect(unitsDialog, SIGNAL(favouritesChanged()), this, SLOT(updateFavouriteUnits())); connect(unitsDialog, SIGNAL(variableRemoved(Variable*)), this, SLOT(onVariableRemoved(Variable*))); connect(unitsDialog, SIGNAL(variableDeactivated(Variable*)), this, SLOT(onVariableDeactivated(Variable*))); connect(unitsDialog, SIGNAL(insertUnitRequest(Unit*)), this, SLOT(onUnitClicked(Unit*))); connect(unitsDialog, SIGNAL(insertUnitRequest(Unit*)), this, SLOT(addToRecentUnits(Unit*))); connect(unitsDialog, SIGNAL(convertToUnitRequest(Unit*)), this, SLOT(convertToUnit(Unit*))); connect(unitsDialog, SIGNAL(unitActivated(Unit*)), this, SLOT(onUnitActivated(Unit*))); if(settings->always_on_top) unitsDialog->setWindowFlags(unitsDialog->windowFlags() | Qt::WindowStaysOnTopHint); unitsDialog->show(); } void remove_nonunits(MathStructure &m) { if(m.isUnit()) { if(m.unit()->defaultPrefix() != 0) m.setPrefix(CALCULATOR->getExactDecimalPrefix(m.unit()->defaultPrefix())); else m.setPrefix(NULL); } if(m.size() > 0) { for(size_t i = 0; i < m.size();) { if(!m.isUnit_exp() && !m[i].containsType(STRUCT_UNIT, true)) { m.delChild(i + 1); } else { remove_nonunits(m[i]); i++; } } if(m.size() == 1) m.setToChild(1); else if(m.size() == 0) m.clear(); } } void QalculateWindow::onUnitActivated(Unit *u) { if(expressionEdit->expressionHasChanged() || settings->history_answer.empty() || ((settings->replace_expression != CLEAR_EXPRESSION || !expressionEdit->document()->isEmpty()) && (expressionEdit->document()->isEmpty() || expressionEdit->selectedText() != expressionEdit->toPlainText())) || !mstruct) { onUnitClicked(u); addToRecentUnits(u); } else { if(!mstruct->containsType(STRUCT_UNIT, true)) { MathStructure m_u(u); m_u.unformat(settings->evalops); MathStructure moptimal(CALCULATOR->convertToOptimalUnit(m_u, settings->evalops, true)); remove_nonunits(moptimal); moptimal.unformat(settings->evalops); if(moptimal.compare(m_u) == COMPARISON_RESULT_EQUAL) { onUnitClicked(u); return; } } convertToUnit(u); } } void QalculateWindow::openFPConversion() { if(fpConversionDialog) { fpConversionDialog->setWindowState((fpConversionDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); fpConversionDialog->show(); qApp->processEvents(); fpConversionDialog->raise(); fpConversionDialog->activateWindow(); } else { fpConversionDialog = new FPConversionDialog(this); if(settings->always_on_top) fpConversionDialog->setWindowFlags(fpConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); fpConversionDialog->show(); } if(!expressionEdit->expressionHasChanged() && !settings->history_answer.empty()) { if(mstruct && mstruct->isNumber()) { fpConversionDialog->setValue(*mstruct); } } else if(!auto_result.empty()) { if(mauto.isNumber()) { fpConversionDialog->setValue(mauto); } } else { QString str = expressionEdit->selectedText(true).trimmed(); int base = settings->evalops.parse_options.base; if(base <= BASE_FP16 && base >= BASE_FP80) base = BASE_BINARY; if(str.isEmpty()) { fpConversionDialog->clear(); } else { switch(base) { case BASE_BINARY: { fpConversionDialog->setBin(str); break; } case BASE_HEXADECIMAL: { fpConversionDialog->setHex(str); break; } case BASE_DECIMAL: { fpConversionDialog->setValue(str); break; } default: { fpConversionDialog->clear(); break; } } } } } void QalculateWindow::openPercentageCalculation() { if(percentageDialog) { percentageDialog->setWindowState((percentageDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); percentageDialog->show(); qApp->processEvents(); percentageDialog->raise(); percentageDialog->activateWindow(); } else { percentageDialog = new PercentageCalculationDialog(this); if(settings->always_on_top) percentageDialog->setWindowFlags(percentageDialog->windowFlags() | Qt::WindowStaysOnTopHint); percentageDialog->show(); } QString str; if(!expressionEdit->expressionHasChanged() && !settings->history_answer.empty()) { if(mstruct && mstruct->isNumber()) { str = QString::fromStdString(unhtmlize(result_text)); } } else if(!auto_result.empty()) { if(mauto.isNumber()) { str = QString::fromStdString(unhtmlize(auto_result)); } } else { str = expressionEdit->selectedText(true); } percentageDialog->resetValues(str); } void QalculateWindow::openPlot() { if(!CALCULATOR->canPlot()) { QMessageBox::critical(this, tr("Gnuplot was not found"), tr("%1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work.").arg("Gnuplot").arg("http://www.gnuplot.info/"), QMessageBox::Ok); return; } if(plotDialog) { plotDialog->setWindowState((plotDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); plotDialog->show(); qApp->processEvents(); plotDialog->raise(); plotDialog->activateWindow(); } else { plotDialog = new PlotDialog(this); if(settings->always_on_top) plotDialog->setWindowFlags(plotDialog->windowFlags() | Qt::WindowStaysOnTopHint); plotDialog->show(); } if(settings->evalops.parse_options.base == 10) { std::string str = expressionEdit->selectedText(true).toStdString(), str2; CALCULATOR->separateToExpression(str, str2, settings->evalops, true); remove_blank_ends(str); plotDialog->setExpression(QString::fromStdString(str)); } else { plotDialog->setExpression(QString()); } } void QalculateWindow::openPeriodicTable() { if(periodicTableDialog) { periodicTableDialog->setWindowState((periodicTableDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); periodicTableDialog->show(); qApp->processEvents(); periodicTableDialog->raise(); periodicTableDialog->activateWindow(); } else { periodicTableDialog = new PeriodicTableDialog(this); connect(periodicTableDialog, SIGNAL(insertPropertyRequest(DataObject*, DataProperty*)), this, SLOT(insertProperty(DataObject*, DataProperty*))); if(settings->always_on_top) periodicTableDialog->setWindowFlags(periodicTableDialog->windowFlags() | Qt::WindowStaysOnTopHint); periodicTableDialog->show(); } } void QalculateWindow::openCalendarConversion() { if(calendarConversionDialog) { if(!auto_result.empty() && mauto.isDateTime()) calendarConversionDialog->setDate(*mauto.datetime()); else if(auto_result.empty() && mstruct && mstruct->isDateTime()) calendarConversionDialog->setDate(*mstruct->datetime()); calendarConversionDialog->setWindowState((calendarConversionDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); calendarConversionDialog->show(); qApp->processEvents(); calendarConversionDialog->raise(); calendarConversionDialog->activateWindow(); return; } calendarConversionDialog = new CalendarConversionDialog(this); if(settings->always_on_top) calendarConversionDialog->setWindowFlags(calendarConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); QalculateDateTime dt; if(!auto_result.empty() && mauto.isDateTime()) dt.set(*mauto.datetime()); else if(auto_result.empty() && mstruct && mstruct->isDateTime()) dt.set(*mstruct->datetime()); else dt.setToCurrentDate(); calendarConversionDialog->setDate(dt); calendarConversionDialog->show(); } struct FunctionDialog { MathFunction *f; QDialog *dialog; QPushButton *b_cancel, *b_exec, *b_insert; QCheckBox *b_keepopen; QLabel *w_result; QScrollArea *w_scrollresult; std::vector label; std::vector entry; std::vector boolean_buttons; std::vector boolean_index; bool add_to_menu, keep_open, rpn; int args; }; MathSpinBox::MathSpinBox(QWidget *parent) : QSpinBox(parent) { setLineEdit(new MathLineEdit(this)); connect(lineEdit(), SIGNAL(returnPressed()), this, SIGNAL(returnPressed())); #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif } MathSpinBox::~MathSpinBox() {} int MathSpinBox::valueFromText(const QString &text) const { if(settings->evalops.parse_options.base != BASE_DECIMAL) return QSpinBox::valueFromText(text); std::string str = text.toStdString(); if(str.find_first_not_of(NUMBERS) == std::string::npos) { return text.toInt(); } MathStructure value; CALCULATOR->beginTemporaryStopMessages(); EvaluationOptions eo = settings->evalops; eo.parse_options.base = 10; CALCULATOR->calculate(&value, CALCULATOR->unlocalizeExpression(str, eo.parse_options), 100, eo); CALCULATOR->endTemporaryStopMessages(); return value.number().intValue(); } QValidator::State MathSpinBox::validate(QString &text, int &pos) const { if(settings->evalops.parse_options.base != BASE_DECIMAL) return QSpinBox::validate(text, pos); std::string str = text.trimmed().toStdString(); if(str.empty()) return QValidator::Intermediate; return QValidator::Acceptable; } QLineEdit *MathSpinBox::entry() const { return lineEdit(); } void MathSpinBox::keyPressEvent(QKeyEvent *event) { QSpinBox::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } class MathDateTimeEdit : public QDateTimeEdit { public: MathDateTimeEdit(QWidget *parent = NULL) : QDateTimeEdit(parent) {} virtual ~MathDateTimeEdit() {} QLineEdit *entry() const {return lineEdit();} protected: void keyPressEvent(QKeyEvent *event) override { QDateTimeEdit::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } }; void QalculateWindow::onCalculateFunctionRequested(MathFunction *f) { insertFunction(f, functionsDialog); } void QalculateWindow::onInsertFunctionRequested(MathFunction *f) { expressionEdit->blockCompletion(); if(!expressionEdit->expressionHasChanged()) { expressionEdit->blockUndo(true); expressionEdit->clear(); expressionEdit->blockUndo(false); } QTextCursor cur = expressionEdit->textCursor(); expressionEdit->wrapSelection(QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)), true, true); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::insertFunction(MathFunction *f, QWidget *parent) { if(!f) return; //if function takes no arguments, do not display dialog and insert function directly if(f->args() == 0) { expressionEdit->insertText(QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)) + "()"); //function_inserted(f); return; } FunctionDialog *fd = new FunctionDialog; int args = 0; bool has_vector = false; if(f->args() > 0) { args = f->args(); } else if(f->minargs() > 0) { args = f->minargs(); while(!f->getDefaultValue(args + 1).empty()) args++; if(args == 1 || f->id() == FUNCTION_ID_PLOT) args++; } else { args = 1; has_vector = true; } fd->args = args; fd->rpn = settings->rpn_mode && expressionEdit->document()->isEmpty() && CALCULATOR->RPNStackSize() >= (f->minargs() <= 0 ? 1 : (size_t) f->minargs()); fd->add_to_menu = true; fd->f = f; std::string f_title = f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this); fd->dialog = new QDialog(parent ? parent : this); if(settings->always_on_top) fd->dialog->setWindowFlags(fd->dialog->windowFlags() | Qt::WindowStaysOnTopHint); fd->dialog->setWindowTitle(QString::fromStdString(f_title)); QVBoxLayout *box = new QVBoxLayout(fd->dialog); box->addSpacing(box->spacing()); QLabel *titleLabel = new QLabel("" + QString::fromStdString(f_title) + ""); box->addWidget(titleLabel); box->addSpacing(box->spacing()); QGridLayout *table = new QGridLayout(); box->addLayout(table); box->addSpacing(box->spacing()); if(!f->description().empty() || !f->example(true).empty()) { QPlainTextEdit *descr = new QPlainTextEdit(); descr->setReadOnly(true); box->addWidget(descr); QString str = QString::fromStdString(f->description()); if(!f->example(true).empty()) { if(!str.isEmpty()) str += "\n\n"; str += tr("Example:", "Example of function usage"); str += " "; str += QString::fromStdString(f->example(false)); } str.replace(">=", SIGN_GREATER_OR_EQUAL); str.replace("<=", SIGN_LESS_OR_EQUAL); str.replace("!=", SIGN_NOT_EQUAL); str.replace("...", "…"); descr->setPlainText(str); int n = str.count("\n"); if(n < 5) n = 5; QFontMetrics fm(descr->font()); descr->setFixedHeight(fm.lineSpacing() * n + descr->frameWidth() * 2 + descr->contentsMargins().top() + descr->contentsMargins().bottom()); } fd->w_scrollresult = new QScrollArea(); fd->w_scrollresult->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); fd->w_result = new QLabel(); fd->w_result->setTextInteractionFlags(Qt::TextSelectableByMouse); fd->w_result->setWordWrap(true); fd->w_result->setAlignment(Qt::AlignRight); QFont font(fd->w_result->font()); font.setWeight(QFont::Bold); QFontMetrics fm(font); fd->w_scrollresult->setMinimumWidth(fm.averageCharWidth() * 40); titleLabel->setMinimumWidth(fm.averageCharWidth() * 40); fd->w_scrollresult->setWidget(fd->w_result); fd->w_scrollresult->setWidgetResizable(true); fd->w_scrollresult->setFrameShape(QFrame::NoFrame); fd->w_scrollresult->setFixedHeight(fm.lineSpacing() * 2 + fd->w_scrollresult->frameWidth() * 2 + fd->w_scrollresult->contentsMargins().top() + fd->w_scrollresult->contentsMargins().bottom()); box->addWidget(fd->w_scrollresult, Qt::AlignRight); QHBoxLayout *hbox = new QHBoxLayout(); box->addLayout(hbox); fd->b_keepopen = new QCheckBox(tr("Keep open")); fd->keep_open = settings->keep_function_dialog_open; fd->b_keepopen->setChecked(fd->keep_open); hbox->addWidget(fd->b_keepopen); hbox->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, fd->dialog); hbox->addWidget(buttonBox); fd->b_cancel = buttonBox->button(QDialogButtonBox::Close); fd->b_exec = buttonBox->addButton(settings->rpn_mode ? tr("Enter", "RPN Enter") : tr("Calculate"), QDialogButtonBox::ApplyRole); fd->b_insert = buttonBox->addButton(settings->rpn_mode ? tr("Apply to Stack") : tr("Insert"), QDialogButtonBox::AcceptRole); if(settings->rpn_mode && CALCULATOR->RPNStackSize() < (f->minargs() <= 0 ? 1 : (size_t) f->minargs())) fd->b_insert->setEnabled(false); fd->label.resize(args, NULL); fd->entry.resize(args, NULL); fd->boolean_index.resize(args, 0); int bindex = 0; QString argstr, typestr, defstr; QString freetype = QString::fromStdString(Argument().printlong()); Argument *arg; int r = 0; for(int i = 0; i < args; i++) { arg = f->getArgumentDefinition(i + 1); if(!arg || arg->name().empty()) { if(args == 1) { argstr = tr("Value"); } else { argstr = tr("Argument"); if(i > 0 || f->maxargs() != 1) { argstr += " "; argstr += QString::number(i + 1); } } } else { argstr = QString::fromStdString(arg->name()); } typestr = ""; ParseOptions pa = settings->evalops.parse_options; pa.base = 10; defstr = QString::fromStdString(CALCULATOR->localizeExpression(f->getDefaultValue(i + 1), pa)); if(arg && (arg->suggestsQuotes() || arg->type() == ARGUMENT_TYPE_TEXT) && defstr.length() >= 2 && defstr[0] == '\"' && defstr[defstr.length() - 1] == '\"') { defstr = defstr.mid(1, defstr.length() - 2); } fd->label[i] = new QLabel(tr("%1:").arg(argstr)); fd->label[i]->setAlignment(Qt::AlignRight); QWidget *entry = NULL; if(arg) { if(arg->type() == ARGUMENT_TYPE_INTEGER) { IntegerArgument *iarg = (IntegerArgument*) arg; int min = INT_MIN, max = INT_MAX; if(iarg->min()) { min = iarg->min()->intValue(); } if(iarg->max()) { max = iarg->max()->intValue(); } MathSpinBox *spin = new MathSpinBox(); entry = spin; fd->entry[i] = spin->entry(); spin->setRange(min, max); if(!defstr.isEmpty()) { spin->setValue(defstr.toInt()); } else if(!arg->zeroForbidden() && min <= 0 && max >= 0) { spin->setValue(0); } else { if(max < 0) { spin->setValue(max); } else if(min <= 1) { spin->setValue(1); } else { spin->setValue(min); } } spin->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); connect(spin, SIGNAL(textChanged(const QString&)), this, SLOT(onInsertFunctionChanged())); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } else if(arg->type() == ARGUMENT_TYPE_DATE) { MathDateTimeEdit *dateEdit = new MathDateTimeEdit(); entry = dateEdit; if(defstr == "now") { dateEdit->setDateTime(QDateTime::currentDateTime()); dateEdit->setDisplayFormat("yyyy-MM-ddTHH:mm:ss"); } else { dateEdit->setDate(QDate::currentDate()); dateEdit->setDisplayFormat("yyyy-MM-dd"); dateEdit->setCalendarPopup(true); } dateEdit->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->entry[i] = dateEdit->entry(); connect(dateEdit, SIGNAL(dateTimeChanged(const QDateTime&)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } else if(arg->type() == ARGUMENT_TYPE_BOOLEAN) { fd->boolean_index[i] = bindex; bindex += 2; fd->entry[i] = new QWidget(); hbox = new QHBoxLayout(fd->entry[i]); QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); QRadioButton *w = new QRadioButton(tr("True")); group->addButton(w); hbox->addWidget(w); w->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->boolean_buttons.push_back(w); w = new QRadioButton(tr("False")); group->addButton(w); hbox->addWidget(w); w->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->boolean_buttons.push_back(w); w->setChecked(true); hbox->addStretch(1); connect(fd->boolean_buttons[fd->boolean_buttons.size() - 2], SIGNAL(toggled(bool)), this, SLOT(onInsertFunctionChanged())); connect(fd->boolean_buttons[fd->boolean_buttons.size() - 1], SIGNAL(toggled(bool)), this, SLOT(onInsertFunctionChanged())); } else if(arg->type() == ARGUMENT_TYPE_DATA_PROPERTY && f->subtype() == SUBTYPE_DATA_SET) { QComboBox *w = new QComboBox(); fd->entry[i] = w; DataPropertyIter it; DataSet *ds = (DataSet*) f; DataProperty *dp = ds->getFirstProperty(&it); if(fd->rpn && (size_t) i < CALCULATOR->RPNStackSize()) { QTableWidgetItem *item = rpnView->item(i, 0); if(item) defstr = item->text(); } int active_index = -1; for(int i2 = 0; dp; i2++) { if(!dp->isHidden()) { w->addItem(QString::fromStdString(dp->title()), QVariant::fromValue((void*) dp)); if(active_index < 0 && defstr.toStdString() == dp->getName()) { active_index = i2; } } dp = ds->getNextProperty(&it); } w->addItem(tr("Info"), QVariant::fromValue((void*) NULL)); if(active_index < 0) active_index = w->count() - 1; w->setCurrentIndex(active_index); connect(w, SIGNAL(currentTextChanged(const QString&)), this, SLOT(onInsertFunctionChanged())); } else { typestr = QString::fromStdString(arg->printlong()); if(typestr == freetype) typestr = ""; if(arg->type() == ARGUMENT_TYPE_DATA_OBJECT && f->subtype() == SUBTYPE_DATA_SET && ((DataSet*) f)->getPrimaryKeyProperty()) { QComboBox *combo = new QComboBox(); combo->setEditable(true); DataObjectIter it; DataSet *ds = (DataSet*) f; DataObject *obj = ds->getFirstObject(&it); DataProperty *dp = ds->getProperty("name"); if(!dp || !dp->isKey()) dp = ds->getPrimaryKeyProperty(); while(obj) { combo->addItem(QString::fromStdString(obj->getPropertyInputString(dp))); obj = ds->getNextObject(&it); } combo->setCurrentText(QString()); fd->entry[i] = combo->lineEdit(); entry = combo; } else if(i == 1 && f->id() == FUNCTION_ID_ASCII && arg->type() == ARGUMENT_TYPE_TEXT) { QComboBox *combo = new QComboBox(); combo->setEditable(true); combo->addItem("UTF-8"); combo->addItem("UTF-16"); combo->addItem("UTF-32"); fd->entry[i] = combo->lineEdit(); entry = combo; } else if(i == 3 && f->id() == FUNCTION_ID_DATE && arg->type() == ARGUMENT_TYPE_TEXT) { QComboBox *combo = new QComboBox(); combo->setEditable(true); combo->addItem("chinese"); combo->addItem("coptic"); combo->addItem("egyptian"); combo->addItem("ethiopian"); combo->addItem("gregorian"); combo->addItem("hebrew"); combo->addItem("indian"); combo->addItem("islamic"); combo->addItem("julian"); combo->addItem("milankovic"); combo->addItem("persian"); fd->entry[i] = combo->lineEdit(); entry = combo; } else if(USE_QUOTES(arg, f)) { fd->entry[i] = new QLineEdit(); } else { fd->entry[i] = new MathLineEdit(); } if(i >= f->minargs() && !has_vector) { ((QLineEdit*) fd->entry[i])->setPlaceholderText(tr("optional", "optional argument")); } connect(fd->entry[i], SIGNAL(textEdited(const QString&)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } } else { fd->entry[i] = new MathLineEdit(); if(i >= f->minargs() && !has_vector) { ((QLineEdit*) fd->entry[i])->setPlaceholderText(tr("optional", "optional argument")); } connect(fd->entry[i], SIGNAL(textEdited(const QString&)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } if(arg && arg->type() == ARGUMENT_TYPE_FILE) { QAction *action = ((QLineEdit*) fd->entry[i])->addAction(LOAD_ICON("document-open"), QLineEdit::TrailingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) ((QLineEdit*) fd->entry[i])->setTextMargins(0, 0, 22, 0); # endif #endif action->setProperty("QALCULATE ENTRY", QVariant::fromValue((void*) fd->entry[i])); typestr = ""; connect(action, SIGNAL(triggered()), this, SLOT(onEntrySelectFile())); } else if(arg && arg->type() == ARGUMENT_TYPE_MATRIX) { QAction *action = ((QLineEdit*) fd->entry[i])->addAction(LOAD_ICON("table"), QLineEdit::TrailingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) ((QLineEdit*) fd->entry[i])->setTextMargins(0, 0, 22, 0); # endif #endif action->setProperty("QALCULATE ENTRY", QVariant::fromValue((void*) fd->entry[i])); typestr = ""; connect(action, SIGNAL(triggered()), this, SLOT(onEntryEditMatrix())); } if(fd->rpn && (size_t) i < CALCULATOR->RPNStackSize()) { QTableWidgetItem *item = rpnView->item(i, 0); if(item) { if(arg && arg->type() == ARGUMENT_TYPE_BOOLEAN) { if(item->text() == "1") { fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(true); fd->boolean_buttons[fd->boolean_buttons.size() - 1]->setChecked(false); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->setChecked(true); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(false); } } else if(!arg || arg->type() != ARGUMENT_TYPE_DATA_PROPERTY || f->subtype() != SUBTYPE_DATA_SET) { fd->entry[i]->blockSignals(true); if(i == 0 && args == 1 && (has_vector || arg->type() == ARGUMENT_TYPE_VECTOR)) { QString rpn_vector = item->text(); for(int i2 = i + 1; i2 < rpnView->rowCount(); i2++) { item = rpnView->item(i, 0); if(item) { rpn_vector += QString::fromStdString(CALCULATOR->getComma()); rpn_vector += " "; rpn_vector += item->text(); } } ((QLineEdit*) fd->entry[i])->setText(rpn_vector); } else { ((QLineEdit*) fd->entry[i])->setText(item->text()); } fd->entry[i]->blockSignals(false); } } } else if(arg && arg->type() == ARGUMENT_TYPE_BOOLEAN) { if(defstr == "1") { fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(true); fd->boolean_buttons[fd->boolean_buttons.size() - 1]->setChecked(false); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->setChecked(true); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(false); } } else if(!arg || arg->type() != ARGUMENT_TYPE_DATA_PROPERTY || f->subtype() != SUBTYPE_DATA_SET) { fd->entry[i]->blockSignals(true); if(!defstr.isEmpty() && (!arg || (arg->type() != ARGUMENT_TYPE_DATE && arg->type() != ARGUMENT_TYPE_INTEGER)) && (i < f->minargs() || has_vector || (defstr != "undefined" && defstr != "\"\""))) { ((QLineEdit*) fd->entry[i])->setText(defstr); } if(i == 0) { std::string seltext, str2; if(expressionEdit->textCursor().hasSelection()) seltext = expressionEdit->textCursor().selectedText().toStdString(); else seltext = expressionEdit->toPlainText().toStdString(); bool use_current_result = (!auto_result.empty() || (!expressionEdit->expressionHasChanged() && !settings->history_answer.empty() && settings->current_result)) && (!expressionEdit->textCursor().hasSelection() || seltext == expressionEdit->toPlainText().toStdString()); CALCULATOR->separateToExpression(seltext, str2, settings->evalops, true); remove_blank_ends(seltext); if(!seltext.empty()) { if(arg && arg->type() == ARGUMENT_TYPE_INTEGER) { MathStructure m; CALCULATOR->beginTemporaryStopMessages(); if(use_current_result) { m = auto_result.empty() ? *settings->current_result : mauto; } else { CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(seltext, settings->evalops.parse_options), 200, settings->evalops); } if(!CALCULATOR->endTemporaryStopMessages() && m.isInteger()) { bool overflow = false; int v = m.number().intValue(&overflow); QSpinBox *spin = (QSpinBox*) entry; if(!overflow && v >= spin->minimum() && v <= spin->maximum()) spin->setValue(v); } } else if(arg && arg->type() == ARGUMENT_TYPE_DATE) { MathStructure m; CALCULATOR->beginTemporaryStopMessages(); if(use_current_result) { m = auto_result.empty() ? *settings->current_result : mauto; } else { CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(seltext, settings->evalops.parse_options), 200, settings->evalops); } if(!CALCULATOR->endTemporaryStopMessages() && m.isDateTime()) { QDateTime d; d.setDate(QDate(m.datetime()->year(), m.datetime()->month(), m.datetime()->day())); Number nr_sec = m.datetime()->second(); Number nr_msec(nr_sec); nr_msec.frac(); nr_msec *= 1000; nr_msec.round(); nr_sec.trunc(); d.setTime(QTime(m.datetime()->hour(), m.datetime()->minute(), nr_sec.intValue(), nr_msec.intValue())); ((QDateTimeEdit*) entry)->setDateTime(d); } } else { if(use_current_result) { if(exact_text.empty()) { Number nr(settings->history_answer.size(), 1, 0); ((QLineEdit*) fd->entry[i])->setText(QStringLiteral("%1(%2)").arg(QString::fromStdString(settings->f_answer->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) fd->entry[i]).formattedName(TYPE_FUNCTION, true))).arg(QString::fromStdString(print_with_evalops(nr)))); } else { ((QLineEdit*) fd->entry[i])->setText(QString::fromStdString(exact_text)); } } else { ((QLineEdit*) fd->entry[i])->setText(QString::fromStdString(seltext)); } } } } fd->entry[i]->blockSignals(false); } table->addWidget(fd->label[i], r, 0, 1, 1); if(entry) table->addWidget(entry, r, 1, 1, 1); else table->addWidget(fd->entry[i], r, 1, 1, 1); r++; fd->entry[i]->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); if(i == 0) fd->entry[i]->setFocus(); if(!typestr.isEmpty()) { typestr.replace(">=", SIGN_GREATER_OR_EQUAL); typestr.replace("<=", SIGN_LESS_OR_EQUAL); typestr.replace("!=", SIGN_NOT_EQUAL); QLabel *w = new QLabel("" + typestr.toHtmlEscaped() + THIN_SPACE ""); w->setWordWrap(true); w->setAlignment(Qt::AlignRight | Qt::AlignTop); table->addWidget(w, r, 1, 1, 1); r++; } } table->setColumnStretch(1, 1); if(!fd->keep_open) fd->w_scrollresult->hide(); fd->b_exec->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_cancel->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_insert->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_keepopen->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_exec->setDefault(false); fd->b_cancel->setDefault(false); fd->b_insert->setDefault(false); fd->dialog->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); connect(fd->b_exec, SIGNAL(clicked()), this, SLOT(onInsertFunctionExec())); if(fd->rpn) connect(fd->b_insert, SIGNAL(clicked()), this, SLOT(onInsertFunctionRPN())); else connect(fd->b_insert, SIGNAL(clicked()), this, SLOT(onInsertFunctionInsert())); connect(fd->b_cancel, SIGNAL(clicked()), fd->dialog, SLOT(reject())); connect(fd->b_keepopen, SIGNAL(toggled(bool)), this, SLOT(onInsertFunctionKeepOpen(bool))); connect(fd->dialog, SIGNAL(rejected()), this, SLOT(onInsertFunctionClosed())); box->setSizeConstraint(QLayout::SetFixedSize); fd->dialog->show(); } void QalculateWindow::onEntrySelectFile() { QLineEdit *w = (QLineEdit*) sender()->property("QALCULATE ENTRY").value(); FunctionDialog *fd = (FunctionDialog*) w->property("QALCULATE FD").value(); QString str = QFileDialog::getOpenFileName(fd->dialog, QString(), w->text()); if(!str.isEmpty()) w->setText(str); } void QalculateWindow::onEntryEditMatrix() { QLineEdit *entry = (QLineEdit*) sender()->property("QALCULATE ENTRY").value(); FunctionDialog *fd = (FunctionDialog*) entry->property("QALCULATE FD").value(); QDialog *dialog = new QDialog(fd->dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Matrix")); QVBoxLayout *box = new QVBoxLayout(dialog); MatrixWidget *w = new MatrixWidget(dialog); w->setMatrixString(entry->text()); box->addWidget(w); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); w->setFocus(); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { if(!w->isEmpty()) { entry->setText(w->getMatrixString()); } } dialog->deleteLater(); } void QalculateWindow::insertFunctionDo(FunctionDialog *fd) { MathFunction *f = fd->f; std::string str = f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true) + "(", str2; int argcount = fd->args; if((f->maxargs() < 0 || f->minargs() < f->maxargs()) && argcount > f->minargs()) { while(true) { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; std::string defstr = CALCULATOR->localizeExpression(f->getDefaultValue(argcount), pa); remove_blank_ends(defstr); if(f->getArgumentDefinition(argcount) && f->getArgumentDefinition(argcount)->type() == ARGUMENT_TYPE_BOOLEAN) { if(fd->boolean_buttons[fd->boolean_index[argcount - 1]]->isChecked()) str2 = "1"; else str2 = "0"; } else if(settings->evalops.parse_options.base != BASE_DECIMAL && f->getArgumentDefinition(argcount) && f->getArgumentDefinition(argcount)->type() == ARGUMENT_TYPE_INTEGER) { Number nr(((QLineEdit*) fd->entry[argcount - 1])->text().toStdString()); str2 = print_with_evalops(nr); } else if(f->getArgumentDefinition(argcount) && f->getArgumentDefinition(argcount)->type() == ARGUMENT_TYPE_DATA_PROPERTY && f->subtype() == SUBTYPE_DATA_SET) { DataProperty *dp = (DataProperty*) ((QComboBox*) fd->entry[argcount - 1])->currentData().value(); if(dp) { str2 = dp->getName(); } else { str2 = "info"; } } else { str2 = ((QLineEdit*) fd->entry[argcount - 1])->text().toStdString(); remove_blank_ends(str2); } if(!str2.empty() && USE_QUOTES(f->getArgumentDefinition(argcount), f) && (unicode_length(str2) <= 2 || str2.find_first_of("\"\'") == std::string::npos)) { if(str2.find("\"") != std::string::npos) { str2.insert(0, "\'"); str2 += "\'"; } else { str2.insert(0, "\""); str2 += "\""; } } if(str2.empty() || str2 == defstr) argcount--; else break; if(argcount == 0 || argcount == f->minargs()) break; } } int i_vector = f->maxargs() > 0 ? f->maxargs() : argcount; for(int i = 0; i < argcount; i++) { if(f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_BOOLEAN) { if(fd->boolean_buttons[fd->boolean_index[i]]->isChecked()) str2 = "1"; else str2 = "0"; } else if((i != (f->maxargs() > 0 ? f->maxargs() : argcount) - 1 || i_vector == i - 1) && f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_VECTOR) { i_vector = i; str2 = ((QLineEdit*) fd->entry[i])->text().toStdString(); remove_blank_ends(str2); if(str2.find_first_of(PARENTHESISS VECTOR_WRAPS) == std::string::npos && str2.find_first_of(CALCULATOR->getComma() == COMMA ? COMMAS : CALCULATOR->getComma()) != std::string::npos) { str2.insert(0, 1, '['); str2 += ']'; } } else if(settings->evalops.parse_options.base != BASE_DECIMAL && f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_INTEGER) { Number nr(((QLineEdit*) fd->entry[i])->text().toStdString()); str2 = print_with_evalops(nr); } else if(f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_DATA_PROPERTY && f->subtype() == SUBTYPE_DATA_SET) { DataProperty *dp = (DataProperty*) ((QComboBox*) fd->entry[i])->currentData().value(); if(dp) { str2 = dp->getName(); } else { str2 = "info"; } } else { str2 = ((QLineEdit*) fd->entry[i])->text().toStdString(); remove_blank_ends(str2); } if((i < f->minargs() || !str2.empty()) && USE_QUOTES(f->getArgumentDefinition(i + 1), f) && (unicode_length(str2) <= 2 || str2.find_first_of("\"\'") == std::string::npos)) { if(str2.find("\"") != std::string::npos) { str2.insert(0, "\'"); str2 += "\'"; } else { str2.insert(0, "\""); str2 += "\""; } } if(i > 0) { str += CALCULATOR->getComma(); str += " "; } str += str2; } str += ")"; expressionEdit->blockCompletion(true); expressionEdit->insertText(QString::fromStdString(str)); expressionEdit->blockCompletion(false); //if(fd->add_to_menu) function_inserted(f); } void QalculateWindow::onInsertFunctionChanged() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); fd->w_result->clear(); } void QalculateWindow::onInsertFunctionEntryActivated() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); for(int i = 0; i < fd->args; i++) { if(fd->entry[i] == sender()) { if(i == fd->args - 1) { if(fd->rpn) onInsertFunctionRPN(); else if(fd->keep_open || settings->rpn_mode) onInsertFunctionExec(); else onInsertFunctionInsert(); } else { if(fd->f->getArgumentDefinition(i + 2) && fd->f->getArgumentDefinition(i + 2)->type() == ARGUMENT_TYPE_BOOLEAN) { fd->boolean_buttons[fd->boolean_index[i + 1]]->setFocus(); } else { fd->entry[i + 1]->setFocus(); } } break; } } } void QalculateWindow::onInsertFunctionExec() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); expressionEdit->blockUndo(true); expressionEdit->clear(); expressionEdit->blockUndo(false); if(!fd->keep_open) fd->dialog->hide(); insertFunctionDo(fd); calculateExpression(); if(fd->keep_open) { QString str; bool b_approx = *settings->printops.is_approximate || (mstruct && mstruct->isApproximate()); str = ""; if(!b_approx) str += "= "; else str += SIGN_ALMOST_EQUAL " "; if(result_text.length() > 100000) str += QString::fromStdString(ellipsize_result(result_text, 20000)); else str += QString::fromStdString(result_text); str += ""; fd->w_scrollresult->show(); fd->w_result->setText(str); fd->entry[0]->setFocus(); expressionEdit->selectAll(); } else { fd->dialog->deleteLater(); delete fd; } } void QalculateWindow::onInsertFunctionRPN() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); if(!fd->keep_open) fd->dialog->hide(); calculateRPN(fd->f); //if(fd->add_to_menu) function_inserted(f); if(fd->keep_open) { fd->entry[0]->setFocus(); expressionEdit->selectAll(); } else { fd->dialog->deleteLater(); delete fd; } } void QalculateWindow::onInsertFunctionInsert() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); if(!fd->keep_open) fd->dialog->hide(); insertFunctionDo(fd); if(fd->keep_open) { fd->entry[0]->setFocus(); expressionEdit->selectAll(); } else { fd->dialog->deleteLater(); delete fd; } } void QalculateWindow::onInsertFunctionKeepOpen(bool b) { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); fd->keep_open = b; settings->keep_function_dialog_open = b; if(!b) fd->w_scrollresult->hide(); } void QalculateWindow::onInsertFunctionClosed() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); fd->dialog->deleteLater(); delete fd; } void QalculateWindow::executeFromFile(const QString &file) { QFile qfile(file); if(!qfile.open(QIODevice::ReadOnly)) { qDebug() << tr("Failed to open %1.\n%2").arg(file).arg(qfile.errorString()); return; } char buffer[10000]; std::string str, scom; size_t ispace; bool rpn_save = settings->rpn_mode; settings->rpn_mode = false; previous_expression = ""; expressionEdit->blockUndo(true); expressionEdit->blockCompletion(true); expressionEdit->blockParseStatus(true); block_expression_history = true; while(qfile.readLine(buffer, 10000) >= 0) { str = buffer; remove_blank_ends(str); ispace = str.find_first_of(SPACES); if(ispace == std::string::npos) scom = ""; else scom = str.substr(0, ispace); if(equalsIgnoreCase(str, "exrates") || equalsIgnoreCase(str, "stack") || equalsIgnoreCase(str, "swap") || equalsIgnoreCase(str, "rotate") || equalsIgnoreCase(str, "copy") || equalsIgnoreCase(str, "clear stack") || equalsIgnoreCase(str, "exact") || equalsIgnoreCase(str, "approximate") || equalsIgnoreCase(str, "approx") || equalsIgnoreCase(str, "factor") || equalsIgnoreCase(str, "partial fraction") || equalsIgnoreCase(str, "simplify") || equalsIgnoreCase(str, "expand") || equalsIgnoreCase(str, "mode") || equalsIgnoreCase(str, "help") || equalsIgnoreCase(str, "?") || equalsIgnoreCase(str, "list") || equalsIgnoreCase(str, "exit") || equalsIgnoreCase(str, "quit") || equalsIgnoreCase(str, "clear") || equalsIgnoreCase(str, "clear history") || equalsIgnoreCase(scom, "variable") || equalsIgnoreCase(scom, "function") || equalsIgnoreCase(scom, "set") || equalsIgnoreCase(scom, "save") || equalsIgnoreCase(scom, "store") || equalsIgnoreCase(scom, "swap") || equalsIgnoreCase(scom, "delete") || equalsIgnoreCase(scom, "keep") || equalsIgnoreCase(scom, "unkeep") || equalsIgnoreCase(scom, "assume") || equalsIgnoreCase(scom, "base") || equalsIgnoreCase(scom, "rpn") || equalsIgnoreCase(scom, "move") || equalsIgnoreCase(scom, "rotate") || equalsIgnoreCase(scom, "copy") || equalsIgnoreCase(scom, "pop") || equalsIgnoreCase(scom, "convert") || (equalsIgnoreCase(scom, "to") && scom != "to") || equalsIgnoreCase(scom, "list") || equalsIgnoreCase(scom, "find") || equalsIgnoreCase(scom, "info") || equalsIgnoreCase(scom, "help")) str.insert(0, 1, '/'); if(!str.empty() && str[0] == '#') { if(str.length() == 1) { str = ""; } else if(str[1] != '#') { str.insert(0, 1, '#'); } } if(!str.empty()) calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", str, false); } expressionEdit->clear(); expressionEdit->setExpressionHasChanged(true); if(parsed_mstruct) parsed_mstruct->clear(); if(parsed_tostruct) parsed_tostruct->setUndefined(); matrix_mstruct.clear(); expressionEdit->blockUndo(false); expressionEdit->blockCompletion(false); expressionEdit->blockParseStatus(false); block_expression_history = false; settings->rpn_mode = rpn_save; previous_expression = ""; if(mstruct) { if(settings->rpn_mode) { mstruct->unref(); mstruct = CALCULATOR->getRPNRegister(1); if(!mstruct) mstruct = new MathStructure(); else mstruct->ref(); } else { mstruct->clear(); } } qfile.close(); } void QalculateWindow::convertToUnit(Unit *u) { executeCommand(COMMAND_CONVERT_UNIT, true, "", u); } void QalculateWindow::normalModeActivated() { settings->rpn_mode = false; settings->chain_mode = false; rpnDock->hide(); CALCULATOR->clearRPNStack(); rpnView->clear(); rpnView->setRowCount(0); } void QalculateWindow::onRPNVisibilityChanged(bool b) { if(settings->rpn_mode != b) { if(b) { settings->rpn_mode = true; settings->chain_mode = false; if(!settings->rpn_shown) { rpnDock->blockSignals(true); rpnDock->hide(); rpnDock->setFloating(true); settings->rpn_shown = true; rpnDock->resize(rpnDock->sizeHint()); rpnDock->show(); rpnDock->blockSignals(false); } QAction *w = findChild("action_rpnmode"); if(w) w->setChecked(true); toAction_t->setEnabled(false); } } } void QalculateWindow::onRPNClosed() { normalModeActivated(); QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); } void QalculateWindow::rpnModeActivated() { if(settings->rpn_mode) { normalModeActivated(); QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); } else { settings->rpn_mode = true; settings->chain_mode = false; if(!settings->rpn_shown) {rpnDock->setFloating(true); settings->rpn_shown = true;} rpnDock->show(); rpnDock->raise(); toAction_t->setEnabled(false); } } void QalculateWindow::chainModeActivated() { if(settings->chain_mode) { normalModeActivated(); QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); } else { settings->rpn_mode = false; settings->chain_mode = true; rpnDock->hide(); CALCULATOR->clearRPNStack(); rpnView->clear(); rpnView->setRowCount(0); } } void QalculateWindow::checkVersion() { settings->checkVersion(true, this); } void QalculateWindow::reportBug() { QDesktopServices::openUrl(QUrl("https://github.com/Qalculate/qalculate-qt/issues")); } void QalculateWindow::help() { QDesktopServices::openUrl(QUrl("https://qalculate.github.io/manual/index.html")); } void QalculateWindow::loadInitialHistory() { historyView->loadInitial(); } void QalculateWindow::loadWorkspace(const QString &filename) { bool rpn_mode_prev = settings->rpn_mode; bool chain_mode_prev = settings->chain_mode; if(settings->loadWorkspace(filename.toLocal8Bit().data())) { settings->preferences_version[0] = 4; settings->preferences_version[1] = 1; mstruct->unref(); mstruct = new MathStructure(); mstruct_exact.setUndefined(); parsed_mstruct->clear(); expressionEdit->clear(); historyView->loadInitial(); if(expressionEdit->completionInitialized()) expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); if(unitsDialog) unitsDialog->updateUnits(); if(variablesDialog) variablesDialog->updateVariables(); if(datasetsDialog) datasetsDialog->updateDatasets(); functionsMenu->clear(); unitsMenu->clear(); variablesMenu->clear(); keypad->updateBase(); keypad->updateSymbols(); if(settings->show_keypad >= 0 && settings->show_keypad != keypadDock->isVisible()) keypadAction->trigger(); onBasesActivated(settings->show_bases > 0); QAction *action = find_child_data(this, "group_keypad", settings->show_keypad == 0 ? -1 : settings->keypad_type); if(action) action->setChecked(true); showNumpadAction->setChecked(!settings->hide_numpad); keypad->setKeypadType(settings->keypad_type); updateKeypadTitle(); keypad->hideNumpad(settings->hide_numpad); nKeypadAction->setEnabled(settings->hide_numpad); if(preferencesDialog) { preferencesDialog->hide(); preferencesDialog->deleteLater(); preferencesDialog = NULL; } if(settings->rpn_mode != rpn_mode_prev || settings->chain_mode != chain_mode_prev) { if(settings->rpn_mode) action = findChild("action_rpnmode"); else if(settings->chain_mode) action = findChild("action_chainmode"); else action = findChild("action_normalmode"); if(action) action->setChecked(true); if(settings->rpn_mode) rpnModeActivated(); else if(settings->chain_mode) chainModeActivated(); else normalModeActivated(); } action = find_child_data(this, "group_outbase", settings->printops.base); if(!action) action = customOutputBaseAction; if(action) action->setChecked(true); if(action == customOutputBaseAction) customOutputBaseEdit->setValue(settings->printops.base == BASE_CUSTOM ? CALCULATOR->customOutputBase().intValue() : settings->printops.base); action = find_child_data(this, "group_inbase", settings->evalops.parse_options.base); if(!action) action = customInputBaseAction; if(action) action->setChecked(true); if(action == customInputBaseAction) customInputBaseEdit->setValue(settings->evalops.parse_options.base == BASE_CUSTOM ? CALCULATOR->customInputBase().intValue() : settings->evalops.parse_options.base); action = find_child_data(this, "group_general", settings->printops.min_exp); if(action) action->setChecked(true); QSpinBox *w = findChild("spinbox_precision"); if(w) { w->blockSignals(true); w->setValue(CALCULATOR->getPrecision()); w->blockSignals(false); } settings->setCustomAngleUnit(); action = find_child_data(this, "group_type", CALCULATOR->defaultAssumptions()->type()); if(action) action->setChecked(true); action = find_child_data(this, "group_sign", CALCULATOR->defaultAssumptions()->sign()); if(action) action->setChecked(true); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && !CALCULATOR->customAngleUnit()) settings->evalops.parse_options.angle_unit = ANGLE_UNIT_NONE; if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM) { action = findChild("action_angle_unit" + QString::fromStdString(CALCULATOR->customAngleUnit()->referenceName())); } else { action = find_child_data(this, "group_angleunit", settings->evalops.parse_options.angle_unit); } if(action) action->setChecked(true); action = NULL; if(settings->dual_approximation < 0) action = findChild("action_autoappr"); else if(settings->dual_approximation > 0) action = findChild("action_dualappr"); else if(settings->evalops.approximation == APPROXIMATION_EXACT) action = findChild("action_exact"); else if(settings->evalops.approximation == APPROXIMATION_TRY_EXACT) action = findChild("action_approximate"); else if(settings->evalops.approximation == APPROXIMATION_APPROXIMATE) action = findChild("action_approximate"); if(action) { action->setChecked(true); } w = findChild("spinbox_maxdecimals"); if(w) { w->blockSignals(true); w->setValue(!settings->printops.use_max_decimals || settings->printops.max_decimals < 0 ? -1 : settings->printops.max_decimals); w->blockSignals(false); } w = findChild("spinbox_mindecimals"); if(w) { w->blockSignals(true); w->setValue(!settings->printops.use_min_decimals || settings->printops.min_decimals < 0 ? 0 : settings->printops.min_decimals); w->blockSignals(false); } updateWSActions(); updateWindowTitle(); workspace_changed = false; } else { QMessageBox::critical(this, tr("Error"), tr("Failed to open workspace"), QMessageBox::Ok); } } void QalculateWindow::saveWorkspaceAs() { while(true) { QString str = QFileDialog::getSaveFileName(this); if(str.isEmpty()) break; settings->show_bases = basesDock->isVisible(); if(settings->saveWorkspace(str.toLocal8Bit().data())) { workspace_changed = false; updateWSActions(); break; } else { QMessageBox::critical(this, tr("Error"), tr("Couldn't save workspace"), QMessageBox::Ok); } } } void QalculateWindow::saveWorkspace() { settings->show_bases = basesDock->isVisible(); if(settings->saveWorkspace(settings->current_workspace.c_str())) { workspace_changed = false; updateWSActions(); } else { QMessageBox::critical(this, tr("Error"), tr("Couldn't save workspace"), QMessageBox::Ok); } } int QalculateWindow::askSaveWorkspace() { if(!workspace_changed) return true; bool b_noask = settings->save_workspace >= 0; int b = 0; if(b_noask) { if(settings->save_workspace > 0) b = QMessageBox::Yes; else b = QMessageBox::No; } else { QMessageBox *dialog = new QMessageBox(QMessageBox::Question, tr("Save file?"), tr("Do you want to save the current workspace?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, this); dialog->setCheckBox(new QCheckBox(tr("Do not ask again"))); b = dialog->exec(); b_noask = dialog->checkBox()->isChecked(); dialog->deleteLater(); } if(b == QMessageBox::Yes) { settings->show_bases = basesDock->isVisible(); while(!settings->saveWorkspace(settings->current_workspace.c_str())) { int answer = QMessageBox::critical(this, tr("Error"), tr("Couldn't save workspace"), QMessageBox::Retry | QMessageBox::Ignore | QMessageBox::Cancel); if(answer == QMessageBox::Ignore) return 0; else if(answer == QMessageBox::Cancel) return -1; } workspace_changed = false; if(b_noask) settings->save_workspace = 1; return 1; } else if(b == QMessageBox::Cancel) { return -1; } if(b_noask) settings->save_workspace = 0; return 0; } void QalculateWindow::openRecentWorkspace() { settings->show_bases = basesDock->isVisible(); if(settings->current_workspace.empty()) { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); if(settings->savePreferences() < 0) return; } else { if(askSaveWorkspace() < 0) return; } loadWorkspace(qobject_cast(sender())->data().toString()); updateWSActions(); } void QalculateWindow::openWorkspace() { settings->show_bases = basesDock->isVisible(); if(settings->current_workspace.empty()) { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); if(settings->savePreferences() < 0) return; } else { if(askSaveWorkspace() < 0) return; } QString str = QFileDialog::getOpenFileName(this); if(!str.isEmpty()) { loadWorkspace(str); } updateWSActions(); } void QalculateWindow::openDefaultWorkspace() { if(askSaveWorkspace() < 0) return; loadWorkspace(QString()); workspace_changed = false; updateWSActions(); } void QalculateWindow::updateWSActions() { saveWSAction->setEnabled(!settings->current_workspace.empty()); defaultWSAction->setEnabled(!settings->current_workspace.empty()); if(settings->recent_workspaces.empty() && recentWSSeparator) { recentWSMenu->removeAction(recentWSSeparator); recentWSSeparator = NULL; } for(int i = 0; i < recentWSAction.count(); i++) { recentWSMenu->removeAction(recentWSAction.at(i)); } recentWSAction.clear(); if(!settings->recent_workspaces.empty() && !recentWSSeparator) { recentWSSeparator = recentWSMenu->addSeparator(); } for(size_t i = settings->recent_workspaces.size(); i > 0; i--) { std::string str = (settings->recent_workspaces[i - 1]); #ifdef _WIN32 size_t index = str.rfind('\\'); #else size_t index = str.rfind('/'); #endif if(index != std::string::npos) str = str.substr(index + 1); recentWSAction << recentWSMenu->addAction(QString::fromStdString(str), this, SLOT(openRecentWorkspace())); recentWSAction.last()->setData(QString::fromStdString(settings->recent_workspaces[i - 1])); } } qalculate-qt-5.5.1/src/qalculatewindow.h000066400000000000000000000336621475705355700203160ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef QALCULATE_WINDOW_H #define QALCULATE_WINDOW_H #include #include #include #include #include #include #include #include class QLocalSocket; class QLocalServer; class QCommandLineParser; class ExpressionEdit; class HistoryView; class QSplitter; class QLabel; class KeypadWidget; class QAction; class QToolBar; class QTextEdit; class QTimer; class PreferencesDialog; class FunctionsDialog; class DataSetsDialog; class VariablesDialog; class UnitsDialog; class FPConversionDialog; class PercentageCalculationDialog; class PlotDialog; class PeriodicTableDialog; class CalendarConversionDialog; class QTableWidget; class QMenu; class QTreeWidget; class QTreeWidgetItem; class QPushButton; class QLineEdit; class QLabel; class QDialog; class QComboBox; struct FunctionDialog; struct keyboard_shortcut; class QalculateWindow : public QMainWindow { Q_OBJECT public: QalculateWindow(); virtual ~QalculateWindow(); void setCommandLineParser(QCommandLineParser*); bool displayMessages(); bool updateWindowTitle(const QString &str = QString(), bool is_result = false, bool type_change = false); void executeFromFile(const QString&); void initFinished(); protected: QLocalSocket *socket; QLocalServer *server; QCommandLineParser *parser; Thread *viewThread, *commandThread; ExpressionEdit *expressionEdit; HistoryView *historyView; QSplitter *ehSplitter; QLabel *statusLabel, *statusIconLabel; PreferencesDialog *preferencesDialog; DataSetsDialog *datasetsDialog; FunctionsDialog *functionsDialog; VariablesDialog *variablesDialog; UnitsDialog *unitsDialog; FPConversionDialog *fpConversionDialog; PercentageCalculationDialog *percentageDialog; PlotDialog *plotDialog; PeriodicTableDialog *periodicTableDialog; CalendarConversionDialog *calendarConversionDialog; QDialog *shortcutsDialog, *shortcutActionDialog; QComboBox *shortcutActionValueEdit; QTreeWidget *shortcutActionList; QLabel *shortcutActionValueLabel; QTreeWidget *shortcutList; QPushButton *addShortcutButton, *editShortcutButton, *removeShortcutButton, *shortcutActionOKButton, *shortcutActionAddButton; keyboard_shortcut *edited_keyboard_shortcut; KeypadWidget *keypad; QDockWidget *keypadDock, *basesDock, *rpnDock; QLabel *binEdit, *octEdit, *decEdit, *hexEdit; QLabel *binLabel, *octLabel, *decLabel, *hexLabel; QToolBar *tb; QToolButton *menuAction_t, *modeAction_t, *keypadAction_t, *storeAction_t, *functionsAction_t, *unitsAction_t, *toAction_t; QMenu *tmenu, *basesMenu; QAction *plotAction_t, *basesAction, *customOutputBaseAction, *customInputBaseAction, *newVariableAction, *newFunctionAction, *variablesAction, *functionsAction, *unitsAction, *datasetsAction, *plotAction, *fpAction, *calendarsAction, *percentageAction, *periodicTableAction, *exratesAction, *quitAction, *helpAction, *keypadAction, *rpnAction, *chainAction, *gKeypadAction, *pKeypadAction, *xKeypadAction, *cKeypadAction, *nKeypadAction, *showNumpadAction, *resetKeypadPositionAction, *radAction, *degAction, *graAction, *normalAction, *sciAction, *engAction, *simpleAction, *copyBasesAction, *tbAction; QMenu *recentVariablesMenu, *favouriteVariablesMenu, *variablesMenu, *functionsMenu, *recentFunctionsMenu, *favouriteFunctionsMenu, *unitsMenu, *recentUnitsMenu, *favouriteUnitsMenu, *angleMenu, *toMenu; QAction *assumptionTypeActions[5], *assumptionSignActions[6]; QMenu *recentWSMenu; QAction *recentWSSeparator, *openWSAction, *defaultWSAction, *saveWSAction, *saveWSAsAction; QAction *firstFunctionsMenuOptionAction, *firstVariablesMenuOptionAction, *firstUnitsMenuOptionAction; QList recentWSAction, recentVariableActions, favouriteVariableActions, recentFunctionActions, favouriteFunctionActions, recentUnitActions, favouriteUnitActions; QSpinBox *customOutputBaseEdit, *customInputBaseEdit, *minDecimalsEdit, *maxDecimalsEdit; QTimer *ecTimer, *rfTimer, *autoCalculateTimer, *decimalsTimer, *resizeTimer, *emhTimer; QTableWidget *rpnView; QAction *rpnUpAction, *rpnDownAction, *rpnSwapAction, *rpnCopyAction, *rpnLastxAction, *rpnDeleteAction, *rpnClearAction; bool send_event; bool workspace_changed; bool init_in_progress; void calculateExpression(bool force = true, bool do_mathoperation = false, MathOperation op = OPERATION_ADD, MathFunction *f = NULL, bool do_stack = false, size_t stack_index = 0, std::string execute_str = std::string(), std::string str = std::string(), bool check_exrates = true, bool calculate_selection = false); void setResult(Prefix *prefix = NULL, bool update_history = true, bool update_parse = false, bool force = false, std::string transformation = "", bool do_stack = false, size_t stack_index = 0, bool register_moved = false, bool supress_dialog = false, bool calculate_selection = false); void executeCommand(int command_type, bool show_result = true, std::string ceu_str = "", Unit *u = NULL, int run = 1); void changeEvent(QEvent *e) override; bool askTC(MathStructure&); bool askSinc(MathStructure&); bool askDot(const std::string&); bool askImplicit(); bool askPercent(); void keyPressEvent(QKeyEvent*) override; bool eventFilter(QObject*, QEvent*) override; void closeEvent(QCloseEvent*) override; void setPreviousExpression(); void setOption(std::string); void updateResultBases(); void calculateRPN(MathFunction*); void RPNRegisterAdded(std::string, int = 0); void RPNRegisterRemoved(int); void RPNRegisterChanged(std::string, int); void triggerShortcut(int, const std::string&); void loadShortcuts(); bool editKeyboardShortcut(keyboard_shortcut*, keyboard_shortcut* = NULL, int = 0); void loadWorkspace(const QString &filename); void updateWSActions(); int askSaveWorkspace(); void beforeShowDockCleanUp(QDockWidget*); void beforeShowDock(QDockWidget*, bool); void afterShowDock(QDockWidget*); protected slots: void updateBinEditSize(QFont* = NULL); void onBinaryBitsChanged(); void onSymbolClicked(const QString&); void onOperatorClicked(const QString&); void onFunctionClicked(MathFunction*); void onVariableClicked(Variable*); void onUnitClicked(Unit*); void onPrefixClicked(Prefix*); void onClearClicked(); void onDelClicked(); void onEqualsClicked(); void onParenthesesClicked(); void onBracketsClicked(); void onBackspaceClicked(); void onLeftClicked(); void onRightClicked(); void onStartClicked(); void onEndClicked(); void onMSClicked(); void onMRClicked(); void onMCClicked(); void onMPlusClicked(); void onMMinusClicked(); void onAnswerClicked(); void onBaseClicked(int, bool, bool); void onFactorizeClicked(); void onExpandClicked(); void onExpandPartialFractionsClicked(); void onToActivated(bool = true); void onStoreActivated(); void keypadTypeActivated(); void showNumpad(bool); void showSeparateKeypadMenuButtons(bool); void resetKeypadPosition(); void onEMHTimeout(); void onResizeTimeout(); void onKeypadVisibilityChanged(bool); void onToolbarVisibilityChanged(bool); void onBasesActivated(bool); void onBasesVisibilityChanged(bool); void onRPNVisibilityChanged(bool); void onRPNClosed(); void onExpressionChanged(); void onHistoryReloaded(); void onStatusChanged(QString, bool, bool, bool, bool); void autoCalculateTimeout(); void onToConversionRequested(std::string); void onInsertTextRequested(std::string); void onInsertValueRequested(int); void onAlwaysOnTopChanged(); void onEnableTooltipsChanged(); void onPreferencesClosed(); void onTitleTypeChanged(); void onResultFontChanged(); void onExpressionFontChanged(); void onKeypadFontChanged(); void onAppFontChanged(); void onAppFontTimer(); void angleUnitActivated(); void normalActivated(); void scientificActivated(); void engineeringActivated(); void simpleActivated(); void onPrecisionChanged(int); void syncDecimals(); void onMinDecimalsChanged(int); void onMaxDecimalsChanged(int); void outputBaseActivated(); void onCustomOutputBaseChanged(int); void inputBaseActivated(); void onCustomInputBaseChanged(int); void assumptionsTypeActivated(); void assumptionsSignActivated(); void approximationActivated(); void openCalendarConversion(); void onInsertFunctionExec(); void onInsertFunctionRPN(); void onInsertFunctionInsert(); void onInsertFunctionKeepOpen(bool); void onInsertFunctionClosed(); void onInsertFunctionChanged(); void onInsertFunctionEntryActivated(); void insertFunctionDo(FunctionDialog*); void onEntrySelectFile(); void onEntryEditMatrix(); void onCalculateFunctionRequested(MathFunction*); void onInsertFunctionRequested(MathFunction*); void onUnitActivated(Unit *u); void onUnitRemoved(Unit*); void onVariableRemoved(Variable*); void onUnitDeactivated(Unit*); void onVariableDeactivated(Variable*); void normalModeActivated(); void rpnModeActivated(); void chainModeActivated(); void registerUp(); void registerDown(); void registerSwap(); void copyRegister(); void rpnLastX(); void deleteRegister(); void clearStack(); void registerChanged(int); void calculateRPN(int); void approximateResult(); void toggleResultFraction(); void onExpressionStatusModeChanged(bool = true); void functionActivated(); void unitActivated(); void prefixActivated(); void variableActivated(); void updateAngleUnitsMenu(); void initializeFunctionsMenu(); void initializeVariablesMenu(); void initializeUnitsMenu(); void updateFunctionsMenu(); void useFunctionDialog(bool); void showAllFunctions(bool); void updateFavouriteFunctions(); void updateRecentFunctions(); void addToRecentFunctions(MathFunction*); void updateUnitsMenu(); void addCurrencyFlagsToMenu(); void showAllUnits(bool); void updateFavouriteUnits(); void updateRecentUnits(); void addToRecentUnits(Unit*); void updateVariablesMenu(); void showAllVariables(bool); void updateFavouriteVariables(); void updateRecentVariables(); void addToRecentVariables(Variable*); void shortcutActivated(); void shortcutClicked(int, const QString&); void keyboardShortcutAdded(keyboard_shortcut *ks); void keyboardShortcutRemoved(keyboard_shortcut *ks); void addShortcutClicked(); void editShortcutClicked(); void removeShortcutClicked(); void shortcutActionOKClicked(); void shortcutActionAddClicked(); void updateShortcutActionOK(); void currentShortcutActionChanged(); void currentShortcutChanged(QTreeWidgetItem*, QTreeWidgetItem*); void shortcutDoubleClicked(QTreeWidgetItem*, int); void saveWorkspace(); void saveWorkspaceAs(); void openWorkspace(); void openDefaultWorkspace(); void openRecentWorkspace(); void onColorSchemeChanged(); void showToolbarContextMenu(const QPoint&); void setToolbarStyle(); void showKeypadContextMenu(const QPoint&); void updateKeypadTitle(); void keypadPreferencesChanged(); void resultBasesLinkActivated(const QString&); void showBasesContextMenu(const QPoint&); void copyBases(); public slots: void serverNewConnection(); void socketReadyRead(); void calculate(); void calculate(const QString&); void calculateSelection(); void onActivateRequested(const QStringList&, const QString&); void abort(); void abortCommand(); void fetchExchangeRates(); void showAbout(); void expressionCalculationUpdated(int delay = 0); void resultFormatUpdated(int delay = 0); void resultDisplayUpdated(); void expressionObjectsUpdated(); void expressionFormatUpdated(bool); void insertFunction(MathFunction*, QWidget* = NULL); void newVariable(); void newUnit(); void newMatrix(); void newUnknown(); void newFunction(); void convertToUnit(Unit*); void importCSV(); void exportCSV(); void editKeyboardShortcuts(); void editPreferences(); void openSettingsFolder(); void onDatasetsChanged(); void onFunctionsChanged(); void insertProperty(DataObject*, DataProperty*); void openDatasets(); void openFunctions(); void resetUnitsAndVariablesMenus(); void openUnits(); void openVariables(); void applyFunction(MathFunction*); void openFPConversion(); void openPercentageCalculation(); void openPlot(); void openPeriodicTable(); void negate(); void checkVersion(); void reportBug(); void help(); void loadInitialHistory(); signals: }; class QalculateTranslator : public QTranslator { Q_OBJECT public: QalculateTranslator(); QString translate(const char *context, const char *sourceText, const char *disambiguation = NULL, int n = -1) const; }; class MathSpinBox : public QSpinBox { Q_OBJECT public: MathSpinBox(QWidget *parent = NULL); virtual ~MathSpinBox(); QLineEdit *entry() const; protected: int valueFromText(const QString &text) const override; QValidator::State validate(QString &text, int &pos) const override; void keyPressEvent(QKeyEvent *event); signals: void returnPressed(); }; class QalculateDockWidget : public QDockWidget { Q_OBJECT; public: QalculateDockWidget(const QString &name, QWidget *parent, ExpressionEdit *editwidget); QalculateDockWidget(QWidget *parent, ExpressionEdit *editwidget); virtual ~QalculateDockWidget(); protected: ExpressionEdit *expressionEdit; void keyPressEvent(QKeyEvent *e) override; void closeEvent(QCloseEvent *e) override; signals: void dockClosed(); }; class QalculateToolButton : public QToolButton { Q_OBJECT public: QalculateToolButton(QWidget *parent = NULL); ~QalculateToolButton(); protected: QTimer *longPressTimer; bool b_longpress; void mouseReleaseEvent(QMouseEvent*) override; void mousePressEvent(QMouseEvent*) override; protected slots: void longPressTimeout(); }; #endif //QALCULATE_WINDOW_H qalculate-qt-5.5.1/src/uniteditdialog.cpp000066400000000000000000000514351475705355700204510ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "uniteditdialog.h" #include "functioneditdialog.h" UnitEditDialog::UnitEditDialog(QWidget *parent) : QDialog(parent) { o_unit = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); box->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); tabs->addTab(w1, tr("General")); tabs->addTab(w2, tr("Relation")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); namesAction = nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition); connect(namesAction, SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Category:"), this), 1, 0); categoryEdit = new QComboBox(this); QMap hash; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(!CALCULATOR->units[i]->category().empty()) { if(hash.find(CALCULATOR->units[i]->category()) == hash.end()) { hash[CALCULATOR->units[i]->category()] = true; } } } for(QMap::const_iterator it = hash.constBegin(); it != hash.constEnd(); ++it) { categoryEdit->addItem(QString::fromStdString(it.key())); } categoryEdit->setEditable(true); categoryEdit->setCurrentText(QString()); grid->addWidget(categoryEdit, 1, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 2, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 2, 1); grid->addWidget(new QLabel(tr("System:"), this), 3, 0); systemEdit = new QComboBox(this); systemEdit->addItem("SI"); systemEdit->addItem("CGS"); systemEdit->addItem(tr("Imperial")); systemEdit->addItem(tr("US Survey")); systemEdit->setEditable(true); systemEdit->setCurrentText(QString()); grid->addWidget(systemEdit, 3, 1); hideBox = new QCheckBox(tr("Hide unit"), this); grid->addWidget(hideBox, 4, 1, Qt::AlignRight); grid->addWidget(new QLabel(tr("Description:"), this), 5, 0, 1, 2); descriptionEdit = new SmallTextEdit(2, this); grid->addWidget(descriptionEdit, 6, 0, 1, 2); grid = new QGridLayout(w2); grid->addWidget(new QLabel(tr("Class:"), this), 0, 0); typeCombo = new QComboBox(this); typeCombo->setToolTip("
" + tr("The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units.") + "
"); typeCombo->setEditable(false); typeCombo->addItem(tr("Base unit")); typeCombo->addItem(tr("Named derived unit")); typeCombo->addItem(tr("Derived unit")); typeCombo->setCurrentIndex(0); grid->addWidget(typeCombo, 0, 1); baseLabel = new QLabel(tr("Base unit(s):"), this); grid->addWidget(baseLabel, 1, 0); baseEdit = new MathLineEdit(this, true); baseEdit->setToolTip("
" + tr("Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to") + "
"); grid->addWidget(baseEdit, 1, 1); exponentLabel = new QLabel(tr("Exponent:"), this); grid->addWidget(exponentLabel, 2, 0); exponentEdit = new QSpinBox(this); exponentEdit->setRange(-9, 9); exponentEdit->setValue(1); grid->addWidget(exponentEdit, 2, 1); relationLabel = new QLabel(tr("Relation:"), this); grid->addWidget(relationLabel, 3, 0); relationEdit = new MathLineEdit(this); relationEdit->setToolTip("
" + tr("Relation to the base unit. For linear relations this should just be a number.

For non-linear relations use \\x for the factor and \\y for the exponent (e.g. \"\\x + 273.15\" for the relation between degrees Celsius and Kelvin).") + "
"); grid->addWidget(relationEdit, 3, 1); inverseLabel = new QLabel(tr("Inverse relation:"), this); grid->addWidget(inverseLabel, 4, 0); inverseEdit = new MathLineEdit(this); inverseEdit->setToolTip(tr("Specify for non-linear relation, for conversion back to the base unit.")); grid->addWidget(inverseEdit, 4, 1); mixBox = new QCheckBox(tr("Mix with base unit"), this); grid->addWidget(mixBox, 5, 0, 1, 2, Qt::AlignLeft); priorityLabel = new QLabel(tr("Priority:"), this); grid->addWidget(priorityLabel, 6, 0); priorityEdit = new QSpinBox(this); priorityEdit->setToolTip(tr("Example: priority of the unit \"hand\" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in \"17 in = 1 ft + 5 in\", instead of \"17 in = 1 ft + 1 hand + 1 in\".")); priorityEdit->setRange(1, 100); priorityEdit->setValue(1); grid->addWidget(priorityEdit, 6, 1); mbunLabel = new QLabel(tr("Minimum base unit number:"), this); grid->addWidget(mbunLabel, 7, 0); mbunEdit = new QSpinBox(this); mbunEdit->setToolTip(tr("Example: minimum base unit number of yd (yard) is set to 12, which results in \"3 × 3 ft = 9 ft\" (instead of \"3 yd\") and \"4 × 3 ft = 4 yd\".")); mbunEdit->setRange(1, 100000); mbunEdit->setValue(1); grid->addWidget(mbunEdit, 7, 1); prefixBox = new QCheckBox(tr("Use with prefixes by default"), this); grid->addWidget(prefixBox, 8, 0, 1, 2, Qt::AlignLeft); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); typeChanged(0); nameEdit->setFocus(); connect(priorityEdit, SIGNAL(valueChanged(int)), this, SLOT(onUnitChanged())); connect(exponentEdit, SIGNAL(valueChanged(int)), this, SLOT(exponentChanged(int))); connect(mbunEdit, SIGNAL(valueChanged(int)), this, SLOT(onUnitChanged())); connect(prefixBox, SIGNAL(toggled(bool)), this, SLOT(onUnitChanged())); connect(mixBox, SIGNAL(toggled(bool)), this, SLOT(onUnitChanged())); connect(mixBox, SIGNAL(toggled(bool)), priorityEdit, SLOT(setEnabled(bool))); connect(mixBox, SIGNAL(toggled(bool)), mbunEdit, SLOT(setEnabled(bool))); connect(mixBox, SIGNAL(toggled(bool)), priorityLabel, SLOT(setEnabled(bool))); connect(mixBox, SIGNAL(toggled(bool)), mbunLabel, SLOT(setEnabled(bool))); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(typeChanged(int))); connect(typeCombo, SIGNAL(activated(int)), this, SLOT(onUnitChanged())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onUnitChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onUnitChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onUnitChanged())); connect(relationEdit, SIGNAL(textEdited(const QString&)), this, SLOT(relationChanged(const QString&))); connect(inverseEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onUnitChanged())); connect(baseEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onUnitChanged())); connect(categoryEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(onUnitChanged())); connect(systemEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(systemChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } UnitEditDialog::~UnitEditDialog() {} void UnitEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_UNIT, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_unit, nameEdit->text()); } else { namesEditDialog->setName(nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onUnitChanged(); } Unit *UnitEditDialog::createUnit(ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Unit *unit = NULL; Unit *bu = NULL; if(typeCombo->currentIndex() == 1) { bu = CALCULATOR->getUnit(baseEdit->text().trimmed().toStdString()); if(!bu) bu = CALCULATOR->getCompositeUnit(baseEdit->text().trimmed().toStdString()); if(!bu) { tabs->setCurrentIndex(1); baseEdit->setFocus(); QMessageBox::critical(this, tr("Error"), tr("Base unit does not exist."), QMessageBox::Ok); return NULL; } } if(CALCULATOR->unitNameTaken(nameEdit->text().trimmed().toStdString())) { unit = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!unit || unit->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!unit) *replaced_item = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); else *replaced_item = unit; } } Unit *u = NULL; if(unit && unit->isLocal()) { unit->clearNames(); return modifyUnit(unit); } if(typeCombo->currentIndex() == 1) { u = new AliasUnit("", "", "", "", "", bu, settings->unlocalizeExpression(relationEdit->text().trimmed().toStdString()), exponentEdit->value(), settings->unlocalizeExpression(inverseEdit->text().trimmed().toStdString()), true); if(mixBox->isChecked()) { ((AliasUnit*) u)->setMixWithBase(priorityEdit->value()); ((AliasUnit*) u)->setMixWithBaseMinimum(mbunEdit->value()); } } else if(typeCombo->currentIndex() == 2) { u = new CompositeUnit("", "", "", settings->unlocalizeExpression(baseEdit->text().trimmed().toStdString()), true); } else { u = new Unit(); } if(namesEditDialog && typeCombo->currentIndex() != 2) { namesEditDialog->modifyNames(u, nameEdit->text()); } else { NamesEditDialog::modifyName(u, nameEdit->text()); } u->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); u->setTitle(titleEdit->text().trimmed().toStdString()); u->setCategory(categoryEdit->currentText().trimmed().toStdString()); u->setSystem(systemEdit->currentText().trimmed().toStdString()); u->setHidden(hideBox->isChecked()); if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { u->setUseWithPrefixesByDefault(prefixBox->isChecked()); } u->setChanged(false); CALCULATOR->addUnit(u); return u; } Unit *UnitEditDialog::modifyUnit(Unit *u, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Unit *bu = NULL; if(typeCombo->currentIndex() == 1) { bu = CALCULATOR->getUnit(baseEdit->text().trimmed().toStdString()); if(!bu) bu = CALCULATOR->getCompositeUnit(baseEdit->text().trimmed().toStdString()); if(!bu || bu == u) { tabs->setCurrentIndex(1); baseEdit->setFocus(); QMessageBox::critical(this, tr("Error"), tr("Base unit does not exist."), QMessageBox::Ok); return NULL; } } if(CALCULATOR->unitNameTaken(nameEdit->text().trimmed().toStdString(), u)) { Unit *unit = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!unit || unit->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!unit) *replaced_item = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); else if(unit != u) *replaced_item = unit; } } Unit *old_u = u; switch(typeCombo->currentIndex()) { case 1: { AliasUnit *au; if(u->subtype() != SUBTYPE_ALIAS_UNIT) { au = new AliasUnit("", "", "", "", "", bu, settings->unlocalizeExpression(relationEdit->text().trimmed().toStdString()), exponentEdit->value(), settings->unlocalizeExpression(inverseEdit->text().trimmed().toStdString()), true); u = au; } else { au = (AliasUnit*) u; au->setBaseUnit(bu); au->setExpression(settings->unlocalizeExpression(relationEdit->text().trimmed().toStdString())); au->setInverseExpression(au->hasNonlinearExpression() ? settings->unlocalizeExpression(inverseEdit->text().trimmed().toStdString()) : ""); au->setExponent(exponentEdit->value()); } if(mixBox->isChecked()) { ((AliasUnit*) u)->setMixWithBase(priorityEdit->value()); ((AliasUnit*) u)->setMixWithBaseMinimum(mbunEdit->value()); } else { ((AliasUnit*) u)->setMixWithBase(0); } break; } case 2: { if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { u = new CompositeUnit("", "", "", settings->unlocalizeExpression(baseEdit->text().trimmed().toStdString()), true); } else { ((CompositeUnit*) u)->setBaseExpression(settings->unlocalizeExpression(baseEdit->text().trimmed().toStdString())); } break; } default: { if(u->subtype() != SUBTYPE_BASE_UNIT) { u = new Unit(); } break; } } if(typeCombo->currentIndex() == 2) { u->clearNames(); NamesEditDialog::modifyName(u, nameEdit->text()); } else if(namesEditDialog) { namesEditDialog->modifyNames(u, nameEdit->text()); } else { if(old_u != u) u->set(old_u); NamesEditDialog::modifyName(u, nameEdit->text()); } u->setApproximate(false); u->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); u->setTitle(titleEdit->text().trimmed().toStdString()); u->setCategory(categoryEdit->currentText().trimmed().toStdString()); u->setSystem(systemEdit->currentText().trimmed().toStdString()); u->setHidden(hideBox->isChecked()); if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { u->setUseWithPrefixesByDefault(prefixBox->isChecked()); } if(u != old_u) { old_u->destroy(); u->setChanged(false); CALCULATOR->addUnit(u); for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->subtype() == SUBTYPE_ALIAS_UNIT && ((AliasUnit*) CALCULATOR->units[i])->firstBaseUnit() == old_u) { ((AliasUnit*) CALCULATOR->units[i])->setBaseUnit(u); } else if(CALCULATOR->units[i]->subtype() == SUBTYPE_COMPOSITE_UNIT) { size_t i2 = ((CompositeUnit*) CALCULATOR->units[i])->find(old_u); if(i2 > 0) { int exp = 1; Prefix *p = NULL; ((CompositeUnit*) CALCULATOR->units[i])->get(i2, &exp, &p); ((CompositeUnit*) CALCULATOR->units[i])->del(i2); ((CompositeUnit*) CALCULATOR->units[i])->add(u, exp, p); } } } } return u; } void UnitEditDialog::setUnit(Unit *u) { name_edited = false; nameEdit->setText(QString::fromStdString(u->getName(1).name)); if(namesEditDialog) namesEditDialog->setNames(u, nameEdit->text()); o_unit = u; switch(u->subtype()) { case SUBTYPE_BASE_UNIT: { typeCombo->setCurrentIndex(0); typeChanged(0); break; } case SUBTYPE_ALIAS_UNIT: { AliasUnit *au = (AliasUnit*) u; mixBox->setChecked(au->mixWithBase() > 0); baseEdit->setText(QString::fromStdString(au->firstBaseUnit()->preferredInputName(settings->printops.abbreviate_names, true, false, false, &can_display_unicode_string_function, (void*) baseEdit).formattedName(STRUCT_UNIT, true))); exponentEdit->setValue(au->firstBaseExponent()); mbunEdit->setValue(au->mixWithBaseMinimum() > 1 ? au->mixWithBaseMinimum() : 1); priorityEdit->setValue(au->mixWithBase()); typeCombo->setCurrentIndex(1); bool is_relative = false; if(au->uncertainty(&is_relative).empty()) { relationEdit->setText(QString::fromStdString(settings->localizeExpression(au->expression()))); } else if(is_relative) { std::string value = CALCULATOR->getFunctionById(FUNCTION_ID_UNCERTAINTY)->referenceName(); value += "("; value += settings->localizeExpression(au->expression()); value += CALCULATOR->getComma(); value += " "; value += settings->localizeExpression(au->uncertainty()); value += CALCULATOR->getComma(); value += " 1)"; relationEdit->setText(QString::fromStdString(value)); } else { relationEdit->setText(QString::fromStdString(settings->localizeExpression(au->expression() + SIGN_PLUSMINUS + au->uncertainty()))); } inverseEdit->setText(QString::fromStdString(settings->localizeExpression(au->inverseExpression()))); break; } case SUBTYPE_COMPOSITE_UNIT: { typeCombo->setCurrentIndex(2); PrintOptions po = settings->printops; po.is_approximate = NULL; po.can_display_unicode_string_arg = (void*) baseEdit; baseEdit->setText(QString::fromStdString(((CompositeUnit*) u)->print(po, false, TAG_TYPE_HTML, true, false))); break; } } prefixBox->setChecked(u->useWithPrefixesByDefault()); exponentEdit->setReadOnly(!u->isLocal()); priorityEdit->setReadOnly(!u->isLocal()); mbunEdit->setReadOnly(!u->isLocal()); nameEdit->setReadOnly(!u->isLocal()); baseEdit->setReadOnly(!u->isLocal()); relationEdit->setReadOnly(!u->isLocal()); inverseEdit->setReadOnly(!u->isLocal()); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(u->description())); descriptionEdit->blockSignals(false); titleEdit->setText(QString::fromStdString(u->title(false))); categoryEdit->setCurrentText(QString::fromStdString(u->category())); systemEdit->blockSignals(true); systemEdit->setCurrentText(QString::fromStdString(u->system())); systemEdit->blockSignals(false); descriptionEdit->setReadOnly(!u->isLocal()); titleEdit->setReadOnly(!u->isLocal()); hideBox->setChecked(u->isHidden()); okButton->setEnabled(false); } void UnitEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->unitNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidUnitName(str.trimmed().toStdString()))); } name_edited = true; onUnitChanged(); } void UnitEditDialog::relationChanged(const QString &str) { inverseEdit->setEnabled(str.indexOf("\\x") >= 0); if(!inverseEdit->isEnabled()) inverseEdit->clear(); inverseLabel->setEnabled(inverseEdit->isEnabled()); onUnitChanged(); } void UnitEditDialog::systemChanged(const QString &str) { if(str == "SI" || str == "CGS") { prefixBox->setChecked(true); } } void UnitEditDialog::typeChanged(int i) { baseEdit->setEnabled(i > 0); exponentEdit->setEnabled(i == 1); relationEdit->setEnabled(i == 1); inverseEdit->setEnabled(i == 1 && relationEdit->text().indexOf("\\x") >= 0); mixBox->setEnabled(i == 1 && exponentEdit->value() == 1); if(i != 1 || exponentEdit->value() != 1) mixBox->setChecked(false); if(i == 2) prefixBox->setChecked(false); if(i != 1) { exponentEdit->setValue(1); relationEdit->setText("1"); } if(i == 0) baseEdit->clear(); if(!inverseEdit->isEnabled()) inverseEdit->clear(); priorityEdit->setEnabled(mixBox->isChecked()); mbunEdit->setEnabled(mixBox->isChecked()); prefixBox->setEnabled(i != 2); baseLabel->setEnabled(baseEdit->isEnabled()); exponentLabel->setEnabled(exponentEdit->isEnabled()); relationLabel->setEnabled(relationEdit->isEnabled()); inverseLabel->setEnabled(inverseEdit->isEnabled()); priorityLabel->setEnabled(priorityEdit->isEnabled()); mbunLabel->setEnabled(mbunEdit->isEnabled()); namesAction->setEnabled(i != 2); } void UnitEditDialog::onUnitChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty() && (typeCombo->currentIndex() == 0 || (!baseEdit->text().trimmed().isEmpty() && (typeCombo->currentIndex() != 1 || !relationEdit->text().trimmed().isEmpty())))); } void UnitEditDialog::exponentChanged(int i) { if(i != 1) { mixBox->setChecked(false); priorityEdit->setEnabled(false); mbunEdit->setEnabled(false); priorityLabel->setEnabled(false); mbunLabel->setEnabled(false); } mixBox->setEnabled(i == 1); onUnitChanged(); } void UnitEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } Unit *UnitEditDialog::editUnit(QWidget *parent, Unit *u, ExpressionItem **replaced_item) { UnitEditDialog *d = new UnitEditDialog(parent); d->setWindowTitle(tr("Edit Unit")); d->setUnit(u); while(d->exec() == QDialog::Accepted) { Unit *u_new = d->modifyUnit(u, replaced_item); if(u_new) { d->deleteLater(); return u_new; } } d->deleteLater(); return NULL; } Unit *UnitEditDialog::newUnit(QWidget *parent, ExpressionItem **replaced_item) { UnitEditDialog *d = new UnitEditDialog(parent); d->setWindowTitle(tr("New Unit")); Unit *u = NULL; while(d->exec() == QDialog::Accepted) { u = d->createUnit(replaced_item); if(u) break; } d->deleteLater(); return u; } qalculate-qt-5.5.1/src/uniteditdialog.h000066400000000000000000000035701475705355700201130ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef UNIT_EDIT_DIALOG_H #define UNIT_EDIT_DIALOG_H #include #include class QLineEdit; class QCheckBox; class QPushButton; class QComboBox; class QPlainTextEdit; class QSpinBox; class QLabel; class NamesEditDialog; class QTabWidget; class QAction; class UnitEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *titleEdit, *baseEdit, *relationEdit, *inverseEdit; QComboBox *categoryEdit, *systemEdit, *typeCombo; QCheckBox *hideBox, *mixBox, *prefixBox; QSpinBox *exponentEdit, *priorityEdit, *mbunEdit; QPlainTextEdit *descriptionEdit; QPushButton *okButton; QTabWidget *tabs; QAction *namesAction; QLabel *relationLabel, *baseLabel, *inverseLabel, *priorityLabel, *mbunLabel, *exponentLabel; NamesEditDialog *namesEditDialog; Unit *o_unit; bool name_edited; protected slots: void onNameEdited(const QString&); void relationChanged(const QString&); void systemChanged(const QString&); void onUnitChanged(); void editNames(); void typeChanged(int); void exponentChanged(int); public: UnitEditDialog(QWidget *parent = NULL); virtual ~UnitEditDialog(); Unit *createUnit(ExpressionItem **replaced_item = NULL); Unit *modifyUnit(Unit *u, ExpressionItem **replaced_item = NULL); void setUnit(Unit *u); void setName(const QString&); static Unit *editUnit(QWidget *parent, Unit *u, ExpressionItem **replaced_item = NULL); static Unit *newUnit(QWidget *parent, ExpressionItem **replaced_item = NULL); }; #endif //UNIT_EDIT_DIALOG_H qalculate-qt-5.5.1/src/unitsdialog.cpp000066400000000000000000001127551475705355700177710ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "unitsdialog.h" #include "itemproxymodel.h" #include "uniteditdialog.h" UnitsDialog::UnitsDialog(QWidget *parent) : QDialog(parent, Qt::Window) { last_from = true; QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Units")); QHBoxLayout *hbox = new QHBoxLayout(); topbox->addLayout(hbox); vsplitter = new QSplitter(Qt::Vertical, this); hbox->addWidget(vsplitter, 1); hsplitter = new QSplitter(Qt::Horizontal, this); categoriesView = new QTreeWidget(this); categoriesView->setSelectionMode(QAbstractItemView::SingleSelection); categoriesView->setRootIsDecorated(false); categoriesView->headerItem()->setText(0, tr("Category")); categoriesView->setColumnCount(2); categoriesView->setColumnHidden(1, true); categoriesView->installEventFilter(this); hsplitter->addWidget(categoriesView); QWidget *w = new QWidget(this); QVBoxLayout *vbox = new QVBoxLayout(w); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); unitsView = new QTreeView(this); unitsView->setSelectionMode(QAbstractItemView::SingleSelection); unitsView->setRootIsDecorated(false); unitsView->installEventFilter(this); unitsModel = new ItemProxyModel(this); sourceModel = new QStandardItemModel(this); unitsModel->setSourceModel(sourceModel); unitsModel->setShowHidden(false); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Unit"))); unitsView->setModel(unitsModel); selected_item = NULL; vbox->addWidget(unitsView, 1); searchEdit = new QLineEdit(this); searchEdit->addAction(LOAD_ICON("edit-find"), QLineEdit::LeadingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) searchEdit->setTextMargins(22, 0, 0, 0); # endif #endif searchEdit->installEventFilter(this); vbox->addWidget(searchEdit, 0); hsplitter->addWidget(w); vsplitter->addWidget(hsplitter); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); vsplitter->addWidget(descriptionView); vsplitter->setStretchFactor(0, 3); vsplitter->setStretchFactor(1, 1); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); QVBoxLayout *box = new QVBoxLayout(); newButton = new QPushButton(tr("New…"), this); box->addWidget(newButton); connect(newButton, SIGNAL(clicked()), this, SLOT(newClicked())); editButton = new QPushButton(tr("Edit…"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); deactivateButton = new QPushButton(tr("Deactivate"), this); box->addWidget(deactivateButton); connect(deactivateButton, SIGNAL(clicked()), this, SLOT(deactivateClicked())); delButton = new QPushButton(tr("Delete"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); box->addSpacing(12); convertButton = new QPushButton(tr("Convert"), this); box->addWidget(convertButton); connect(convertButton, SIGNAL(clicked()), this, SLOT(convertClicked())); insertButton = new QPushButton(tr("Insert"), this); box->addWidget(insertButton); connect(insertButton, SIGNAL(clicked()), this, SLOT(insertClicked())); insertButton->setDefault(true); box->addSpacing(12); favouriteButton = new QCheckBox(tr("Favorite"), this); box->addWidget(favouriteButton); connect(favouriteButton, SIGNAL(clicked()), this, SLOT(favouriteClicked())); box->addStretch(1); hbox->addLayout(box, 0); QGridLayout *grid = new QGridLayout(); equalsLabel = new QLabel("=", this); equalsLabel->setAlignment(Qt::AlignRight); QFontMetrics fm(equalsLabel->font()); equalsLabel->setMinimumWidth(fm.boundingRect(SIGN_ALMOST_EQUAL).width()); equalsLabel->setMinimumHeight(fm.boundingRect(SIGN_ALMOST_EQUAL).height()); grid->addWidget(equalsLabel, 1, 0); fromEdit = new MathLineEdit(this); fromEdit->setText("1"); fromEdit->setAlignment(Qt::AlignRight); grid->addWidget(fromEdit, 0, 1); toEdit = new MathLineEdit(this); toEdit->setText("1"); toEdit->setAlignment(Qt::AlignRight); grid->addWidget(toEdit, 1, 1); fromLabel = new QLabel(this); grid->addWidget(fromLabel, 0, 2); toCombo = new QComboBox(this); toModel = new ItemProxyModel(this); toSourceModel = new QStandardItemModel(this); toSourceModel->setColumnCount(1); toModel->setSourceModel(toSourceModel); toCombo->setModel(toModel); grid->addWidget(toCombo, 1, 2); topbox->addLayout(grid); topbox->addSpacing(topbox->spacing() * 2); hbox = new QHBoxLayout(); showHiddenButton = new QCheckBox(tr("Show hidden units"), this); hbox->addWidget(showHiddenButton, Qt::AlignLeft); showHiddenButton->setChecked(false); connect(showHiddenButton, SIGNAL(toggled(bool)), this, SLOT(showHiddenToggled(bool))); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); hbox->addWidget(buttonBox, 1); topbox->addLayout(hbox); selected_category = "All"; updateUnits(); unitsView->setFocus(); connect(searchEdit, SIGNAL(textChanged(const QString&)), this, SLOT(searchChanged(const QString&))); connect(fromEdit, SIGNAL(textEdited(const QString&)), this, SLOT(fromChanged())); connect(toEdit, SIGNAL(textEdited(const QString&)), this, SLOT(toChanged())); connect(toCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(toUnitChanged())); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(categoriesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(unitsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedUnitChanged(const QModelIndex&, const QModelIndex&))); connect(unitsView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(onUnitActivated(const QModelIndex&))); if(!settings->units_geometry.isEmpty()) restoreGeometry(settings->units_geometry); else try_resize(this, 900, 800); if(!settings->units_vsplitter_state.isEmpty()) vsplitter->restoreState(settings->units_vsplitter_state); if(!settings->units_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->units_hsplitter_state); } UnitsDialog::~UnitsDialog() {} void UnitsDialog::convert(bool from) { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid() || toCombo->currentIndex() < 0) {toEdit->clear(); return;} last_from = from; Unit *from_u, *to_u; std::string str; if(from) { str = fromEdit->text().trimmed().toStdString(); if(str == CALCULATOR->timedOutString()) return; from_u = (Unit*) index.data(Qt::UserRole).value(); to_u = (Unit*) toCombo->currentData(Qt::UserRole).value(); if(from_u == to_u || str.empty()) {toEdit->setText(fromEdit->text().trimmed()); return;} } else { str = toEdit->text().trimmed().toStdString(); if(str == CALCULATOR->timedOutString()) return; to_u = (Unit*) index.data(Qt::UserRole).value(); from_u = (Unit*) toCombo->currentData(Qt::UserRole).value(); if(from_u == to_u || str.empty()) {fromEdit->setText(toEdit->text().trimmed()); return;} } bool b = false; EvaluationOptions eo; eo.approximation = APPROXIMATION_APPROXIMATE; eo.parse_options = settings->evalops.parse_options; eo.parse_options.base = 10; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.read_precision = DONT_READ_PRECISION; PrintOptions po; po.is_approximate = &b; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; CALCULATOR->resetExchangeRatesUsed(); CALCULATOR->beginTemporaryStopMessages(); MathStructure v_mstruct = CALCULATOR->convert(CALCULATOR->unlocalizeExpression(str, eo.parse_options), from_u, to_u, 1500, eo); if(!v_mstruct.isAborted() && settings->checkExchangeRates(this)) v_mstruct = CALCULATOR->convert(CALCULATOR->unlocalizeExpression(str, eo.parse_options), from_u, to_u, 1500, eo); if(v_mstruct.isAborted()) { str = CALCULATOR->timedOutString(); } else { str = CALCULATOR->print(v_mstruct, 300, po); } if(from) toEdit->setText(QString::fromStdString(str)); else fromEdit->setText(QString::fromStdString(str)); b = b || v_mstruct.isApproximate(); if(b) equalsLabel->setText(SIGN_ALMOST_EQUAL); else equalsLabel->setText("="); CALCULATOR->endTemporaryStopMessages(); } void UnitsDialog::fromChanged() { convert(true); } void UnitsDialog::toChanged() { convert(false); } void UnitsDialog::toUnitChanged() { convert(last_from); } void UnitsDialog::fromUnitChanged() { convert(last_from); } bool UnitsDialog::eventFilter(QObject *o, QEvent *e) { if(e->type() == QEvent::KeyPress) { QKeyEvent *event = static_cast(e); if(o == searchEdit) { if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up || event->key() == Qt::Key_PageDown || event->key() == Qt::Key_PageUp) { unitsView->setFocus(); QKeyEvent *eventCopy = new QKeyEvent(event->type(), event->key(), event->modifiers(), event->text(), event->isAutoRepeat(), event->count()); QApplication::postEvent(unitsView, eventCopy); return true; } } else if(o != fromEdit && o != toEdit && (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier)) { if(event->key() >= Qt::Key_0 && event->key() <= Qt::Key_9) { if(fromEdit->isEnabled()) { fromEdit->setFocus(); fromEdit->setText(event->text()); convert(true); } return true; } else if(!event->text().isEmpty() && event->text()[0].isLetterOrNumber()) { searchEdit->setFocus(); searchEdit->setText(event->text()); return true; } } } return QDialog::eventFilter(o, e); } void UnitsDialog::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Find)) { searchEdit->setFocus(); return; } if(event->key() == Qt::Key_Escape && searchEdit->hasFocus()) { searchEdit->clear(); unitsView->setFocus(); return; } if(event->key() == Qt::Key_Escape && (fromEdit->hasFocus() || toEdit->hasFocus())) { fromEdit->clear(); toEdit->clear(); return; } if(event->key() == Qt::Key_Return && unitsView->hasFocus()) { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(index.isValid()) { onUnitActivated(index); return; } } if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { if(event->key() >= Qt::Key_0 && event->key() <= Qt::Key_9 && fromEdit->isEnabled() && !searchEdit->hasFocus() && !fromEdit->hasFocus() && !toEdit->hasFocus()) { fromEdit->setFocus(); fromEdit->setText(event->text()); convert(true); return; } } QDialog::keyPressEvent(event); } void UnitsDialog::onUnitActivated(const QModelIndex &index) { if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) emit unitActivated(u); } void UnitsDialog::closeEvent(QCloseEvent *e) { settings->units_geometry = saveGeometry(); settings->units_vsplitter_state = vsplitter->saveState(); settings->units_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void UnitsDialog::reject() { settings->units_geometry = saveGeometry(); settings->units_vsplitter_state = vsplitter->saveState(); settings->units_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } void UnitsDialog::searchChanged(const QString &str) { unitsModel->setSecondaryFilter(str.toStdString()); unitsView->selectionModel()->setCurrentIndex(unitsModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); if(str.isEmpty()) unitsView->setFocus(); } void UnitsDialog::showHiddenToggled(bool b) { unitsModel->setShowHidden(b); } #define SET_TO_STR if(u->isCurrency()) qstr = QString::fromStdString(u->referenceName());\ else qstr = QString::fromStdString(u->print(true, true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) toCombo));\ if(u->subtype() == SUBTYPE_COMPOSITE_UNIT) {\ qstr.replace("^-1", "⁻" SIGN_POWER_1);\ qstr.replace("^-2", "⁻" SIGN_POWER_2);\ qstr.replace("^-3", "⁻" SIGN_POWER_3);\ qstr.replace("^-4", "⁻" SIGN_POWER_4);\ qstr.replace("^4", SIGN_POWER_4);\ qstr.remove("_unit");\ } void UnitsDialog::newClicked() { ExpressionItem *replaced_item = NULL; Unit *u = UnitEditDialog::newUnit(this, &replaced_item); if(u) { if(replaced_item) { if(!CALCULATOR->stillHasVariable((Variable*) replaced_item)) { emit variableRemoved((Variable*) replaced_item); } else if(replaced_item == u || !CALCULATOR->stillHasUnit((Unit*) replaced_item) || (replaced_item->type() == TYPE_UNIT && !CALCULATOR->hasUnit((Unit*) replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_VARIABLE) { if(!CALCULATOR->hasVariable((Variable*) replaced_item)) emit variableRemoved((Variable*) replaced_item); else if(!replaced_item->isActive()) emit variableDeactivated((Variable*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = u; if(u->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(u->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(u->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateUnits(); emit itemsChanged(); return; } } QString qstr; SET_TO_STR QStandardItem *item = new QStandardItem(qstr); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); toSourceModel->appendRow(item); item = new QStandardItem(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) unitsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + u->category() && (selected_category != "Uncategorized" || !u->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { unitsModel->invalidate(); toModel->invalidate(); } sourceModel->sort(0); QModelIndex index = unitsModel->mapFromSource(item->index()); if(index.isValid()) { unitsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); unitsView->scrollTo(index); } if(u != replaced_item && !u->isHidden()) settings->favourite_units.push_back(u); emit itemsChanged(); } } void UnitsDialog::unitRemoved(Unit *u) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) u), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) u), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); } void UnitsDialog::unitDeactivated(Unit*) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } unitsModel->invalidate(); toModel->invalidate(); } void UnitsDialog::editClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *old_u = (Unit*) index.data(Qt::UserRole).value(); if(!old_u) return; ExpressionItem *replaced_item = NULL; Unit *u = UnitEditDialog::editUnit(this, old_u, &replaced_item); if(u) { sourceModel->removeRow(unitsModel->mapToSource(unitsView->selectionModel()->currentIndex()).row()); QModelIndexList list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) old_u), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); if(replaced_item) { if(!CALCULATOR->stillHasVariable((Variable*) replaced_item)) { emit variableRemoved((Variable*) replaced_item); } else if(!CALCULATOR->stillHasUnit((Unit*) replaced_item) || (replaced_item->type() == TYPE_UNIT && !CALCULATOR->hasUnit((Unit*) replaced_item))) { list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_VARIABLE) { if(!CALCULATOR->hasVariable((Variable*) replaced_item)) emit variableRemoved((Variable*) replaced_item); else if(!replaced_item->isActive()) emit variableDeactivated((Variable*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = u; if(u->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(u->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(u->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateUnits(); emit itemsChanged(); return; } } QString qstr; SET_TO_STR QStandardItem *item = new QStandardItem(qstr); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); toSourceModel->appendRow(item); item = new QStandardItem(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) unitsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + u->category() && (selected_category != "Uncategorized" || !u->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { unitsModel->invalidate(); toModel->invalidate(); } sourceModel->sort(0); toSourceModel->sort(0); QModelIndex index = unitsModel->mapFromSource(item->index()); if(index.isValid()) { unitsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); unitsView->scrollTo(index); } emit itemsChanged(); } } void UnitsDialog::favouriteClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(!u) return; if(favouriteButton->isChecked()) { settings->favourite_units.push_back(u); } else { for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == u) { settings->favourite_units.erase(settings->favourite_units.begin() + i); break; } } if(selected_category == "Favorites") { if(settings->favourite_units.empty()) { QList list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else { selected_item = NULL; unitsModel->invalidate(); selectedUnitChanged(unitsView->selectionModel()->currentIndex(), unitsView->selectionModel()->currentIndex()); } } } settings->favourite_units_changed = true; emit favouritesChanged(); } void UnitsDialog::delClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u && u->isLocal()) { sourceModel->removeRow(unitsModel->mapToSource(unitsView->selectionModel()->currentIndex()).row()); QModelIndexList list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) u), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); selected_item = NULL; u->destroy(); emit itemsChanged(); } } void UnitsDialog::convertClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) { emit convertToUnitRequest(u); } } void UnitsDialog::insertClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) { emit insertUnitRequest(u); } } void UnitsDialog::deactivateClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) { u->setActive(!u->isActive()); QList list = categoriesView->findItems(u->isActive() ? "All" : "Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else if(!u->isActive()) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QStringList l; l << tr("Inactive"); l << "Inactive"; QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); categoriesView->setCurrentItem(i, 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } emit itemsChanged(); } } void UnitsDialog::selectedUnitChanged(const QModelIndex &index, const QModelIndex&) { if(index.isValid()) { Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(CALCULATOR->stillHasUnit(u)) { selected_item = u; std::string str; if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { const ExpressionName *ename = &u->preferredName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView); str = ""; str += ename->formattedName(TYPE_UNIT, true, true); str += ""; for(size_t i2 = 1; i2 <= u->countNames(); i2++) { if(&u->getName(i2) != ename) { str += ", "; str += u->getName(i2).formattedName(TYPE_UNIT, true, true); } } str += "

"; } bool is_approximate = false; PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) descriptionView; po.is_approximate = &is_approximate; po.allow_non_usable = true; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.use_unit_prefixes = false; if(u->subtype() == SUBTYPE_ALIAS_UNIT) { AliasUnit *au = (AliasUnit*) u; MathStructure m(1, 1, 0), mexp(1, 1, 0); if(au->hasNonlinearExpression()) { m.set("x"); if(au->expression().find("\\y") != std::string::npos) mexp.set("y"); str += "x "; str += u->preferredDisplayName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView).formattedName(TYPE_UNIT, true, true); if(au->expression().find("\\y") != std::string::npos) str += "y"; str += " "; } au->convertToFirstBaseUnit(m, mexp); if(au->firstBaseUnit()->subtype() == SUBTYPE_COMPOSITE_UNIT) m.multiply(((CompositeUnit*) au->firstBaseUnit())->generateMathStructure()); else m.multiply(au->firstBaseUnit()); if(!mexp.isOne()) m.last() ^= mexp; if(m.isApproximate() || is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; m.format(po); str += m.print(po, true, false, TAG_TYPE_HTML); if(au->hasNonlinearExpression() && !au->inverseExpression().empty()) { str += "
"; m.set("x"); if(au->inverseExpression().find("\\y") != std::string::npos) mexp.set("y"); else mexp.set(1, 1, 0); str += "x "; bool b_y = au->inverseExpression().find("\\y") != std::string::npos; if(au->firstBaseUnit()->subtype() == SUBTYPE_COMPOSITE_UNIT) { if(b_y) str += "("; MathStructure m2(((CompositeUnit*) au->firstBaseUnit())->generateMathStructure()); m2.format(po); str += m2.print(po, true, false, TAG_TYPE_HTML); if(b_y) str += ")y"; } else { str += au->firstBaseUnit()->preferredDisplayName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView).formattedName(TYPE_UNIT, true, true); if(b_y) str += "y"; } str += " "; au->convertFromFirstBaseUnit(m, mexp); m.multiply(au); if(!mexp.isOne()) m.last() ^= mexp; if(m.isApproximate() || is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; m.format(po); str += m.print(po, true, false, TAG_TYPE_HTML); } } else if(u->subtype() == SUBTYPE_COMPOSITE_UNIT) { str += "= "; MathStructure m(((CompositeUnit*) u)->generateMathStructure()); m.format(po); str += m.print(po, true, false, TAG_TYPE_HTML); } if(!u->description().empty()) { if(u->subtype() != SUBTYPE_BASE_UNIT) str += "
"; str += "
"; str += to_html_escaped(u->description()); } if(u->isActive() != (deactivateButton->text() == tr("Deactivate"))) { deactivateButton->setMinimumWidth(deactivateButton->width()); if(u->isActive()) { deactivateButton->setText(tr("Deactivate")); } else { deactivateButton->setText(tr("Activate")); } } editButton->setEnabled(true); insertButton->setEnabled(u->isActive()); convertButton->setEnabled(u->isActive()); delButton->setEnabled(u->isLocal()); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == u) { favouriteButton->setChecked(true); break; } } deactivateButton->setEnabled(true); descriptionView->setHtml(QString::fromStdString(str)); std::string to_filter; if(u->category().empty()) { if(u->isLocal()) to_filter = "Uncategorized"; else to_filter = "User items"; } else { to_filter = "/"; to_filter += u->category(); } bool change_index = false; if(u->baseUnit()->referenceName() == "m" && u->baseExponent() == 3) { size_t i = to_filter.find("/", 1); if(i != std::string::npos) to_filter = to_filter.substr(0, i); } if(to_filter != toModel->currentFilter()) { toModel->setFilter(to_filter); toModel->sort(0); change_index = toCombo->count() > 0; } else if(toCombo->currentIndex() >= 0 && toCombo->currentData(Qt::UserRole).value() == u) { change_index = true; } if(change_index) { if(toCombo->itemData(0, Qt::UserRole).value() == u && toCombo->count() >= 2) toCombo->setCurrentIndex(1); else toCombo->setCurrentIndex(0); } fromEdit->setEnabled(u->isActive()); toEdit->setEnabled(u->isActive()); toCombo->setEnabled(u->isActive()); QString qstr; SET_TO_STR fromLabel->setText(qstr); fromUnitChanged(); return; } } fromUnitChanged(); fromEdit->setEnabled(false); toEdit->setEnabled(false); toCombo->setEnabled(false); fromLabel->setText(QString()); editButton->setEnabled(false); insertButton->setEnabled(false); convertButton->setEnabled(false); delButton->setEnabled(false); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); deactivateButton->setEnabled(false); descriptionView->clear(); selected_item = NULL; } void UnitsDialog::selectedCategoryChanged(QTreeWidgetItem *iter, QTreeWidgetItem*) { if(!iter) selected_category = ""; else selected_category = iter->text(1).toStdString(); searchEdit->clear(); unitsModel->setFilter(selected_category); QModelIndex index = unitsView->selectionModel()->currentIndex(); if(index.isValid()) { selectedUnitChanged(index, QModelIndex()); unitsView->scrollTo(index); } else if(selected_category != "All" && selected_category != "Inactive" && selected_category != toModel->currentFilter()) { toModel->setFilter(selected_category); toModel->sort(0); if(toCombo->count()) toCombo->setCurrentIndex(0); } } struct tree_struct { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; tree_struct *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct &s1) const { return string_is_less(item, s1.item); } }; void UnitsDialog::updateUnits() { size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; QString qstr; tree_struct unit_cats; unit_cats.parent = NULL; bool has_inactive = false, has_uncat = false; std::list::iterator it; QStandardItem *item_sel = NULL; unitsView->selectionModel()->blockSignals(true); sourceModel->clear(); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Unit"))); toSourceModel->clear(); toSourceModel->setColumnCount(1); for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(!u->isActive()) { has_inactive = true; } else { tree_struct *item = &unit_cats; if(!u->category().empty()) { cat = u->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } else { has_uncat = true; } } QStandardItem *item = new QStandardItem(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) unitsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); sourceModel->appendRow(item); if(u == selected_item) item_sel = item; SET_TO_STR item = new QStandardItem(qstr); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); toSourceModel->appendRow(item); } unitsView->selectionModel()->blockSignals(false); sourceModel->sort(0); toSourceModel->sort(0); unit_cats.sort(); categoriesView->blockSignals(true); categoriesView->clear(); categoriesView->blockSignals(false); QTreeWidgetItem *iter, *iter2, *iter3; QStringList l; l.clear(); l << tr("Favorites"); l << "Favorites"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Favorites") { iter->setSelected(true); } l.clear(); l << tr("User units"); l << "User items"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "User items") { iter->setSelected(true); } if(has_inactive) { //add "Inactive" category if there are inactive units l.clear(); l << tr("Inactive"); l << "Inactive"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Inactive") { iter->setSelected(true); } } l.clear(); l << tr("All", "All units"); l << "All"; iter3 = new QTreeWidgetItem(categoriesView, l); tree_struct *item, *item2; unit_cats.it = unit_cats.items.begin(); if(unit_cats.it != unit_cats.items.end()) { item = &*unit_cats.it; ++unit_cats.it; item->it = item->items.begin(); } else { item = NULL; } str = ""; iter2 = iter3; while(item) { str += "/"; str += item->item; l.clear(); l << QString::fromStdString(item->item); l << QString::fromStdString(str); iter = new QTreeWidgetItem(iter2, l); if(str == selected_category) { iter->setExpanded(true); iter->setSelected(true); } while(item && item->it == item->items.end()) { size_t str_i = str.rfind("/"); if(str_i == std::string::npos) { str = ""; } else { str = str.substr(0, str_i); } item = item->parent; iter2 = iter->parent(); iter = iter2; } if(item) { item2 = &*item->it; if(item->it == item->items.begin()) iter2 = iter; ++item->it; item = item2; item->it = item->items.begin(); } } if(has_uncat) { //add "Uncategorized" category if there are units without category l.clear(); l << tr("Uncategorized"); l << "Uncategorized"; iter = new QTreeWidgetItem(iter3, l); if(selected_category == "Uncategorized") { iter->setSelected(true); } } iter3->setExpanded(true); if(categoriesView->selectedItems().isEmpty()) { //if no category has been selected (previously selected has been renamed/deleted), select "All" selected_category = "All"; iter3->setSelected(true); } searchEdit->blockSignals(true); searchEdit->clear(); searchEdit->blockSignals(false); unitsModel->setFilter(selected_category); QModelIndex index; if(item_sel) index = unitsModel->mapFromSource(item_sel->index()); if(!index.isValid()) index = unitsModel->index(0, 0); if(index.isValid()) { unitsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); unitsView->scrollTo(index); } selectedUnitChanged(index, QModelIndex()); } void UnitsDialog::setSearch(const QString &str) { searchEdit->setText(str); } void UnitsDialog::selectCategory(std::string str) { QList list = categoriesView->findItems((str.empty() || str == "All") ? "All" : "/" + QString::fromStdString(str), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } qalculate-qt-5.5.1/src/unitsdialog.h000066400000000000000000000047601475705355700174320ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef UNITS_DIALOG_H #define UNITS_DIALOG_H #include #include class QTreeView; class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QStandardItemModel; class QPushButton; class QLineEdit; class QSplitter; class ItemProxyModel; class QComboBox; class QLabel; class QAbstractButton; class UnitsDialog : public QDialog { Q_OBJECT protected: QTreeView *unitsView; QTreeWidget *categoriesView; QTextEdit *descriptionView; ItemProxyModel *unitsModel, *toModel; QStandardItemModel *sourceModel, *toSourceModel; QPushButton *deactivateButton, *insertButton, *delButton, *editButton, *newButton, *convertButton; QAbstractButton *favouriteButton, *showHiddenButton; QLineEdit *searchEdit, *fromEdit, *toEdit; QSplitter *vsplitter, *hsplitter; QLabel *fromLabel, *equalsLabel; QComboBox *toCombo; bool last_from; std::string selected_category; ExpressionItem *selected_item; void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent*) override; void convert(bool from); protected slots: void selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedUnitChanged(const QModelIndex&, const QModelIndex&); void newClicked(); void editClicked(); void delClicked(); void insertClicked(); void convertClicked(); void deactivateClicked(); void searchChanged(const QString&); void fromChanged(); void toChanged(); void toUnitChanged(); void fromUnitChanged(); void favouriteClicked(); void showHiddenToggled(bool); void onUnitActivated(const QModelIndex&); public: UnitsDialog(QWidget *parent = NULL); virtual ~UnitsDialog(); void updateUnits(); void setSearch(const QString&); void selectCategory(std::string); void unitRemoved(Unit*); void unitDeactivated(Unit*); bool eventFilter(QObject*, QEvent*) override; public slots: void reject() override; signals: void itemsChanged(); void favouritesChanged(); void variableRemoved(Variable*); void variableDeactivated(Variable*); void insertUnitRequest(Unit*); void convertToUnitRequest(Unit*); void unitActivated(Unit*); }; #endif //UNITS_DIALOG_H qalculate-qt-5.5.1/src/unknowneditdialog.cpp000066400000000000000000000242421475705355700211650ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "unknowneditdialog.h" #include "functioneditdialog.h" UnknownEditDialog::UnknownEditDialog(QWidget *parent) : QDialog(parent) { o_variable = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); customBox = new QCheckBox(tr("Custom assumptions"), this); customBox->setChecked(true); grid->addWidget(customBox, 1, 0, 1, 2); grid->addWidget(new QLabel(tr("Type:"), this), 2, 0); typeCombo = new QComboBox(this); typeCombo->addItem("Number", ASSUMPTION_TYPE_NUMBER); typeCombo->addItem("Real number", ASSUMPTION_TYPE_REAL); typeCombo->addItem("Rational number", ASSUMPTION_TYPE_RATIONAL); typeCombo->addItem("Integer", ASSUMPTION_TYPE_INTEGER); typeCombo->addItem("Boolean", ASSUMPTION_TYPE_BOOLEAN); grid->addWidget(typeCombo, 2, 1); grid->addWidget(new QLabel(tr("Sign:"), this), 3, 0); signCombo = new QComboBox(this); signCombo->addItem("Unknown", ASSUMPTION_SIGN_UNKNOWN); signCombo->addItem("Non-zero", ASSUMPTION_SIGN_NONZERO); signCombo->addItem("Positive", ASSUMPTION_SIGN_POSITIVE); signCombo->addItem("Non-negative", ASSUMPTION_SIGN_NONNEGATIVE); signCombo->addItem("Negative", ASSUMPTION_SIGN_NEGATIVE); signCombo->addItem("Non-positive", ASSUMPTION_SIGN_NONPOSITIVE); grid->addWidget(signCombo, 3, 1); temporaryBox = new QCheckBox(tr("Temporary"), this); temporaryBox->setChecked(false); grid->addWidget(temporaryBox, 4, 0, 1, 2, Qt::AlignRight); typeCombo->setCurrentIndex(typeCombo->findData(CALCULATOR->defaultAssumptions()->type())); signCombo->setCurrentIndex(signCombo->findData(CALCULATOR->defaultAssumptions()->sign())); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onTypeChanged(int))); connect(signCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onSignChanged(int))); connect(customBox, SIGNAL(toggled(bool)), this, SLOT(onCustomToggled(bool))); connect(temporaryBox, SIGNAL(clicked()), this, SLOT(onVariableChanged())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } UnknownEditDialog::~UnknownEditDialog() {} void UnknownEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_VARIABLE, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_variable, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onVariableChanged(); } void UnknownEditDialog::onTypeChanged(int i) { int t = typeCombo->itemData(i).toInt(); int s = signCombo->currentData().toInt(); if((t == ASSUMPTION_TYPE_NUMBER && s != ASSUMPTION_SIGN_NONZERO && s != ASSUMPTION_SIGN_UNKNOWN) || (t == ASSUMPTION_TYPE_BOOLEAN && s != ASSUMPTION_SIGN_UNKNOWN)) { signCombo->blockSignals(true); signCombo->setCurrentIndex(signCombo->findData(ASSUMPTION_SIGN_UNKNOWN)); signCombo->blockSignals(false); } onVariableChanged(); } void UnknownEditDialog::onSignChanged(int i) { int t = typeCombo->currentData().toInt(); int s = signCombo->itemData(i).toInt(); if((t == ASSUMPTION_TYPE_NUMBER && s != ASSUMPTION_SIGN_NONZERO && s != ASSUMPTION_SIGN_UNKNOWN) || (t == ASSUMPTION_TYPE_BOOLEAN && s != ASSUMPTION_SIGN_UNKNOWN)) { typeCombo->blockSignals(true); typeCombo->setCurrentIndex(typeCombo->findData(ASSUMPTION_TYPE_REAL)); typeCombo->blockSignals(false); } onVariableChanged(); } void UnknownEditDialog::onVariableChanged() { okButton->setEnabled(!nameEdit->text().trimmed().isEmpty()); } void UnknownEditDialog::onCustomToggled(bool b) { typeCombo->setEnabled(b); signCombo->setEnabled(b); onVariableChanged(); } UnknownVariable *UnknownEditDialog::createVariable(ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Variable *var = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString())) { var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else *replaced_item = var; } } UnknownVariable *v; if(var && var->isLocal() && !var->isKnown()) { v = (UnknownVariable*) var; v->clearNames(); v->setHidden(false); v->setApproximate(false); v->setDescription(""); v->setTitle(""); if(!modifyVariable(v)) return NULL; return v; } v = new UnknownVariable("", ""); if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); if(temporaryBox->isChecked()) v->setCategory(CALCULATOR->temporaryCategory()); else v->setCategory(CALCULATOR->getVariableById(VARIABLE_ID_X)->category()); if(customBox->isChecked()) { v->setAssumptions(new Assumptions()); v->assumptions()->setType((AssumptionType) typeCombo->currentData().toInt()); v->assumptions()->setSign((AssumptionSign) signCombo->currentData().toInt()); } v->setChanged(false); CALCULATOR->addVariable(v); return v; } bool UnknownEditDialog::modifyVariable(UnknownVariable *v, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString(), v)) { Variable *var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else if(var != v) *replaced_item = var; } } if(v->isLocal()) { if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); if(temporaryBox->isChecked()) v->setCategory(CALCULATOR->temporaryCategory()); else if(v->category() == CALCULATOR->temporaryCategory()) v->setCategory(CALCULATOR->getVariableById(VARIABLE_ID_X)->category()); } if(!customBox->isChecked()) { v->setAssumptions(NULL); } else { if(!v->assumptions()) v->setAssumptions(new Assumptions()); v->assumptions()->setType((AssumptionType) typeCombo->currentData().toInt()); v->assumptions()->setSign((AssumptionSign) signCombo->currentData().toInt()); } return true; } void UnknownEditDialog::setVariable(UnknownVariable *v) { o_variable = v; name_edited = false; nameEdit->setText(QString::fromStdString(v->getName(1).name)); nameEdit->setEnabled(v->isLocal()); if(namesEditDialog) namesEditDialog->setNames(v, nameEdit->text()); Assumptions *ass = v->assumptions(); customBox->setChecked(ass); if(!ass) ass = CALCULATOR->defaultAssumptions(); typeCombo->setCurrentIndex(typeCombo->findData(ass->type())); signCombo->setCurrentIndex(signCombo->findData(ass->sign())); temporaryBox->setChecked(v->category() == CALCULATOR->temporaryCategory()); temporaryBox->setEnabled(v->isLocal()); okButton->setEnabled(false); } void UnknownEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->variableNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(str.trimmed().toStdString()))); } name_edited = true; okButton->setEnabled(!nameEdit->text().trimmed().isEmpty()); } void UnknownEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } bool UnknownEditDialog::editVariable(QWidget *parent, UnknownVariable *v, ExpressionItem **replaced_item) { UnknownEditDialog *d = new UnknownEditDialog(parent); d->setWindowTitle(tr("Edit Unknown Variable")); d->setVariable(v); while(d->exec() == QDialog::Accepted) { if(d->modifyVariable(v, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } UnknownVariable* UnknownEditDialog::newVariable(QWidget *parent, ExpressionItem **replaced_item) { UnknownEditDialog *d = new UnknownEditDialog(parent); d->setWindowTitle(tr("New Unknown Variable")); std::string v_name; int i = 1; do { v_name = "v"; v_name += i2s(i); i++; } while(CALCULATOR->nameTaken(v_name)); d->setName(QString::fromStdString(v_name)); UnknownVariable *v = NULL; while(d->exec() == QDialog::Accepted) { v = d->createVariable(replaced_item); if(v) break; } d->deleteLater(); return v; } qalculate-qt-5.5.1/src/unknowneditdialog.h000066400000000000000000000030561475705355700206320ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef UNKNOWN_EDIT_DIALOG_H #define UNKNOWN_EDIT_DIALOG_H #include #include class QLineEdit; class QCheckBox; class QPushButton; class QComboBox; class NamesEditDialog; class UnknownEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit; QCheckBox *customBox, *temporaryBox; QComboBox *typeCombo, *signCombo; QPushButton *okButton; NamesEditDialog *namesEditDialog; Variable *o_variable; bool name_edited; protected slots: void onNameEdited(const QString&); void onVariableChanged(); void onTypeChanged(int); void onSignChanged(int); void onCustomToggled(bool); void editNames(); public: UnknownEditDialog(QWidget *parent = NULL); virtual ~UnknownEditDialog(); UnknownVariable *createVariable(ExpressionItem **replaced_item = NULL); bool modifyVariable(UnknownVariable *v, ExpressionItem **replaced_item = NULL); void setVariable(UnknownVariable *v); void setName(const QString&); static bool editVariable(QWidget *parent, UnknownVariable *, ExpressionItem **replaced_item = NULL); static UnknownVariable* newVariable(QWidget *parent, ExpressionItem **replaced_item = NULL); }; #endif //UNKNOWN_EDIT_DIALOG_H qalculate-qt-5.5.1/src/variableeditdialog.cpp000066400000000000000000000402441475705355700212530ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "variableeditdialog.h" #include "functioneditdialog.h" #include "matrixwidget.h" VariableEditDialog::VariableEditDialog(QWidget *parent, bool allow_empty_value, bool edit_matrix) : QDialog(parent), b_empty(allow_empty_value), b_matrix(edit_matrix), b_changed(false) { o_variable = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); QTabWidget *tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); box->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); tabs->addTab(w1, tr("Required")); tabs->addTab(w2, tr("Description")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif int r = 0; grid->addWidget(nameEdit, r, 1); r++; if(b_matrix) { matrixEdit = new MatrixWidget(this); grid->addWidget(matrixEdit, r, 0, 1, 2); r++; connect(matrixEdit, SIGNAL(matrixChanged()), this, SLOT(onMatrixChanged())); connect(matrixEdit, SIGNAL(dimensionChanged(int, int)), this, SLOT(onMatrixDimensionChanged())); } else { grid->addWidget(new QLabel(tr("Value:"), this), r, 0); r++; valueEdit = new MathTextEdit(this); #if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) if(b_empty) valueEdit->setPlaceholderText(tr("current result")); #endif grid->addWidget(valueEdit, r, 0, 1, 2); r++; connect(valueEdit, SIGNAL(textChanged()), this, SLOT(onValueEdited())); } temporaryBox = new QCheckBox(tr("Temporary"), this); temporaryBox->setChecked(true); grid->addWidget(temporaryBox, r, 0, 1, 2, Qt::AlignRight); r++; grid = new QGridLayout(w2); grid->addWidget(new QLabel(tr("Category:"), this), 0, 0); categoryEdit = new QComboBox(this); categoryEdit->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); int l = unicode_length(CALCULATOR->temporaryCategory()); if(l < 20) l = 20; categoryEdit->setMinimumContentsLength(l); QMap hash; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(!CALCULATOR->variables[i]->category().empty()) { if(hash.find(CALCULATOR->variables[i]->category()) == hash.end()) { hash[CALCULATOR->variables[i]->category()] = true; } } } for(QMap::const_iterator it = hash.constBegin(); it != hash.constEnd(); ++it) { categoryEdit->addItem(QString::fromStdString(it.key())); } categoryEdit->setEditable(true); categoryEdit->setCurrentText(QString::fromStdString(CALCULATOR->temporaryCategory())); grid->addWidget(categoryEdit, 0, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 1, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 1, 1); hideBox = new QCheckBox(tr("Hide variable"), this); grid->addWidget(hideBox, 2, 1, Qt::AlignRight); grid->addWidget(new QLabel(tr("Description:"), this), 3, 0, 1, 2); descriptionEdit = new SmallTextEdit(2, this); grid->addWidget(descriptionEdit, 4, 0, 1, 2); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); nameEdit->setFocus(); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(temporaryBox, SIGNAL(clicked()), this, SLOT(temporaryClicked())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onVariableChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onVariableChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onVariableChanged())); connect(categoryEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(categoryChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } VariableEditDialog::~VariableEditDialog() {} void VariableEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_VARIABLE, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_variable, nameEdit->text()); } else { namesEditDialog->setName(nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onVariableChanged(); } void VariableEditDialog::categoryChanged(const QString &str) { temporaryBox->setChecked(str == QString::fromStdString(CALCULATOR->temporaryCategory())); onVariableChanged(); } void VariableEditDialog::temporaryClicked() { categoryEdit->blockSignals(true); if(temporaryBox->isChecked()) { categoryEdit->setCurrentText(QString::fromStdString(CALCULATOR->temporaryCategory())); } else { categoryEdit->setCurrentText(QString()); } categoryEdit->blockSignals(false); onVariableChanged(); } void VariableEditDialog::onMatrixDimensionChanged() { b_changed = true; } void VariableEditDialog::onMatrixChanged() { b_changed = true; onVariableChanged(); } bool VariableEditDialog::valueHasChanged() const { return b_changed; } KnownVariable *VariableEditDialog::createVariable(MathStructure *default_value, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Variable *var = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString())) { var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else *replaced_item = var; } } KnownVariable *v; if(var && var->isLocal() && var->isKnown()) { v = (KnownVariable*) var; v->clearNames(); if(!modifyVariable(v, default_value)) return NULL; return v; } if(default_value && ((!b_matrix && valueEdit->toPlainText().isEmpty()) || !b_changed)) { v = new KnownVariable("", "", *default_value); } else { std::string str; if(b_matrix) { str = matrixEdit->getMatrixString().toStdString(); } else { str = settings->unlocalizeExpression(valueEdit->toPlainText().toStdString()); } v = new KnownVariable("", "", str); } if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); v->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); v->setTitle(titleEdit->text().trimmed().toStdString()); v->setCategory(categoryEdit->currentText().trimmed().toStdString()); v->setHidden(hideBox->isChecked()); v->setChanged(false); CALCULATOR->addVariable(v); return v; } bool VariableEditDialog::modifyVariable(KnownVariable *v, MathStructure *default_value, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString(), v)) { Variable *var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else if(var != v) *replaced_item = var; } } if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); v->setApproximate(false); v->setUncertainty(""); v->setUnit(""); if(default_value && ((!b_matrix && valueEdit->toPlainText().isEmpty()) || !b_changed)) { v->set(*default_value); } else { std::string str; if(b_matrix) { str = matrixEdit->getMatrixString().toStdString(); } else { str = settings->unlocalizeExpression(valueEdit->toPlainText().toStdString()); } v->set(str); } v->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); v->setTitle(titleEdit->text().trimmed().toStdString()); v->setCategory(categoryEdit->currentText().trimmed().toStdString()); v->setHidden(hideBox->isChecked()); return true; } void VariableEditDialog::setVariable(KnownVariable *v) { nameEdit->setText(QString::fromStdString(v->getName(1).name)); name_edited = false; if(!nameEdit->text().isEmpty()) o_variable = v; else o_variable = NULL; if(namesEditDialog) namesEditDialog->setNames(o_variable, nameEdit->text()); if(v->isExpression() && !b_matrix) { std::string value_str = settings->localizeExpression(v->expression()); bool is_relative = false; if((!v->uncertainty(&is_relative).empty() || !v->unit().empty()) && !is_relative && v->expression().find_first_not_of(NUMBER_ELEMENTS) != std::string::npos) { value_str.insert(0, 1, '('); value_str += ')'; } if(!v->uncertainty(&is_relative).empty()) { if(is_relative) { value_str.insert(0, "("); value_str.insert(0, CALCULATOR->getFunctionById(FUNCTION_ID_UNCERTAINTY)->referenceName()); value_str += CALCULATOR->getComma(); value_str += " "; value_str += settings->localizeExpression(v->uncertainty()); value_str += CALCULATOR->getComma(); value_str += " 1)"; } else { value_str += SIGN_PLUSMINUS; value_str += settings->localizeExpression(v->uncertainty()); } } else if(v->isApproximate() && value_str.find(CALCULATOR->getFunctionById(FUNCTION_ID_INTERVAL)->referenceName()) == std::string::npos && value_str.find("±") == std::string::npos && value_str.find("+/-") == std::string::npos) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.preserve_precision = true; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; if(po.number_fraction_format == FRACTION_DECIMAL) po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.base = 10; value_str = CALCULATOR->print(v->get(), 1000, po); } if(!v->unit().empty() && v->unit() != "auto") { value_str += " "; value_str += settings->localizeExpression(v->unit(), true); } valueEdit->setPlainText(QString::fromStdString(value_str)); } else if(b_matrix) { matrixEdit->setMatrix(v->get()); } else { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.preserve_precision = true; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; if(po.number_fraction_format == FRACTION_DECIMAL) po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.base = 10; valueEdit->setPlainText(QString::fromStdString(CALCULATOR->print(v->get(), 1000, po))); } nameEdit->setReadOnly(!v->isLocal()); if(b_matrix) { matrixEdit->setEditable(v->isLocal()); } else { valueEdit->setReadOnly(!v->isLocal()); } temporaryBox->setChecked(v->category() == CALCULATOR->temporaryCategory()); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(v->description())); descriptionEdit->blockSignals(false); titleEdit->setText(QString::fromStdString(v->title(false))); categoryEdit->blockSignals(true); categoryEdit->setCurrentText(QString::fromStdString(v->category())); categoryEdit->blockSignals(false); descriptionEdit->setReadOnly(!v->isLocal()); titleEdit->setReadOnly(!v->isLocal()); hideBox->setChecked(v->isHidden()); okButton->setEnabled(false); b_changed = false; } void VariableEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->variableNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(str.trimmed().toStdString()))); } name_edited = true; onVariableChanged(); } void VariableEditDialog::onVariableChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty() && (b_empty || (!b_matrix && !valueEdit->toPlainText().trimmed().isEmpty()) || (b_matrix && b_changed))); } void VariableEditDialog::onValueEdited() { b_changed = true; onVariableChanged(); } void VariableEditDialog::setValue(const QString &str) { valueEdit->setPlainText(str); if(!b_empty) onValueEdited(); b_changed = false; } void VariableEditDialog::disableValue() { valueEdit->setReadOnly(true); } void VariableEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } QString VariableEditDialog::value() const { return valueEdit->toPlainText(); } bool VariableEditDialog::editVariable(QWidget *parent, KnownVariable *v, ExpressionItem **replaced_item) { VariableEditDialog *d = new VariableEditDialog(parent, false, v->get().isMatrix() && v->get().rows() * v->get().columns() <= 10000); d->setWindowTitle(tr("Edit Variable")); d->setVariable(v); while(d->exec() == QDialog::Accepted) { if(d->modifyVariable(v, NULL, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } KnownVariable* VariableEditDialog::newVariable(QWidget *parent, MathStructure *default_value, const QString &value_str, ExpressionItem **replaced_item) { bool edit_matrix = default_value && default_value->isMatrix() && default_value->rows() * default_value->columns() <= 10000; VariableEditDialog *d = new VariableEditDialog(parent, default_value != NULL && (value_str.isEmpty() || value_str.length() > 1000 || edit_matrix), edit_matrix); d->setWindowTitle(tr("New Variable")); QString vstr = value_str; if(edit_matrix) { KnownVariable v(CALCULATOR->temporaryCategory(), "", *default_value); d->setVariable(&v); } else if(vstr.length() > 1000) { d->setValue(QString()); } else { if(vstr.isEmpty() && default_value) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.preserve_precision = true; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; po.show_ending_zeroes = false; if(po.number_fraction_format == FRACTION_DECIMAL) po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.base = 10; vstr = QString::fromStdString(CALCULATOR->print(*default_value, 1000, po)); } d->setValue(vstr); } std::string v_name; int i = 1; do { v_name = "v"; v_name += i2s(i); i++; } while(CALCULATOR->nameTaken(v_name)); d->setName(QString::fromStdString(v_name)); KnownVariable *v = NULL; while(d->exec() == QDialog::Accepted) { if(edit_matrix) { v = d->createVariable(default_value, replaced_item); if(v) break; } else { QString str = d->value().trimmed(); if(default_value && str == vstr) d->setValue(""); v = d->createVariable(default_value, replaced_item); if(v) break; d->setValue(str); } } d->deleteLater(); return v; } KnownVariable *VariableEditDialog::newMatrix(QWidget *parent, ExpressionItem **replaced_item) { VariableEditDialog *d = new VariableEditDialog(parent, false, true); d->setWindowTitle(tr("New Variable")); std::string v_name; int i = 1; do { v_name = "v"; v_name += i2s(i); i++; } while(CALCULATOR->nameTaken(v_name)); d->setName(QString::fromStdString(v_name)); KnownVariable *v = NULL; while(d->exec() == QDialog::Accepted) { v = d->createVariable(NULL, replaced_item); if(v) break; } d->deleteLater(); return v; } qalculate-qt-5.5.1/src/variableeditdialog.h000066400000000000000000000042351475705355700207200ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef VARIABLE_EDIT_DIALOG_H #define VARIABLE_EDIT_DIALOG_H #include #include class QLineEdit; class QCheckBox; class QPushButton; class MatrixWidget; class QComboBox; class QPlainTextEdit; class NamesEditDialog; class VariableEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *titleEdit; QComboBox *categoryEdit; QCheckBox *temporaryBox, *hideBox; QPlainTextEdit *descriptionEdit, *valueEdit; QPushButton *okButton; MatrixWidget *matrixEdit; NamesEditDialog *namesEditDialog; Variable *o_variable; bool b_empty, b_matrix, b_changed, name_edited; protected slots: void onNameEdited(const QString&); void onValueEdited(); void onVariableChanged(); void onMatrixDimensionChanged(); void onMatrixChanged(); void editNames(); void temporaryClicked(); void categoryChanged(const QString&); public: VariableEditDialog(QWidget *parent = NULL, bool allow_empty_value = true, bool edit_matrix = false); virtual ~VariableEditDialog(); KnownVariable *createVariable(MathStructure *default_value = NULL, ExpressionItem **replaced_item = NULL); bool modifyVariable(KnownVariable *v, MathStructure *default_value = NULL, ExpressionItem **replaced_item = NULL); void setVariable(KnownVariable *v); void setValue(const QString&); void disableValue(); bool valueHasChanged() const; QString value() const; void setName(const QString&); static bool editVariable(QWidget *parent, KnownVariable *v, ExpressionItem **replaced_item = NULL); static KnownVariable *newVariable(QWidget *parent, MathStructure *default_value = NULL, const QString &value_str = QString(), ExpressionItem **replaced_item = NULL); static KnownVariable *newMatrix(QWidget *parent, ExpressionItem **replaced_item = NULL); }; #endif //VARIABLE_EDIT_DIALOG_H qalculate-qt-5.5.1/src/variablesdialog.cpp000066400000000000000000000732671475705355700206030ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "variablesdialog.h" #include "itemproxymodel.h" #include "unknowneditdialog.h" #include "variableeditdialog.h" #include "csvdialog.h" VariablesDialog::VariablesDialog(QWidget *parent) : QDialog(parent, Qt::Window) { QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Variables")); QHBoxLayout *hbox = new QHBoxLayout(); topbox->addLayout(hbox); vsplitter = new QSplitter(Qt::Vertical, this); hbox->addWidget(vsplitter, 1); hsplitter = new QSplitter(Qt::Horizontal, this); categoriesView = new QTreeWidget(this); categoriesView->setSelectionMode(QAbstractItemView::SingleSelection); categoriesView->setRootIsDecorated(false); categoriesView->headerItem()->setText(0, tr("Category")); categoriesView->setColumnCount(2); categoriesView->setColumnHidden(1, true); categoriesView->installEventFilter(this); hsplitter->addWidget(categoriesView); QWidget *w = new QWidget(this); QVBoxLayout *vbox = new QVBoxLayout(w); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); variablesView = new QTreeView(this); variablesView->setSelectionMode(QAbstractItemView::SingleSelection); variablesView->setRootIsDecorated(false); variablesView->installEventFilter(this); variablesModel = new ItemProxyModel(this); sourceModel = new QStandardItemModel(this); variablesModel->setSourceModel(sourceModel); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Variable"))); variablesView->setModel(variablesModel); selected_item = NULL; vbox->addWidget(variablesView, 1); searchEdit = new QLineEdit(this); searchEdit->addAction(LOAD_ICON("edit-find"), QLineEdit::LeadingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) searchEdit->setTextMargins(22, 0, 0, 0); # endif #endif searchEdit->installEventFilter(this); vbox->addWidget(searchEdit, 0); hsplitter->addWidget(w); vsplitter->addWidget(hsplitter); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); vsplitter->addWidget(descriptionView); vsplitter->setStretchFactor(0, 3); vsplitter->setStretchFactor(1, 1); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); QVBoxLayout *box = new QVBoxLayout(); newButton = new QPushButton(tr("New"), this); box->addWidget(newButton); QMenu *menu = new QMenu(this); menu->addAction(tr("Variable/Constant…"), this, SLOT(newVariable())); menu->addAction(tr("Unknown Variable…"), this, SLOT(newUnknown())); menu->addAction(tr("Matrix…"), this, SLOT(newMatrix())); newButton->setMenu(menu); editButton = new QPushButton(tr("Edit…"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); exportButton = new QPushButton(tr("Export…"), this); box->addWidget(exportButton); connect(exportButton, SIGNAL(clicked()), this, SLOT(exportClicked())); deactivateButton = new QPushButton(tr("Deactivate"), this); box->addWidget(deactivateButton); connect(deactivateButton, SIGNAL(clicked()), this, SLOT(deactivateClicked())); delButton = new QPushButton(tr("Delete"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); box->addSpacing(12); insertButton = new QPushButton(tr("Insert"), this); box->addWidget(insertButton); connect(insertButton, SIGNAL(clicked()), this, SLOT(insertClicked())); insertButton->setDefault(true); box->addSpacing(12); favouriteButton = new QCheckBox(tr("Favorite"), this); box->addWidget(favouriteButton); connect(favouriteButton, SIGNAL(clicked()), this, SLOT(favouriteClicked())); box->addStretch(1); hbox->addLayout(box, 0); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); topbox->addWidget(buttonBox); selected_category = "All"; updateVariables(); variablesView->setFocus(); connect(searchEdit, SIGNAL(textChanged(const QString&)), this, SLOT(searchChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(categoriesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(variablesView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedVariableChanged(const QModelIndex&, const QModelIndex&))); connect(variablesView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(insertClicked())); if(!settings->variables_geometry.isEmpty()) restoreGeometry(settings->variables_geometry); else try_resize(this, 900, 700); if(!settings->variables_vsplitter_state.isEmpty()) vsplitter->restoreState(settings->variables_vsplitter_state); if(!settings->variables_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->variables_hsplitter_state); } VariablesDialog::~VariablesDialog() {} void VariablesDialog::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Find)) { searchEdit->setFocus(); return; } if(event->key() == Qt::Key_Escape && searchEdit->hasFocus()) { searchEdit->clear(); variablesView->setFocus(); return; } if(event->key() == Qt::Key_Return && variablesView->hasFocus()) { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(index.isValid()) { insertClicked(); return; } } QDialog::keyPressEvent(event); } bool VariablesDialog::eventFilter(QObject *o, QEvent *e) { if(e->type() == QEvent::KeyPress) { QKeyEvent *event = static_cast(e); if(o == searchEdit) { if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up || event->key() == Qt::Key_PageDown || event->key() == Qt::Key_PageUp) { variablesView->setFocus(); QKeyEvent *eventCopy = new QKeyEvent(event->type(), event->key(), event->modifiers(), event->text(), event->isAutoRepeat(), event->count()); QApplication::postEvent(variablesView, eventCopy); return true; } } else if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { if(!event->text().isEmpty() && event->text()[0].isLetterOrNumber()) { searchEdit->setFocus(); searchEdit->setText(event->text()); return true; } } } return QDialog::eventFilter(o, e); } void VariablesDialog::closeEvent(QCloseEvent *e) { settings->variables_geometry = saveGeometry(); settings->variables_vsplitter_state = vsplitter->saveState(); settings->variables_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void VariablesDialog::reject() { settings->variables_geometry = saveGeometry(); settings->variables_vsplitter_state = vsplitter->saveState(); settings->variables_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } void VariablesDialog::searchChanged(const QString &str) { variablesModel->setSecondaryFilter(str.toStdString()); variablesView->selectionModel()->setCurrentIndex(variablesModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); if(str.isEmpty()) variablesView->setFocus(); } void VariablesDialog::newMatrix() {newVariable(2);} void VariablesDialog::newVariable() {newVariable(0);} void VariablesDialog::newVariable(int type) { ExpressionItem *replaced_item = NULL; Variable *v; if(type == 2) v = VariableEditDialog::newMatrix(this, &replaced_item); else if(type == 1) v = UnknownEditDialog::newVariable(this, &replaced_item); else v = VariableEditDialog::newVariable(this, NULL, QString(), &replaced_item); if(v) { if(replaced_item) { if(!CALCULATOR->stillHasUnit((Unit*) replaced_item)) { emit unitRemoved((Unit*) replaced_item); } else if(replaced_item == v || !CALCULATOR->stillHasVariable((Variable*) replaced_item) || (replaced_item->type() == TYPE_VARIABLE && !CALCULATOR->hasVariable((Variable*) replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_UNIT) { if(!CALCULATOR->hasUnit((Unit*) replaced_item)) emit unitRemoved((Unit*) replaced_item); else if(!replaced_item->isActive()) emit unitDeactivated((Unit*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = v; if(v->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(v->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(v->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateVariables(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) variablesView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) v), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + v->category() && (selected_category != "Uncategorized" || !v->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { variablesModel->invalidate(); } sourceModel->sort(0); QModelIndex index = variablesModel->mapFromSource(item->index()); if(index.isValid()) { variablesView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); variablesView->scrollTo(index); } if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); emit itemsChanged(); } } void VariablesDialog::newUnknown() {newVariable(1);} void VariablesDialog::variableRemoved(Variable *v) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) v), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } void VariablesDialog::variableDeactivated(Variable*) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } variablesModel->invalidate(); } void VariablesDialog::editClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(!v) return; bool b = false; ExpressionItem *replaced_item = NULL; if(v->isKnown()) { b = VariableEditDialog::editVariable(this, (KnownVariable*) v, &replaced_item); } else { b = UnknownEditDialog::editVariable(this, (UnknownVariable*) v, &replaced_item); } if(b) { sourceModel->removeRow(variablesModel->mapToSource(variablesView->selectionModel()->currentIndex()).row()); if(replaced_item) { if(!CALCULATOR->stillHasUnit((Unit*) replaced_item)) { emit unitRemoved((Unit*) replaced_item); } else if(!CALCULATOR->stillHasVariable((Variable*) replaced_item) || (replaced_item->type() == TYPE_VARIABLE && !CALCULATOR->hasVariable((Variable*) replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_UNIT) { if(!CALCULATOR->hasUnit((Unit*) replaced_item)) emit unitRemoved((Unit*) replaced_item); else if(!replaced_item->isActive()) emit unitDeactivated((Unit*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = v; if(v->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(v->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(v->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateVariables(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) variablesView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) v), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + v->category() && (selected_category != "Uncategorized" || !v->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { variablesModel->invalidate(); } sourceModel->sort(0); QModelIndex index = variablesModel->mapFromSource(item->index()); if(index.isValid()) { variablesView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); variablesView->scrollTo(index); } emit itemsChanged(); } } void VariablesDialog::favouriteClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(!v) return; if(favouriteButton->isChecked()) { settings->favourite_variables.push_back(v); } else { for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == v) { settings->favourite_variables.erase(settings->favourite_variables.begin() + i); break; } } if(selected_category == "Favorites") { if(settings->favourite_variables.empty()) { QList list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else { selected_item = NULL; variablesModel->invalidate(); selectedVariableChanged(variablesView->selectionModel()->currentIndex(), variablesView->selectionModel()->currentIndex()); } } } settings->favourite_variables_changed = true; emit favouritesChanged(); } void VariablesDialog::delClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v && v->isLocal()) { sourceModel->removeRow(variablesModel->mapToSource(variablesView->selectionModel()->currentIndex()).row()); selected_item = NULL; v->destroy(); emit itemsChanged(); } } void VariablesDialog::insertClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v) { emit insertVariableRequest(v); } } void VariablesDialog::exportClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v && v->isKnown()) CSVDialog::exportCSVFile(this, NULL, (KnownVariable*) v); } void VariablesDialog::deactivateClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v) { v->setActive(!v->isActive()); QList list = categoriesView->findItems(v->isActive() ? "All" : "Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else if(!v->isActive()) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QStringList l; l << tr("Inactive"); l << "Inactive"; QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); categoriesView->setCurrentItem(i, 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } emit itemsChanged(); } } void VariablesDialog::selectedVariableChanged(const QModelIndex &index, const QModelIndex&) { if(index.isValid()) { Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(CALCULATOR->stillHasVariable(v)) { selected_item = v; std::string str; const ExpressionName *ename = &v->preferredName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView); str = ""; str += ename->formattedName(TYPE_VARIABLE, true, true); str += ""; for(size_t i2 = 1; i2 <= v->countNames(); i2++) { if(&v->getName(i2) != ename) { str += ", "; str += v->getName(i2).formattedName(TYPE_VARIABLE, true, true); } } str += "

"; if(v->isKnown()) { bool is_approximate = false; if(((KnownVariable*) v)->get().isMatrix() && ((KnownVariable*) v)->get().columns() * ((KnownVariable*) v)->get().rows() > 16) { str += tr("a matrix").toStdString(); } else if(((KnownVariable*) v)->get().isVector() && ((KnownVariable*) v)->get().size() > 10) { str += tr("a vector").toStdString(); } else { PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) descriptionView; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.allow_non_usable = true; po.is_approximate = &is_approximate; if(v->isApproximate() || is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; str += CALCULATOR->print(((KnownVariable*) v)->get(), 1000, po, settings->format_result, settings->colorize_result ? settings->color : 0, TAG_TYPE_HTML); } } else { if(((UnknownVariable*) v)->assumptions()) { QString value; if(((UnknownVariable*) v)->assumptions()->type() != ASSUMPTION_TYPE_BOOLEAN) { switch(((UnknownVariable*) v)->assumptions()->sign()) { case ASSUMPTION_SIGN_POSITIVE: {value = tr("positive"); break;} case ASSUMPTION_SIGN_NONPOSITIVE: {value = tr("non-positive"); break;} case ASSUMPTION_SIGN_NEGATIVE: {value = tr("negative"); break;} case ASSUMPTION_SIGN_NONNEGATIVE: {value = tr("non-negative"); break;} case ASSUMPTION_SIGN_NONZERO: {value = tr("non-zero"); break;} default: {} } } if(!value.isEmpty() && ((UnknownVariable*) v)->assumptions()->type() != ASSUMPTION_TYPE_NONE) value += " "; switch(((UnknownVariable*) v)->assumptions()->type()) { case ASSUMPTION_TYPE_INTEGER: {value += tr("integer"); break;} case ASSUMPTION_TYPE_BOOLEAN: {value += tr("boolean"); break;} case ASSUMPTION_TYPE_RATIONAL: {value += tr("rational"); break;} case ASSUMPTION_TYPE_REAL: {value += tr("real"); break;} case ASSUMPTION_TYPE_COMPLEX: {value += tr("complex"); break;} case ASSUMPTION_TYPE_NUMBER: {value += tr("number"); break;} case ASSUMPTION_TYPE_NONMATRIX: {value += tr("not matrix"); break;} default: {} } if(value.isEmpty()) value = tr("unknown"); str += value.toStdString(); } else { str += tr("Default assumptions").toStdString(); } } if(!v->description().empty()) { str += "

"; str += to_html_escaped(v->description()); } if(v->isActive() != (deactivateButton->text() == tr("Deactivate"))) { deactivateButton->setMinimumWidth(deactivateButton->width()); if(v->isActive()) { deactivateButton->setText(tr("Deactivate")); } else { deactivateButton->setText(tr("Activate")); } } editButton->setEnabled(!v->isBuiltin()); exportButton->setEnabled(v->isKnown() && ((KnownVariable*) v)->get().isVector()); insertButton->setEnabled(v->isActive()); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == v) { favouriteButton->setChecked(true); break; } } delButton->setEnabled(v->isLocal() && !settings->isAnswerVariable(v) && v != settings->v_memory && v != CALCULATOR->getVariableById(VARIABLE_ID_X) && v != CALCULATOR->getVariableById(VARIABLE_ID_Y) && v != CALCULATOR->getVariableById(VARIABLE_ID_Z)); deactivateButton->setEnabled(!settings->isAnswerVariable(v) && v != settings->v_memory); descriptionView->setHtml(QString::fromStdString(str)); return; } } editButton->setEnabled(false); insertButton->setEnabled(false); exportButton->setEnabled(false); delButton->setEnabled(false); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); deactivateButton->setEnabled(false); descriptionView->clear(); selected_item = NULL; } void VariablesDialog::selectedCategoryChanged(QTreeWidgetItem *iter, QTreeWidgetItem*) { if(!iter) selected_category = ""; else selected_category = iter->text(1).toStdString(); searchEdit->clear(); variablesModel->setFilter(selected_category); QModelIndex index = variablesView->selectionModel()->currentIndex(); if(index.isValid()) { selectedVariableChanged(index, QModelIndex()); variablesView->scrollTo(index); } } struct tree_struct { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; tree_struct *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct &s1) const { return string_is_less(item, s1.item); } }; void VariablesDialog::updateVariables() { size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; tree_struct variable_cats; variable_cats.parent = NULL; bool has_inactive = false, has_uncat = false; std::list::iterator it; QStandardItem *item_sel = NULL; variablesView->selectionModel()->blockSignals(true); sourceModel->clear(); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Variable"))); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(!v->isActive()) { has_inactive = true; } else { tree_struct *item = &variable_cats; if(!v->category().empty()) { cat = v->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } else { has_uncat = true; } } QStandardItem *item = new QStandardItem(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) variablesView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) v), Qt::UserRole); sourceModel->appendRow(item); if(v == selected_item) item_sel = item; } variablesView->selectionModel()->blockSignals(false); sourceModel->sort(0); variable_cats.sort(); categoriesView->blockSignals(true); categoriesView->clear(); categoriesView->blockSignals(false); QTreeWidgetItem *iter, *iter2, *iter3; QStringList l; l.clear(); l << tr("Favorites"); l << "Favorites"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Favorites") { iter->setSelected(true); } l.clear(); l << tr("User variables"); l << "User items"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "User items") { iter->setSelected(true); } if(has_inactive) { //add "Inactive" category if there are inactive variables l.clear(); l << tr("Inactive"); l << "Inactive"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Inactive") { iter->setSelected(true); } } l.clear(); l << tr("All", "All variables"); l << "All"; iter3 = new QTreeWidgetItem(categoriesView, l); tree_struct *item, *item2; variable_cats.it = variable_cats.items.begin(); if(variable_cats.it != variable_cats.items.end()) { item = &*variable_cats.it; ++variable_cats.it; item->it = item->items.begin(); } else { item = NULL; } str = ""; iter2 = iter3; while(item) { str += "/"; str += item->item; l.clear(); l << QString::fromStdString(item->item); l << QString::fromStdString(str); iter = new QTreeWidgetItem(iter2, l); if(str == selected_category) { iter->setExpanded(true); iter->setSelected(true); } while(item && item->it == item->items.end()) { size_t str_i = str.rfind("/"); if(str_i == std::string::npos) { str = ""; } else { str = str.substr(0, str_i); } item = item->parent; iter2 = iter->parent(); iter = iter2; } if(item) { item2 = &*item->it; if(item->it == item->items.begin()) iter2 = iter; ++item->it; item = item2; item->it = item->items.begin(); } } if(has_uncat) { //add "Uncategorized" category if there are variables without category l.clear(); l << tr("Uncategorized"); l << "Uncategorized"; iter = new QTreeWidgetItem(iter3, l); if(selected_category == "Uncategorized") { iter->setSelected(true); } } iter3->setExpanded(true); if(categoriesView->selectedItems().isEmpty()) { //if no category has been selected (previously selected has been renamed/deleted), select "All" selected_category = "All"; iter3->setSelected(true); } searchEdit->blockSignals(true); searchEdit->clear(); searchEdit->blockSignals(false); variablesModel->setFilter(selected_category); QModelIndex index; if(item_sel) index = variablesModel->mapFromSource(item_sel->index()); if(!index.isValid()) index = variablesModel->index(0, 0); if(index.isValid()) { variablesView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); variablesView->scrollTo(index); } selectedVariableChanged(index, QModelIndex()); } void VariablesDialog::setSearch(const QString &str) { searchEdit->setText(str); } void VariablesDialog::selectCategory(std::string str) { QList list = categoriesView->findItems((str.empty() || str == "All") ? "All" : "/" + QString::fromStdString(str), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } qalculate-qt-5.5.1/src/variablesdialog.h000066400000000000000000000043321475705355700202330ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) 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 2 of the License, or (at your option) any later version. */ #ifndef VARIABLES_DIALOG_H #define VARIABLES_DIALOG_H #include #include class QTreeView; class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QStandardItemModel; class QPushButton; class QLineEdit; class QSplitter; class ItemProxyModel; class QAbstractButton; class VariablesDialog : public QDialog { Q_OBJECT protected: QTreeView *variablesView; QTreeWidget *categoriesView; QTextEdit *descriptionView; ItemProxyModel *variablesModel; QStandardItemModel *sourceModel; QPushButton *deactivateButton, *insertButton, *delButton, *exportButton, *editButton, *newButton; QAbstractButton *favouriteButton; QLineEdit *searchEdit; QSplitter *vsplitter, *hsplitter; std::string selected_category; ExpressionItem *selected_item; void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent*) override; void newVariable(int); protected slots: void selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedVariableChanged(const QModelIndex&, const QModelIndex&); void newVariable(); void newMatrix(); void newUnknown(); void editClicked(); void delClicked(); void insertClicked(); void exportClicked(); void deactivateClicked(); void favouriteClicked(); void searchChanged(const QString&); public: VariablesDialog(QWidget *parent = NULL); virtual ~VariablesDialog(); void updateVariables(); void setSearch(const QString&); void selectCategory(std::string); void variableRemoved(Variable*); void variableDeactivated(Variable*); bool eventFilter(QObject*, QEvent*) override; public slots: void reject() override; signals: void itemsChanged(); void favouritesChanged(); void unitRemoved(Unit*); void unitDeactivated(Unit*); void applyVariableRequest(Variable*); void insertVariableRequest(Variable*); }; #endif //VARIABLES_DIALOG_H qalculate-qt-5.5.1/translations.qrc000066400000000000000000000011471475705355700173740ustar00rootroot00000000000000 translations/qalculate-qt_ca.qm translations/qalculate-qt_de.qm translations/qalculate-qt_en.qm translations/qalculate-qt_es.qm translations/qalculate-qt_fr.qm translations/qalculate-qt_nl.qm translations/qalculate-qt_pt_BR.qm translations/qalculate-qt_pt_PT.qm translations/qalculate-qt_ru.qm translations/qalculate-qt_sl.qm translations/qalculate-qt_sv.qm translations/qalculate-qt_zh_CN.qm qalculate-qt-5.5.1/translations/000077500000000000000000000000001475705355700166625ustar00rootroot00000000000000qalculate-qt-5.5.1/translations/qalculate-qt_ca.ts000066400000000000000000016441621475705355700223100ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora poderosa i fàcil a usar calculation;arithmetic;scientific;financial; calculation;arithmetic;scientific;financial; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). El Qalculate! és una calculadora d'escriptori per a diverses plataformes i finalitats. És senzill a usar però proporciona poder i versatilitat que normalment es reserva als paquets de matemàtica complicats, així com eines útils per a necessitats diàries (com la conversió de monedes i calculació de percentatge). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Les característiques inclouen una biblioteca amplia de funcions personalitzables, calculació i conversió d'unitat, constants físics, càlculs simbòlics (incloent integrals i equacions), precisió arbitrària, propagació d'incertesa, aritmètica d'interval, dibuix i una interfície fàcil d'emprar. Argument Rules Regles d'argument _Cancel _Cancel·la Do not save modifications No desis modificacions _OK _D'acord Accept the modification of argument rules Accepta la modificació de regles d'argument Enable rules and type test Habilita regles i verificació de tipus Custom condition Condició personalitzada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Per exemple, si l'argument és una matriu que ha de tenir un nombre igual de files i columnes: rows(\x) = columns(\x) Allow matrix Permet matriu Forbid zero Prohibeix zero Handle vector Tractar amb vectors Calculate function for each separate element in vector. Calcula la funció per cada element distint en el vector. Min Mín Include equals Inclusiu Max Màx Keyboard Shortcuts Dreceres de teclat _Close _Tanca Label Etiqueta Left-click Clic esquerre Right-click Clic dret Middle-click Clic del mig Reset Restableix Button Action Acció del botó Value Valor Argument name Nom d'argument Calendar Conversion Conversió de calendari Export CSV File Exporta fitxer CSV Current result Resultat actual Matrix/vector variable Variable de matriu/vector File Fitxer Delimiter Delimitador Comma Coma Tabulator Tabulador Semicolon Punt i coma Space Espai Other Altre Import CSV File Importació de fitxer CSV Do not import the file No importis el fitxer Import the file Importa el fitxer Name of the data file to import Nom del fitxer de dades a importar Select a file Selecciona un fitxer Import as Importa com a Matrix Matriu If a matrix shall be generated from the contents of the file Si es generarà una matriu dels continguts del fitxer Vectors Vectors If vectors shall be generated from the contents of the file Si es generaran vectors dels continguts del fitxer Name Nom Name (or name prefix) used to reference generated variable(s) in expressions Nom (o prefix de nom) usat per a referir a les variables generades en expressions Descriptive name Nom descriptiu Title displayed in menus and in variable manager Títol mostrat en els menús i en el gestor de variables Category Categoria First row Primera fila The first row with data to import in the file La primera fila amb dades a importar en el fitxer Includes headings Inclou encapçalaments If the first row contains column headings Si la primera fila conté encapçalaments de columna Delimiter used to separate columns in the file Delimitador usat per a separar les columnes en el fitxer Custom delimiter Delimitador personalitzat Edit Data Property Edició de propietat de dades Do not create/modify this data set No creis o no modifiques aquest conjunt de dades Accept the creation/modification of this data set Accepta la creació o modificació d'aquest conjunt de dades Name used for reference Nom usat per a referència Properties Propietats Title displayed in menus and in data set manager Títol mostrat en els menús i en el gestor de conjunts de dades Description Descripció Description of this data property Descripció d'aquesta propietat de dades Value Type Tipus de valor Text Text Number Nombre Expression Expressió Hide Amaga Use as key Usa com a clau Approximate value Valor aproximat Case sensitive value Valor sensitiu a majúscules i minúscules Value uses brackets El valor usa claudàtors Unit expression Expressió d'unitat Edit Data Set Edició de conjunt de dades Title Títol Data file Fitxer de dades Description of this data set Descripció d'aquest conjunt de dades Copyright Dret d'autor General General Properties: Propietats: Definition of the properties of this data set Definició de les propietats d'aquest conjunt de dades _New _Nou _Edit _Edita _Delete _Suprimeix Name used to invoke the function in expressions Nom usat per a invocar la funció en les expressions Object argument name Nom d'argument d'objecte Property argument name Nom d'argument de propietat Default property Propietat predeterminat Function Funció Edit Data Object Edició d'objecte de dades Do not create/modify this data object No creis o no modifiques aquest objecte de dades Accept the creation/modification of this data object Accepta la creació o modificació d'aquest object de dades Data Sets new dataset Conjunts de dades Data Set Conjunt de dades Create a new data set Crea un conjunt de dades nou Edit the selected data set Edita el conjunt de dades seleccionat Delete the selected data set Suprimeix el conjunt de dades seleccionat Objects Objectes Create a new data object Crea un objecte de dades nou Edit the selected data object Edita l'objecte de dades seleccionat Remove the selected data object Elimina l'object de dades seleccionat Data Set Description Descripció de conjunt de dades Object Attributes Atributs d'objecte Decimals Decimals Close this window Tanca aquesta finestra Min decimals Mín de decimals Max decimals Màx de decimals Minimal number of displayed decimals Nombre mínim de decimals mostrats Maximal number of decimals to display (and round to) Nombre màxim de decimals a mostrar (i al qual arrodonir) Floating Point Conversion Conversió de punt flotant Decimal value Valor decimal Binary value Valor binari Octal value Valor octal Hexadecimal representation Representació hexadecimal Conversion error Error de conversió Binary representation Representació binària Floating point value Valor de punt flotant Format Format 16-bit (half precision) 16 bits (precisió mitja) 32-bit (single precision) 32 bits (precisió singular) 64-bit (double precision) 64 bits (precisió doble) 80-bit (x86 extended format) 80 bits (format x86 estès) 128-bit (quadruple precision) 128 bits (precisió quàdruple) Hexadecimal value Valor hexadecimal Edit Function Edició de funció _Help A_juda Do not create/modify this function No creis ni modifiques aquesta funció Accept the creation/modification of this function Accepta la creació o modificació d'aquesta funció Name used to invoke this function in expressions Nom usat per a invocar aquesta funció en les expressions Title displayed in menus and in function manager Títol que es mostra en els menús i en el gestor de funcions Hide function Amaga la funció If this function shall be hidden in menus Si aquesta funció es deu amagar en els menús Description of this function Descripció d'aquesta funció Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Useu \x pel primer, \y pel segon i \z pel tercer argument. Per més informació, feu clic en el botó d'ajuda. Condition Condició Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") La condició que ha de ser cert per a la funció (per exemple, si el segon argument ha de ser més gran que el primer: "\y > \x") Sub-Functions Subfuncions Arguments: Arguments: Definition of this function's arguments Definició dels arguments d'aquesta funció Free Libre Integer Enter Symbol Símbol Date Dada Vector Vector Positive number Nombre positiu Non-zero number Nombre no zero Non-negative number Nombre no negatiu Positive integer Enter positiu Non-zero integer Enter no zero Non-negative integer Enter no negatiu Boolean Booleà Object Objecte Unit Unitat Variable Variable Angle Angle Data object Objecte de dades Data property Propietat d'objecte _Add _Afegeix Add entered argument definition Afegeix la definició d'argument introduïda _Apply _Aplica Modify selected argument Modifica l'argument seleccionat Remove selected argument Elimina l'argument seleccionat Rules Regles Edit conditions for selected argument Edita les condicions per a l'argument seleccionat Close this dialog Tanca aquest diàleg Precalculate Precalcula Calculate the subfunction only once, before the parent function Calcula la subfunció només una vegada, abans de la funció mare Add entered subfunction Afegeix la subfunció introduïda Apply changes to the selected subfunction Aplica els canvis a la subfunció seleccionada Remove the selected subfunction Elimina la subfunció seleccionada Functions Funcions Create a new function Crea una funció nova Edit the selected function Edita la funció seleccionada _Insert _Insereix Insert (or execute) the selected function into the expression entry Insereix (o executa) la funció seleccionada en l'entrada d'expressió Delete the selected function Elimina la funció seleccionada (De)activate the selected function (Des)activa la funció seleccionada Deacti_vate Desacti_va Apply the selected function to the current expression Aplica la funció seleccionada a l'expressió actual Categor_y Categor_ia _Function _Funció Descri_ption Descri_pció Degrees Graus Radians Radians Gradians Gradians Default assumptions Suposicions predeterminades Unknown Desconeguda Not Matrix No matriu Complex Complex Real Real Rational Racional Non-Zero No zero Positive Positiu Non-Negative No negatiu Negative Negatiu Non-Positive No positiu _File _Fitxer Unknown Variable Variable desconeguda Function (simplified) Funció (simplificada) Import CSV File… Importa un fitxer CSV… Export CSV File… Exporta un fitxer CSV… _Store Result… _Desa el resultat… Save Result Image… Desa una imatge del resultat… Save local functions, variables and units Desa les funcions, variables i unitats locals Save Definitions Desa les definicions Import Definitions File… Importa un fitxer de definicions… Fetch current exchange rates from the Internet Obté taxes d'intercanvi actuals de l'Internet Update Exchange Rates Actualitza les taxes d'intercanvi Plot Functions/Data Dibuixa funcions/dades Convert Number Bases Converteix bases numèriques Floating Point Conversion (IEEE 754) Conversió de punt flotant (IEEE 754) Percentage Calculation Tool Eina de càlcul de percentatge Periodic Table Taula periòdica Minimal Window Finestra mìmima _Quit _Surt Manage Variables Gestiona les variables Manage Functions Gestiona les funcions Manage Units Gestiona les unitats Manage Data Sets Gestiona els conjunts de dades Factorize Factoritza Expand Expandeix Apply partial fraction decomposition to the current result. Aplica la descomposició en fraccions parcials al resultat actual. Expand Partial Fractions Expandeix fraccions parcials Set Unknowns… Estableix les desconegudes… Convert to Unit Converteix a unitat Set Prefix Estableix prefix Convert to Unit Expression… Converteix a una expressió d'unitat… Convert to Base Units Converteix a unitats bases Convert to Optimal Unit Converteix a la unitat òptima Insert Date… Insereix data… Insert Matrix… Insereix matriu… Insert Vector… Insereix vector… _Copy Result _Copia el resultat Customize Keypad Buttons Personalitza els botons de teclat numèric _Preferences _Preferències _Mode _Mode Number Base Base numèrica Select Result and Expression Base… Selecciona la base del resultat i de l'expressió… Binary Binària Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Altra… Sexagesimal Sexagesimal Time Format Format de temps Roman Numerals Nombres romans Numerical Display Presentació numèrica Normal Normal Engineering Enginyeria Scientific Científica Purely Scientific Científica pura Simple Senzill Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desactivat: 1/7 ≈ 0,14285714 Activat: 1/7 = 0,142857 142857... Indicate Repeating Decimals Indica els decimals periòdics Show Ending Zeroes Mostra els zeros finals Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desactivat: 2,5 ≈ 3, 1,5 ≈ 2 Activat: 2,5 ≈ 2, 1,5 ≈ 2 Round Halfway Numbers to Even Arrodoneix els nombres a mig camí al par Off: -x + y On: y - x Desactivat: -x + y Activat: y - x Sort Minus Last Ordena els negatius al final Complex Rectangular Form Forma rectangular complexa Complex Exponential Form Forma exponencial complexa Complex Polar Form Forma polar complexa Complex Angle/Phasor Notation Notació complexa d'angle o de fasor Rational Number Form Forma de nombres racionals 1/3 ≈ 0.33333 1/3 ≈ 0,33333 Decimal Fractions Fraccions decimals 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1,5 Exact Decimal Fractions Fraccions decimals exactes 6/4 = 3/2 6/4 = 3/2 Simple Fractions Fraccions senzilles 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Fraccions mixtes Interval Display Presentació d'intervals Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desactivat: 1/2*pi ≈ 1,5707963 Activat: 1/2*pi = 0.5 pi Adaptive Adaptativa Calculates an interval of possible values and keeps track of precision changes. Calcula un interval de valors possibles i rastreja els canvis de precisió. Significant Digits Xifres significants Interval Interval Plus/Minus Més/Menys Midpoint Punt mitjà Unit Display Presentació d'unitats Do not use any prefixes in result No usis cap prefix en el resultat Show prefixes for primarily SI and CGS units. Mostra els prefixes per a unitats principalment SI i CGS. Use prefixes for selected units Usa prefixes per a les unitats seleccionades Use prefixes also for currencies Usa prefixes també per a les monedes Use prefixs for all units Usa prefixes per a totes les unitats Enables automatic use of hekto, deka, deci and centi when prefixes are enabled Habilita l'ús automàtic de hecto, deka, deci i centi quan els prefixes estén habilitades Enable All SI Prefixes Habilita tots els prefixes SI Enables automatic setting of prefix for denominator in addition to the numerator Habilita l'establiment automàtic del prefix del denominador a més del numerador Enable Denominator Prefixes Habilita els prefixes de denominador Off: J / K On: J * K^-1 Desactivat: J / K Activat: J * K^-1 Negative Exponents Exponents negatius Off: (2 m)/s On: 2 (m/s) Desactivat: (2 m)/s Activat: 2 (m/s) Place Units Separately Separa les unitats No Additional Conversion Cap conversió addicional Convert to Optimal SI Unit Converteix a la unitat SI òptima If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Si està habilitat: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Convert to Mixed Units Converteix a unitats mixtes Abbreviate Names Abrevia els noms Enabled Objects Objectes habilitats Variables Variables Units Unitats Unknowns Desconegudes Units in Physical Constants Unitats en constants físics If not enabled, treats all variables as unknown Si no està habilitat, tracta totes les variables com a desconegudes Calculate Variables Calcula les variables Disables/enables complex numbers in result Deshabilita/habilita els nombres complexes en el resultat Allow Complex Result Permet un result complex Disables/enables infinite numbers in result Deshabilita/habilita nombres infinits en el resultat Allow Infinite Result Permet resultat d'infinit Approximation Aproximació Always Exact Sempre sigues exacte Try Exact Intenta ser exacte Approximate Aproxima Interval Arithmetic Aritmètica d'interval Interval Calculation Càlcul d'interval Variance Formula Fórmula de variància Change angle unit used in trigonometric functions Canvia la unitat d'angle que s'usa en les funcions trigonomètriques Angle Unit Unitat d'angle None Cap Assumptions Suposicions Algebraic Mode Mode algebraic Assume that unknown denominators are non-zero Presumeix que els denominadors desconeguts no siguin zero Non-Zero Denominators Denominadors no zero Warn when unknown denominators are assumed non-zero Adverteix quan es presumeix que els denominadors desconeguts no siguin zero Warn About Denominators Assumed Non-Zero Adverteix en quant als denominadors presumiblement no zeros Parsing Mode Mode d'anàlisi Adaptive Parsing Anàlisi adaptiva Parse Implicit Multiplication First Analitza primer la multiplicació implícita Conventional Parsing Anàlisi convencional Chain Syntax Sintaxi de cadena RPN Syntax Sintaxi NPI Off: xy = x*y On: xy != x*y Desactivat: xy = x*y Activat: xy != x*y Limit Implicit Multiplication Limita la multiplicació implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analitza els nombres decimals com a aproximats amb precisió igual al nombre de xifres. Desactivat: 1.1 * 1.1 = 1.21 Activat: 1.1 * 1.1 ≈ 1.2 Read Precision Llegeix la precisió _Precision _Precisió _Decimals _Decimals Calculate As You Type Calcula mentre teclegeu Chain Mode Mode de cadena Activate the RPN stack. Activa la pila NPI. RPN Mode Mode NPI Meta Modes Metamodes Save Mode… Desa el mode… Delete Mode… Suprimeix el mode… Save Default _Mode Desa com al _mode predeterminat Fu_nctions Fu_ncions _Variables _Variables _Units _Unitats _Contents _Continguts Report a Bug Informa d'un error Check for Updates Cercar actualitzacions _About _Quant al Toggle minimal window Commuta la finestra mínima Calculation result Resultat del càlcul _Keypad _Teclat numèric Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Commuta el teclat numèric persistent (fa possible mostrar el teclat numèric i l'historial simultàniament) _History _Historial C_onversion C_onversió RPN Stack Pila NPI Insert the selected value Insereix el valor seleccionat Insert the selected text Insereix el text seleccionat Copy the selected text Copia el text seleccionat Add the selected value(s) Addiciona el(s) valor(s) seleccionat(s) Subtract the selected value(s) Sostreu el(s) valor(s) seleccionat(s) Multiply the selected value(s) Multiplica el(s) valor(s) seleccionat(s) Divide the the selected value(s) Divideix el(s) valor(s) seleccionat(s) Raise to the power of the selected value Exponencia al valor seleccionat Calculate the square root of the selected value Calcula l'arrel quadrada del valor seleccionat History Historial Subtract the top value from the second value Sostreu el últim valor del penúltim Multiply the top two values Multiplica el dos últims valors Divide the second value by the top value Divideix el penúltim valor pel últim Raise the second value to the power of the top value Exponencia el penúltim valor al últim Negate the top value (Ctrl+-) Negar el últim valor (Ctrl+-) Invert the top value Inverteix el últim valor Calculate the square root of the top value Calcula l'arrel quadrada del últim valor Calculate the sum of all values Calcula la suma de tots els valors Rotate the stack or move selected register up Roda la pila o mou el registre seleccionat amunt Rotate the stack or move selected register down Roda la pila o mou el registre seleccionat avall Swap the two top values or move the selected value to the top of the stack Intercanvia els últims dos valors o mou el valor seleccionat al cim de la pila Copy the selected or top value to the top of the stack Copia el valor seleccionat o el últim al cim de la pila Enter the top value from before the last numeric operation Introdueix el úlim valor d'abans de la darrera operació numèrica Delete the top or selected value Suprimeix el últim valor o el seleccionat Edit the selected value Edita el valor seleccionat Clear the RPN stack Neteja la pila NPI Unit(s) and prefix to convert result to Unitat(s) i prefix als quals convertir el resultat Convert Converteix Continuous conversion Conversió contínua Automatically convert result to the current unit expression as long as the conversion box is visible. Automàticament converteix el resultat a l'expressió d'unitat actual sempre que la caixa de conversió sigui visible. Add prefix Afegeix un prefix If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Si l'expressió d'unitat no conté cap prefix, usa el prefix òptim. Això es pot anular preposant l'expressió d'unitat amb "?" o "0". Conversion Conversió Show/hide programming keypad Mostra/amaga el teclat programari Exact Exacte Fraction Fracció Numerical display Presentació numèrica Pure Pura Number base Base numèrica Time format Format de temps Roman Romana sin sin cos cos tan tan ln ln Equals És sqrt arrelq sum suma Unknown variable Variable desconeguda mod mod mean mitjana Store result as a variable Desa el resultat com a variable STO Standard calculator button. Do not use more than three characters. STO Convert number bases Converteix entre bases numèriques Imaginary unit i (√-1) Unitat imaginària i (√-1) Manage units Gestiona les unitats Conversion operator Operador de conversió Kilogram Quilograma Two's complement input Entrada de complement a dos Two's complement output Sortida de complement a dos Bitwise Exclusive OR OR exclusiu bit a bit Bitwise Left Shift Desplaçament a l'esquerra bit a bit Bitwise Right Shift Desplaçament a la dreta bit a bit Floating point conversion Conversió de punt flotant Show/hide left keypad Mostra/amaga el teclat numèric esquerre Show/hide right keypad Mostra/amaga el teclat numèric dret DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultat prèvi ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Afegeix a l'expressió Persistent Keypad Teclat numèric persistent Edit Edita Delete Suprimeix Update Actualitza Insert Value Insereix el valor Insert Text Insereix el text Insert Parsed Text Insereix el text analitzat Copy Copia Copy Full Text Copia el text complet Search… Cerca… Add Bookmark… Afegeix un marcador… Bookmarks Marcadors Protect Protegeix Move To Top Mou al cim Remove Elimina Clear All Neteja tot _Copy _Copia _Store… _Desa… Save Image… Desa una imatge… _Factorize _Factoritza _Expand _Expandeix _Normal _Normal Sc_ientific C_ientífica Purel_y Scientific Cientifica P_ura Simp_le Senzi_lla _Binary _Binaria _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fracció decimal Exact Decimal Fraction Fracció decimal exacta Simple Fraction Fracció senzilla Mixed Fraction Fracció mixta _Abbreviate Names _Abrevia els noms C_onvert… C_onverteix… Convert to Base _Units Converteix a _unitats bases Convert _to Optimal Unit Converteix a la unitat òp_tima Use Optimal Prefix Usa el prefix òptim Convert to Converteix a Convert to UTC Converteix a UTC Convert to Calendars Converteix entre calendaris Use prefixes for all units Usa prefixes per a totes les unitats Enable All SI Prefi_xes Habilita tots els prefi_xes SI View/Edit Matrix Visualitza/edita la matriu View/Edit Vector Visualitza/edita el vector Copy Text Copia el text To Top Al cim Swap Intercanvia Up Amunt Down Avall Negate Nega Invert Inverteix Square Quadra Square Root Arrel quadrada Clear Stack Neteja la pila Select Number Base… Selecciona la base numèrica… Store result Desa el resultat Add result Add current result to variable value Addiciona el resultat Subtract result Subtruct current result from variable value Sostreu el resultat Insert the matrix/vector into the expression Insereix la matriu o el vector en l'expressió Rows Files Number of rows in this matrix (rows displayed for vectors) Nombre de files en aquesta matriu (files mostrades per als vectors) Columns Columnes Number of columns in this matrix (columns displayed for vectors) Nombre de columnes en aquesta matriu (columnes mostrades per als vectors) If this is a matrix or vector Si això és una matriu o un vector Elements Elements Current element: Element actual: Edit Matrix Edició de matriu Do not create/modify this matrix/vector No creis/modifiques aquesta matriu o aquest vector Create/modify the matrix/vector Crea/modifica la matriu o el vector Accept the creation/modification of this matrix/vector Accepta la creació/modificació d'aquesta matriu o d'aquest vector Name used to reference this variable in expressions Nom usat per a referir a aquesta variable en les expressions Names Noms Add new name Afegeix un nom nou Apply changes to the selected name Aplica els canvis al nom seleccionat Remove the selected name Elimina el nom seleccionat Abbreviation Abreviatura Unicode Unicode Plural Plural Suffix Sufix Reference Referència Avoid input Evita l'entrada Case sensitive Distingeix entre majúscules i minúscules Completion only Només compleció Number Bases Bases numèriques Roman numerals Numerals romans BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Sostreu Multiply Multiplica Divide Divideix Bitwise AND AND bit a bit Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear Neteja Enter two values, of which at most one is a percentage, and the others will be calculated for you. Introduïu dos valors, dels quals al màxim un és percentatge, i es calcularan els altres per a vostè. Percentage Porcentatge Calculate Calcula Value 1 Valor 1 2 compared to 1 2 comparat amb 1 Change from 1 to 2 Canvi de 1 a 2 Value 2 Valor 2 1 compared to 2 1 comparat amb 2 Change from 2 to 1 Canvi de 2 a 1 Plot Dibuix _Save _Desa Save as png, svg, postscript, eps, latex or fig Desa com a png, svg, postscript, eps, latex o fig Vector/matrix Vector/matriu Paired matrix Matriu emparellada if you want to split matrix in rows instead of columns si voleu dividir la matriu en files en lloc de columnes X variable Variable X The variable name used in expression El nom de variable usat en l'expressió Style Estil Line Línia Points Punts Line with points Línia amb punts Boxes/bars Caixes/barres Histogram Histograma Steps Pasos Candlesticks Candelers Dots Cercles Smoothing Suavitzat Monotonic Monotònic Natural cubic splines Spline cúbic natural Bezier Bézier Bezier (monotonic) Bézier (monotònic) Y-axis Eix Y Primary Principal Secondary Secondari _Remove _Elimina Data Dades Minimum x value Valor x mìnim Maximum x value Valor x màxim Sampling rate Taxa de mostreig Step size Mida de passos Function Range Rang de funció Display grid Mostra una graella Display full border Mostra la vora completa Minimum y value Valor y mínim Maximum y value Valor y màxim Logarithmic x scale Escala x logarítmica Logarithmic y scale Escala y logarítmica X-axis label Etiqueta de l'eix X Y-axis label Etiqueta de l'eix Y Line width Amplada de línia Color display Presentació acolorida Color Color Monochrome Monocrom Legend placement Posició de la llegenda Top-left Superior-esquerra Top-right Superior-dreta Bottom-left Inferior-esquerra Bottom-right Inferior-dreta Below A baix Outside A fora Appearance Aparència Precision Precisió _Recalculate _Recalcula Recalculate expression Recalcula l'expressió The number of significant digits to display/calculate (simple arithmetics are always calculated exact) El nombre de xifres significats a mostrar/calcular (l'aritmètica senzilla sempre es calcula amb exactitud) Preferences Preferències Save mode on exit Desa el mode en surtir If the mode of the calculator shall be restored Si el mode del calculador es restaurarà Save definitions on exit Desa les definicions en surtir If changes to functions, units and variables shall be saved automatically Si els canvis a les funcions, unitats i variables es desaran automàticament Clear history on exit Neteja l'historial en surtir Allow multiple instances Permet múltiples instàncies Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permet que s'obrin múltiples instàncies de la finestra principal a la vegada. Tingueu en compte que només es desaran el mode, l'historial i les definicions de la última instància tancada. Notify when a new version is available Notifica quan una versió nova estigui disponible Use keyboard keys for RPN Usa les tecles del teclat per a la NPI Use keyboard operator keys for RPN operations (+-*/^). Usa les tecles d'operador del teclat per a les operacions NPI (+-*/^). Use caret for bitwise XOR Usa el caret per XOR bit a bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Introdueix el XOR (⊻) mitjançant el caret (^) en el teclat (d'altra manera, usa Ctrl+^). Sempre es pot introduir l'operador d'exponenciació (^) mitjançant Ctrl+*. Add calculate-as-you-type result to history Afegeix, mentre teclegeu, el resultat del càlcul a l'historial Delay: Retard: Time limit for plot: Limit de temps del dibuix: Behavior Comportament Enable Unicode symbols Habilita els símbols d'Unicode Disable this if you have problems with some fancy characters Deshabilita això si teniu problemes amb alguns caràcters sofisticats Ignore system language (requires restart) Ignora la llengua del sistema (requereix reinici) Use system tray icon Usa una icona en la safata del sistema Hides the application in the system tray when the main window is closed Amaga l'aplicació en la safata del sistema quan es tanca la finestra principal Hide on startup Amaga en iniciar Remember window position Recorda la posició de la finestra Keep above other windows Manté superior a les altres finestres Keep the main window above other windows (depending on platform and settings this might not work) Manté la finestra principal superior a les altres finestres (depenent del plataforma i de la configuració del sistema, potser no funciona) Application name Nom d'aplicació Result Resultat Application name + result Nom d'aplicació + resultat Mode Mode Application name + mode Nom d'aplicació + mode Window title Títol de finestra Default Predeterminat Light Clar Dark Fosc High contrast Contrast alt Dark high contrast Contrast alt fosc Theme Tema Button padding Espaiat de botó / / Number of expression lines Nombre de línies d'expressió 3 3 Display expression status Mostra l'estat de l'expressió If as-you-type expression status shall be displayed below the expression entry Si, mentre teclegeu, l'estat d'expressió es mostrarà abaix de l'entrada d'expressió Persistent keypad Teclat numèric persistent Look & Feel Aparença Binary two's complement representation Representació binaria de complement a dos If two's complement representation shall be used for negative binary numbers. Si la representació de complement a dos s'usarà pels nombres binaris negatius. Hexadecimal two's complement representation Representació hexadecimal de complement a dos If two's complement representation shall be used for negative hexadecimal numbers. Si la representació de complement a dos s'usarà pels nombres hexadecimals negatius. Use lower case letters in non-decimal numbers Usa lletres minúscules en nombres no decimals If lower case letters should be used in numbers with non-decimal base Si es deuen usar lletres minúscules en els nombres amb base no decimal Alternative base prefixes Prefixes de base alternatius If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Si es mostraran els nombres hexadecimals amb "0x0" i els nombres binaris amb "0b00" com a prefixes Spell out logical operators Enuncia els operadors lògics If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Si i/o lògics es mostraran com a "&&"/"||" o "and"/"or" If "e" shall be used instead of "E" in numbers Si s'usarà "e" en lloc de "E" en nombres Use E-notation instead of 10<sup><i>n</i></sup> Usa la notació E en lloc de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usa "e" minúscula (tal com 1e10) Use 'j' as imaginary unit Usa 'j' com a unitat imaginària Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front of the imaginary part. Usa 'j' (en lloc de 'i') com al símbol predeterminat pela unitat imaginària, i col·loca'l davant la part imaginària. Use comma as decimal separator Usa la coma com a separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permet que els punts, '.', s'usin com a separador de millars en lloc d'un signe decimal alternatiu Ignore comma in numbers Ignora comas en els nombres Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permet que les comes, ',', s'usin com a separador de millars en lloc de ser un separador dels arguments d'una funció Ignore dots in numbers Ignora els punts en els nombres Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permet que els punts, '.', s'usin com a separador de millars en lloc d'un signe decimal alternatiu Digit grouping Agrupament de xifres off desactivat standard estàndar local local Multiplication sign Signe de multiplicació Division sign Signe de divisó Copy digit separator Copia els separadors de xifres Deactivate to remove digit separator when copying result Desactiva per a eliminar els separadors de xifres quan es copia el resultat Numbers & Operators Nombres i operadors Use binary prefixes for information units Una els prefixes binaris per a les unitats d'informació Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usa els prefixes binaris, en lloc dels decimals, per defecte per a les unitats d'informació (e.g. bytes). Conversion to local currency Conversió a la moneda local Automatically convert to the local currency when optimal unit conversion is activated. Converteix a la moneda local automàticament quan la conversió d'unitat òptima està activada. Update exchange rates on start Actualitza les taxes d'intercanvi en iniciar If current exchange rates shall be downloaded from the internet at program start Si les taxes d'intercanvi actuals es descarregaran de l'Internet a l'inici del programa Exchange rates updates Actualitzacions de taxes d'intercanvi Temperature calculation mode: Mode de càlcul de temperatura: Absolute Absolut Relative Relatiu Hybrid Híbrid Units & Currencies Unitats i monedes Show expression completion suggestions Mostra els suggeriments de compleció d'expressió Search titles and countries Cerca en els títols i països Minimum characters Caràcters mínims Popup delay (ms) Retard de caixa emergent (ms) Completion Compleció Status warning color Color d'estat d'advertència Status error color Color d'estat d'error Custom status font Tipus de lletra personalitzat per a l'estat If you want to use a font other than the default in the status display below the expression entry Si voleu usar altre tipus de lletra que el predeterminat en la presentació de l'estat abaix de l'entrada d'expressió Custom expression font Tipus de lletra personalitzat per a l'expressió If you want to use a font other than the default in the expression entry Si voleu usar altre tipus de lletra que el predeterminat en l'entrada d'expressió Custom result font Tipus de lletra personalitzat per al resultat If you want to use a font other than the default in the result display Si voleu usar altre tipus de lletra que el predeterminat en la presentació del resultat Custom keypad font Tipus de lletra personalitzat per al teclat numèric If you want to use a font other than the default in the keypad Si voleu usar altre tipus de lletra que el predeterminat en el teclat numèric Custom application font Tipus de lletra personalitzat per a l'aplicació If you want to use a font other than the default for the whole application Si voleu usar altre tipus de lletra que el predeterminat per a l'aplicació sencera Text color Color de text Fonts & Colors Tipus de lletra i colors Other: Altra: Bijective base-26 Base 26 bijectiva <b>Result Base</b> <b>Base del resultat</b> <b>Expression Base</b> <b>Base de l'expressió</b> New Keyboard Shortcut Drecera de teclat nova Edit Variable Edita la variable Advanced Avançat Accept the creation/modification of this variable Accepta la creació/modificació d'aquesta variable x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Usa x, y i z pel primer, segon i tercer argument de funció, respectivament. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Usa \x, \y i \z pel primer, segon i tercer argument de funció, respectivament. Això evita conflictes potencials amb variables, funcions i unitats. Edit Unit Edita la unitat Do not create/modify this unit No creis/modifiquis aquesta unitat Accept the creation/modification of this unit Accepta la creació/modificació d'aquesta unitat Singular form of this unit's name Forma singular del nom d'aquesta unitat Title displayed in menus and in unit manager Títol mostrat en els menús i en el gestor d'unitats System Sistema Imperial Imperial US Survey Agrimensura estatunidenca Hide unit Amaga la unitat If this unit shall be hidden in menus Si s'amagarà aquesta unitat en els menús Class Classe The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe a la qual pertany aquesta unitat. Es defineixen les unitats derivades anomenades en relació a una sola altra unitat, amb un exponent opcional, mentre es defineixen les unitats derivades (sense nom) per una expressió d'unitat amb una unitat o múltiples unitats. Base unit Unitat base Named derived unit Unitat derivada anomenada Derived unit Unitat derivada Base unit(s) Unitat(s) base(s) Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unitat (per a una unitat derivada amb nom) o expressió d'unitat (per a una unitat derivada sense nom) a la qual aquesta unitat està definida Exponent Exponent Exponent of the base unit Exponent de la unitat base Relation Relació Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relació a la unitat base. Per als relacions linears això només deu ser un nombre. Per a les relacions no linears useu \x pel factor i \y pel exponent (per exemple "\x + 273.15" pela relació entre graus Celsius i Kelvin). Relation is exact La relació és exacta If the relation is precise Si la relació és precisa Inverse relation Relació inversa Specify for non-linear relation, for conversion back to the base unit. Especifiqueu per a relació no linear, per a conversió de retorn a la unitat base. Mix with base unit Mescla amb la unitat base - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decideix amb quines unitats es mescla la unitat base si existeixen múltiples opcions. - No es mesclarà la unitat original amb unitats de prioritat més baixa. - Un valor inferior vol dir prioritat superior. Priority Prioritat Minimum base unit number Nombre d'unitat base mínim Use with prefixes by default Usa amb prefixes per defecte Create a new unit Crea una unitat nova Edit the selected unit Edita la unitat seleccionada Insert the selected unit into the expression entry Insereix la unitat seleccionada en l'entrada d'expressió C_onvert C_onverteix Convert the result to the selected unit Converteix el resultat a la unitat seleccionada Delete the selected unit Suprimeix la unitat seleccionada (De)activate the selected unit (Des)activa la unitat seleccionada _Unit _Unitat Convert between units Converteix entre unitats = = Conver_sion Conver_sió Converted value Valor convertit Value to convert from Valor del qual convertir Type anywhere Teclegeu en qualsevol lloc Edit Unknown Variable Edició de variable desconeguda Do not create/modify this unknown variable No creis/modifiques aquesta variable desconeguda Accept the creation/modification of this unknown variable Accepta la creació/modificació d'aquesta variable desconeguda Name used to reference this unknown variable in expressions El nom usat per a referir a aquesta variable desconeguda en les expressions Use custom assumptions Usa suposicions personalitzades Type Tipus Real Number Nombre real Rational Number Nombre racional Sign Signe The category this unknown variable belongs to La categoria a la qual pertany aquesta variable desconeguda Value of this variable (expression) Valor d'aquesta variable (expressió) value is exact el valor és exacte If the value is precise Si el valor es precise The category this variable belongs to La categoria a la qual pertany aquesta variable Create a new variable Crea una variable nova Edit the selected variable Edita la variable seleccionada Insert the selected variable into the expression entry Insereix la variable seleccionada a l'entrada d'expressió Delete the selected variable Elimina la variable seleccionada (De)activate the selected variable (Des)activa la variable seleccionada E_xport E_xporta _Variable _Variable Execute expressions and commands from a file Executa expressions i ordres d'un fitxer Start a new instance of the application Inicia una instància nova de l'aplicació Display the application version Mostra la versió de l'aplicació Specify the window title Especifica el títol de finestra TITLE TÍTOL Expression to calculate Expressió a calcular [EXPRESSION] [EXPRESSIÓ] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Teclegeu una expressió matemàtica a dalt, per exemple "5 + 2 / 3", i premeu el teclat Retorn. ans res Last Answer Última resposta answer resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Memòria Failed to load global definitions! S'ha fallat en carregar les definicions globals! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Tot By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Per defecte, es permet només una instància (una finestra principal) de %s. Si s'obren múltiples instàncies simultàniament, només es desaran les definicions (variables, funcions etc.), el mode, les preferències i l'historial de la última finestra tancada Voleu, malgrat això, canviar el comportament predeterminat i permetre múltiples instàncies simultànies? c-format Right-click/long press: %s Clic dret o premuda llarga: %s c-format Right-click: %s Clic dret: %s c-format Middle-click: %s Clic del mig: %s c-format Cycle through previous expression Mou per les expressions prèvies Move cursor left or right Mou el cursor a l'esquerra o a la dreta Move cursor to beginning or end Mou el cursor al principi o al fin Uncertainty/interval Incertesa/interval Relative error Error relatiu Argument separator Separador d'arguments Blank space Espai en blanc New line Línia nova Smart parentheses Parèntesis intel·ligents Vector brackets Claudàtors de vector Left parenthesis Parèntesi esquerre Left vector bracket Claudàtor esquerre de vector Right parenthesis Parèntesi dret Right vector bracket Claudàtor dret de vector Decimal point Punt decimal Raise (Ctrl+*) Exponencia (Ctrl+*) Add Addiciona M+ (memory plus) M+ (afegeix a la memòria) MC (memory clear) MC (neteja la memòria) Backspace Retrocés M− (memory minus) M− (elimina de la memòria) Previous result (static) Resultat previ (estàtic) Calculate expression Calcula l'expressió MR (memory recall) MR (retira de la memòria) MS (memory store) MS (desa a la memòria) Set unknowns Estableix les desconegudes more Show further items in a submenu més Logical AND AND lógic Logical OR OR lógic Logical NOT NOT lógic Toggle Result Base Commuta la base del resultat Open menu with stored variables Obre un menú amb les variables emmagatzemades Index Índex ENTER RPN Enter (calculate and add to stack) RETORN Calculate expression and add to stack Calcula l'expressió i afegeix-la a la pila Flag Bandera Matrices Matrius Gregorian Gregorià Revised Julian (Milanković) Julià revisat (Milanković) Julian Julià Islamic (Hijri) Islàmic (Hijri) Hebrew Hebreu Chinese Xinés Persian (Solar Hijri) Persià (Hijri solar) Coptic Copt Ethiopian Etíop Indian (National) Indi (nacional) Action Acció Key combination Combinació de teclats Raise Exponencia History Answer Value Valor de resposta de l'historial History Index(es) Índex(es) de l'historial History index %s does not exist. L'índex d'historial %s no existeix. c-format expression expressió History Parsed Expression Expressió analitzada de l'historial Set Window Title Estableix el títol de la finestra Failed to open %s. %s S'ha fallat en obrir %s. %s c-format Could not display help for Qalculate!. No s'ha pogut mostrar l'ajuda del Qalculate!. Could not display help for Qalculate!. %s No s'ha pogut mostrar l'ajuda del Qalculate!. %s c-format approx. aprox. Stop process Atura el procés Clear expression Neteja l'expressió EXACT EXACTE APPROX APROX RPN NPI CHN Chain mode CDN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Voleu actualitzar les taxes d'intercanvi ara? It has been %s day since the exchange rates last were updated. Fa %s dia que es van actualitzar les taxes d'intercanvi. Fa %s dies que es van actualitzar les taxes d'intercanvi. c-format It has been %s days since the exchange rates last were updated. Do not ask again No tornis a preguntar It took too long to generate the plot data. Ha trigat massa temps generar les dades a dibuixar. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Ha trigat massa temps generar les dades a dibuixar. Si us plau, disminuïu la taxa de mostreig o augmenta el límit de temps en les preferències. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Quan es generen errors, advertències i altra informació durant el càlcul, la icona en la cantonada dreta superior de l'entrada d'expressió canvia per a reflectir això. Si mantingueu el punter sobre la icona o feu clic en ella, el missatge es mostrarà. Path of executable not found. No s'ha trobat el camí de l'executable. curl not found. No s'ha trobat curl. Failed to run update script. %s S'ha fallat en executar l'script d'actualització. %s c-format Failed to check for updates. S'ha fallat en cercar actualitzacions. No updates found. No s'ha trobat cap actualització. A new version of %s is available at %s. Do you wish to update to version %s? Una versió nova de %s està disponible a %s. Voleu actualitzar a la versió %s? c-format A new version of %s is available. You can get version %s at %s. Una versió nova de %s està disponible. Podeu aconseguir la versió %s a %s. c-format Too many arguments for %s(). Hi ha massa arguments per a %s(). c-format argument argument Temperature Calculation Mode Mode de càlcul de temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expressió és ambigua. Si us plau, seleccioneu el mode de càlcul de temperatura (es pot canviar el mode després en les preferències). Interpretation of dots Interpretació de punts Please select interpretation of dots (".") (this can later be changed in preferences). Si us plau, seleccioneu la interpretació de punts (".") (es pot canviar això després en les preferències). Both dot and comma as decimal separators Ambdós punt i coma com a separadors decimals Dot as thousands separator Punt com a separador de millars Only dot as decimal separator Només punt com a separador decimal Uncategorized Sense categoria hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binària roman romana bijective bijectiva sexagesimal sexagesimal latitude latitud longitude longitud time temps bases bases calendars calendaris rectangular rectangular cartesian cartesià exponential exponencial polar polar angle angle phasor fasor optimal òptima base base mixed mixta fraction fracció factors factors partial fraction fracció parcial factorize factoritza expand expandeix hexadecimal number nombre hexadecimal octal number nombre octal decimal number nombre decimal duodecimal number nombre duodecimal binary number nombre binari roman numerals numerals romans bijective base-26 base 26 bijectiva sexagesimal number nombre sexagesimal 32-bit floating point punt flotant de 32 bits 64-bit floating point punt flotant de 64 bits 16-bit floating point punt flotant de 16 bis 80-bit (x86) floating point punt flotant de 80 bits (x86) 128-bit floating point punt flotant de 128 bits time format format de temps number bases bases numèriques optimal unit unitat òptima base units unitats bases mixed units unitats mixtes expanded partial fractions fraccions parcials expandides complex rectangular form forma rectangular complexa complex exponential form forma exponencial complexa complex polar form forma polar complexa complex cis form forma cis complexa complex angle notation notació complexa d'angle complex phasor notation notació complexa de fasor UTC time zone Zona horària UTC number base %s base numèrica %s c-format Inactive Desactivat Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Obté dades del conjunt de dades %s per a un objecte i una propietat donats. Si "info" és de tipus propietat, una finestra de diàleg emergirà amb totes les propietats de l'objecte. c-format Example: Exemple: Arguments Arguments optional optional argument opcional default: argument default, in description default: Requirement Requisit key indicating that the property is a data set key clau Acti_vate Acti_va a previous result un resultat prèvi matrix matriu vector vector positive positiu non-positive no positiu negative negatiu non-negative no negatiu non-zero no zero boolean booleà integer enter rational racional real real complex complex number nombre (not matrix) (no matriu) unknown desconegut default assumptions suposicions predeterminades Variable does not exist anymore. La variable ja no existeix. Data Retrieval Function Funció d'obteniment de dades Insert function Insereix una funció Insert function (dialog) Insereix una funció (diàleg) Insert variable Insereix una variable Insert unit Insereix una unitat Insert text Insereix text Insert date Insereix una data Insert vector Insereix un vector Insert matrix Insereix una matriu Insert smart parentheses Insereix parèntesis intel·ligents Convert to unit Converteix a altra unitat Convert to unit (entry) Converteix a altra unitat (entrada) Convert to optimal unit Converteix a la unitat òptima Convert to base units Converteix a les unitats bases Convert to optimal prefix Converteix al prefix òptim Convert to number base Converteix a la base numèrica Factorize result Factoritza el resultat Expand result Expandeix el resultat Expand partial fractions Expandeix les fraccions parcials RPN: down NPI: avall RPN: up NPI: amunt RPN: swap NPI: intercanvia RPN: copy NPI: copia RPN: lastx RPN: última x RPN: delete register NPI: suprimeix el registre RPN: clear stack NPI: neteja la pila Load meta mode Carrega el mode meta Set expression base Estableix la base d'expressió Set result base Estableix la base del resultat Toggle exact mode Commuta el mode exacte Set angle unit to degrees Estableix la unitat d'angle com a graus Set angle unit to radians Estableix la unitat d'angle com a radians Set angle unit to gradians Estableix la unitat d'angle com a gradians Toggle simple fractions Commuta les fraccions senzilles Toggle mixed fractions Commuta les fraccions mixtes Toggle scientific notation Commuta la notació científica Toggle simple notation Commuta la notació senzilla Toggle RPN mode Commuta el mode NPI Toggle calculate as you type Commuta el càlcul mentre teclegeu Toggle programming keypad Commuta el teclat programari Show keypad Mostra el teclat numèric Show history Mostra l'historial Search history Cerca en l'historial Show conversion Mostra la conversió Show RPN stack Mostra la pila NPI Manage variables Gestiona les variables Manage functions Gestiona les funcions Manage data sets Gestiona els conjunts de dades New variable Variable nova New function Funció nova Open plot functions/data Obre el dibuix de funcions/dades Open convert number bases Obre la conversió de bases numèriques Open floating point conversion Obre la conversió de punt flotant Open calender conversion Obre la conversió de calendari Open percentage calculation tool Obre l'eina de càlcul de percentatge Open periodic table Obre la taula periòdica Update exchange rates Actualitza les taxes d'intercanvi Copy result Copia el resultat Insert result Insereix el resultat Save result image Desa una imatge del resultat Help Ajuda Quit Surt Toggle chain mode Commuta el mode de cadena Toggle keep above Commuta el manteniment amunt Show/hide completion Mostra/amaga la compleció Perform completion (activate first item) Realitza la compleció (activa el primer element) Prefixes Prefixes No Prefix Cap prefix Optimal Prefix Prefix òptim Prefix Prefix Complex angle/phasor notation Notació complexa d'angle o de fasor Number bases Bases numèriques Base units Unitats bases Binary number Nombre binari Calendars Calendaris Complex cis form Forma cis complexa Decimal number Nombre decimal Duodecimal number Nombre duodecimal Complex exponential form Forma exponencial complexa Factors Factors 16-bit floating point binary format Format binari de punt flotant de 16 bits 32-bit floating point binary format Format binari de punt flotant de 32 bits 64-bit floating point binary format Format binari de punt flotant de 64 bits 80-bit (x86) floating point binary format Format binari de punt flotant de 80 bits (x86) 128-bit floating point binary format Format binari de punt flotant de 128 bits Hexadecimal number Nombre hexadecimal Latitude Latitud Longitude Longitud Mixed units Unitats mixtes Octal number Nombre octal Optimal units Unitats òptimes Expanded partial fractions Fraccions parcials expandides Complex polar form Forma polar complex Complex rectangular form Forma rectangular complex Sexagesimal number Nombre sexagesimal and and or or undefined sense definir result is too long see history el resultat és massa llarg vegeu l'historial calculation was aborted s'ha avortat el càlcul RPN Register Moved S'ha mogut el registre NPI RPN Operation Operació NPI Processing… S'està processant… result processing was aborted s'ha avortat el processament del resultat Factorizing… S'està factoritzant… Expanding partial fractions… S'estan expandint les fraccions parcials… Expanding… S'està expandint… Calculating… S'està calculant… Converting… S'està convertint… Fetching exchange rates. S'estan obtenint les taxes d'intercanvi. Time zone parsing failed. L'anàlisi de la zona horària ha fallat. Keep open Manté obert Enter RPN Enter (calculate and add to stack) Introdueix C_alculate C_alcula Apply to Stack Aplica a la pila Argument Argment True Cert False Fals Info Info Edit Unit (global) Edita la unitat (global) New Unit Unitat nova Empty name field. El camp de nom està buit. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Una variable o unitat amb el mateix nom ja existeix. Voleu sobreescriure-la? Base unit does not exist. La unitat base no existeix. Edit Function (global) Edita la funció (global) New Function Funció nova Yes No No Empty expression field. El camp d'expressió està buit. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Una funció amb el mateix nom ja existeix. Voleu sobreescriure la funció? Unit does not exist La unitat no existeix Edit Unknown Variable (global) Edita la variable desconeguda (global) New Unknown Variable Variable desconeguda nova An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Variable (global) Edita la variable (global) New Variable Variable nova Empty value field. El camp de valor està buit. Edit Vector Edita el vector Edit Vector (global) Edita el vector (global) New Vector Vector nou Edit Matrix (global) Edita la matriu (global) New Matrix Matriu nova Vector Result Resultat vector Matrix Result Resultat de matriu New Data Object Objecte de dades nou text text approximate aproximat Edit Data Set (global) Edita el conjunt de dades (global) New Data Set Conjunt de dades nou info info Property Propietat No file name entered. No s'ha introduït cap nom de fitxer. No delimiter selected. No s'ha seleccionat cap delimitador. Could not import from file %s No s'ha pogut importar del fitxer %s c-format No variable name entered. No s'ha introduït cap nom de variable. No known variable with entered name found. No s'ha trobat cap variable coneguda amb el nom introduït. Could not export to file %s No s'ha pogut exportar al fitxer %s c-format My Variables Les meves variables Couldn't write definitions No s'ha pogut escriure les definicions Preset Preestablert Abort Avorta Undo Desfés Redo Refés Completion Mode Mode de compleció Limited strict completion Compleció estricta limitada Strict completion Compleció estricta Limited full completion Compleció plena limitada Full completion Compleció plena No completion Cap compleció Delayed completion Compleció retardada Customize completion… Personalitza la compleció… Save Mode Desa el mode Preset mode cannot be overwritten. No es pot sobreescriure el mode preestablert. Delete Mode Suprimeix el mode Couldn't write preferences to %s No s'ha pogut escriure les preferèncias a %s c-format never mai ask pregunta %i day %i dia %i dies c-format %i days Copied Result was copied Copiat log10 function not found. No s'ha trobat la funció log10. Search Cerca _Search _Cerca Remove Bookmark Elimina el marcador Add Bookmark Afegeix un marcador A bookmark with the selected name already exists. Do you want to overwrite it? Un marcador amb el nom seleccionat ja existeix. Voleu sobreescriure'l? No items found No s'ha trobat cap element Select date Selecció de data Rectangular form Forma rectangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notació d'angle o de fasor Optimal unit Unitat òptima Optimal prefix Prefix òptim All functions Totes les funcions All variables Totes les variables Select definitions file Selecció del fitxer de definicions _Import _Importa Could not copy %s to %s. No s'ha pogut copiar %s a %s. c-format Could not read %s. No s'ha pogut llegir %s. c-format Could not copy file to %s. No s'ha pogut copiar el fitxer a %s. c-format Unsupported base. La base no és admesa. The selected Chinese year does not exist. L'any xinés seleccionat no existeix. Conversion to Gregorian calendar failed. La conversió al calendari gregorià ha fallat. Calendar conversion failed for: %s. La conversió de calendari ha fallat per a: %s. c-format Gnuplot was not found. No s'ha trobat el Gnuplot. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) necessita instal·lar-se separadament, i trobar-se en el camí de cerca d'executables, per a que funcioni el dibuix. c-format Select file to save PNG image to Selecció del fitxer al qual desar la imatge PNG Allowed File Types Tipus de fitxer permesos All Files Tots els fitxers Cannot delete unit as it is needed by other units. do not delete units that are used by other units No es pot suprimir la unitat perquè altres unitats la necessiten. none cap result is too long el resultat és massa llarg translator-credits Alex Henrie <alexhenrie24@gmail.com> Mode not found. No s'ha trobat el mode. Elements (in horizontal order) Elements (en ordre horitzontal) Select file to import Selecció del fitxer a importar _Open _Obre Select file to export to Selecció del fitxer al qual exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Un objecte conflictiu amb el mateix nom existeix. Si procediu i deseu els canvis, l'objecte conflictiu se sobreescriurà o es desactivarà. Voleu procedir? Set key combination Establiment de combinació de tecles Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Premeu la combinació de tecles que voleu usar per l'acció (premeu Escapa per a cancel·lar.) No keys Sense claus Empty value. El valor està buit. Function not found. No s'ha trobat la funció. Variable not found. No s'ha trobat la variable. Unit not found. No s'ha trobat la unitat. The key combination is already in use. Do you wish to replace the current action? La combinació de tecles ja està en ús. Voleu reemplaçar l'acció actual? Select file to export Selecció del fitxer a exportar Empty expression. L'expressió està buida. Empty x variable. La variable x està buida. Element Data Dades d'element Classification Classificació Alkali Metal Metall alcalí Alkaline-Earth Metal Metall alcalinoterri Lanthanide Lantanoide Actinide Actinoide Transition Metal Metall de transició Metal Metall Metalloid Metal·loide Polyatomic Non-Metal Poliatòmic no metal Diatomic Non-Metal Diatòmic no metal Noble Gas Gas noble Unknown chemical properties Propietats químiques desconegudes No unknowns in result. No hi ha cap desconeguda en el resultat. Set Unknowns Estableix les desconegudes Copy result to clipboard Copia el resultat al porta-retalls ArgumentEditDialog Name: Nom: Type: Tipus: Free Libre Number Nombre Integer Enter Symbol Símbol Text Text Date Dada Vector Vector Matrix Matriu Boolean Booleà Angle Angle Object Objecte Function Funció Unit Unitat Variable Variable File Fitxer Enable rules and type test Habilita regles i verificació de tipus Custom condition: Condició personalitzada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Per exemple, si l'argument és una matriu que ha de tenir un nombre igual de files i columnes: rows(\x) = columns(\x) Allow matrix Permet matriu Forbid zero Prohibeix zero Handle vector Tractar amb vectors Calculate function for each separate element in vector. Calcula la funció per cada element distint en el vector. Min Mín Include equals Inclusiu Max Màx CSVDialog Import CSV File Importació de fitxer CSV Export CSV File Exporta fitxer CSV Current result Resultat actual Matrix/vector variable: Variable de matriu/vector: File: Fitxer: Import as Importa com a matrix matriu vectors vectors Name: Nom: First row: Primera fila: Includes headings Inclou encapçalaments Delimiter: Delimitador: Comma Coma Tabulator Tabulador Semicolon Punt i coma Space Espai Other Altre Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? An unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Error Error Could not import from file %1 No s'ha pogut importar del fitxer %1 No matrix or vector variable with the entered name was found. No s'ha trobat cap variable de matriu ni de vector amb el nom introduït. Could not export to file %1 No s'ha pogut exportar al fitxer %1 CalendarConversionDialog Calendar Conversion Conversió de calendari Gregorian Gregorià Hebrew Hebreu Islamic (Hijri) Islàmic (Hijri) Persian (Solar Hijri) Persià (Hijri solar) Indian (National) Indi (nacional) Chinese Xinés Julian Julià Revised Julian (Milanković) Julià revisat (Milanković) Coptic Copt Ethiopian Etíop Error Error The selected Chinese year does not exist. L'any xinés seleccionat no existeix. Conversion to Gregorian calendar failed. La conversió al calendari gregorià ha fallat. Calendar conversion failed for: %1. La conversió de calendari ha fallat per a: %1. DataObjectEditDialog %1: %1: Default Predeterminat Approximate Aproxima Exact Exacte Edit Data Object Edició d'objecte de dades New Data Object Objecte de dades nou DataPropertyEditDialog Name: Nom: Title: Títol: Descriptive name: Nom descriptiu: Description: Descripció: Value type: Tipus de valor: Expression Expressió Number Nombre Text Text Unit expression: Expressió d'unitat: Use as key Usa com a clau Case sensitive value Valor sensitiu a majúscules i minúscules Approximate value Valor aproximat Value uses brackets El valor usa claudàtors Hide Amaga Edit Data Property Edició de propietat de dades DataSetEditDialog General General Properties Propietats Function Funció Title: Títol: Descriptive name: Nom descriptiu: Data file: Fitxer de dades: Description: Descripció: Copyright: Dret d'autor: Title Títol Name Nom Type Tipus Add Afegeix Edit Edita Remove Elimina Name: Nom: Object argument name: Nom d'argument d'objecte: Property argument name: Nom d'argument de propietat: Default property: Propietat predeterminat: text text approximate aproximat number nombre expression expressió key clau Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una funció amb el mateix nom ja existeix. Voleu sobreescriure la funció? Data Sets Conjunts de dades Object Objecte Property Propietat Edit Data Set Edició de conjunt de dades New Data Set Conjunt de dades nou DataSetsDialog Data Sets Conjunts de dades Data sets: Conjunts de dades: New… Nou… Edit… Edita… Delete Suprimeix Objects: Objectes: Data set description: Descripció de conjunt de dades: Object attributes: Atributs d'objecte: Properties Propietats key clau Data Retrieval Function Funció d'obteniment de dades argument argument ExpressionEdit matrix matriu vector vector positive positiu non-positive no positiu negative negatiu non-negative no negatiu non-zero no zero boolean booleà integer enter rational racional real real complex complex number nombre (not matrix) (no matriu) unknown desconegut default assumptions suposicions predeterminades Prefix: Prefix: Complex Angle/Phasor Notation Notació complexa d'angle o de fasor Base units Unitats bases Number Base Base numèrica Binary-Coded Decimal Decimal codificat en binari (BCD) Bijective Base-26 Base 26 bijectiva Binary Number Nombre binari Calendars Calendaris Complex cis Form Forma cis complexa Decimal Number Nombre decimal Duodecimal Number Nombre duodecimal Complex Exponential Form Forma exponencial complexa Factors Factors 16-bit Floating Point Binary Format Format binari de punt flotant de 16 bits 32-bit Floating Point Binary Format Format binari de punt flotant de 32 bits 64-bit Floating Point Binary Format Format binari de punt flotant de 64 bits 80-bit (x86) Floating Point Binary Format Format binari de punt flotant de 80 bits (x86) 128-bit Floating Point Binary Format Format binari de punt flotant de 128 bits Fraction Fracció Decimal Fraction Fracció decimal Hexadecimal Number Nombre hexadecimal Latitude Latitud Longitude Longitud Mixed Units Unitats mixtes Octal Number Nombre octal Optimal Unit Unitat òptima Optimal Prefix Prefix òptim Expanded Partial Fractions Fraccions parcials expandides Complex Polar Form Forma polar complexa Complex Rectangular Form Forma rectangular complexa Roman Numerals Nombres romans Sexagesimal Number Nombre sexagesimal Time Format Format de temps Unicode Unicode UTC Time Zone Zona horària UTC Undo Desfés Redo Refés Cut Retalla Copy Copia Paste Enganxa Delete Suprimeix Calculate Selection Calcular la selecció Insert Date… Insereix data… Insert Matrix… Insereix matriu… Select All Selleciona-ho tot Clear Neteja Clear History Neteja l'historial Completion Compleció No completion Cap compleció Limited strict completion Compleció estricta limitada Strict completion Compleció estricta Limited full completion Compleció plena limitada Full completion Compleció plena Delayed completion Compleció retardada Expression Status L'estat de l'expressió Off Desactivat In history list In expression field With delay Amb retard Without delay Sense demora Automatically calculate selection Use input method Utilitzeu el mètode d’entrada Enable input method Activa el mètode d'entrada Matrix Matriu Too many arguments for %1(). Hi ha massa arguments per a %1(). argument argument %1: %1: comment comentari MC (memory clear) MC (neteja la memòria) MS (memory store) MS (desa a la memòria) M+ (memory plus) M+ (afegeix a la memòria) M− (memory minus) M− (elimina de la memòria) factorize factoritza expand expandeix hexadecimal hexadecimal hexadecimal number nombre hexadecimal octal octal octal number nombre octal decimal decimal decimal number nombre decimal duodecimal duodecimal duodecimal number nombre duodecimal binary binària binary number nombre binari roman romana roman numerals numerals romans bijective bijectiva bijective base-26 base 26 bijectiva binary-coded decimal BCD sexagesimal sexagesimal sexagesimal number nombre sexagesimal latitude latitud longitude longitud 32-bit floating point punt flotant de 32 bits 64-bit floating point punt flotant de 64 bits 16-bit floating point punt flotant de 16 bis 80-bit (x86) floating point punt flotant de 80 bits (x86) 128-bit floating point punt flotant de 128 bits time temps time format format de temps bases bases number bases bases numèriques calendars calendaris optimal òptima optimal unit unitat òptima prefix prefix optimal prefix base base base units unitats bases mixed mixta mixed units unitats mixtes decimals decimal fraction fraction fracció factors factors partial fraction fracció parcial expanded partial fractions fraccions parcials expandides rectangular rectangular cartesian cartesià complex rectangular form forma rectangular complexa exponential exponencial complex exponential form forma exponencial complexa polar polar complex polar form forma polar complexa complex cis form forma cis complexa angle angle complex angle notation notació complexa d'angle phasor fasor complex phasor notation notació complexa de fasor UTC time zone zona horària UTC number base %1 base numèrica %1 Data object Objecte de dades FPConversionDialog Floating Point Conversion (IEEE 754) Conversió de punt flotant (IEEE 754) Format Format 16-bit (half precision) 16 bits (precisió mitja) 32-bit (single precision) 32 bits (precisió singular) 64-bit (double precision) 64 bits (precisió doble) 80-bit (x86 extended format) 80 bits (format x86 estès) 128-bit (quadruple precision) 128 bits (precisió quàdruple) Microchip 24-bit Microchip 32-bit Value Valor Decimal value Valor decimal Binary representation Representació binària Hexadecimal representation Representació hexadecimal Floating point value Valor de punt flotant Conversion error Error de conversió FunctionEditDialog Required Necessari Details Detalls Description Descripció Name: Nom: Expression: Expressió: Argument references: Referències d'arguments: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y i z (p. ex., "(x+y)/2"), o \x, \y, \z, \a, \b, … (p. ex., "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Utilitzeu x, y i z (per exemple "(x+y)/2"), o \x, \y, \z, \a, \b, … (per exemple "(\x+\y)/2") Category: Categoria: Descriptive name: Nom descriptiu: Hide function Amaga la funció Example: Exemple: Description: Descripció: Condition: Condició: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") La condició que ha de ser cert per a la funció (per exemple, si el segon argument ha de ser més gran que el primer: "\y > \x") Sub-functions: Subfuncions: Expression Expressió Precalculate Precalcula Reference Referència Add Afegeix Edit Edita Remove Elimina Arguments: Arguments: Name Nom Type Tipus Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una funció amb el mateix nom ja existeix. Voleu sobreescriure la funció? Edit Function Edició de funció New Function Funció nova FunctionsDialog Functions Funcions Category Categoria Function Funció New… Nou… Edit… Edita… Deactivate Desactiva Delete Suprimeix Calculate… Calcula… Apply Aplica Insert Insereix Favorite Favorit argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Obté dades del conjunt de dades %1 per a un objecte i una propietat donats. Si "info" és de tipus propietat, una finestra de diàleg emergirà amb totes les propietats de l'objecte. Example: Exemple: Arguments Arguments optional optional argument opcional default: argument default default: Requirement: Required condition for function Requisit: Properties Propietats %1: %1: key indicating that the property is a data set key clau Activate Activa All All functions Tot Uncategorized Sense categoria User functions Funcions de l'usuari Favorites Favorits Inactive Desactivat HistoryView Insert Value Insereix el valor Insert Text Insereix el text Copy Copia Copy Formatted Text Copia text formatat Copy unformatted ASCII Copiar ASCII sense format Select All Selleciona-ho tot Search… Cerca… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Teclegeu una expressió matemàtica a dalt, per exemple "5 + 2 / 3", i premeu el teclat Retorn. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Teclegeu una expressió matemàtica a dalt, per exemple "5 + 2 / 3", i premeu el teclat Retorn. Exchange rate source(s): updated %1 Comment Comentari Protect Protegeix Add Comment… Afegeix un comentari… Move to Top Mou al cim Remove Elimina Clear Neteja Edit Comment… Edita el comentari… Text: Text: Search Cerca KeypadButton <i>Right-click/long press</i>: %1 <i>Clic dret o premuda llarga</i>: %1 <i>Right-click</i>: %1 <i>Clic dret</i>: %1 <i>Long press</i>: %1 <i>Premuda llarga</i>: %1 Open menu Obre el menú <i>Middle-click</i>: %1 <i>Clic del mig</i>: %1 KeypadWidget Memory store Desa a la memòria) Memory clear Neteja la memòria Memory recall Retira de la memòria Memory add Afegeix a la memòria Memory subtract Elimina de la memòria STO Standard calculator button. Do not use more than three characters. STO Store Desa New function Funció nova sin sin cos cos tan tan Exponentiation Potenciació Percent or remainder Per cent o residu Uncertainty/interval Incertesa/interval Relative error Error relatiu Interval Interval Move cursor left Mou el cursor a l'esquerra Move cursor to start Mou el cursor al principi Move cursor right Mou el cursor a la dreta Move cursor to end Mou el cursor al fin Logical AND AND lógic Logical OR OR lógic Bitwise Exclusive OR OR exclusiu bit a bit Logical NOT NOT lógic Bitwise Left Shift Desplaçament a l'esquerra bit a bit Bitwise Right Shift Desplaçament a la dreta bit a bit cmp rot a→1 Expand partial fractions Expandeix les fraccions parcials Enable units in physical constants Activa les unitats en constants físics All constants Totes les constants Percentage Calculation Tool Eina de càlcul de percentatge more més All units Totes les unitats All variables Totes les variables Action Acció Interval Display Presentació d'intervals Adaptive Adaptativa Significant digits Xifres significants Plus/minus Més/menys Relative Relatiu Concise Interval Calculation Càlcul d'interval Variance formula Fórmula de variància Interval arithmetic Aritmètica d'interval Allow concise uncertainty input Complex number form Forma de nombre complex Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Angle o fasor Type Assumptions type Tipus Sign Assumptions sign Signe Default assumptions Suposicions predeterminades Number Nombre Real Real Rational Racional Integer Enter Boolean Booleà Unknown Unknown assumptions sign Desconeguda Non-zero No zero Positive Positiu Non-negative No negatiu Negative Negatiu Non-positive No positiu Factorize Factoritza Expand Expandeix Add column Add row Remove column Remove row Left parenthesis Parèntesi esquerre Left vector bracket Claudàtor esquerre de vector Right parenthesis Parèntesi dret Right vector bracket Claudàtor dret de vector Smart parentheses Parèntesis intel·ligents Vector brackets Claudàtors de vector Argument separator Separador d'arguments Blank space Espai en blanc New line Línia nova Decimal point Punt decimal Previous result (static) Resultat previ (estàtic) Multiplication Multiplicació Button Action Acció del botó Label: Etiqueta: Action: Acció: None Cap Value: Valor: Bitwise AND AND bit a bit Bitwise Shift Desplaçament bit a bit Delete Suprimeix Backspace Retrocés Addition Addició Plus Més Subtraction Sostracció Minus Menys Division Divisó Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear expression Neteja l'expressió Calculate expression Calcula l'expressió NamesEditDialog Name Nom Abbreviation Abreviatura Plural Plural Reference Referència Avoid input Evita l'entrada Unicode Unicode Suffix Sufix Case sensitive Distingeix entre majúscules i minúscules Completion only Només compleció Add Edit Edita Remove Elimina Warning Advertiment Illegal name El nom és il ilegal A function with the same name already exists. Una funció amb el mateix nom ja existeix. A unit or variable with the same name already exists. Una unitat o variable amb el mateix nom ja existeix. PercentageCalculationDialog Percentage Porcentatge Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Canvi de 1 a 2 Change from 2 to 1 Canvi de 2 a 1 2 compared to 1 2 comparat amb 1 1 compared to 2 1 comparat amb 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Introduïu dos valors, dels quals al màxim un és percentatge, i es calcularan els altres per a vostè. Clear Neteja PeriodicTableDialog Periodic Table Taula periòdica Element Data Dades d'element Alkali Metal Metall alcalí Alkaline-Earth Metal Metall alcalinoterri Lanthanide Lantanoide Actinide Actinoide Transition Metal Metall de transició Metal Metall Metalloid Metal·loide Polyatomic Non-Metal Poliatòmic no metal Diatomic Non-Metal Diatòmic no metal Noble Gas Gas noble Unknown chemical properties Propietats químiques desconegudes Unknown Desconeguda %1: %1: PlotDialog Plot Dibuix Data Dades Title: Títol: Expression: Expressió: Function Funció Vector/matrix Vector/matriu Paired matrix Matriu emparellada Rows Files X variable: Variable X: Style: Estil: Line Línia Points Punts Line with points Línia amb punts Boxes/bars Caixes/barres Histogram Histograma Steps Pasos Candlesticks Candelers Dots Cercles Polar Polar Smoothing: Suavitzat: None Cap Monotonic Monotònic Natural cubic splines Spline cúbic natural Bezier Bézier Bezier (monotonic) Bézier (monotònic) Y-axis: Eix Y: Primary Principal Secondary Secondari Add Afegeix Apply Aplica Remove Elimina Category Categoria Title Títol Expression Expressió Function Range Rang de funció Minimum x value: Valor x mìnim: Maximum x value: Valor x màxim: Sampling rate: Taxa de mostreig: Step size: Mida de passos: Show real and imaginary parts Appearance Aparència Display grid Mostra una graella Display full border Mostra la vora completa Minimum y value: Valor y mínim: Maximum y value: Valor y màxim: Logarithmic x scale: Escala x logarítmica: Logarithmic y scale: Escala y logarítmica: X-axis label: Etiqueta de l'eix X: Y-axis label: Etiqueta de l'eix Y: Line width: Amplada de línia: Legend placement: Posició de la llegenda: Top-left Superior-esquerra Top-right Superior-dreta Bottom-left Inferior-esquerra Bottom-right Inferior-dreta Below A baix Outside A fora Calculating… S'està calculant… Cancel Cancel·la Processing… S'està processant… PreferencesDialog Look && Feel Aparença Numbers && Operators Nombres i operadors Units && Currencies Unitats i monedes Parsing && Calculation Anàlisi i càlcul Ignore system language (requires restart) Ignora la llengua del sistema (requereix reinici) Allow multiple instances Permet múltiples instàncies Clear history on exit Neteja l'historial en surtir Close application with Escape key Keep above other windows Manté superior a les altres finestres Window title: Títol de finestra: Application name Nom d'aplicació Result Resultat Application name + result Nom d'aplicació + resultat Workspace Espai de treball Application name + workspace Nom d'aplicació + espai de treball Style: Estil: Default (requires restart) Default style Predeterminat (requereix reinici) Dark mode Mode fosc Colorize result Coloritzar el resultat Custom result font Tipus de lletra personalitzat per al resultat Custom expression font Tipus de lletra personalitzat per a l'expressió Custom keypad font Tipus de lletra personalitzat per al teclat numèric Custom application font Tipus de lletra personalitzat per a l'aplicació Custom result font: Tipus de lletra personalitzat per al resultat: Custom expression font: Tipus de lletra personalitzat per a l'expressió: Custom keypad font: Tipus de lletra personalitzat per al teclat numèric: Custom application font: Tipus de lletra personalitzat per a l'aplicació: Display expression status Mostra l'estat de l'expressió Delay: Retard: Expression after calculation: Expressió després del càlcul: Keep expression Clear expression Neteja l'expressió Replace with result Replace with result if shorter Use keyboard keys for RPN Usa les tecles del teclat per a la NPI Parsing mode: Mode d'anàlisi: Adaptive Adaptativa Conventional Convencional Implicit multiplication first Primer la multiplicació implícita Chain Cadena RPN NPI Read precision Llegeix la precisió Limit implicit multiplication Limita la multiplicació implícita Interval calculation: Càlcul d'interval: Variance formula Fórmula de variància Interval arithmetic Aritmètica d'interval Factorize result Factoritza el resultat Binary two's complement representation Representació binaria de complement a dos Hexadecimal two's complement representation Representació hexadecimal de complement a dos Use lower case letters in non-decimal numbers Usa lletres minúscules en nombres no decimals Spell out logical operators Enuncia els operadors lògics Use E-notation instead of 10^x Usa la notació E en lloc de 10^x Preferences Preferències ms milliseconds ms Use E-notation instead of 10^n Usa la notació E en lloc de 10^n Use 'j' as imaginary unit Usa 'j' com a unitat imaginària Use comma as decimal separator Usa la coma com a separador decimal Ignore comma in numbers Ignora comas en els nombres Ignore dots in numbers Ignora els punts en els nombres Round halfway numbers away from zero Arrodoneix els nombres a mig camí lluny de zero Round halfway numbers to even Arrodoneix els nombres a mig camí al par Indicate repeating decimals Indica els decimals periòdics Language: Idioma: Max history lines saved: Use caret for bitwise XOR Usa el caret per XOR bit a bit Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Expression status: Estat de l'expressió: Off Desactivat In history list In expression field Status tooltip delay: Automatically calculate selection Expression in history: Parsed Entered Entered + parsed Automatically copy result Simplified percentage calculation Càlcul de percentatges simplificat Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binària Hexadecimal Hexadecimal Binary bits: Automatic Automàtica Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Copy unformatted ASCII by default Digit grouping: Agrupament de xifres: None Cap Standard Estàndar Local Local Automatically group digits in input (experimental) Interval display: Presentació d'intervals: Significant digits Xifres significants Interval Interval Plus/minus Més/menys Concise Midpoint Punt mitjà Lower Inferior Upper Superior Rounding: Truncate all numbers Trunca tots els números Complex number form: Forma de nombre complex: Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Angle o fasor Enable units Abbreviate names Abrevia els noms Use binary prefixes for information units Una els prefixes binaris per a les unitats d'informació Automatic unit conversion: Conversió automàtica d’unitats: No conversion Cap conversió Base units Unitats bases Optimal units Unitats òptimes Optimal SI units Unitats SI òptimes Convert to mixed units Converteix a unitats mixtes Automatic unit prefixes: Prefixos automàtics: Copy unformatted ASCII without units Restart required Please restart the program for the language change to take effect. Default Predeterminat Calculate as you type delay: Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Cap prefixos Prefixes for some units Prefixes per a les unitats seleccionades Prefixes also for currencies Prefixes també per a les monedes Prefixes for all units Prefixes per a totes les unitats Enable all SI-prefixes Habilita tots els prefixes SI Enable denominator prefixes Habilita els prefixes de denominador Enable units in physical constants Activa les unitats en constants físics Temperature calculation: Càlcul de temperatura: Absolute Absolut Relative Relatiu Hybrid Híbrid Exchange rates updates: Actualitzacions de taxes d'intercanvi: %n day(s) %n dia %n dies days dia dies QApplication Execute expressions and commands from a file Executa expressions i ordres d'un fitxer FILE FITXER Start a new instance of the application Inicia una instància nova de l'aplicació Specify the window title Especifica el títol de finestra TITLE TÍTOL Display the application version Mostra la versió de l'aplicació Open workspace Expression to calculate Expressió a calcular [EXPRESSION] [EXPRESSIÓ] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Per defecte, es permet només una instància (una finestra principal) de %1. Si s'obren múltiples instàncies simultàniament, només es desaran les definicions (variables, funcions etc.), el mode, les preferències i l'historial de la última finestra tancada Voleu, malgrat això, canviar el comportament predeterminat i permetre múltiples instàncies simultànies? Allow multiple instances? %1 is already running. Failed to load global definitions! S'ha fallat en carregar les definicions globals! answer resposta History Answer Value Valor de resposta de l'historial History Index(es) Índex(es) de l'historial History index %s does not exist. L'índex d'historial %s no existeix. Last Answer Última resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Memòria Error Error Couldn't write preferences to %1 No s'ha pogut escriure les preferèncias a %1 Function not found. No s'ha trobat la funció. Variable not found. No s'ha trobat la variable. Unit not found. No s'ha trobat la unitat. Unsupported base. La base no és admesa. Unsupported value. QalculateQtSettings Update exchange rates? Actualitza les taxes d'intercanvi? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Fa %n dia que es van actualitzar les taxes d'intercanvi. Voleu actualitzar les taxes d'intercanvi ara? Fa %n dies que es van actualitzar les taxes d'intercanvi. Voleu actualitzar les taxes d'intercanvi ara? Fetching exchange rates. S'estan obtenint les taxes d'intercanvi. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… S'estan obtenint les taxes d'intercanvi… Error Error Warning Advertiment Information Informació Path of executable not found. No s'ha trobat el camí de l'executable. curl not found. No s'ha trobat curl. Failed to run update script. %1 S'ha fallat en executar l'script d'actualització. %1 Failed to check for updates. S'ha fallat en cercar actualitzacions. No updates found. No s'ha trobat cap actualització. A new version of %1 is available at %2. Do you wish to update to version %3? Una versió nova de %1 està disponible a %2. Voleu actualitzar a la versió %3? A new version of %1 is available. You can get version %3 at %2. Una versió nova de %1 està disponible. Podeu aconseguir la versió %3 a %2. Download %1: %2 Insert function Insereix una funció Insert function (dialog) Insereix una funció (diàleg) Insert variable Insereix una variable Approximate result Negate Nega Invert Inverteix Insert unit Insereix una unitat Insert text Insereix text Insert operator Insert date Insereix una data Insert matrix Insereix una matriu Insert smart parentheses Insereix parèntesis intel·ligents Convert to unit Converteix a altra unitat Convert Converteix Convert to optimal unit Converteix a la unitat òptima Convert to base units Converteix a les unitats bases Convert to optimal prefix Converteix al prefix òptim Convert to number base Converteix a la base numèrica Factorize result Factoritza el resultat Expand result Expandeix el resultat Expand partial fractions Expandeix les fraccions parcials RPN: down NPI: avall RPN: up NPI: amunt RPN: swap NPI: intercanvia RPN: copy NPI: copia RPN: lastx RPN: última x RPN: delete register NPI: suprimeix el registre RPN: clear stack NPI: neteja la pila Set expression base Estableix la base d'expressió Set result base Estableix la base del resultat Set angle unit to degrees Estableix la unitat d'angle com a graus Set angle unit to radians Estableix la unitat d'angle com a radians Set angle unit to gradians Estableix la unitat d'angle com a gradians Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Commuta el mode NPI Show general keypad Toggle programming keypad Commuta el teclat programari Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Cerca en l'historial Clear history Neteja l'historial Show variables Show functions Show units Show data sets Store result Desa el resultat MC (memory clear) MC (neteja la memòria) MR (memory recall) MR (retira de la memòria) MS (memory store) MS (desa a la memòria) M+ (memory plus) M+ (afegeix a la memòria) M− (memory minus) M− (elimina de la memòria) New variable Variable nova New function Funció nova Open plot functions/data Obre el dibuix de funcions/dades Open convert number bases Obre la conversió de bases numèriques Open floating point conversion Obre la conversió de punt flotant Open calender conversion Obre la conversió de calendari Open percentage calculation tool Obre l'eina de càlcul de percentatge Open periodic table Obre la taula periòdica Update exchange rates Actualitza les taxes d'intercanvi Copy result Copia el resultat Insert result Insereix el resultat Open mode menu Open menu Obre el menú Help Ajuda Quit Surt Toggle chain mode Commuta el mode de cadena Toggle keep above Commuta el manteniment amunt Show completion (activate first item) Clear expression Neteja l'expressió Delete Suprimeix Backspace Retrocés Home End Right Left Up Amunt Down Avall Undo Desfés Redo Refés Calculate expression Calcula l'expressió Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Predeterminat Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Cancel·la Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Menú Menu (%1) Menú (%1) New Nou Function… Funció… Variable/Constant… Variable/constant… Unknown Variable… Variable desconeguda… Matrix… Matriu… Workspaces Espais de treball Open… Obre… Open default Obre predeterminat Save Guardar Save As… Guardar com… Import CSV File… Importa un fitxer CSV… Export CSV File… Exporta un fitxer CSV… Functions Funcions Variables and Constants Variables i constants Units Unitats Plot Functions/Data Dibuixa funcions/dades Floating Point Conversion (IEEE 754) Conversió de punt flotant (IEEE 754) Calendar Conversion Conversió de calendari Update Exchange Rates Actualitza les taxes d'intercanvi Normal Mode Mode normal RPN Mode Mode NPI Chain Mode Mode de cadena Keyboard Shortcuts Dreceres de teclat Preferences Preferències Help Ajuda Report a Bug Informa d'un error Check for Updates Cercar actualitzacions About %1 Quant a %1 Quit Surt Mode Mode Mode (%1) Mode (%1) General Display Mode Mode de presentació general Normal Normal Scientific Científica Engineering Enginyeria Simple Senzill Angle Unit Unitat d'angle Radians Radians Degrees Graus Gradians Gradians Approximation Aproximació Automatic Automatic approximation Automàtica Dual Dual approximation Doble Exact Exact approximation Exacte Approximate Aproxima Assumptions Suposicions Type Assumptions type Tipus Number Nombre Real Real Rational Racional Integer Enter Boolean Booleà Sign Assumptions sign Signe Unknown Unknown assumptions sign Desconeguda Non-zero No zero Positive Positiu Non-negative No negatiu Negative Negatiu Non-positive No positiu Result Base Base del resultat Binary Binària Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Altre Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Format de temps Roman numerals Numerals romans Unicode Unicode Bijective base-26 Base 26 bijectiva Binary-encoded decimal (BCD) Decimal codificat en binari (BCD) Custom: Number base Expression Base Base d'expressió Other: Number base Altra: Precision: Precisió: Min decimals: Mín de decimals: Max decimals: Màx de decimals: off Max decimals desactivat Convert Converteix Convert (%1) Converteix (%1) Store Desa Store (%1) Desa (%1) Functions (%1) Funcions (%1) Keypad Teclat numèric Keypad (%1) Teclat numèric (%1) Number bases Bases numèriques Unit… Unitat… Data Sets Conjunts de dades Percentage Calculation Tool Eina de càlcul de percentatge Periodic Table Taula periòdica Units (%1) Unitats (%1) Plot Functions/Data (%1) Dibuixa funcions/dades (%1) Number Bases (%1) Bases numèriques (%1) Binary: Binària: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pila NPI Rotate the stack or move the selected register up (%1) Roda la pila o mou el registre seleccionat amunt (%1) Rotate the stack or move the selected register down (%1) Roda la pila o mou el registre seleccionat avall (%1) Swap the top two values or move the selected value to the top of the stack (%1) Intercanvia els últims dos valors o mou el valor seleccionat al cim de la pila (%1) Copy the selected or top value to the top of the stack (%1) Copia el valor seleccionat o el últim al cim de la pila (%1) Enter the top value from before the last numeric operation (%1) Introdueix el úlim valor d'abans de la darrera operació numèrica (%1) Delete the top or selected value (%1) Suprimeix el últim valor o el seleccionat (%1) Clear the RPN stack (%1) Neteja la pila NPI (%1) New Function… Funció nova… Favorites Favorits Recent User functions Funcions de l'usuari Open dialog Show all functions User units Unitats d'usuari more més Prefixes Prefixes Show all units User variables Variables d'usuari Show all variables Powerful and easy to use calculator Calculadora poderosa i fàcil a usar License: GNU General Public License version 2 or later Error Error Couldn't write definitions No s'ha pogut escriure les definicions hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binària roman romana bijective bijectiva sexagesimal sexagesimal latitude latitud longitude longitud time temps Time zone parsing failed. L'anàlisi de la zona horària ha fallat. bases bases calendars calendaris rectangular rectangular cartesian cartesià exponential exponencial polar polar phasor fasor angle angle optimal òptima base base mixed mixta fraction fracció factors factors Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad Copy Copia prefix prefix partial fraction fracció parcial decimals factorize factoritza expand expandeix Calculating… S'està calculant… Cancel Cancel·la RPN Operation Operació NPI Factorizing… S'està factoritzant… Expanding partial fractions… S'estan expandint les fraccions parcials… Expanding… S'està expandint… Converting… S'està convertint… RPN Register Moved S'ha mogut el registre NPI Processing… S'està processant… Matrix Matriu Temperature Calculation Mode Mode de càlcul de temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expressió és ambigua. Si us plau, seleccioneu el mode de càlcul de temperatura (es pot canviar el mode després en les preferències). Absolute Absolut Relative Relatiu Hybrid Híbrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretació de punts Please select interpretation of dots (".") (this can later be changed in preferences). Si us plau, seleccioneu la interpretació de punts (".") (es pot canviar això després en les preferències). Both dot and comma as decimal separators Ambdós punt i coma com a separadors decimals Dot as thousands separator Punt com a separador de millars Only dot as decimal separator Només punt com a separador decimal Parsing Mode Mode d'anàlisi The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). L'expressió és ambigua. Si us plau, seleccioneu la interpretació de l'expressió amb multiplicació implícita (es pot canviar aixó després en les preferències). Implicit multiplication first Primer la multiplicació implícita Conventional Convencional Adaptive Adaptativa Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Afegeix acció (%1) Edit Keyboard Shortcut New Keyboard Shortcut Drecera de teclat nova Action: Acció: Value: Valor: Set key combination Establiment de combinació de tecles Press the key combination you wish to use for the action. Premeu la combinació de tecles que voleu usar per l'acció. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? La combinació de tecles ja està en ús. Voleu reemplaçar l'acció actual (%1)? Question Pregunta Add… Afegeix… Edit… Edita… Remove Elimina Gnuplot was not found No s'ha trobat el Gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) necessita instal·lar-se separadament, i trobar-se en el camí de cerca d'executables, per a que funcioni el dibuix. Example: Example of function usage Exemple: Enter RPN Enter Introdueix Calculate Calcula Apply to Stack Aplica a la pila Insert Insereix Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again No tornis a preguntar Keep open Manté obert Value Valor Argument Argument %1: %1: Plot Dibuix General General Programming Programari Algebra Àlgebra Custom Personalitzat None Cap Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Clic dret o premuda llarga</i>: %1 Open menu Obre el menú Number Bases Bases numèriques Rotate the stack or move the selected register up Roda la pila o mou el registre seleccionat amunt Rotate the stack or move the selected register down Roda la pila o mou el registre seleccionat avall Swap the top two values or move the selected value to the top of the stack Intercanvia els últims dos valors o mou el valor seleccionat al cim de la pila Delete the top or selected value Suprimeix el últim valor o el seleccionat Enter the top value from before the last numeric operation Introdueix el úlim valor d'abans de la darrera operació numèrica Copy the selected or top value to the top of the stack Copia el valor seleccionat o el últim al cim de la pila Clear the RPN stack Neteja la pila NPI Action Acció Key combination Combinació de teclats True Cert False Fals Info Info optional optional argument opcional Failed to open %1. %2 S'ha fallat en obrir %1. %2 UnitEditDialog General General Relation Relació Name: Nom: Category: Categoria: Descriptive name: Nom descriptiu: System: Sistema: Imperial Imperial US Survey Agrimensura estatunidenca Hide unit Amaga la unitat Description: Descripció: Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe a la qual pertany aquesta unitat. Es defineixen les unitats derivades anomenades en relació a una sola altra unitat, amb un exponent opcional, mentre es defineixen les unitats derivades (sense nom) per una expressió d'unitat amb una unitat o múltiples unitats. Base unit Unitat base Named derived unit Unitat derivada anomenada Derived unit Unitat derivada Base unit(s): Unitat(s) base(s): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unitat (per a una unitat derivada amb nom) o expressió d'unitat (per a una unitat derivada sense nom) a la qual aquesta unitat està definida Exponent: Exponent: Relation: Relació: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relació a la unitat base. Per als relacions linears això només deu ser un nombre.<br><br>Per a les relacions no linears useu \x pel factor i \y pel exponent (per exemple "\x + 273,15" pela relació entre graus Celsius i Kelvin). Inverse relation: Relació inversa: Specify for non-linear relation, for conversion back to the base unit. Especifiqueu per a relació no linear, per a conversió de retorn a la unitat base. Mix with base unit Mescla amb la unitat base Priority: Prioritat: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Nombre d'unitat base mínim: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Usa amb prefixes per defecte Error Error Base unit does not exist. La unitat base no existeix. Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? A variable or unit with the same name already exists. Do you want to overwrite it? Una variable o unitat amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Unit Edita la unitat New Unit Unitat nova UnitsDialog Units Unitats Category Categoria Unit Unitat New… Nou… Edit… Edita… Deactivate Desactiva Delete Suprimeix Convert Converteix Insert Insereix Favorite Favorit Show hidden units Mostra unitats amagades Activate Activa All All units Tot Uncategorized Sense categoria User units Unitats d'usuari Favorites Favorits Inactive Desactivat UnknownEditDialog Name: Nom: Custom assumptions Suposicions personalitzades Type: Tipus: Sign: Signe: Temporary Temporal Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Unknown Variable Edició de variable desconeguda New Unknown Variable Variable desconeguda nova VariableEditDialog Name: Nom: Temporary Temporal Value: Valor: Required Necessari Description Descripció current result resultat actual Category: Categoria: Descriptive name: Nom descriptiu: Hide variable Amaga la variable Description: Descripció: Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Variable Edita la variable New Variable Variable nova VariablesDialog Variables Variables Category Categoria Variable Variable New Nou Variable/Constant… Variable/constant… Unknown Variable… Variable desconeguda… Matrix… Matriu… Edit… Edita… Export… Exporta… Deactivate Desactiva Delete Suprimeix Insert Insereix Favorite Favorit a matrix una matriu a vector un vector positive positiu non-positive no positiu negative negatiu non-negative no negatiu non-zero no zero integer enter boolean booleà rational racional real real complex complex number nombre not matrix no matriu unknown desconegut Default assumptions Suposicions predeterminades Activate Activa All All variables Tot Uncategorized Sense categoria User variables Variables d'usuari Favorites Favorits Inactive Desactivat qalculate-qt-5.5.1/translations/qalculate-qt_de.ts000066400000000000000000016653541475705355700223230ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Taschenrechner Powerful and easy to use calculator Leistungsstarker und einfach zu bedienender Taschenrechner calculation;arithmetic;scientific;financial; Berechnung;Arithmetik; Wissenschaft;Finanzen; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! ist ein vielseitig einsetzbarer, plattformübergreifender Desktop-Rechner. Er ist einfach zu bedienen, bietet aber Leistung und Vielseitigkeit die normalerweise nur für komplizierte mathematische Pakete vorbehalten sind, sowie nützliche ls auch für den täglichen Bedarf (wie Währungsumrechnung und Prozentrechnung). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Zu den Leistungsmerkmalen gehören eine große Bibliothek anpassbarer Funktionen, Einheiten-berechnungen und -umrechnungen, physikalische Konstanten, symbolische Berechnungen (einschließlich Integrale und Gleichungen), beliebige Genauigkeit, Unsicherheits-fortpflanzung, Intervallarithmetik, Plotten und eine benutzerfreundliche Oberfläche. Argument Rules Regeln für Argumente _Cancel _Abbruch Do not save modifications Änderungen nicht speichern _OK _OK Accept the modification of argument rules Änderung der Argumentregeln akzeptieren Enable rules and type test Regeln und Typenprüfung einschalten Custom condition Benutzerdefinierte Bedingung For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Wenn das Argument zum Beispiel eine Matrix ist, die die gleiche Anzahl von Zeilen und Spalten haben muss Spalten: Zeilen(\x) = Spalten(\x) Allow matrix Matrix zulassen Forbid zero Null verbieten Handle vector Vektor verarbeiten Calculate function for each separate element in vector. Funktion für jedes einzelne Element im Vektor berechnen. Min Min Include equals Schließe Gleichheiten ein Max Max Keyboard Shortcuts Tastaturkürzel _Close _Schließen Label Beschriftung Left-click Linksklick Right-click Rechtsklick Middle-click Mittelklick Reset Zurücksetzen Button Action Aktion für Schaltfläche Value Wert Argument name Argumentname Calendar Conversion Kalender Konvertierung Export CSV File CSV-Datei exportieren Current result Aktuelles Ergebnis Matrix/vector variable Matrix/Vektor-Variable File Datei Delimiter Begrenzungszeichen Comma Komma Tabulator Tabulator Semicolon Semikolon Space Leerzeichen Other Andere Import CSV File CSV-Datei importieren Do not import the file Die Datei nicht importieren Import the file Die Datei importieren Name of the data file to import Name der zu importierenden Datendatei Select a file Wählen Sie eine Datei Import as Importieren als Matrix Matrix If a matrix shall be generated from the contents of the file Wenn aus dem Inhalt der Datei eine Matrix erzeugt werden soll Vectors Vektoren If vectors shall be generated from the contents of the file Wenn aus dem Inhalt der Datei Vektoren generiert werden sollen Name Name Name (or name prefix) used to reference generated variable(s) in expressions Name (oder Namenspräfix), der verwendet wird, um die erzeugte(n) Variable(n) in Ausdrücken zu referenzieren Descriptive name Beschreibender Name Title displayed in menus and in variable manager Titel, der in Menüs und im Variablen-Manager angezeigt wird Category Kategorie First row Erste Zeile The first row with data to import in the file Die erste Zeile mit zu importierenden Daten in der Datei Includes headings Enthält Überschriften If the first row contains column headings Wenn die erste Zeile Spaltenüberschriften enthält Delimiter used to separate columns in the file Trennzeichen, das zum Trennen von Spalten in der Datei verwendet wird Custom delimiter Benutzerdefiniertes Begrenzungszeichen Edit Data Property Dateneigenschaft bearbeiten Do not create/modify this data set Diesen Datensatz nicht erstellen/verändern Accept the creation/modification of this data set Erstellung/Änderung dieses Datensatzes akzeptieren Name used for reference Name als Referenz verwendet Properties Eigenschaften Title displayed in menus and in data set manager Titel wird in Menüs und im Datensatzmanager angezeigt Description Beschreibung Description of this data property Beschreibung dieser Dateneigenschaft Value Type Wert Typ Text Text Number Zahl Expression Ausdruck Hide Ausblenden Use as key Als Schlüssel verwenden Approximate value Näherungswert Case sensitive value Wert unterscheidet Groß-/Kleinschreibung Value uses brackets Wert verwendet Klammern Unit expression Einheitenausdruck Edit Data Set Datensatz bearbeiten Title Titel Data file Daten Datei Description of this data set Beschreibung dieses Datensatzes Copyright Urheberrecht General Allgemein Properties: Eigenschaften Definition of the properties of this data set Definition der Eigenschaften dieses Datensatzes _New _Neu _Edit _Bearbeiten _Delete _Löschen Name used to invoke the function in expressions Name, mit dem die Funktion in Ausdrücken aufgerufen wird Object argument name Objekt-Argumentname Property argument name Name des Eigenschaftsarguments Default property Standard-Eigenschaft Function Funktion Edit Data Object Datenobjekt bearbeiten Do not create/modify this data object Dieses Datenobjekt nicht anlegen/verändern Accept the creation/modification of this data object Anlegen/Ändern dieses Datenobjekts zulassen Data Sets new dataset Datensätze Data Set Datensatz Create a new data set Einen neuen Datensatz anlegen Edit the selected data set Ausgewählten Datensatz bearbeiten Delete the selected data set Löschen des ausgewählten Datensatzes Objects Objekte Create a new data object Anlegen eines neuen Datenobjekts Edit the selected data object Ausgewähltes Datenobjekt bearbeiten Remove the selected data object Ausgewähltes Datenobjekt entfernen Data Set Description Datensatz Beschreibung Object Attributes Objekt-Attribute Decimals Dezimalstellen Close this window Dieses Fenster schließen Min decimals Min Dezimalen Max decimals Max Dezimalen Minimal number of displayed decimals Minimale Anzahl der angezeigten Nachkommastellen Maximal number of decimals to display (and round to) Maximale Anzahl der anzuzeigenden (und zu rundenden) Nachkommastellen Floating Point Conversion Gleitkomma-Umrechnung Decimal value Dezimaler Wert Binary value Binärer Wert Octal value Oktalwert Hexadecimal representation Hexadezimale Darstellung Conversion error Konvertierungsfehler Binary representation Binäre Darstellung Floating point value Gleitkommawert Format Format 16-bit (half precision) 16-Bit (halbe Genauigkeit) 32-bit (single precision) 32-Bit (einfache Genauigkeit) 64-bit (double precision) 64-Bit (doppelte Genauigkeit) 80-bit (x86 extended format) 80-Bit (erweitertes x86-Format) 128-bit (quadruple precision) 128-Bit (vierfache Genauigkeit) Hexadecimal value Hexadezimalwert Edit Function Bearbeite Funktion _Help _Hilfe Do not create/modify this function Diese Funktion nicht erstellen/verändern Accept the creation/modification of this function Erstellung/Änderung dieser Funktion zulassen Name used to invoke this function in expressions Name, der zum Aufrufen dieser Funktion in Ausdrücken verwendet wird Title displayed in menus and in function manager Titel, der in Menüs und im Funktionsmanager angezeigt wird Hide function Funktion ausblenden If this function shall be hidden in menus Wenn diese Funktion in Menüs ausgeblendet werden soll Description of this function Beschreibung dieser Funktion Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Verwenden Sie \x für das erste, \y für das zweite und \z für das dritte Argument. Für weitere Informationen klicken Sie auf die Schaltfläche Hilfe. Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Bedingung, die für die Funktion wahr sein muss (z. B. wenn das zweite Argument größer sein muss als das erste: "\y > \x") Sub-Functions Unterfunktionen Arguments: Argumente: Definition of this function's arguments Definition der Argumente für diese Funktion Free Frei Integer Ganzzahl Symbol Symbol Date Datum Vector Vektor Positive number Positive Zahl Non-zero number Nicht-Null-Zahl Non-negative number Nicht-negative Zahl Positive integer Positive Ganzzahl Non-zero integer Nicht-Null-Ganzzahl Non-negative integer Nicht-negative ganze Zahl Boolean Boolescher Wert Object Objekt Unit Einheit Variable Variable Angle Winkel Data object Daten-Objekt Data property Daten-Eigenschaft _Add _Hinzufügen Add entered argument definition Eingegebene Argumentdefinition hinzufügen _Apply _Anwenden Modify selected argument Selektiertes Argument modifizieren Remove selected argument Ausgewähltes Argument entfernen Rules Regeln Edit conditions for selected argument Bedingungen für ausgewähltes Argument bearbeiten Close this dialog Diesen Dialog schließen Precalculate Vorberechnen Calculate the subfunction only once, before the parent function Die Unterfunktion nur einmal berechnen, vor der übergeordneten Funktion Add entered subfunction Eingegebene Unterfunktion hinzufügen Apply changes to the selected subfunction Änderungen auf die ausgewählte Unterfunktion anwenden Remove the selected subfunction Markierte Teilfunktion entfernen Functions Funktionen Create a new function Eine neue Funktion erstellen Edit the selected function Ausgewählte Funktion bearbeiten _Insert _Einfügen Insert (or execute) the selected function into the expression entry Einfügen (oder Ausführen) der markierten Funktion in den Ausdruckseintrag Delete the selected function Löschen der markierten Funktion (De)activate the selected function Die gewählte Funktion (de)aktivieren Deacti_vate Deakti_vieren Apply the selected function to the current expression Anwenden der ausgewählten Funktion auf den aktuellen Ausdruck Categor_y Kategorie_y _Function _Funktion Descri_ption Beschrei_bung Degrees Grad Radians Bogenmaß Gradians Neugrad Default assumptions Standardannahmen Unknown Unbekannt Not Matrix Nicht Matrix Complex Komplex Real Real Rational Rational Non-Zero Nicht-Null Positive Positiv Non-Negative Nicht-Negativ Negative Negativ Non-Positive Nicht-Positiv _File _Datei Unknown Variable Unbekannte Variable Function (simplified) Funktion (vereinfacht) Import CSV File… CSV-Datei importieren... Export CSV File… CSV-Datei exportieren... _Store Result… _Ergebnis speichern... Save Result Image… Ergebnisbild speichern... Save local functions, variables and units Lokale Funktionen, Variablen und Einheiten speichern Save Definitions Definitionen speichern Import Definitions File… Definitionsdatei importieren... Fetch current exchange rates from the Internet Aktuelle Wechselkurse aus dem Internet abrufen Update Exchange Rates Wechselkurse aktualisieren Plot Functions/Data Funktionen/Daten plotten Convert Number Bases Zahlenbasen umwandeln Floating Point Conversion (IEEE 754) Gleitkomma-Konvertierung (IEEE 754) Percentage Calculation Tool Werkzeug zur Prozentberechnung Periodic Table Periodensystem Minimal Window Minimales Fenster _Quit _Beenden Manage Variables Variablen verwalten Manage Functions Funktionen verwalten Manage Units Einheiten verwalten Manage Data Sets Datensätze verwalten Factorize Faktorisieren Expand Erweitern Apply partial fraction decomposition to the current result. Teilbruchzerlegung auf das aktuelle Ergebnis anwenden. Expand Partial Fractions Partielle Brüche expandieren Set Unknowns… Unbekannte bestimmen... Convert to Unit In Einheit umrechnen Set Prefix Präfix setzen Convert to Unit Expression… In Einheitsausdruck umrechnen... Convert to Base Units In Basiseinheiten umrechnen Convert to Optimal Unit In optimale Einheit umrechnen Insert Date… Datum einfügen... Insert Matrix… Matrix einfügen... Insert Vector… Vektor einfügen... _Copy Result _Ergebnis kopieren Customize Keypad Buttons Tastenfeld-Schaltflächen anpassen _Preferences _Voreinstellungen _Mode _Modus Number Base Zahlenbasis Select Result and Expression Base… Ergebnis und Ausdrucksbasis wählen... Binary Binär Octal Oktal Decimal Dezimal Duodecimal Duodezimal Hexadecimal Hexadezimal Other… Andere... Sexagesimal Sexagesimal Time Format Zeitformat Roman Numerals Römische Ziffern Numerical Display Numerische Anzeige Normal Normal Engineering Technisch Scientific Wissenschaftlich Purely Scientific Rein wissenschaftlich Simple Einfach Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Aus: 1/7 ≈ 0.14285714 Ein: 1/7 = 0.142857 142857... Indicate Repeating Decimals Wiederholte Dezimalstellen anzeigen Show Ending Zeroes Endnullen anzeigen Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Aus: 2.5 ≈ 3, 1.5 ≈ 2 Ein: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Halbe Zahlen auf gerade Zahlen runden Off: -x + y On: y - x Aus: -x + y Ein: y - x Sort Minus Last Minus zuletzt sortieren Complex Rectangular Form Komplexe Rechtwinklige Form Complex Exponential Form Komplexe Exponentialform Complex Polar Form Komplexe Polarform Complex Angle/Phasor Notation Komplexe Winkel-/Phasenschreibweise Rational Number Form Rationale Zahlenform 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Dezimalbrüche 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Exakte Dezimalbrüche 6/4 = 3/2 6/4 = 3/2 Simple Fractions Einfache Brüche 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Gemischte Brüche Interval Display Intervall-Anzeige Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Aus: 1/2*pi ≈ 1.5707963 Ein: 1/2*pi = 0.5 pi Adaptive Adaptiv Calculates an interval of possible values and keeps track of precision changes. Berechnet ein Intervall möglicher Werte und verfolgt die Präzisions-.änderungen Significant Digits Signifikante Ziffern Interval Intervall Plus/Minus Plus/Minus Midpoint Mittelwert Unit Display Anzeige der Einheit Do not use any prefixes in result Keine Präfixe im Ergebnis verwenden Show prefixes for primarily SI and CGS units. Präfixe für primär SI- und CGS-Einheiten anzeigen. Use prefixes for selected units Präfixe für ausgewählte Einheiten verwenden Use prefixes also for currencies Präfixe auch für Währungen verwenden Use prefixs for all units Präfixe für alle Einheiten verwenden Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Ermöglicht die automatische Verwendung von Hekto, Deka, Dezi und Centi, wenn Präfixe aktiviert sind Enable All SI Prefixes Alle SI-Präfixe einschalten Enables automatic setting of prefix for denominator in addition to the numerator Ermöglicht das automatische Setzen des Präfixes für den Nenner zusätzlich zum Zähler Enable Denominator Prefixes Nenner-Präfixe einschalten Off: J / K On: J * K^-1 Aus: J / K Ein: J * K^-1 Negative Exponents Negative Exponenten Off: (2 m)/s On: 2 (m/s) Aus: (2 m)/s Ein: 2 (m/s) Place Units Separately Einheiten gesondert platzieren No Additional Conversion Keine zusätzliche Umrechnung Convert to Optimal SI Unit In optimale SI-Einheit umrechnen If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Wenn aktiviert: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units In gemischte Einheiten umrechnen Abbreviate Names Namen abkürzen Enabled Objects Aktivierte Objekte Variables Variablen Units Einheiten Unknowns Unbekannte Units in Physical Constants Einheiten in physikalischen Konstanten If not enabled, treats all variables as unknown Wenn nicht aktiviert, werden alle Variablen als unbekannt behandelt Calculate Variables Variablen berechnen Disables/enables complex numbers in result Deaktiviert/aktiviert komplexe Zahlen im Ergebnis Allow Complex Result Komplexes Ergebnis zulassen Disables/enables infinite numbers in result Deaktiviert/aktiviert unendliche Zahlen im Ergebnis Allow Infinite Result Unendliches Ergebnis zulassen Approximation Annäherung Always Exact Immer genau Try Exact Exakt versuchen Approximate Annähern Interval Arithmetic Intervall-Arithmetik Interval Calculation Intervall-Berechnung Variance Formula Varianz-Formel Change angle unit used in trigonometric functions Ändern der in trigonometrischen Funktionen verwendeten Winkeleinheit Angle Unit Winkeleinheit None Keine Assumptions Annahmen Algebraic Mode Algebraischer Modus Assume that unknown denominators are non-zero Annehmen, dass unbekannte Nenner ungleich Null sind Non-Zero Denominators Nicht-Null-Nenner Warn when unknown denominators are assumed non-zero Warnen, wenn unbekannte Nenner als ungleich Null angenommen werden Warn About Denominators Assumed Non-Zero Warnung bei angenommenen Nennern ungleich Null Parsing Mode Analyse-Modus Adaptive Parsing Adaptive Analyse Parse Implicit Multiplication First Implizite Multiplikation zuerst analysieren Conventional Parsing Konventionelles Analysieren Chain Syntax Verketteter Syntax RPN Syntax RPN-Syntax Off: xy = x*y On: xy != x*y Aus: xy = x*y Ein: xy != x*y Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analysiert Dezimalzahlen als Näherungswerte mit einer Genauigkeit, die der Anzahl der Ziffern entspricht. Aus: 1.1 * 1.1 = 1.21 Ein: 1.1 * 1.1 ≈ 1.2 Read Precision Genauigkeit lesen _Precision _Genauigkeit _Decimals _Dezimalstellen Calculate As You Type Berechnen während der Eingabe Chain Mode Methodenverkettung Activate the RPN stack. Aktivieren Sie den RPN-Stapel. RPN Mode RPN-Modus Meta Modes Meta-Modi Save Mode… Speichere Modus... Delete Mode… Modus löschen... Save Default _Mode Standard _Modus speichern Fu_nctions Fu_nktionen _Variables _Variablen _Units _Einheiten _Contents _Inhalte Report a Bug Einen Fehler melden Check for Updates Nach Updates suchen _About _Über Toggle minimal window Schalte um auf minimales Fenster Calculation result Berechnungsergebnis _Keypad _Tastatur Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Schaltet das beständige Tastenfeld um (ermöglicht die gleichzeitige Anzeige von Tastenfeld und Verlauf) _History _Historie C_onversion U_mrechnung RPN Stack RPN-Stack Insert the selected value Einfügen des markierten Wertes Insert the selected text Einfügen des markierten Textes Copy the selected text Kopieren des markierten Textes Add the selected value(s) Addiert den/die markierten Wert(e) Subtract the selected value(s) Subtrahiert den/die markierten Wert(e) Multiply the selected value(s) Multiplizieren des/der markierten Werte(s) Divide the the selected value(s) Dividieren des/der markierten Werte(s) Raise to the power of the selected value Erhöhen mit der Potenz des markierten Wertes Calculate the square root of the selected value Berechnen der Quadratwurzel des gewählten Wertes History Verlauf Subtract the top value from the second value Subtrahieren des oberen Wertes vom zweiten Wert Multiply the top two values Multiplizieren der beiden oberen Werte Divide the second value by the top value Dividieren des zweiten Wertes durch den oberen Wert Raise the second value to the power of the top value Erhöhen des zweiten Wertes mit der Potenz des oberen Wertes Negate the top value (Ctrl+-) Negieren des oberen Wertes (Strg+-) Invert the top value Invertieren des oberen Wertes Calculate the square root of the top value Quadratwurzel des obersten Wertes berechnen Calculate the sum of all values Summe aller Werte berechnen Rotate the stack or move selected register up Drehen des Stapels oder Verschieben des ausgewählten Register nach oben Rotate the stack or move selected register down Drehen des Stapels oder Verschieben des ausgewählten Register nach unten Swap the two top values or move the selected value to the top of the stack Vertauschen Sie die beiden oberen Werte oder verschieben Sie den ausgewählten Wert an die Spitze des Stapels Copy the selected or top value to the top of the stack Kopieren des ausgewählten oder obersten Wertes an die Spitze des Stapels Enter the top value from before the last numeric operation Eingabe des obersten Wertes von vor der letzten numerischen Operation Delete the top or selected value Löschen des oberen oder ausgewählten Wertes Edit the selected value Bearbeiten des ausgewählten Wertes Clear the RPN stack Löschen des RPN-Stack Unit(s) and prefix to convert result to Einheit(en) und Präfix zum Umrechnen des Ergebnisses in Convert Umrechnen Continuous conversion Kontinuierliche Konvertierung Automatically convert result to the current unit expression as long as the conversion box is visible. Ergebnis automatisch in den aktuellen Einheitenausdruck umrechnen, solange das Umrechnungsfeld sichtbar ist. Add prefix Präfix hinzufügen If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Wenn der Einheitsausdruck keine Präfixe enthält, verwenden Sie das optimale Präfix. Dies kann außer Kraft gesetzt werden, indem dem Einheitenausdruck ein "?" oder "0" vorangestellt wird. Conversion Konvertierung Show/hide programming keypad Programmiertastatur ein-/ausblenden Exact Genau Fraction Bruchteil Numerical display Numerische Anzeige Pure Rein Number base Zahlenbasis Time format Zeitformat Roman Römisch sin sin cos cos tan tan ln ln Equals Entspricht sqrt sqrt sum sum Unknown variable Unbekannte Variable mod mod mean Mittelwert Store result as a variable Ergebnis als Variable speichern STO Standard calculator button. Do not use more than three characters. STO Convert number bases Zahlenbasen umrechnen Imaginary unit i (√-1) Imaginäre Einheit i (√-1) Manage units Einheiten verwalten Conversion operator Umrechnungsoperator Kilogram Kilogramm Two's complement input Zweierkomplement Eingabe Two's complement output Zweierkomplement-Ausgabe Bitwise Exclusive OR Bitweise Exklusiv-ODER Bitwise Left Shift Bitweise Linksverschiebung Bitwise Right Shift Bitweise Rechtsverschiebung Floating point conversion Gleitkomma-Konvertierung Show/hide left keypad Linkes Tastenfeld ein-/ausblenden Show/hide right keypad Rechtes Tastenfeld ein-/ausblenden DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Vorheriges Ergebnis ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Zum Ausdruck hinzufügen Persistent Keypad Beständiges Tastenfeld Edit Bearbeiten Delete Löschen Update Aktualisieren Insert Value Wert einfügen Insert Text Text einfügen Insert Parsed Text Analysierten Text einfügen Copy Kopieren Copy Full Text Vollständigen Text kopieren Search… Suchen... Add Bookmark… Lesezeichen hinzufügen... Bookmarks Lesezeichen Protect Schützen Move To Top Nach oben verschieben Remove Entfernen Clear All Alles löschen _Copy _Kopieren _Store… _Sichern... Save Image… Bild speichern... _Factorize _Faktorisieren _Expand _Expandieren _Normal _Normal Sc_ientific Wi_ssenschaftlich Purel_y Scientific Rei_n Wissenschaftlich Simp_le Simp_le _Binary _Binär _Octal _Oktal _Decimal _Dezimal _Hexadecimal _Hexadezimal Decimal Fraction Dezimalbruch Exact Decimal Fraction Exakter Dezimalbruch Simple Fraction Einfacher Bruch Mixed Fraction Gemischter Bruch _Abbreviate Names _Namen abkürzen C_onvert… U_mrechnen... Convert to Base _Units Umrechnen in Basis _Einheiten Convert _to Optimal Unit Umrechnen _in optimale Einheit Use Optimal Prefix Optimalen Präfix verwenden Convert to Konvertiere in Convert to UTC Konvertiere in UTC Convert to Calendars Konvertiere in Kalender Use prefixes for all units Präfixe für alle Einheiten verwenden Enable All SI Prefi_xes Alle SI-Präfi_xe aktivieren View/Edit Matrix Matrix anzeigen/bearbeiten View/Edit Vector Vektor anzeigen/bearbeiten Copy Text Text kopieren To Top Nach oben Swap Tauschen Up Hoch Down Runter Negate Negieren Invert Invertieren Square Quadratisch Square Root Quadratische Wurzel Clear Stack Stapel löschen Select Number Base… Zahlenbasis wählen... Store result Ergebnis speichern Add result Add current result to variable value Ergebnis addieren Subtract result Subtruct current result from variable value Ergebnis subtrahieren Insert the matrix/vector into the expression Einfügen der Matrix/des Vektors in den Ausdruck Rows Zeilen Number of rows in this matrix (rows displayed for vectors) Anzahl der Zeilen in dieser Matrix (bei Vektoren werden die Zeilen angezeigt) Columns Spalten Number of columns in this matrix (columns displayed for vectors) Anzahl der Spalten in dieser Matrix (bei Vektoren werden die Spalten angezeigt) If this is a matrix or vector Wenn dies eine Matrix oder ein Vektor ist Elements Elemente Current element: Aktuelles Element: Edit Matrix Matrix bearbeiten Do not create/modify this matrix/vector Diese Matrix/Vektor nicht erstellen/verändern Create/modify the matrix/vector Matrix/Vektor erstellen/verändern Accept the creation/modification of this matrix/vector Anlegen/Ändern dieser Matrix/des Vektors übernehmen Name used to reference this variable in expressions Name, der verwendet wird, um diese Variable in Ausdrücken zu referenzieren Names Namen Add new name Neuen Namen hinzufügen Apply changes to the selected name Änderungen auf den ausgewählten Namen anwenden Remove the selected name Den ausgewählten Namen entfernen Abbreviation Abkürzung Unicode Unicode Plural Plural Suffix Nachsilbe Reference Referenz Avoid input Eingabe vermeiden Case sensitive Groß-/Kleinschreibung beachten Completion only Nur Vervollständigung Number Bases Zahlen-Basen Roman numerals Römische Ziffern BIN BIN OCT OKT DEC DEZ DUO DUO HEX HEX ROM ROM Subtract Subtrahieren Multiply Multiplizieren Divide Dividieren Bitwise AND Bitweise UND Bitwise OR Bitweises ODER Bitwise NOT Bitweises NICHT Clear Löschen Enter two values, of which at most one is a percentage, and the others will be calculated for you. Geben Sie zwei Werte ein, von denen höchstens einer ein Prozentwert ist, und die anderen werden für Sie berechnet. Percentage Prozentsatz Calculate Berechnen Value 1 Wert 1 2 compared to 1 2 im Vergleich zu 1 Change from 1 to 2 Änderung von 1 auf 2 Value 2 Wert 2 1 compared to 2 1 im Vergleich zu 2 Change from 2 to 1 Änderung von 2 auf 1 Plot Plotten _Save _Speichern Save as png, svg, postscript, eps, latex or fig Speichern als png, svg, postscript, eps, latex oder fig Vector/matrix Vektor/Matrix Paired matrix Gepaarte Matrix if you want to split matrix in rows instead of columns wenn Sie die Matrix in Zeilen statt in Spalten aufteilen wollen X variable X Variable The variable name used in expression Der Name der Variable, die im Ausdruck verwendet wird Style Stil Line Zeile Points Punkte Line with points Linie mit Punkten Boxes/bars Boxen/Balken Histogram Histogramm Steps Stufen Candlesticks Kerzenständer Dots Punkte Smoothing Glättung Monotonic Monoton Natural cubic splines Natürliche kubische Splines Bezier Bézier Bezier (monotonic) Bézier (monoton) Y-axis Y-Achse Primary Primär Secondary Sekundär _Remove _Entfernen Data Daten Minimum x value Minimaler x-Wert Maximum x value Maximaler x-Wert Sampling rate Abtastrate Step size Schrittweite Function Range Funktionsbereich Display grid Raster anzeigen Display full border Vollen Rand anzeigen Minimum y value Minimaler y-Wert Maximum y value Maximaler y-Wert Logarithmic x scale Logarithmische x-Skala Logarithmic y scale Logarithmische y-Skala X-axis label X-Achsen-Beschriftung Y-axis label Y-Achsen-Beschriftung Line width Linienbreite Color display Farbdarstellung Color Farbe Monochrome Monochrom Legend placement Platzierung der Legende Top-left Oben-links Top-right Oben-rechts Bottom-left Unten-links Bottom-right Unten-rechts Below Unterhalb Outside Außerhalb Appearance Erscheinungsbild Precision Genauigkeit _Recalculate _Neuberechnen Recalculate expression Ausdruck neu berechnen The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Die Anzahl der signifikanten Stellen, die angezeigt/berechnet werden sollen (einfache Arithmetik wird immer exakt berechnet) Preferences Einstellungen Save mode on exit Modus beim Beenden speichern If the mode of the calculator shall be restored Wenn der Modus des Taschenrechners wiederhergestellt werden soll Save definitions on exit Definitionen beim Beenden speichern If changes to functions, units and variables shall be saved automatically Wenn Änderungen an Funktionen, Einheiten und Variablen automatisch gespeichert werden sollen Clear history on exit Verlauf beim Beenden löschen Allow multiple instances Mehrere Instanzen zulassen Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Erlaubt, dass mehrere Instanzen des Hauptfensters von Qalculate! gleichzeitig geöffnet sein können. Beachten Sie, dass nur der Modus, der Verlauf und die Definitionen der zuletzt geschlossenen Instanz gespeichert werden. Notify when a new version is available Benachrichtigen, wenn eine neue Version verfügbar ist Use keyboard keys for RPN Tasten auf der Tastatur für RPN verwenden Use keyboard operator keys for RPN operations (+-*/^). Tastaturoperatortasten für RPN-Operationen verwenden (+-*/^). Use caret for bitwise XOR Einfügezeichen für bitweises XOR verwenden Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Eingabe von XOR (⊻) mit Einfügezeichen (^) auf der Tastatur (sonst mit Strg+^). Der Potenzierungsoperator (^) kann immer mit Strg+* eingegeben werden. Add calculate-as-you-type result to history Berechne-während-du-tippst-Ergebnis zur Historie hinzufügen Delay: Verzögern: Time limit for plot: Zeitlimit für Plot: Behavior Verhalten Enable Unicode symbols Unicode-Symbole einschalten Disable this if you have problems with some fancy characters Deaktivieren Sie dies, wenn Sie Probleme mit einigen ausgefallenen Zeichen haben Ignore system language (requires restart) Systemsprache ignorieren (erfordert Neustart) Use system tray icon Systemtray-Symbol verwenden Hides the application in the system tray when the main window is closed Versteckt die Anwendung in der Taskleiste, wenn das Hauptfenster geschlossen wird Hide on startup Beim Starten ausblenden Remember window position Fensterposition merken Application name Name der Anwendung Result Ergebnis Application name + result Anwendungsname + Ergebnis Mode Modus Application name + mode Anwendungsname + Modus Window title Fenstertitel Default Standard Light Hell Dark Dunkel High contrast Hoher Kontrast Dark high contrast Dunkel Hochkontrast Theme Design Button padding Schaltflächen Abstand / / Number of expression lines Anzahl der Ausdruckszeilen 3 3 Display expression status Anzeige des Ausdrucksstatus If as-you-type expression status shall be displayed below the expression entry Wenn der Status des Ausdrucks "während-du-tippst" unterhalb des Ausdruckseintrags angezeigt werden soll Persistent keypad Beständiges tastenfeld Look & Feel Aussehen & Bedienung Binary two's complement representation Binäre Zweierkomplement-Darstellung If two's complement representation shall be used for negative binary numbers. Ob die Zweierkomplement-Darstellung für negative Binärzahlen verwendet werden soll. Hexadecimal two's complement representation Hexadezimale Zweierkomplement-Darstellung If two's complement representation shall be used for negative hexadecimal numbers. Wenn die Zweierkomplement-Darstellung für negative Hexadezimalzahlen verwendet werden soll. Use lower case letters in non-decimal numbers Kleinbuchstaben in Zahlen mit nicht-dezimaler Basis verwenden If lower case letters should be used in numbers with non-decimal base Wenn Kleinbuchstaben in Zahlen mit nicht dezimaler Basis verwendet werden sollen Alternative base prefixes Alternative Basis-Präfixe If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Wenn hexadezimale Zahlen mit "0x0" und binäre Zahlen mit "0b00" als Präfixe dargestellt werden sollen Spell out logical operators Logische Operatoren ausbuchstabieren If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Wenn logisch und/oder als "&&"/"||" oder "and"/"or" dargestellt werden soll If "e" shall be used instead of "E" in numbers Wenn "e" statt "E" in Zahlen verwendet werden soll Use E-notation instead of 10<sup><i>n</i></sup> E-Notation anstelle von 10<sup><i>n</i></sup> verwenden Use lower case "e" (as in 1e10) Kleinschreibung von "e" verwenden (wie in 1e10) Use 'j' as imaginary unit 'j' als imaginäre Einheit verwenden Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Verwenden Sie 'j' (anstelle von 'i') als Standardsymbol für die imaginäre Einheit, und platzieren Sie es vor dem Imaginärteil. Use comma as decimal separator Komma als Dezimaltrennzeichen verwenden Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Punkt, '.', als Tausendertrennzeichen anstelle eines alternativen Dezimalzeichens zulassen Ignore comma in numbers Komma in Zahlen ignorieren Allow commas, ',', to be used as thousands separator instead of as an function argument separator Erlaubt die Verwendung von Kommas, ',', als Tausendertrennzeichen statt als Funktionsargumenttrennzeichen Ignore dots in numbers Punkte in Zahlen ignorieren Digit grouping Zifferngruppierung off aus standard Standard local lokal Multiplication sign Multiplikationszeichen Division sign Divisionszeichen Copy digit separator Zifferntrennzeichen kopieren Deactivate to remove digit separator when copying result Deaktivieren, um Zifferntrennzeichen beim Kopieren des Ergebnisses zu entfernen Numbers & Operators Zahlen & Operatoren Use binary prefixes for information units Binäre Präfixe für Informationseinheiten verwenden Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Verwenden Sie standardmäßig binäre, statt dezimale Präfixe für Informationseinheiten (z.B. Bytes). Conversion to local currency Umrechnung in Landeswährung Automatically convert to the local currency when optimal unit conversion is activated. Konvertieren Sie automatisch in die lokale Währung, wenn die optimale Einheitenumrechnung aktiviert ist. Update exchange rates on start Wechselkurse beim Start aktualisieren If current exchange rates shall be downloaded from the internet at program start Wenn die aktuellen Wechselkurse beim Programmstart aus dem Internet geladen werden sollen Exchange rates updates Wechselkurse aktualisieren Temperature calculation mode: Temperatur-Berechnungsmodus: Absolute Absolut Relative Relativ Hybrid Hybrid Units & Currencies Einheiten & Währungen Show expression completion suggestions Vorschläge zur Vervollständigung von Ausdrücken anzeigen Search titles and countries Titel und Länder suchen Minimum characters Minimale Zeichen Popup delay (ms) Popup-Verzögerung (ms) Completion Vervollständigung Status warning color Farbe der Status-Warnung Status error color Farbe für Status-Fehler Custom status font Benutzerdefinierte Schriftart für den Status If you want to use a font other than the default in the status display below the expression entry Wenn Sie in der Statusanzeige unter dem Ausdruckseintrag eine andere als die Standardschriftart verwenden möchten Custom expression font Benutzerdefinierte Ausdrucksschriftart If you want to use a font other than the default in the expression entry Wenn Sie in der Ausdruckseingabe eine andere als die Standardschriftart verwenden möchten Custom result font Benutzerdefinierte Ergebnisschriftart If you want to use a font other than the default in the result display Wenn Sie in der Ergebnisanzeige eine andere Schriftart als die Standardschriftart verwenden möchten Custom keypad font Benutzerdefinierte Tastenfeldschriftart If you want to use a font other than the default in the keypad Wenn Sie eine andere Schriftart als die Standardschriftart im Tastenfeld verwenden möchten Custom application font Benutzerdefinierte Anwendungsschriftart If you want to use a font other than the default for the whole application Wenn Sie eine andere als die Standardschriftart für die gesamte Anwendung verwenden möchten Text color Textfarbe Fonts & Colors Schriftarten und Farben Other: Andere: Bijective base-26 Bijektive Basis-26 <b>Result Base</b> <b>Ergebnisbasis</b> <b>Expression Base</b> <b>Ausdrucksbasis</b> New Keyboard Shortcut Neues Tastaturkürzel Edit Variable Variable bearbeiten Advanced Erweitert Accept the creation/modification of this variable Erstellen/Ändern dieser Variable übernehmen. x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Verwenden Sie x, y und z jeweils für das erste, zweite und dritte Funktionsargument. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Verwenden Sie \x, \y und \z für das erste, zweite bzw. dritte Funktionsargument. Dadurch werden mögliche Konflikte mit Variablen, Funktionen und Einheiten vermieden. Edit Unit Einheit bearbeiten Do not create/modify this unit Diese Einheit nicht erstellen/verändern Accept the creation/modification of this unit Erstellen/Ändern dieser Einheit übernehmen. Singular form of this unit's name Singularform des Einheitennamens Title displayed in menus and in unit manager Titel wird in Menüs und im Einheitenmanager angezeigt System System Imperial Imperial US Survey US-Umfrage Hide unit Einheit ausblenden If this unit shall be hidden in menus Wenn diese Einheit in Menüs ausgeblendet werden soll Class Klasse The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Die Klasse, zu der diese Einheit gehört. Benannte abgeleitete Einheiten werden in Bezug auf eine einzelne andere Einheit definiert, mit einem optionalen Exponenten, während (unbenannte) abgeleitete Einheiten durch einen Einheitenausdruck mit einer oder mehreren Einheiten definiert werden. Base unit Basiseinheit Named derived unit Benannte abgeleitete Einheit Derived unit Abgeleitete Einheit Base unit(s) Basiseinheit(en) Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to Einheit (für benannte abgeleitete Einheit) oder Einheitenausdruck (für unbenannte abgeleitete Einheit), die diese Einheit in Bezug auf Exponent Exponent Exponent of the base unit Exponent der Basiseinheit Relation Relation Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation zur Basiseinheit. Für lineare Beziehungen sollte dies einfach eine Zahl sein. Für nicht lineare Beziehungen verwenden Sie \x für den Faktor und \y für den Exponenten (z.B. "\x + 273,15" für die Beziehung zwischen Grad Celsius und Kelvin). Relation is exact Relation ist exakt If the relation is precise Wenn die Relation exakt ist Inverse relation Inverse Relation Specify for non-linear relation, for conversion back to the base unit. Bei nicht-linearer Relation angeben, zur Umrechnung zurück in die Basiseinheit. Mix with base unit Mit Basiseinheit mischen - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Entscheidet, mit welchen Einheiten die Basiseinheit gemischt wird, wenn mehrere Optionen vorhanden sind. - Die ursprüngliche Einheit wird nicht mit Einheiten mit niedrigerer Priorität gemischt. - Ein niedrigerer Wert bedeutet höhere Priorität. Priority Vorrangig Minimum base unit number Minimale Nummer der Basiseinheit Use with prefixes by default Standardmäßig mit Präfixen verwenden Create a new unit Eine neue Einheit erstellen Edit the selected unit Die ausgewählte Einheit bearbeiten Insert the selected unit into the expression entry Einfügen der ausgewählten Einheit in den Ausdruckseintrag C_onvert U_mrechnen Convert the result to the selected unit Das Ergebnis in die ausgewählte Einheit umrechnen Delete the selected unit Löschen der selektierten Einheit (De)activate the selected unit Selektierte Einheit (de)aktivieren _Unit _Einheit Convert between units Zwischen Einheiten umrechnen = = Conver_sion Umrech_nung Converted value Umgerechneter Wert Value to convert from Umzurechnender Wert von Type anywhere Eingabe irgendwo Edit Unknown Variable Unbekannte Variable bearbeiten Do not create/modify this unknown variable Diese unbekannte Variable nicht erstellen/verändern Accept the creation/modification of this unknown variable Erstellung/Änderung dieser unbekannten Variable übernehmen Name used to reference this unknown variable in expressions Name, der verwendet wird, um diese unbekannte Variable in Ausdrücken zu referenzieren Use custom assumptions Benutzerdefinierte Annahmen verwenden Type Typ Real Number Reelle Zahl Rational Number Rationale Zahl Sign Vorzeichen The category this unknown variable belongs to Die Kategorie, zu der diese unbekannte Variable gehört Value of this variable (expression) Wert der Variable (Ausdruck) value is exact Wert ist genau If the value is precise Wenn der Wert genau ist The category this variable belongs to Die Kategorie, zu der diese Variable gehört Create a new variable Eine neue Variable erstellen Edit the selected variable Bearbeiten Sie die ausgewählte Variable Insert the selected variable into the expression entry Einfügen der ausgewählten Variable in den Ausdruckseintrag Delete the selected variable Löschen der ausgewählten Variable (De)activate the selected variable Ausgewählte Variable (de)aktivieren E_xport E_xportieren _Variable _Variable Execute expressions and commands from a file Ausdrücke und Befehle aus einer Datei ausführen Start a new instance of the application Eine neue Instanz der Applikation starten Display the application version Anzeigen der Applikationsversion Specify the window title Festlegen des Fenstertitels TITLE TITEL Expression to calculate Zu berechnender Ausdruck [EXPRESSION] [AUSDRUCK] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Geben Sie oben einen mathematischen Ausdruck ein, z. B. "5 + 2 / 3", und drücken Sie die Eingabetaste. ans ans Last Answer Letzte Antwort answer antwort Answer 2 Antwort 2 Answer 3 Antwort 3 Answer 4 Antwort 4 Answer 5 Antwort 5 Memory Speicher Failed to load global definitions! Das Laden der globalen Definitionen ist fehlgeschlagen! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Alle By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Standardmäßig ist nur eine Instanz (ein Hauptfenster) von %s erlaubt. Wenn mehrere Instanzen gleichzeitig geöffnet werden, werden nur die Definitionen (Variablen, Funktionen usw.), der Modus, die Einstellungen und der Verlauf des zuletzt geschlossenen Fensters gespeichert. Möchten Sie trotzdem die Standardvorgabe ändern und mehrere gleichzeitige Instanzen zulassen? c-format Right-click/long press: %s Rechtsklick/Lang drücken: %s c-format Right-click: %s Rechtsklick: %s c-format Middle-click: %s Mittelklick: %s c-format Cycle through previous expression Durchlaufen vorheriger Ausdrücke Move cursor left or right Mauszeiger nach links oder rechts bewegen Move cursor to beginning or end Mauszeiger zum Anfang oder Ende bewegen Uncertainty/interval Ungenauigkeit/Intervall Relative error Relativer Fehler Argument separator Argument-Trennzeichen Blank space Leerzeichen New line Neue Zeile Smart parentheses Intelligente Klammern Vector brackets Vektorielle Klammern Left parenthesis Linke Klammer Left vector bracket Linke Vektor-Klammer Right parenthesis Rechte Klammer Right vector bracket Rechte Vektor-Klammer Decimal point Dezimalpunkt Raise (Ctrl+*) Erhöhen (Strg+*) Add Hinzufügen M+ (memory plus) M+ (Speicher plus) MC (memory clear) MC (Speicher löschen) Backspace Rücktaste M− (memory minus) M- (Speicher minus) Previous result (static) Vorheriges Ergebnis (statisch) Calculate expression Ausdruck berechnen MR (memory recall) MR (Speicherabruf) MS (memory store) MS (Speicher speichern) Set unknowns Unbekannte setzen more Show further items in a submenu mehr Logical AND Logisches UND Logical OR Logisches ODER Logical NOT logisches NICHT Toggle Result Base Ergebnisbasis umschalten Open menu with stored variables Menü mit gespeicherten Variablen öffnen Index Index ENTER RPN Enter (calculate and add to stack) EINGABE Calculate expression and add to stack Ausdruck berechnen und zum Stapel hinzufügen Flag Flagge Matrices Matrizen Gregorian Gregorianisch Revised Julian (Milanković) Neujulianisch (Milanković) Julian Julianisch Islamic (Hijri) Islamisch (Hijri) Hebrew Hebräisch Chinese Chinesisch Persian (Solar Hijri) Persisch (Solar Hijri) Coptic Koptisch Ethiopian Äthiopisch Indian (National) Indisch (National) Action Aktion Key combination Tastenkombination Raise Erhöhen History Answer Value Verlauf Ergebniswert History Index(es) Verlaufsindex(e) History index %s does not exist. Verlaufsindex %s existiert nicht. c-format expression ausdruck History Parsed Expression Verlauf des analysierten Ausdrucks Set Window Title Fenstertitel setzen Failed to open %s. %s Konnte %s. nicht öffnen %s c-format Could not display help for Qalculate!. Konnte keine Hilfe für Qalculate! anzeigen. Could not display help for Qalculate!. %s Konnte keine Hilfe für Qalculate! anzeigen. %s c-format approx. ca. Stop process Prozess anhalten Clear expression Ausdruck löschen EXACT EXAKT APPROX CIRCA RPN RPN CHN Chain mode CHN ROMAN RÖMISCH DEG DEG RAD RAD GRA GRA PREC PREZ FUNC FUNK UNIT EINHEIT VAR VAR INF INF CPLX KPLX Do you wish to update the exchange rates now? Möchten Sie die Wechselkurse jetzt aktualisieren? It has been %s day since the exchange rates last were updated. Es ist %s Tag seit der letzten Aktualisierung der Wechselkurse vergangen. Es sind %s Tage seit der letzten Aktualisierung der Wechselkurse vergangen. c-format It has been %s days since the exchange rates last were updated. Do not ask again Nicht erneut fragen It took too long to generate the plot data. Es hat zu lange gedauert, die Plotdaten zu generieren. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Es hat zu lange gedauert, die Plotdaten zu generieren. Bitte verringern Sie die Abtast-rate oder erhöhen Sie das Zeitlimit in den Einstellungen. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Wenn während der Berechnung Fehler, Warnungen und andere Informationen generiert werden, ändert sich das Symbol in der oberen rechten Ecke des Ausdruckseintrags, um dies anzuzeigen. Wenn Sie den Zeiger über das Symbol halten oder darauf klicken, wird die Meldung angezeigt. Path of executable not found. Pfad der ausführbaren Datei nicht gefunden. curl not found. curl nicht gefunden. Failed to run update script. %s Update-Skript konnte nicht ausgeführt werden. %s c-format Failed to check for updates. Prüfung auf Updates fehlgeschlagen. No updates found. Keine Updates gefunden. A new version of %s is available at %s. Do you wish to update to version %s. Eine neue Version von %s ist verfügbar unter %s. Möchten Sie auf die Version %s aktualisieren. c-format A new version of %s is available. You can get version %s at %s. Eine neue Version von %s ist verfügbar. Sie können die Version %s unter %s erhalten. c-format Too many arguments for %s(). Zu viele Argumente für %s(). c-format argument argument Temperature Calculation Mode Temperatur-Berechnungsmodus The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Der Ausdruck ist mehrdeutig. Bitte wählen Sie den Temperaturberechnungsmodus (der Modus kann später in den Einstellungen geändert werden). Interpretation of dots Interpretation von Punkten Please select interpretation of dots (".") (this can later be changed in preferences). Bitte wählen Sie die Interpretation der Punkte (".") (dies kann später in den Einstellungen geändert werden). Both dot and comma as decimal separators Sowohl Punkt als auch Komma als Dezimaltrennzeichen Dot as thousands separator Punkt als Tausendertrennzeichen Only dot as decimal separator Nur Punkt als Dezimaltrennzeichen Uncategorized Nicht kategorisiert hexadecimal hexadezimal octal oktal decimal dezimal duodecimal duodezimal binary binär roman römisch bijective bijektiv sexagesimal sexagesimal latitude breitengrad longitude längengrad time zeit bases basen calendars kalendarien rectangular rechtwinklig cartesian kartesisch exponential exponentiell polar polar angle winkel phasor phase optimal optimal base basis mixed gemischt fraction bruchteil factors faktoren partial fraction teilbruch factorize faktorisieren expand erweitern hexadecimal number hexadezimale zahl octal number oktalzahl decimal number dezimalzahl duodecimal number duodezimalzahl binary number binärzahl roman numerals römische Ziffern bijective base-26 bijektive basis-26 sexagesimal number sexagesimale Zahl 32-bit floating point 32-Bit-Gleitkomma 64-bit floating point 64-Bit-Gleitkomma 16-bit floating point 16-Bit Gleitkomma 80-bit (x86) floating point 80-Bit (x86) Gleitkomma 128-bit floating point 128-Bit Gleitkomma time format zeitformat number bases zahlenbasen optimal unit optimale einheit base units basiseinheiten mixed units gemischte einheiten expanded partial fractions erweiterte teilbrüche complex rectangular form komplexe rechteckform complex exponential form komplexe exponentialform complex polar form komplexe polarform complex cis form komplexe cis-form complex angle notation komplexe winkeldarstellung complex phasor notation komplexe Phasenschreibweise UTC time zone UTC-Zeitzone number base %s zahlenbasis %s c-format Inactive Inaktiv Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Ruft Daten aus dem %s-Datensatz für ein angegebenes Objekt und eine Eigenschaft ab. Wenn "info" als Eigenschaft eingegeben wird, wird ein Dialogfenster mit allen Eigenschaften des Objekts angezeigt. c-format Example: Beispiel: Arguments Argumente optional optional argument optional default: argument default, in description standard: Requirement Bedingung key indicating that the property is a data set key Taste Acti_vate Akti_vate a previous result ein vorheriges Ergebnis matrix matrix vector vektor positive positiv non-positive nicht-positiv negative negativ non-negative nicht-negativ non-zero nicht-null boolean boolesch integer ganzzahlig rational rational real reell complex komplex number zahl (not matrix) (nicht Matrix) unknown unbekannt default assumptions standardmäßige Annahmen Variable does not exist anymore. Variable existiert nicht mehr. Data Retrieval Function Funktion zum Abrufen von Daten Insert function Funktion einfügen Insert function (dialog) Funktion einfügen (Dialog) Insert variable Variable einfügen Insert unit Einheit einfügen Insert text Text einfügen Insert date Datum einfügen Insert vector Vektor einfügen Insert matrix Matrix einfügen Insert smart parentheses Intelligente Klammern einfügen Convert to unit In Einheit umrechnen Convert to unit (entry) In Einheit umrechnen (Eingabe) Convert to optimal unit In optimale Einheit umrechnen Convert to base units In Basiseinheiten umrechnen Convert to optimal prefix In optimales Präfix umrechnen Convert to number base In Zahlenbasis umrechnen Factorize result Ergebnis faktorisieren Expand result Expandieren des Ergebnisses Expand partial fractions Expandieren von Teilbrüchen RPN: down RPN: abwärts RPN: up RPN: aufwärts RPN: swap RPN: tauschen RPN: copy RPN: kopieren RPN: lastx RPN: lastx RPN: delete register RPN: Register löschen RPN: clear stack RPN: Stapel löschen Load meta mode Metamodus laden Set expression base Ausdrucksbasis einstellen Set result base Ergebnisbasis einstellen Toggle exact mode Exakten Modus einstellen Set angle unit to degrees Winkeleinheit auf Grad stellen Set angle unit to radians Winkeleinheit auf Bogenmaß stellen Set angle unit to gradians Winkeleinheit auf Gradienten stellen Toggle simple fractions Einfache Brüche umschalten Toggle mixed fractions Gemischte Brüche umschalten Toggle scientific notation Umschalten der wissenschaftlichen Schreibweise Toggle simple notation Umschalten der einfachen Schreibweise Toggle RPN mode RPN-Modus umschalten Toggle calculate as you type Umschalten zwischen Rechnen während der Eingabe Toggle programming keypad Programmiertastatur ein- und ausschalten Show keypad Tastenfeld anzeigen Show history Verlauf anzeigen Search history Verlauf suchen Show conversion Umrechnung anzeigen Show RPN stack RPN-Stack anzeigen Manage variables Variablen verwalten Manage functions Funktionen verwalten Manage data sets Datensätze verwalten New variable Neue Variable New function Neue Funktion Open plot functions/data Plotfunktionen/Daten öffnen Open convert number bases Aufruf Zahlenbasis konvertieren Open floating point conversion Gleitkomma-Konvertierung öffnen Open calender conversion Kalenderkonvertierung öffnen Open percentage calculation tool Prozentrechnungs-Tool öffnen Open periodic table Periodensystem öffnen Update exchange rates Wechselkurse aktualisieren Copy result Ergebnis kopieren Insert result Text einfügen Save result image Ergebnisbild speichern Help Hilfe Quit Beenden Toggle chain mode Schalte um auf Methodenverkettung Toggle keep above Exakten Modus einstellen Show/hide completion Keine Fertigstellung Prefixes Präfixe No Prefix Kein Präfix Optimal Prefix Optimales Präfix Prefix Präfix Complex angle/phasor notation Komplexe Winkel-/Phasenschreibweise Number bases Zahlenbasen Base units Basiseinheiten Binary number Binäre Zahlen Calendars Kalendarien Complex cis form Komplexe cis-Form Decimal number Dezimalzahl Duodecimal number Duodezimale Zahl Complex exponential form Komplexe Exponentialform Factors Faktoren 16-bit floating point binary format 16-Bit-Gleitkomma-Binärformat 32-bit floating point binary format 32-Bit-Gleitkomma-Binärformat 64-bit floating point binary format 64-Bit-Gleitkomma-Binärformat 80-bit (x86) floating point binary format 80-Bit (x86) Fließkomma-Binärformat 128-bit floating point binary format 128-Bit Fließkomma-Binärformat Hexadecimal number Hexadezimalzahl Latitude Breitengrad Longitude Längengrad Mixed units Gemischte Einheiten Octal number Oktalzahl Optimal units Optimale Einheiten Expanded partial fractions Erweiterte Teilbrüche Complex polar form Komplexe Polarform Complex rectangular form Komplexe Rechteckform Sexagesimal number Sexagesimalzahl and und or oder undefined undefiniert result is too long see history Ergebnis ist zu lang siehe Verlauf calculation was aborted Berechnung wurde abgebrochen RPN Register Moved RPN-Register verschoben RPN Operation RPN-Operation Processing… Verarbeitung... result processing was aborted ergebnisverarbeitung wurde abgebrochen Factorizing… Faktorisieren... Expanding partial fractions… Expandieren von Teilbrüchen... Expanding… Expandieren... Calculating… Berechnen... Converting… Konvertieren... Fetching exchange rates. Abrufen von Wechselkursen. Time zone parsing failed. Zeitzonenanalyse fehlgeschlagen. Keep open Offen halten Enter RPN Enter (calculate and add to stack) eingeben C_alculate B_erechnen Apply to Stack Auf Stapel anwenden Argument Argument True Wahr False Falsch Info Info Edit Unit (global) Einheit bearbeiten (global) New Unit Neue Einheit Empty name field. Leeres Namensfeld. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Eine Variable oder Einheit mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Base unit does not exist. Basiseinheit ist nicht vorhanden. Edit Function (global) Funktion bearbeiten (global) New Function Neue Funktion Yes Ja No Nein Empty expression field. Leeres Ausdrucksfeld. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Eine Funktion mit demselben Namen existiert bereits. Möchten Sie die Funktion überschreiben? Unit does not exist Einheit ist nicht vorhanden Edit Unknown Variable (global) Unbekannte Variable bearbeiten (global) New Unknown Variable Neue Unbekannte Variable An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Variable (global) Variable bearbeiten (global) New Variable Neue Variable Empty value field. Leeres Wertefeld. Edit Vector Vektor bearbeiten Edit Vector (global) Vektor bearbeiten (global) New Vector Neuer Vektor Edit Matrix (global) Matrix bearbeiten (global) New Matrix Neue Matrix Vector Result Vektor Ergebnis Matrix Result Matrix-Ergebnis New Data Object Neues Datenobjekt text text approximate ungefähr Edit Data Set (global) Datensatz bearbeiten (global) New Data Set Neuer Datensatz info info Property Eigenschaft No file name entered. Kein Dateiname eingegeben. No delimiter selected. Kein Begrenzungszeichen ausgewählt. Could not import from file %s Konnte nicht aus Datei importieren %s c-format No variable name entered. Es wurde kein Variablenname eingegeben. No known variable with entered name found. Keine bekannte Variable mit eingegebenem Namen gefunden. Could not export to file %s Konnte nicht in eine Datei exportieren %s c-format My Variables Meine Variablen Couldn't write definitions Definitionen konnten nicht geschrieben werden Preset Voreinstellung Abort Abbrechen Undo Rückgängig Redo Wiederholen Completion Mode Fertigstellungsmodus Limited strict completion Eingeschränkte strenge Fertigstellung Strict completion Strenge Fertigstellung Limited full completion Eingeschränkte vollständige Fertigstellung Full completion Vollständige Fertigstellung No completion Keine Fertigstellung Delayed completion Verzögertes Fertigstellung Customize completion… Fertigstellung anpassen... Save Mode Modus speichern Preset mode cannot be overwritten. Der voreingestellte Modus kann nicht überschrieben werden. Delete Mode Modus löschen Couldn't write preferences to %s Konnte Einstellungen nicht schreiben in %s c-format never nie ask fragen %i day %i Tag %i Tage c-format %i days Copied Result was copied Kopiert log10 function not found. log10 Funktion nicht gefunden. Search Suche _Search _Suche Remove Bookmark Lesezeichen entfernen Add Bookmark Lesezeichen hinzufügen A bookmark with the selected name already exists. Do you want to overwrite it? Es existiert bereits ein Lesezeichen mit dem gewählten Namen. Möchten Sie es überschreiben? No items found Keine Einträge gefunden Select date Datum auswählen Rectangular form Rechteckige Form Exponential form Exponentialform Polar form Polarform Angle/phasor notation Winkel/Phasenschreibweise Optimal unit Optimale Einheit Optimal prefix Optimales Präfix All functions Alle Funktionen All variables Alle Variablen Select definitions file Definitionsdatei auswählen _Import _Importieren Could not copy %s to %s. Konnte %s nicht nach %s kopieren. c-format Could not read %s. Konnte %s nicht lesen. c-format Could not copy file to %s. Konnte Datei nicht nach %s kopieren. c-format Unsupported base. Nicht unterstützte Basis. The selected Chinese year does not exist. Das ausgewählte chinesische Jahr existiert nicht. Conversion to Gregorian calendar failed. Die Konvertierung in den gregorianischen Kalender ist fehlgeschlagen. Calendar conversion failed for: %s. Kalenderkonvertierung fehlgeschlagen für: %s. c-format Gnuplot was not found. Gnuplot wurde nicht gefunden. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) muss separat installiert werden und im Such-pfad für ausführbare Dateien gefunden werden, damit das Plotten funktioniert. c-format Select file to save PNG image to Datei zum Speichern des PNG-Bildes auswählen Allowed File Types Erlaubte Dateitypen All Files Alle Dateien Cannot delete unit as it is needed by other units. do not delete units that are used by other units Kann Einheit nicht löschen, da sie von anderen Einheiten benötigt wird. none keine result is too long Ergebnis ist zu lang translator-credits Alexander Krause <akay.devel@protonmail.com> leveltrauma <rhade_tm@t-online.de> Mode not found. Modus nicht gefunden. Elements (in horizontal order) Elemente (in horizontaler Reihenfolge) Select file to import Datei zum Importieren auswählen _Open _Öffnen Select file to export to Datei zum Exportieren wählen A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Es existiert ein kollidierendes Objekt mit demselben Namen. Wenn Sie fortfahren und die Änderungen speichern, wird das kollidierende Objekt überschrieben oder deaktiviert. Möchten Sie fortfahren? Set key combination Tastenkombination einstellen Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Drücken Sie die Tastenkombination, die Sie für die Aktion verwenden möchten (zum Abbrechen Escape drücken). No keys Keine Tasten Empty value. Leerer Wert. Function not found. Funktion nicht gefunden. Variable not found. Variable nicht gefunden. Unit not found. Einheit nicht gefunden. The key combination is already in use. Do you wish to replace the current action? Die Tastenkombination ist bereits in Gebrauch. Möchten Sie die aktuelle Aktion ersetzen? Select file to export Datei zum Exportieren auswählen Empty expression. Leerer Ausdruck. Empty x variable. Leere Variable x. Element Data Element Daten Classification Klassifizierung Alkali Metal Alkalimetall Alkaline-Earth Metal Erdalkalimetall Lanthanide Lanthanid Actinide Aktinid Transition Metal Übergangsmetall Metal Metall Metalloid Halbmetall Polyatomic Non-Metal Polyatomares Nicht-Metall Diatomic Non-Metal Diatomares Nichtmetall Noble Gas Edelgas Unknown chemical properties Unbekannte chemische Eigenschaften No unknowns in result. Keine Unbekannten im Ergebnis. Set Unknowns Unbekannte setzen Copy result to clipboard Ergebnis in die Zwischenablage kopieren ArgumentEditDialog Name: Name: Type: Typ: Free Frei Number Zahl Integer Ganzzahl Symbol Symbol Text Text Date Datum Vector Vektor Matrix Matrix Boolean Boolescher Wert Angle Winkel Object Objekt Function Funktion Unit Einheit Variable Variable File Datei Enable rules and type test Regeln und Typenprüfung aktivieren Custom condition: Benutzerdefinierte Bedingung: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Wenn das Argument z.B. eine Matrix ist, die die gleiche Anzahl von Zeilen und Spalten haben muss: Zeilen(\x) = Spalten(\x) Allow matrix Matrix zulassen Forbid zero Null verbieten Handle vector Vektor verarbeiten Calculate function for each separate element in vector. Funktion für jedes einzelne Element im Vektor berechnen. Min Min Include equals Schließe Gleichheiten ein Max Max CSVDialog Import CSV File CSV-Datei importieren Export CSV File CSV-Datei exportieren Current result Aktuelles Ergebnis Matrix/vector variable: Matrix-/Vektorvariable: File: Datei: Import as Importieren als matrix Matrix vectors Vektoren Name: Name: First row: Erste Zeile: Includes headings Enthält Überschriften Delimiter: Begrenzungszeichen: Comma Komma Tabulator Tabulator Semicolon Semikolon Space Leerzeichen Other Andere Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? An unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Error Error Could not import from file %1 Konnte nicht aus Datei importieren %1 No matrix or vector variable with the entered name was found. Keine Matrix- oder Vektorvariable mit eingegebenem Namen gefunden. Could not export to file %1 Konnte nicht in eine Datei exportieren %1 CalendarConversionDialog Calendar Conversion Kalenderumrechnung Gregorian Gregorianisch Hebrew Hebräisch Islamic (Hijri) Islamisch (Hijri) Persian (Solar Hijri) Persisch (Solar Hijri) Indian (National) Indisch (national) Chinese Chinesisch Julian Julianisch Revised Julian (Milanković) Neujulianisch (Milanković) Coptic Koptisch Ethiopian Äthiopisch Error Error The selected Chinese year does not exist. Das ausgewählte chinesische Jahr existiert nicht. Conversion to Gregorian calendar failed. Die Umrechnung in gregorianischen Kalender fehlgeschlagen. Calendar conversion failed for: %1. Kalenderumrechnung fehlgeschlagen für: %1. DataObjectEditDialog %1: %1: Default Standard Approximate Annähern Exact Genau Edit Data Object Datenobjekt bearbeiten New Data Object Neues Datenobjekt DataPropertyEditDialog Name: Name: Title: Titel: Descriptive name: Beschreibender Name: Description: Beschreibung: Value type: Wertetyp: Expression Rechenausdruck Number Zahl Text Text Unit expression: Einheitenausdruck: Use as key Als Schlüssel verwenden Case sensitive value Groß-/Kleinschreibung unterscheidender Wert Approximate value Näherungswert Value uses brackets Wert verwendet Klammern Hide Ausblenden Edit Data Property Dateneigenschaft bearbeiten DataSetEditDialog General Allgemein Properties Eigenschaften Function Funktion Title: Titel: Descriptive name: Beschreibender Name: Data file: Datendatei: Description: Beschreibung: Copyright: Urheberrecht: Title Titel Name Name Type Typ Add Hinzufügen Edit Bearbeiten Remove Entfernen Name: Name: Object argument name: Objektargumentname: Property argument name: Name des Eigenschaftsarguments: Default property: Standardeigenschaft: text Text approximate ungefähr number Zahl expression Rechenausdruck key Schlüssel Question Frage A function with the same name already exists. Do you want to overwrite the function? Eine Funktion mit demselben Namen existiert bereits. Möchten Sie die Funktion überschreiben? Data Sets Datensätze Object Objekt Property Eigenschaft Edit Data Set Datensatz bearbeiten New Data Set Neuer Datensatz DataSetsDialog Data Sets Datensätze Data sets: Datensätze: New… Neu… Edit… Bearbeiten… Delete Löschen Objects: Objekte: Data set description: Datensatzbeschreibung: Object attributes: Objektattribute: Properties Eigenschaften key Schlüssel Data Retrieval Function Funktion zum Abrufen von Daten argument argument ExpressionEdit matrix Matrix vector Vektor positive positiv non-positive nicht positiv negative negativ non-negative nicht negativ non-zero ungleich null boolean boolesch integer ganzzahlig rational rational real reell complex komplex number zahl (not matrix) (nicht Matrix) unknown unbekannt default assumptions standardmäßige Annahmen Prefix Präfix Prefix: Präfix: Complex angle/phasor notation Komplexe Winkel-/Phasenschreibweise Base units Basiseinheiten Number base Zahlenbasis Bijective base-26 Bijektive Basis-26 Binary number Binäre Zahlen Calendars Kalendarien Complex cis form Komplexe cis-Form Decimal number Dezimalzahl Duodecimal number Duodezimale Zahl Complex exponential form Komplexe Exponentialform Factors Faktoren 16-bit floating point binary format 16-Bit-Gleitkomma-Binärformat 32-bit floating point binary format 32-Bit-Gleitkomma-Binärformat 64-bit floating point binary format 64-Bit-Gleitkomma-Binärformat 80-bit (x86) floating point binary format 80-Bit (x86) Fließkomma-Binärformat 128-bit floating point binary format 128-Bit Fließkomma-Binärformat Fraction Bruchteil Hexadecimal number Hexadezimalzahl Latitude Breitengrad Longitude Längengrad Mixed units Gemischte Einheiten Octal number Oktalzahl Optimal units Optimale Einheiten Expanded partial fractions Erweiterte Teilbrüche Complex polar form Komplexe Polarform Complex rectangular form Komplexe Rechteckform Roman numerals Römische Ziffern Sexagesimal number Sexagesimalzahl Time format Zeitformat Unicode Unicode Expression Status Analysierten Rechenausdruck Off Aus With delay Mit Verzögerung Without delay Ohne Verzögerung Use input method Eingabemethode verwenden UTC time zone UTC-Zeitzone Undo Rückgängig Complex Angle/Phasor Notation Komplexe Winkel-/Phasorschreibweise Number Base Zahlenbasis Binary-Coded Decimal BCD-Code Bijective Base-26 Bijektives Basis-26-System Binary Bumber Binäre Zahlen Complex Cis Form Komplexe cis-Form Binary Number Binärzahl Complex cis Form Komplexe cis-Form Decimal Number Dezimalzahl Duodecimal Number Duodezimalzahl Complex Exponential Form Komplexe Exponentialform 16-bit Floating Point Binary Format 16-Bit-Gleitkomma-Binärformat 32-bit Floating Point Binary Format 32-Bit-Gleitkomma-Binärformat 64-bit Floating Point Binary Format 64-Bit-Gleitkomma-Binärformat 80-bit (x86) Floating Point Binary Format 80-Bit-x86-Gleitkomma-Binärformat 128-bit Floating Point Binary Format 128-Bit-Gleitkomma-Binärformat Hexadecimal Number Hexadezimalzahl Mixed Units Gemischte Einheiten Octal Number Oktalzahl Optimal Units Optimale Einheiten Optimal Unit Optimale Einheit Optimal Prefix Optimales Präfix Expanded Partial Fractions Erweiterte Teilbrüche Complex Polar Form Komplexe Polarform Complex Rectangular Form Komplexe rechtwinklige Form Roman Numerals Römische Ziffern Sexagesimal Number Sexagesimalzahl Time Format Zeitformat UTC Time Zone UTC-Zeitzone Redo Wiederholen Cut Ausschneiden Copy Kopieren Paste Einfügen Delete Löschen Calculate Selection Auswahl berechnen Insert Date… Datum einfügen … Insert Matrix… Matrix einfügen … Select All Alles markieren Clear Löschen Clear History Verlauf löschen Completion Vervollständigung No completion Keine Vervollständigung Limited strict completion Eingeschränkte strenge Vervollständigung Strict completion Strenge Vervollständigung Limited full completion Eingeschränkte vollständige Vervollständigung Full completion Vollständige Vervollständigung Delayed completion Verzögerte Vervollständigung Enable input method Eingabemethode aktivieren Matrix Matrix Too many arguments for %1(). Zu viele Argumente für %1(). argument argument %1: %1: comment Kommentar MC (memory clear) MC (memory clear – Speicher löschen) MS (memory store) MS (memory store – speichern) M+ (memory plus) M+ (auf Speicher addieren) M− (memory minus) M- (von Speicher abziehen) factorize faktorisieren expand erweitern hexadecimal hexadezimal hexadecimal number Hexadezimalzahl octal oktal octal number Oktalzahl decimal dezimal decimal number Dezimalzahl duodecimal duodezimal duodecimal number Duodezimalzahl binary binär binary number Binärzahl roman römisch roman numerals römische Ziffern bijective bijektiv bijective base-26 bijektives Basis-26-System binary-coded decimal BCD-code sexagesimal sexagesimal sexagesimal number Sexagesimalzahl latitude Breitengrad longitude Längengrad 32-bit floating point 32-Bit-Gleitkomma 64-bit floating point 64-Bit-Gleitkomma 16-bit floating point 16-Bit-Gleitkomma 80-bit (x86) floating point 80-Bit-x86-Gleitkomma 128-bit floating point 128-Bit-Gleitkomma time Zeit time format Zeitformat bases Basen number bases Zahlenbasen calendars Kalendarien optimal optimal optimal unit optimale Einheit prefix präfix optimal prefix base basis base units Basiseinheiten mixed gemischt mixed units gemischte Einheiten decimals decimal fraction fraction Bruchteil factors Faktoren Decimal Fraction Dezimalbruch In history list In expression field Automatically calculate selection partial fraction Teilbruch expanded partial fractions erweiterte Teilbrüche rectangular rechtwinklig cartesian kartesisch complex rectangular form komplexe Rechteckform exponential exponentiell complex exponential form komplexe Exponentialform polar polar complex polar form komplexe Polarform complex cis form komplexe cis-Form angle Winkel complex angle notation komplexe Winkeldarstellung phasor Phasor complex phasor notation komplexe Phaorschreibweise number base %1 Zahlenbasis %1 Data object Datenobjekt FPConversionDialog Floating Point Conversion (IEEE 754) Gleitkomma-Umrechnung (IEEE 754) Format Format 16-bit (half precision) 16 Bit (halbe Genauigkeit) 32-bit (single precision) 32 Bit (einfache Genauigkeit) 64-bit (double precision) 64 Bit (doppelte Genauigkeit) 80-bit (x86 extended format) 80 Bit (erweitertes x86-Format) 128-bit (quadruple precision) 128 Bit (vierfache Genauigkeit) Microchip 24-bit Microchip 32-bit Value Wert Decimal value Dezimalwert Binary representation Binärschreibweise Hexadecimal representation Hexadezimalschreibweise Floating point value Gleitkommawert Conversion error Umrechnungsfehler FunctionEditDialog Required Erforderlich Details Einzelheiten Description Beschreibung Name: Name: Expression: Rechenausdruck: Argument references: Argumentreferenzen: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y und z (z. B. "(x+y)/2"), oder \x, \y, \z, \a, \b, … (z. B. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Verwenden Sie x, y und z (z. B. „(x+y)/2“), oder \x, \y, \z, \a, \b, … (z. B. „(\x+\y)/2“) Category: Kategorie: Descriptive name: Beschreibender Name: Hide function Funktion ausblenden Example: Beispiel: Description: Beschreibung: Condition: Bedingung: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Bedingung, die für die Funktion wahr sein muss (z. B. wenn das zweite Argument größer sein muss als das erste: "\y > \x") Sub-functions: Unterfunktionen: Expression Rechenausdruck Precalculate Vorberechnen Reference Referenz Add Hinzufügen Edit Bearbeiten Remove Entfernen Arguments: Argumente: Name Name Type Typ Question Frage A function with the same name already exists. Do you want to overwrite the function? Eine Funktion mit demselben Namen existiert bereits. Möchten Sie die Funktion überschreiben? Edit Function Bearbeite Funktion New Function Neue Funktion FunctionsDialog Functions Funktionen Category Kategorie Function Funktion New… Neu… Edit… Bearbeiten… Deactivate Deaktivieren Delete Löschen Calculate… Berechnen… Apply Anwenden Insert Einfügen Favorite Favorit argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Ruft Daten aus dem %1-Datensatz für ein angegebenes Objekt und eine Eigenschaft ab. Wenn "info" als Eigenschaft eingegeben wird, wird ein Dialogfenster mit allen Eigenschaften des Objekts angezeigt. Example: Beispiel: Arguments Argumente optional optional argument optional default: argument default Standard: Requirement: Required condition for function Bedingung: Favorites Favoriten default: argument default standard: Requirement Bedingung Properties Eigenschaften %1: %1: key indicating that the property is a data set key Schlüssel Activate Aktivieren All All functions Alle Uncategorized Nicht kategorisierte User functions Benutzerfunktionen Inactive Inaktive HistoryView Insert Value Wert einfügen Insert Text Text einfügen Copy Kopieren Copy Formatted Text Formatierten Text kopieren Copy unformatted ASCII Unformatiertes ASCII kopieren Select All Alles markieren Search… Suchen … Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Geben Sie oben einen mathematischen Ausdruck ein, z. B. "5 + 2 / 3", und drücken Sie die Eingabetaste. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Geben Sie oben einen mathematischen Ausdruck ein, z. B. "5 + 2 / 3", und drücken Sie die Eingabetaste. Exchange rate source(s): updated %1 Comment Kommentar Protect Schützen Add Comment… Kommentar hinzufügen… Move to Top Nach oben verschieben Remove Entfernen Clear Löschen Edit Comment… Kommentar bearbeiten… Text: Text: Search Suche KeypadButton <i>Right-click/long press</i>: %1 <i>Rechtsklick/lang drücken</i>: %1 <i>Right-click</i>: %1 <i>Rechtsklick</i>: %1 <i>Long press</i>: %1 <i>Lang drücken</i>: %1 Open menu Menü öffnen <i>Middle-click</i>: %1 <i>Mittelklick</i>: %1 KeypadWidget Memory store Speicher speichern Memory clear Speicher löschen Memory recall Speicherabruf Memory add Speicher plus Memory subtract Speicher minus STO Standard calculator button. Do not use more than three characters. STO Store Intern speichern New function Neue Funktion sin sin cos cos tan tan Exponentiation Percent or remainder Prozent oder Rest Uncertainty/interval Unsicherheit/Intervall Relative error Relativer Fehler Interval Intervall Move cursor left Cursor nach links bewegen Move cursor to start Cursor zum Anfang Move cursor right Cursor nach rechts bewegen Move cursor to end Cursor zum Ende bewegen Logical AND Logisches Und Logical OR Logisches Oder Bitwise Exclusive OR Bitweises Exklusiv-Oder Logical NOT logisches Nicht Bitwise Left Shift Bitweise Linksverschiebung Bitwise Right Shift Bitweise Rechtsverschiebung cmp rot a→1 Expand partial fractions Expandieren von Teilbrüchen Enable units in physical constants Einheiten in physikalischen Konstanten einschalten All constants Alles Konstanten Percentage Calculation Tool Prozentrechnungswerkzeug more mehr All units Alle Einheiten All variables Alle Variablen Action Aktion Interval Display Intervall-Anzeige Adaptive Adaptiv Significant digits Signifikante Ziffern Plus/minus Plus/minus Relative Relativ Concise Interval Calculation Intervall-Berechnung Variance formula Varianzformel Interval arithmetic Intervallarithmetik Allow concise uncertainty input Complex number form Komplexe Zahlenform Rectangular Algebraischen Form Exponential Exponentialform Polar Polarform Angle/phasor Winkel/Phasorschreibweise Type Assumptions type Typ Sign Assumptions sign Vorzeichen Default assumptions Standardannahmen Number Zahl Real Real Rational Rational Integer Ganzzahl Boolean Boolescher Wert Unknown Unknown assumptions sign Unbekannt Non-zero Ungleich null Positive Positiv Non-negative Nicht negativ Negative Negativ Non-positive Nicht positiv Factorize Faktorisieren Expand Erweitern Add column Add row Remove column Remove row Left parenthesis Linke Klammer Left vector bracket Linke Vektor-Klammer Right parenthesis Rechte Klammer Right vector bracket Rechte Vektor-Klammer Smart parentheses Intelligente Klammern Vector brackets Vektorielle Klammern Argument separator Argumenttrennzeichen Blank space Leerzeichen New line Neue Zeile Decimal point Dezimaltrennzeichen Previous result (static) Voriges Ergebnis (statisch) Multiplication Button Action Aktion für Schaltfläche Label: Beschriftung: Action: Aktion: None Keine Value: Wert: Bitwise AND Bitweises Und Bitwise Shift Bitweise Verschiebung Delete Löschen Backspace Backspace Addition Plus Plus Subtraction Subtraktion Minus Minus Division Bitwise OR Bitweises Oder Bitwise NOT Bitweises Nicht Clear expression Rechenausdruck löschen Calculate expression Rechenausdruck berechnen NamesEditDialog Name Name Abbreviation Abkürzung Plural Plural Reference Referenz Avoid input Eingabe vermeiden Unicode Unicode Suffix Nachsilbe Case sensitive Groß-/Kleinschreibung beachten Completion only Nur Vervollständigung Add Hinzufügen Edit Bearbeiten Remove Entfernen Warning Warnung Illegal name Unzulässiger Name A function with the same name already exists. Eine Funktion mit demselben Namen existiert bereits. A unit or variable with the same name already exists. Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. PercentageCalculationDialog Percentage Prozentsatz Value 1 Wert 1 Value 2 Wert 2 Change from 1 to 2 Änderung von 1 auf 2 Change from 2 to 1 Änderung von 2 auf 1 2 compared to 1 2 im Vergleich zu 1 1 compared to 2 1 im Vergleich zu 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Geben Sie zwei Werte ein, von denen höchstens einer ein Prozentwert ist, und die anderen werden für Sie berechnet. Clear Löschen PeriodicTableDialog Periodic Table Periodensystem Element Data Element Daten Alkali Metal Alkalimetall Alkaline-Earth Metal Erdalkalimetall Lanthanide Lanthanid Actinide Aktinid Transition Metal Übergangsmetall Metal Metall Metalloid Halbmetall Polyatomic Non-Metal Polyatomares Nichtmetall Diatomic Non-Metal Diatomares Nichtmetall Noble Gas Edelgas Unknown chemical properties Unbekannte chemische Eigenschaften Unknown Unbekannt %1: %1: PlotDialog Plot Plotten Data Daten Title: Titel: Expression: Rechenausdruck: Function Funktion Vector/matrix Vektor/Matrix Paired matrix Gepaarte Matrix Rows Zeilen X variable: X Variable: Style: Stil: Line Zeile Points Punkte Line with points Linie mit Punkten Boxes/bars Boxen/Balken Histogram Histogramm Steps Stufen Candlesticks Kerzenständer Dots Kleine Punkte Polar Polarform Smoothing: Glättung: None Keine Monotonic Monoton Natural cubic splines Natürliche kubische Splines Bezier Bézier Bezier (monotonic) Bézier (monoton) Y-axis: Y-Achse: Primary Primär Secondary Sekundär Add Hinzufügen Apply Anwenden Remove Entfernen Category Kategorie Title Titel Expression Rechenausdruck Function Range Funktionsbereich Minimum x value: Minimaler x-Wert: Maximum x value: Maximaler x-Wert: Sampling rate: Abtastrate: Step size: Schrittweite: Show real and imaginary parts Appearance Erscheinungsbild Display grid Raster anzeigen Display full border Vollen Rand anzeigen Minimum y value: Minimaler y-Wert: Maximum y value: Maximaler y-Wert: Logarithmic x scale: Logarithmische x-Skala: Logarithmic y scale: Logarithmische y-Skala: Calculating… Berechne … Cancel Abbruch Processing… Verarbeite … Minimum y value Minimaler y-Wert Maximum y value Maximaler y-Wert Logarithmic x scale Logarithmische x-Skala Logarithmic y scale Logarithmische y-Skala X-axis label: X-Achsen-Beschriftung: Y-axis label: Y-Achsen-Beschriftung: Line width: Linienbreite: Legend placement: Platzierung der Legende: Top-left Oben links Top-right Oben rechts Bottom-left Unten links Bottom-right Unten rechts Below Unterhalb Outside Außerhalb Error Error It took too long to generate the plot data. Es hat zu lange gedauert, die Plotdaten zu generieren. PreferencesDialog Look && Feel Aussehen && Bedienung Numbers && Operators Zahlen && Operatoren Units && Currencies Einheiten && Währungen Parsing && Calculation Analysierung && Berechnung Ignore system language (requires restart) Systemsprache ignorieren (erfordert Neustart) Allow multiple instances Mehrere Instanzen zulassen Clear history on exit Verlauf beim Beenden löschen Close application with Escape key Keep above other windows Fenster immer im Vordergrund halten Window title: Fenstertitel: Application name Name der Anwendung Result Ergebnis Application name + result Anwendungsname + Ergebnis Workspace Arbeitsbereich Application name + workspace Anwendungsname + Arbeitsbereich Style: Stil: Default (requires restart) Default style Standard (erfordert Neustart) Dark mode Dunkelmodus Colorize result Ergebnis einfärben Custom result font Benutzerdefinierte Ergebnisschriftart Custom expression font Benutzerdefinierte Ausdrucksschriftart Custom keypad font Benutzerdefinierte Tastenfeldschriftart Custom application font Benutzerdefinierte Anwendungsschriftart Custom result font: Benutzerdefinierte Ergebnisschriftart: Custom expression font: Benutzerdefinierte Rechenausdrucksschriftart: Custom keypad font: Benutzerdefinierte Tastenfeld-Schriftart: Custom application font: Benutzerdefinierte Anwendungsschriftart: Display expression status Analysierten Rechenausdruck anzeigen Delay: Verzögerung: Expression after calculation: Rechenausdruck nach Berechnung: Keep expression Rechenausdruck behalten Clear expression Rechenausdruck löschen Replace with result Durch Ergebnisse ersetzen Replace with result if shorter Durch Ergebnis ersetzen, falls kürzer Use keyboard keys for RPN Tasten auf der Tastatur für UPN verwenden Parsing mode: Analysemodus: Adaptive Adaptiv Conventional Konventionell Implicit multiplication first Implizite Multiplikation zuerst Chain Verkettete RPN UPN Read precision Genauigkeit lesen Limit implicit multiplication Implizite Multiplikation begrenzen Interval calculation: Intervallberechnung: Variance formula Varianzformel Interval arithmetic Intervallarithmetik Factorize result Ergebnis faktorisieren Binary two's complement representation Binäre Zweierkomplement-Darstellung Hexadecimal two's complement representation Hexadezimale Zweierkomplement-Darstellung Use lower case letters in non-decimal numbers Kleinbuchstaben in Zahlen mit nicht-dezimaler Basis verwenden Spell out logical operators Logische Operatoren ausbuchstabieren Use E-notation instead of 10^x E-Notation anstelle von 10^x verwenden Preferences Einstellungen ms milliseconds ms Use E-notation instead of 10^n E-Notation anstelle von 10^n verwenden Use 'j' as imaginary unit 'j' als imaginäre Einheit verwenden Use comma as decimal separator Komma als Dezimaltrennzeichen verwenden Ignore comma in numbers Komma in Zahlen ignorieren Ignore dots in numbers Punkte in Zahlen ignorieren Copy unformatted ASCII by default Standardmäßig als unformatiertes ASCII kopieren Round halfway numbers away from zero Halbe Zahlen von null weg runden Round halfway numbers to even Halbe Zahlen auf gerade Zahlen runden Indicate repeating decimals Wiederholte Dezimalstellen anzeigen Language: Sprache: Max history lines saved: Use caret for bitwise XOR Zirkumflex für bitweises Exklusiv-Oder verwenden Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Ergebnis formatieren Expression status: Analysierten Rechenausdruck: Off Aus In history list In expression field Status tooltip delay: Automatically calculate selection Expression in history: Rechenausdruck in Verlauf: Parsed Analysiert Entered Wie eingegeben Entered + parsed Wie eingegeben & analysiert Automatically copy result Ergebnis automatisch kopieren Simplified percentage calculation Vereinfachte Prozentrechnung Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binär Hexadecimal Hexadezimal Binary bits: Automatic Automatisch Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Digit grouping: Zifferngruppierung: None Keine Standard Standard Local Lokal Automatically group digits in input (experimental) Interval display: Intervallanzeige: Significant digits Signifikante Ziffern Interval Intervall Plus/minus Plus/minus Concise Midpoint Mittelwert Lower Untere Upper Obere Rounding: Truncate all numbers Alle Zahlen abschneiden Complex number form: Komplexe form: Rectangular Algebraischen Form Exponential Exponentialform Polar Polarform Angle/phasor Winkel/Phasorschreibweise Enable units Abbreviate names Namen abkürzen Use binary prefixes for information units Binäre Präfixe für Informationseinheiten verwenden Automatic unit conversion: Automatische Einheitenumrechnung: No conversion Keine Umrechning Base units Basiseinheiten Optimal units Optimale Einheiten Optimal SI units Optimale SI-Einheiten Convert to mixed units In gemischte Einheiten umrechnen Automatic unit prefixes: Automatische Einheitenpräfixe: Copy unformatted ASCII without units Unformatiertes ASCII ohne Einheiten kopieren Restart required Please restart the program for the language change to take effect. Default Standard Calculate as you type delay: Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Keine Präfixe Prefixes for some units Präfixe für einige Einheiten Prefixes also for currencies Präfixe auch für Währungen Prefixes for all units Präfixe für alle Einheiten Enable all SI-prefixes Alle SI-Präfixe aktivieren Enable denominator prefixes Nennerpräfixe aktivieren Enable units in physical constants Einheiten in physikalischen Konstanten einschalten Temperature calculation: Temperaturberechnung: Absolute Absolut Relative Relativ Hybrid Hybrid Exchange rates updates: Wechselkurse aktualisieren: %n day(s) %n Tag %n Tage days Tag Tage QApplication Execute expressions and commands from a file Ausdrücke und Befehle aus einer Datei ausführen FILE DATEI Start a new instance of the application Eine neue Instanz der Applikation starten Specify the window title Festlegen des Fenstertitels TITLE TITEL Display the application version Anzeigen der Applikationsversion Open workspace Expression to calculate Zu berechnender Rechenausdruck [EXPRESSION] [RECHENAUSDRUCK] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Standardmäßig ist nur eine Instanz (ein Hauptfenster) von %1 erlaubt. Wenn mehrere Instanzen gleichzeitig geöffnet werden, werden nur die Definitionen (Variablen, Funktionen usw.), der Modus, die Einstellungen und der Verlauf des zuletzt geschlossenen Fensters gespeichert. Möchten Sie trotzdem die Standardvorgabe ändern und mehrere gleichzeitige Instanzen zulassen? Allow multiple instances? %1 is already running. Failed to load global definitions! Das Laden der globalen Definitionen ist fehlgeschlagen! answer antwort History Answer Value Verlauf Antwortwert History Index(es) Verlaufsindex(e) History index %s does not exist. Verlaufsindex %s existiert nicht. Last Answer Letzte Antwort Answer 2 Antwort 2 Answer 3 Antwort 3 Answer 4 Antwort 4 Answer 5 Antwort 5 Memory Speicher Error Error Couldn't write preferences to %1 Konnte Einstellungen nicht schreiben in %1 Function not found. Funktion nicht gefunden. Variable not found. Variable nicht gefunden. Unit not found. Einheit nicht gefunden. Unsupported base. Nicht unterstützte Basis. Unsupported value. Nicht unterstützte Wert. QalculateQtSettings Update exchange rates? Wechselkurse aktualisieren? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Es ist %n Tag seit der letzten Aktualisierung der Wechselkurse vergangen. Möchten Sie die Wechselkurse jetzt aktualisieren? Es sind %n Tage seit der letzten Aktualisierung der Wechselkurse vergangen. Möchten Sie die Wechselkurse jetzt aktualisieren? Fetching exchange rates. Abrufen von Wechselkursen. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Abrufen von Wechselkursen… Error Error Warning Warnung Information Information Path of executable not found. Pfad der ausführbaren Datei nicht gefunden. curl not found. curl nicht gefunden. Failed to run update script. %1 Updateskript konnte nicht ausgeführt werden. %1 Failed to check for updates. Prüfung auf Updates fehlgeschlagen. No updates found. Keine Updates gefunden. A new version of %1 is available at %2. Do you wish to update to version %3? Eine neue Version von %1 ist verfügbar unter %2. Möchten Sie auf die Version %3 aktualisieren? A new version of %1 is available. You can get version %3 at %2. Eine neue Version von %1 ist verfügbar. Sie können die Version %3 unter %2 erhalten. Download %1: %2 Insert function Funktion einfügen Insert function (dialog) Funktion einfügen (Dialog) Insert variable Variable einfügen Approximate result Negate Negieren Invert Invertieren Insert unit Einheit einfügen Insert text Text einfügen Insert operator Insert date Datum einfügen Insert matrix Matrix einfügen Insert smart parentheses Intelligente Klammern einfügen Convert to unit In Einheit umrechnen Convert Umrechnen Convert to optimal unit In optimale Einheit umrechnen Convert to base units In Basiseinheiten umrechnen Convert to optimal prefix In optimales Präfix umrechnen Convert to number base In Zahlenbasis umrechnen Factorize result Ergebnis faktorisieren Expand result Expandieren des Ergebnisses Expand partial fractions Expandieren von Teilbrüchen RPN: down UPN: abwärts RPN: up UPN: aufwärts RPN: swap UPN: tauschen RPN: copy UPN: kopieren RPN: lastx UPN: lastx RPN: delete register UPN: Register löschen RPN: clear stack UPN: Stapel löschen Set expression base Rechenausdrucksbasis einstellen Set result base Ergebnisbasis einstellen Set angle unit to degrees Winkeleinheit auf Grad stellen Set angle unit to radians Winkeleinheit auf Bogenmaß stellen Set angle unit to gradians Winkeleinheit auf Gradienten stellen Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Genauigkeit umschalten Toggle max decimals Max Dezimalen umschalten Toggle min decimals Min Dezimalen umschalten Toggle max/min decimals Min/max Dezimalen umschalten Toggle RPN mode UPN-Modus umschalten Show general keypad Toggle programming keypad Programmiertastenfeld ein- und ausschalten Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Verlauf durchsuchen Clear history Verlauf löschen Show variables Show functions Show units Show data sets Store result Ergebnis intern speichern MC (memory clear) MC (Speicher löschen) MR (memory recall) MR (Speicherabruf) MS (memory store) MS (Speicher speichern) M+ (memory plus) M+ (Speicher plus) M− (memory minus) M- (Speicher minus) New variable Neue Variable New function Neue Funktion Open plot functions/data Funktionen-/Datenplotten öffnen Open convert number bases Zahlenbasenumrechnung öffnen Open floating point conversion Gleitkomma-Umrechnung öffnen Open calender conversion Kalenderumrechnung öffnen Open percentage calculation tool Prozentrechnungswerkzeug öffnen Open periodic table Periodensystem öffnen Update exchange rates Wechselkurse aktualisieren Copy result Ergebnis kopieren Insert result Text einfügen Open mode menu Open menu Menü öffnen Help Hilfe Quit Beenden Toggle chain mode Auf Methodenverkettung umschalten Toggle keep above Immer-im-Vordergrund umschalten Show completion (activate first item) Vervollständigung einblenden (erstes Element aktivieren) Clear expression Rechenausdruck löschen Delete Löschen Backspace Rücktaste Home End Right Left Up Hoch Down Runter Undo Rückgängig Redo Wiederholen Calculate expression Rechenausdruck berechnen Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Standard Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Abbruch Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Menü Menu (%1) Menü (%1) New Neu Function… Funktion… Variable/Constant… Variable/Konstante… Unknown Variable… Unbekannte Variable… Matrix… Matrix… Workspaces Arbeitsbereichen Open… Öffnen… Open default Standard öffnen Save Speichern Save As… Speichern als… Import CSV File… CSV-Datei importieren … Export CSV File… CSV-Datei exportieren … Functions Funktionen Variables and Constants Variablen und Konstanten Units Einheiten Plot Functions/Data Funktionen/Daten plotten Floating Point Conversion (IEEE 754) Gleitkomma-Umrechnung (IEEE 754) Calendar Conversion Kalenderumrechnung Update Exchange Rates Wechselkurse aktualisieren Normal Mode Normal Modus RPN Mode UPN-Modus Chain Mode Methodenverkettung Keyboard Shortcuts Tastaturkürzel Preferences Einstellungen Help Hilfe Report a Bug Fehler melden Check for Updates Nach Updates suchen About %1 Über %1 Quit Beenden Mode Modus Mode (%1) Modus (%1) General Display Mode Allgemeiner Anzeigemodus Normal Normal Scientific Wissenschaftlich Engineering Technisch Simple Einfach Angle Unit Winkeleinheit Radians Bogenmaß Degrees Grad Gradians Neugrad Approximation Annäherung Automatic Automatic approximation Automatisch Dual Dual approximation Zweifach Exact Exact approximation Genau Approximate Annähern Assumptions Annahmen Type Assumptions type Typ Number Zahl Real Real Rational Rational Integer Ganzzahl Boolean Boolescher Wert Sign Assumptions sign Vorzeichen Unknown Unknown assumptions sign Unbekannt Non-zero Ungleich null Positive Positiv Non-negative Nicht negativ Negative Negativ Non-positive Nicht positiv Result Base Ergebnisbasi Binary Binär Octal Oktal Decimal Dezimal Hexadecimal Hexadezimal Other Andere Duodecimal Duodezimal Sexagesimal Sexagesimal Time format Zeitformat Roman numerals Römische Ziffern Unicode Unicode Bijective base-26 Bijektive Basis-26 Binary-encoded decimal (BCD) BCD-Code Custom: Number base Benutzerdefiniert: Expression Base Rechenausdrucksbasis Other: Number base Andere: Precision: Genauigkeit: Min decimals: Min Dezimalen: Max decimals: Max Dezimalen: off Max decimals aus Convert Umrechnen Convert (%1) Umrechnen (%1) Store Intern speichern Store (%1) Sichern (%1) Functions (%1) Funktionen (%1) Keypad Tastenfeld Keypad (%1) Tastatur (%1) Number bases Zahlenbasen Unit… Einheit… Data Sets Datensätze Percentage Calculation Tool Prozentrechnungswerkzeug Periodic Table Periodensystem Units (%1) Einheiten (%1) Plot Functions/Data (%1) Funktionen/Daten plotten (%1) Number Bases (%1) Zahlenbasen (%1) Binary: Binär: Octal: Oktal: Decimal: Dezimal: Hexadecimal: Hexadezimal: RPN Stack UPN-Stapel Rotate the stack or move the selected register up (%1) Drehen des Stapels oder Verschieben des ausgewählten Register nach oben (%1) Rotate the stack or move the selected register down (%1) Drehen des Stapels oder Verschieben des ausgewählten Register nach unten (%1) Swap the top two values or move the selected value to the top of the stack (%1) Vertauschen Sie die beiden oberen Werte oder verschieben Sie den ausgewählten Wert an die Spitze des Stapels (%1) Copy the selected or top value to the top of the stack (%1) Kopieren des ausgewählten oder obersten Wertes an die Spitze des Stapels (%1) Enter the top value from before the last numeric operation (%1) Eingabe des obersten Wertes von vor der letzten numerischen Operation (%1) Delete the top or selected value (%1) Löschen des oberen oder ausgewählten Wertes (%1) Clear the RPN stack (%1) Löschen des RPN-Stack (%1) New Function… Neue Funktion… Favorites Favoriten Recent Aktuelle User functions Benutzerfunktionen Open dialog Dialogfeld öffnen Show all functions Alle Funktionen anzeigen User units Benutzereinheiten more mehr Prefixes Präfixe Show all units Alle Einheiten anzeigen User variables Benutzervariablen Show all variables Alle Variabeln anzeigen Powerful and easy to use calculator Leistungsstarker und einfach zu bedienender Taschenrechner License: GNU General Public License version 2 or later Error Error Couldn't write definitions Definitionen konnten nicht geschrieben werden hexadecimal hexadezimal octal oktal decimal dezimal duodecimal duodezimal binary binär roman römisch bijective bijektiv sexagesimal sexagesimal latitude Breitengrad longitude Längengrad time Zeit Time zone parsing failed. Zeitzonenanalyse fehlgeschlagen. bases basen calendars Kalendarien rectangular rechtwinklig cartesian kartesisch exponential exponential polar polar phasor Phasor angle Winkel optimal optimal base basis mixed gemischt fraction Bruchteil factors Faktoren Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad Copy Kopieren prefix präfix partial fraction Teilbruch decimals factorize faktorisieren expand erweitern Calculating… Berechne … Cancel Abbruch RPN Operation UPN-Operation Factorizing… Faktorisiere … Expanding partial fractions… Expandiere Teilbrüchen … Expanding… Expandiere … Converting… Rechne um … RPN Register Moved UPN-Register verschoben Processing… Verarbeite … Matrix Matrix Temperature Calculation Mode Temperaturberechnungsmodus The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Der Rechenausdruck ist mehrdeutig. Bitte wählen Sie den Temperaturberechnungsmodus (der Modus kann später in den Einstellungen geändert werden). Absolute Absolut Relative Relativ Hybrid Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretation von Punkten Please select interpretation of dots (".") (this can later be changed in preferences). Bitte wählen Sie die Interpretation der Punkte (".") (dies kann später in den Einstellungen geändert werden). Both dot and comma as decimal separators Sowohl Punkt als auch Komma als Dezimaltrennzeichen Dot as thousands separator Punkt als Tausendertrennzeichen Only dot as decimal separator Nur Punkt als Dezimaltrennzeichen Parsing Mode Analysemodus The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Der Rechenausdruck ist mehrdeutig. Bitte wählen Sie die Interpretation von Ausdrücken mit implizite Multiplikation (dies kann später in den Einstellungen geändert werden). Implicit multiplication first Implizite Multiplikation zuerst Conventional Konventionell Adaptive Adaptiv Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Aktion hinzufügen (%1) Edit Keyboard Shortcut New Keyboard Shortcut Neues Tastaturkürzel Action: Aktion: Value: Wert: Set key combination Tastenkombination einstellen Press the key combination you wish to use for the action. Drücken Sie die Tastenkombination, die Sie für die Aktion verwenden möchten. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? Die Tastenkombination ist bereits in Gebrauch. Möchten Sie die aktuelle Aktion (%1) ersetzen? Question Frage Add… Hinzufügen… Edit… Bearbeiten… Remove Entfernen Gnuplot was not found Gnuplot wurde nicht gefunden %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) muss separat installiert werden und im Suchpfad für ausführbare Dateien gefunden werden, damit das Plotten funktioniert. Example: Example of function usage Beispiel: Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Nicht erneut fragen Example: Beispiel: Enter RPN Enter Eingeben Calculate Berechnen Apply to Stack Auf Stapel anwenden Insert Einfügen Keep open Offen halten Value Wert Argument Argument %1: %1: Plot Plotten General Allgemein Programming Programmier Algebra Custom Benutzerdefiniert None Keine Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Rechtsklick/lang drücken</i>: %1 Open menu Menü öffnen Number Bases Zahlenbasen Rotate the stack or move the selected register up Drehen des Stapels oder Verschieben des ausgewählten Register nach oben Rotate the stack or move the selected register down Drehen des Stapels oder Verschieben des ausgewählten Register nach unten Swap the top two values or move the selected value to the top of the stack Vertauschen Sie die beiden oberen Werte oder verschieben Sie den ausgewählten Wert an die Spitze des Stapels Delete the top or selected value Löschen des oberen oder ausgewählten Wertes Enter the top value from before the last numeric operation Eingabe des obersten Wertes von vor der letzten numerischen Operation Copy the selected or top value to the top of the stack Kopieren des ausgewählten oder obersten Wertes an die Spitze des Stapels Clear the RPN stack Löschen des UPN-Stapels Action Aktion Key combination Tastenkombination True Wahr False Falsch Info Info optional optional argument optional optional optional parameter optional Failed to open %1. %2 Konnte %1. nicht öffnen %2 UnitEditDialog General Allgemein Relation Relation Name: Name: Category: Kategorie: Descriptive name: Beschreibender Name: System: System: Imperial Imperial US Survey US-Umfrage Hide unit Einheit ausblenden Description: Beschreibung: Class: Klasse: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Die Klasse, zu der diese Einheit gehört. Benannte abgeleitete Einheiten werden in Bezug auf eine einzelne andere Einheit definiert, mit einem optionalen Exponenten, während (unbenannte) abgeleitete Einheiten durch einen Einheitenausdruck mit einer oder mehreren Einheiten definiert werden. Base unit Basiseinheit Named derived unit Benannte abgeleitete Einheit Derived unit Abgeleitete Einheit Base unit(s): Basiseinheit(en): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Einheit (für benannte abgeleitete Einheit) oder Einheitenausdruck (für unbenannte abgeleitete Einheit), in Bezug worauf diese Einheit definiert ist Exponent: Exponent: Relation: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation zur Basiseinheit. Für lineare Beziehungen sollte dies einfach eine Zahl sein.<br><br>Für nichtlineare Beziehungen verwenden Sie \x für den Faktor und \y für den Exponenten (z.B. "\x + 273,15" für die Beziehung zwischen Grad Celsius und Kelvin). Inverse relation: Inverse Relation: Specify for non-linear relation, for conversion back to the base unit. Bei nichtlinearer Relation angeben, zur Umrechnung zurück in die Basiseinheit. Mix with base unit Mit Basiseinheit mischen Priority: Vorrangig: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Minimale Zahl der Basiseinheit: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Standardmäßig mit Präfixen verwenden Error Error Base unit does not exist. Basiseinheit ist nicht vorhanden. Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? A variable or unit with the same name already exists. Do you want to overwrite it? Eine Variable oder Einheit mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Unit Einheit bearbeiten New Unit Neue Einheit UnitsDialog Units Einheiten Category Kategorie Unit Einheit New… Neu… Edit… Bearbeiten… Deactivate Deaktivieren Delete Löschen Convert Umrechnen Insert Einfügen Favorite Favorit Show hidden units Ausgeblendete Einheiten anzeigen Activate Aktivieren All All units Alle Uncategorized Nicht kategorisiert User units Benutzereinheiten Favorites Favoriten Inactive Inaktiv UnknownEditDialog Name: Name: Custom assumptions Benutzerdefinierte Annahmen Type: Typ: Sign: Vorzeichen: Temporary Temporär Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? An unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Unknown Variable Unbekannte Variable bearbeiten New Unknown Variable Neue Unbekannte Variable VariableEditDialog Name: Name: Temporary Temporär Value: Wert: Required Erforderlich Description Beschreibung current result Aktuelles Ergebnis Category: Kategorie: Descriptive name: Beschreibender Name: Hide variable Variable ausblenden Description: Beschreibung: Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? An unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Variable Variable bearbeiten New Variable Neue Variable VariablesDialog Variables Variablen Category Kategorie Variable Variable New Neu Variable/Constant… Variable/Konstante… Unknown Variable… Unbekannte Variable… Matrix… Matrix… Edit… Bearbeiten… Export… Exportieren… Deactivate Deaktivieren Delete Löschen Insert Einfügen Favorite Favorit a matrix eine Matrix a vector ein Vektor positive positiv non-positive nicht positiv negative negativ non-negative nicht negativ non-zero ungleich null integer ganzzahlig boolean boolesch rational rational real reell complex komplex number zahl not matrix nicht Matrix unknown unbekannt Default assumptions Standardannahmen Activate Aktivieren All All variables Alle Uncategorized Nicht kategorisiert User variables Benutzervariablen Favorites Favoriten Inactive Inaktiv qalculate-qt-5.5.1/translations/qalculate-qt_en.ts000066400000000000000000007767021475705355700223340ustar00rootroot00000000000000 ArgumentEditDialog Name: Type: Free Number Integer Symbol Text Date Vector Matrix Boolean Angle Object Function Unit Variable File Enable rules and type test Custom condition: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Allow matrix Forbid zero Handle vector Calculate function for each separate element in vector. Min Include equals Max CSVDialog Import CSV File Export CSV File Current result Matrix/vector variable: File: Import as matrix vectors Name: First row: Includes headings Delimiter: Comma Tabulator Semicolon Space Other Question A unit or variable with the same name already exists. Do you want to overwrite it? Error Could not import from file %1 No matrix or vector variable with the entered name was found. Could not export to file %1 CalendarConversionDialog Calendar Conversion Gregorian Hebrew Islamic (Hijri) Persian (Solar Hijri) Indian (National) Chinese Julian Revised Julian (Milanković) Coptic Ethiopian Error The selected Chinese year does not exist. Conversion to Gregorian calendar failed. Calendar conversion failed for: %1. DataObjectEditDialog %1: Default Approximate Exact Edit Data Object New Data Object DataPropertyEditDialog Name: Descriptive name: Description: Value type: Expression Number Text Unit expression: Use as key Case sensitive value Approximate value Value uses brackets Hide Edit Data Property DataSetEditDialog General Properties Function Descriptive name: Data file: Description: Copyright: Title Name Type Add Edit Remove Name: Object argument name: Property argument name: Default property: text approximate number expression key Question A function with the same name already exists. Do you want to overwrite the function? Data Sets Object Property Edit Data Set New Data Set DataSetsDialog Data Sets Data sets: New… Edit… Delete Objects: Data set description: Object attributes: Properties key Data Retrieval Function argument ExpressionEdit matrix vector positive non-positive negative non-negative non-zero boolean integer rational real complex number (not matrix) unknown default assumptions Prefix: Complex Angle/Phasor Notation Base units Number Base Binary-Coded Decimal Bijective Base-26 Binary Number Calendars Complex cis Form Decimal Number Duodecimal Number Complex Exponential Form Factors 16-bit Floating Point Binary Format 32-bit Floating Point Binary Format 64-bit Floating Point Binary Format 80-bit (x86) Floating Point Binary Format 128-bit Floating Point Binary Format Fraction Decimal Fraction Hexadecimal Number Latitude Longitude Mixed Units Octal Number Optimal Unit Optimal Prefix Expanded Partial Fractions Complex Polar Form Complex Rectangular Form Roman Numerals Sexagesimal Number Time Format Unicode UTC Time Zone Undo Redo Cut Copy Paste Delete Calculate Selection Insert Date… Insert Matrix… Select All Clear Clear History Completion No completion Limited strict completion Strict completion Limited full completion Full completion Delayed completion Expression Status Off In history list In expression field With delay Without delay Automatically calculate selection Use input method Matrix Too many arguments for %1(). argument %1: comment MC (memory clear) MS (memory store) M+ (memory plus) M− (memory minus) factorize expand hexadecimal hexadecimal number octal octal number decimal decimal number duodecimal duodecimal number binary binary number roman roman numerals bijective bijective base-26 binary-coded decimal sexagesimal sexagesimal number latitude longitude 32-bit floating point 64-bit floating point 16-bit floating point 80-bit (x86) floating point 128-bit floating point time time format bases number bases calendars optimal optimal unit prefix optimal prefix base base units mixed mixed units factors partial fraction expanded partial fractions rectangular cartesian complex rectangular form exponential complex exponential form polar complex polar form complex cis form angle complex angle notation phasor complex phasor notation UTC time zone number base %1 decimals decimal fraction fraction Data object FPConversionDialog Floating Point Conversion (IEEE 754) Format 16-bit (half precision) 32-bit (single precision) 64-bit (double precision) 80-bit (x86 extended format) 128-bit (quadruple precision) Microchip 24-bit Microchip 32-bit Value Binary representation Hexadecimal representation Floating point value Conversion error FunctionEditDialog Required Details Description Name: Expression: Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Category: Descriptive name: Hide function Example: Description: Condition: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Sub-functions: Expression Precalculate Reference Add Edit Remove Arguments: Name Type Question A function with the same name already exists. Do you want to overwrite the function? Edit Function New Function FunctionsDialog Functions Category Function New… Edit… Deactivate Delete Calculate… Apply Insert Favorite Inactive Uncategorized argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Example: Arguments optional optional argument default: argument default Requirement: Required condition for function Properties %1: key indicating that the property is a data set key Activate Favorites User functions All All functions HistoryView Search… Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Exchange rate source(s): Exchange rate source: Exchange rate sources: updated %1 Comment Insert Value Insert Text Copy Copy unformatted ASCII Select All Protect Add Comment… Move to Top Remove Clear Edit Comment… Search Text: KeypadButton <i>Right-click/long press</i>: %1 <i>Right-click</i>: %1 <i>Long press</i>: %1 Open menu <i>Middle-click</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. Store New function sin cos tan Exponentiation Factorize Expand Percent or remainder Uncertainty/interval Relative error Interval Move cursor left Move cursor to start Move cursor right Move cursor to end Bitwise AND Logical AND Bitwise OR Logical OR Bitwise Exclusive OR Bitwise NOT Logical NOT Bitwise Left Shift Bitwise Right Shift cmp rot a→1 Expand partial fractions Add column Add row Remove column Remove row Left parenthesis Left vector bracket Right parenthesis Right vector bracket Smart parentheses Vector brackets Argument separator Blank space New line Decimal point Previous result (static) Multiplication Bitwise Shift Delete Backspace Addition Plus Subtraction Minus Division Clear expression Calculate expression Enable units in physical constants All constants Percentage Calculation Tool more All units All variables Button Action Label: Action None Value: Interval Display Adaptive Significant digits Plus/minus Relative Concise Interval Calculation Variance formula Interval arithmetic Allow concise uncertainty input Complex number form Rectangular Exponential Polar Angle/phasor Type Assumptions type Number Real Rational Integer Boolean Sign Assumptions sign Unknown Unknown assumptions sign Non-zero Positive Non-negative Negative Non-positive Default assumptions NamesEditDialog Name Reference Abbreviation Plural Avoid input Suffix Case sensitive Completion only Add Edit Remove Warning Illegal name A function with the same name already exists. A unit or variable with the same name already exists. PercentageCalculationDialog Percentage Value 1 Value 2 Change from 1 to 2 Change from 2 to 1 2 compared to 1 1 compared to 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Clear PeriodicTableDialog Periodic Table Element Data Alkali Metal Alkaline-Earth Metal Lanthanide Actinide Transition Metal Metal Metalloid Polyatomic Non-Metal Diatomic Non-Metal Noble Gas Unknown chemical properties Unknown %1: PlotDialog Plot Data Title: Expression: Function Vector/matrix Paired matrix Rows X variable: Style: Line Points Line with points Boxes/bars Histogram Steps Candlesticks Dots Polar Smoothing: None Monotonic Natural cubic splines Bezier Bezier (monotonic) Y-axis: Primary Secondary Add Apply Remove Title Expression Function Range Minimum x value: Maximum x value: Sampling rate: Step size: Show real and imaginary parts Appearance Display grid Display full border Minimum y value: Maximum y value: Logarithmic x scale: Logarithmic y scale: X-axis label: Y-axis label: Line width: Legend placement: Top-left Top-right Bottom-left Bottom-right Below Outside Calculating… Cancel Processing… PreferencesDialog Preferences Ignore system language (requires restart) Language: Default Allow multiple instances Clear history on exit Max history lines saved: Close application with Escape key Use keyboard keys for RPN Use caret for bitwise XOR Keep above other windows Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Window title: Application name Result Application name + result Workspace Application name + workspace Tooltips: Show all Hide in keypad Hide all Style: Default (requires restart) Default style Dark mode Disable cursor blinking Colorize result Format result Custom result font: Custom expression font: Custom keypad font: Custom application font: Expression status: Off In history list In expression field Status tooltip delay: ms milliseconds Calculate as you type delay: Automatically calculate selection Expression in history: Parsed Entered Entered + parsed Expression after calculation: Keep expression Clear expression Replace with result Replace with result if shorter Automatically copy result Parsing mode: Adaptive Conventional Implicit multiplication first Chain RPN Simplified percentage calculation Read precision Allow concise uncertainty input Limit implicit multiplication Interpret unrecognized symbols as variables Interval calculation: Variance formula Interval arithmetic Factorize result Two's complement output: Two's complement input: Binary Hexadecimal Binary bits: Automatic Use lower case letters in non-decimal numbers Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Spell out logical operators Use E-notation instead of 10^n Use 'j' as imaginary unit Use comma as decimal separator Ignore comma in numbers Ignore dots in numbers Indicate repeating decimals Copy unformatted ASCII by default Digit grouping: None Standard Local Automatically group digits in input (experimental) Interval display: Significant digits Interval Plus/minus Relative Concise Midpoint Lower Upper Rounding: Round halfway numbers away from zero Round halfway numbers to even Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down Complex number form: Rectangular Exponential Polar Angle/phasor Enable units Abbreviate names Use binary prefixes for information units Automatic unit conversion: No conversion Base units Optimal units Optimal SI units Convert to mixed units Automatic unit prefixes: No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Enable units in physical constants Copy unformatted ASCII without units Temperature calculation: Absolute Hybrid Exchange rates updates: %n day(s) %n day %n days Look && Feel Numbers && Operators Units && Currencies Parsing && Calculation Restart required Please restart the program for the language change to take effect. QApplication Execute expressions and commands from a file FILE Start a new instance of the application Specify the window title TITLE Display the application version Open workspace Expression to calculate [EXPRESSION] Allow multiple instances? By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? %1 is already running. Failed to load global definitions! History Answer Value answer History Index(es) History index %s does not exist. Last Answer Answer 2 Answer 3 Answer 4 Answer 5 Memory Error Couldn't write preferences to %1 Function not found. Variable not found. Unit not found. Unsupported base. Unsupported value. QalculateQtSettings Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? It has been %n day since the exchange rates last were updated. Do you wish to update the exchange rates now? It has been %n days since the exchange rates last were updated. Do you wish to update the exchange rates now? Update exchange rates? Fetching exchange rates… Error Warning Information Path of executable not found. curl not found. Failed to run update script. %1 Failed to check for updates. No updates found. A new version of %1 is available at %2. Do you wish to update to version %3? A new version of %1 is available. You can get version %3 at %2. Download %1: %2 Insert function Insert function (dialog) Insert variable Approximate result Negate Invert Insert unit Insert text Insert operator Insert date Insert matrix Insert smart parentheses Convert to unit Convert Convert to optimal unit Convert to base units Convert to optimal prefix Convert to number base Factorize result Expand result Expand partial fractions RPN: down RPN: up RPN: swap RPN: copy RPN: lastx RPN: delete register RPN: clear stack Set expression base Set result base Set angle unit to degrees Set angle unit to radians Set angle unit to gradians Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Show general keypad Toggle programming keypad Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Clear history Show variables Show functions Show units Show data sets Store result MC (memory clear) MR (memory recall) MS (memory store) M+ (memory plus) M− (memory minus) New variable New function Open plot functions/data Open convert number bases Open floating point conversion Open calender conversion Open percentage calculation tool Open periodic table Update exchange rates Copy result Insert result Open mode menu Open menu Help Quit Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Delete Backspace Home End Right Left Up Down Undo Redo Calculate expression Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Show toolbar Menu New Function… Variable/Constant… Unknown Variable… Matrix… Unit… Workspaces Open… Open default Save Save As… Import CSV File… Export CSV File… Functions Variables and Constants Units Data Sets Plot Functions/Data Floating Point Conversion (IEEE 754) Calendar Conversion Percentage Calculation Tool Periodic Table Update Exchange Rates Normal Mode RPN Mode Chain Mode Keyboard Shortcuts Preferences Open Settings Folder(s) Open Settings Folder Open Settings Folders Help Report a Bug Check for Updates About %1 Quit Mode General Display Mode Normal Scientific Engineering Simple Angle Unit Radians Degrees Gradians Other Approximation Automatic Automatic approximation Dual Dual approximation Exact Exact approximation Approximate Assumptions Type Assumptions type Number Real Rational Integer Boolean Sign Assumptions sign Unknown Unknown assumptions sign Non-zero Positive Non-negative Negative Non-positive Result Base Binary Octal Decimal Hexadecimal Duodecimal Sexagesimal Time format Roman numerals Unicode Bijective base-26 Binary-encoded decimal (BCD) Custom: Number base Expression Base Precision: Min decimals: Max decimals: off Max decimals Convert Store Plot Number bases Keypad General Programming Algebra Custom Number Pad None Always Show Number Pad Separate Menu Buttons Reset Keypad Position Binary: Octal: Decimal: Hexadecimal: RPN Stack Icons only Text only Text beside icons Text under icons Copy <i>Right-click/long press</i>: %1 Open menu Number Bases Rotate the stack or move the selected register up Rotate the stack or move the selected register down Swap the top two values or move the selected value to the top of the stack Delete the top or selected value Enter the top value from before the last numeric operation Copy the selected or top value to the top of the stack Clear the RPN stack New Function… Favorites Recent User functions Open dialog Show all functions User units more Prefixes Show all units User variables Show all variables Powerful and easy to use calculator License: GNU General Public License version 2 or later %1: Error Couldn't write definitions hexadecimal octal decimal duodecimal binary roman bijective sexagesimal latitude longitude time Time zone parsing failed. bases calendars rectangular cartesian exponential polar phasor angle optimal prefix base mixed factors partial fraction decimals fraction factorize expand Calculating… Cancel RPN Operation Factorizing… Expanding partial fractions… Expanding… Converting… RPN Register Moved Processing… Matrix Temperature Calculation Mode The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Absolute Relative Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Only dot as decimal separator Parsing Mode The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first Conventional Adaptive Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Edit Keyboard Shortcut New Keyboard Shortcut Action Value: Set key combination Press the key combination you wish to use for the action. Reserved key combination Question The key combination is already in use. Do you wish to replace the current action (%1)? Key combination Add… Edit… Remove Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. Example: Example of function usage Keep open Enter RPN Enter Calculate Apply to Stack Insert Value Argument True False Info optional optional argument Failed to open %1. %2 Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again UnitEditDialog General Relation Name: Category: Descriptive name: System: Imperial US Survey Hide unit Description: Class: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Base unit Named derived unit Derived unit Base unit(s): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Exponent: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Inverse relation: Specify for non-linear relation, for conversion back to the base unit. Mix with base unit Priority: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Error Base unit does not exist. Question A unit or variable with the same name already exists. Do you want to overwrite it? Edit Unit New Unit UnitsDialog Units Category Unit New… Edit… Deactivate Delete Convert Insert Favorite Show hidden units Inactive Uncategorized Activate Favorites User units All All units UnknownEditDialog Name: Custom assumptions Type: Sign: Temporary Question A unit or variable with the same name already exists. Do you want to overwrite it? Edit Unknown Variable New Unknown Variable VariableEditDialog Required Description Name: Value: current result Temporary Category: Descriptive name: Hide variable Description: Question A unit or variable with the same name already exists. Do you want to overwrite it? Edit Variable New Variable VariablesDialog Variables Category Variable New Variable/Constant… Unknown Variable… Matrix… Edit… Export… Deactivate Delete Insert Favorite Inactive Uncategorized a matrix a vector positive non-positive negative non-negative non-zero integer boolean rational real complex number not matrix unknown Default assumptions Activate Favorites User variables All All variables qalculate-qt-5.5.1/translations/qalculate-qt_es.ts000066400000000000000000016302671475705355700223350ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora poderosa y fácil de usar calculation;arithmetic;scientific;financial; calculadora;aritmética;científica;financiera; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! es una calculadora para escritorio multiplataforma y multiuso. Es simple de usar pero dispone de poder y versatilidad normalmente reservada para paquetes de matemática complicados, así como herramientas útiles para necesidades diarias (como conversión de monedas y cálculo de porcentajes). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Las características incluyen una gran librería de funciones personalizables, cálculo y conversión de unidades, constantes físicas, cálculos simbólicos (incluyendo integrales y ecuaciones), precisión arbitraria, propagación de incertidumbre, aritmética de intervalos, graficado, y una interfaz amigable. Argument Rules Reglas de argumento _Cancel _Cancelar Do not save modifications No guardar modificaciones _OK _Aceptar Accept the modification of argument rules Aceptar la modificación de las reglas de argumento Enable rules and type test Habilitar reglas y prueba de tipo Custom condition Condición personalizada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por ejemplo, si el argumento es una matriz que debe tener igual número de filas y columnas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Prohibir cero Handle vector Manejar vector Calculate function for each separate element in vector. Calcular función por cada elemento del vector por separado Min Mínimo Include equals Incluir igual Max Máximo Keyboard Shortcuts Atajos de teclado _Close _Cerrar Label Etiqueta Left-click Clic izquierdo Right-click Clic derecho Middle-click Clic medio Reset Reiniciar Value Valor Argument name Nombre del argumento Calendar Conversion Conversión de calendario Export CSV File Exportar archivo CSV Current result Resultado actual Matrix/vector variable Variable de matriz/vector File Archivo Delimiter Delimitador Comma Coma Tabulator Tabulador Semicolon Punto y coma Space Espacio Other Otro Import CSV File Importar archivo CSV Do not import the file No importar el archivo Import the file Importar el archivo Name of the data file to import Nombre del archivo de datos a importar Select a file Seleccionar un archivo Import as Importar como Matrix Matriz If a matrix shall be generated from the contents of the file Si se debe generar una matriz o vectores a partir del contenido del archivo Vectors Vectores If vectors shall be generated from the contents of the file Si se debe generar una matriz o vectores a partir del contenido del archivo Name Nombre Name (or name prefix) used to reference generated variable(s) in expressions Nombre (o prefijo) usado para referenciar variable(s) generada(s) en las expresiones Descriptive name Nombre descriptivo Title displayed in menus and in variable manager Título mostrado en menús y en el administrador de variables Category Categoría First row Primera fila The first row with data to import in the file La primera fila del archivo con datos para importar Includes headings Incluye encabezados If the first row contains column headings Si la primera fila contiene encabezados de columna Delimiter used to separate columns in the file Delimitador usado para separar columnas en el archivo Custom delimiter Delimitador personalizado Edit Data Property Editar propiedades de datos Do not create/modify this data set No crear/modificar este conjunto de datos Accept the creation/modification of this data set Aceptar la creación/modificación de este conjunto de datos Name used for reference Nombre usado para referencia Properties Propiedades Title displayed in menus and in data set manager Título mostrado en menús y en el administrador de conjunto de datos Description Descripción Description of this data property Descripción de esta propiedad de datos Value Type Tipo de valor Text Texto Number Número Expression Expresión Hide Ocultar Use as key Usar como clave Approximate value Valor aproximado Case sensitive value Valor sensible a mayúsculas y minúsculas Value uses brackets Usa llaves Unit expression Expresión de unidad Edit Data Set Editar conjunto de datos Title Título Data file Archivo de datos Description of this data set Descripción de este conjunto de datos Copyright Derechos de autor General General Properties: Propiedades: Definition of the properties of this data set Definición de las propiedades de este conjunto de datos _New _Nuevo _Edit _Editar _Delete _Eliminar Name used to invoke the function in expressions Nombre usado para llamar la función en expresiones Object argument name Nombre del argumento de objeto Property argument name Nombre del argumento de propiedad Default property Propiedad por defecto Function Función Edit Data Object Editar objeto de datos Do not create/modify this data object No crear/modificar este objeto de datos Accept the creation/modification of this data object Aceptar la creación/modificación de este objeto de datos Data Sets new dataset Conjuntos de datos Data Set Conjunto de datos Create a new data set Crear un nuevo conjunto de datos Edit the selected data set Editar el conjunto de datos seleccionado Delete the selected data set Eliminar el conjunto de datos seleccionado Objects Objetos Create a new data object Crear un nuevo objeto de datos Edit the selected data object Editar el objeto de datos seleccionado Remove the selected data object Eliminar el objeto de datos Data Set Description Descripción del conjunto de datos Object Attributes Atributos de objeto Decimals Decimales Close this window Cerrar esta ventana Min decimals Decimales mínimos Max decimals Decimales máximos Minimal number of displayed decimals Número mínimo de decimales mostrados Maximal number of decimals to display (and round to) Número máximo de decimales a mostrar (y a redondear) Floating Point Conversion Conversión de punto flotante Decimal value Valor decimal Binary value Valor binario Octal value Valor octal Hexadecimal representation Representación hexadecimal Conversion error Error de conversión Binary representation Representación binaria Floating point value Valor de punto flotante Format Formato 16-bit (half precision) 16-bit (precisión media) 32-bit (single precision) 32-bit (precisión simple) 64-bit (double precision) 64-bit (precisión doble) 80-bit (x86 extended format) 80-bit (formato extendido x86) 128-bit (quadruple precision) 128-bit (precisión cuádruple) Hexadecimal value Valor hexadecimal Edit Function Editar función _Help _Ayuda Do not create/modify this function No crear/modificar esta función Accept the creation/modification of this function Aceptar la creación/modificación de esta función Name used to invoke this function in expressions Nombre usado para llamar esta función en expresiones Title displayed in menus and in function manager Título mostrado en menús y el administrador de funciones Hide function Ocultar función If this function shall be hidden in menus Si esta función debe ser ocultada de los menús Description of this function Descripción de esta función Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Use \x para el primer, \y para el segundo y \z para el tercer argumento. Para más información, haga clic en el botón de ayuda. Condition Condición Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condición que debe ser verdadera para la función (por ejemplo, si el segundo argumento debe ser mayor que el primero: "\y > \x") Sub-Functions Subfunciones Arguments: Argumentos: Definition of this function's arguments Definición de los argumentos de esta función Free Libre Integer Entero Symbol Símbolo Date Fecha Vector Vector Positive number Número positivo Non-zero number Número distinto de cero Non-negative number Número no negativo Positive integer Entero positivo Non-zero integer Entero distinto de cero Non-negative integer Entero no negativo Boolean Booleano Object Objeto Unit Unidad Variable Variable Angle Ángulo Data object Objeto de datos Data property Propiedad de datos _Add _Añadir Add entered argument definition Añadir la definición de argumento ingresada _Apply _Aplicar Modify selected argument Modificar argumento seleccionado Remove selected argument Eliminar argumento seleccionado Rules Reglas Edit conditions for selected argument Editar condiciones para el argumento seleccionado Close this dialog Cerrar este diálogo Precalculate Precalcular Calculate the subfunction only once, before the parent function Calcular la subfunción solo una vez, antes que la función padre Add entered subfunction Añadir subfunción ingresada Apply changes to the selected subfunction Aplicar cambios a la subfunción seleccionada Remove the selected subfunction Eliminar la subfunción seleccionada Functions Funciones Create a new function Crear una nueva función Edit the selected function Editar la función seleccionada _Insert _Insertar Insert (or execute) the selected function into the expression entry Insertar (o ejecutar) la función seleccionada en la entrada de expresión Delete the selected function Eliminar la función seleccionada (De)activate the selected function (Des)activar la función seleccionada Deacti_vate Desacti_var Apply the selected function to the current expression Aplicar la función seleccionada a la expresión actual Categor_y Catego_ría _Function _Función Descri_ption Descri_pción Degrees Grados Radians Radianes Gradians Gradianes Default assumptions Suposiciones predeterminadas Unknown Desconocido Not Matrix No matriz Complex Complejo Real Real Rational Racional Non-Zero No cero Positive Positivo Non-Negative No negativo Negative Negativo Non-Positive No positivo _File _Archivo Unknown Variable Variable desconocida Function (simplified) Función (simplificada) Import CSV File… Importar archivo CSV… Export CSV File… Exportar archivo CSV… _Store Result… _Guardar resultado Save Result Image… Guardar imagen de resultado… Save local functions, variables and units Guardar funciones, variables y unidades locales Save Definitions Guardar definiciones Import Definitions File… Importar archivo de definiciones… Fetch current exchange rates from the Internet Obtener tasas de cambio actuales de Internet Update Exchange Rates Actualizar tasas de cambio Plot Functions/Data Graficar funciones/datos Convert Number Bases Convertir bases de números Floating Point Conversion (IEEE 754) Conversión de punto decimal (IEEE 754) Percentage Calculation Tool Herramienta de cálculo de porcentaje Periodic Table Tabla periódica Minimal Window Ventana mínima _Quit _Cerrar Manage Variables Administrar variables Manage Functions Administrar funciones Manage Units Administrar unidades Manage Data Sets Administrar conjuntos de datos Factorize Factorizar Expand Expandir Apply partial fraction decomposition to the current result. Aplicar descomposición de fracción parcial al resultado actual. Expand Partial Fractions Expandir fracciones parciales Set Unknowns… Definir incógnitas… Convert to Unit Convertir a unidad Set Prefix Definir prefijo Convert to Unit Expression… Convertir a expresión de unidad… Convert to Base Units Convertir a unidades base Convert to Optimal Unit Convertir a unidades óptimas Insert Date… Insertar fecha… Insert Matrix… Insertar matriz… Insert Vector… Insertar vector… _Copy Result _Copiar resultado Customize Keypad Buttons Personalizar botones del teclado _Preferences _Preferencias _Mode _Modo Number Base Base numérica Select Result and Expression Base… Seleccionar base del resultado y la expresión… Binary Binario Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Otro… Sexagesimal Sexagesimal Time Format Formato de hora Roman Numerals Números romanos Numerical Display Visualización numérica Normal Normal Engineering Ingeniería Scientific Científica Purely Scientific Puramente científica Simple Simple Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desactivado: 1/7 ≈ 0.14285714 Activado: 1/7 = 0.142857 142857... Indicate Repeating Decimals Indicar decimales repetidos Show Ending Zeroes Mostrar ceros finales Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desactivado: 2.5 ≈ 3, 1.5 ≈ 2 Activado: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Redondear números intermedios a pares Off: -x + y On: y - x Desactivado: -x + y Activado: y - x Sort Minus Last Ordenar menos al final Complex Rectangular Form Forma compleja rectangular Complex Exponential Form Forma compleja exponencial Complex Polar Form Forma compleja polar Complex Angle/Phasor Notation Notación compleja de ángulo/fasor Rational Number Form Forma de número racional 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Fracciones decimales 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Fracciones decimales exactas 6/4 = 3/2 6/4 = 3/2 Simple Fractions Fracciones simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Fracciones mixtas Interval Display Visualización de intervalo Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desactivado: 1/2*pi ≈ 1.5707963 Activado: 1/2*pi = 0.5 pi Adaptive Adaptativo Calculates an interval of possible values and keeps track of precision changes. Calcula un rango de valores posibles y mantiene un registro de cambios de precisión. Significant Digits Cifras significativas Interval Intervalo Plus/Minus Más/Menos Midpoint Punto medio Unit Display Visualización de unidad Do not use any prefixes in result No usar ningún prefijo en el resultado Show prefixes for primarily SI and CGS units. Mostrar prefijos principalmente para unidades del SI y CGS. Use prefixes for selected units Usar prefijos para las unidades seleccionadas Use prefixes also for currencies Usar prefijos también para monedas Use prefixs for all units Usar prefijos para todas las unidades Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Habilita el uso automático de hecto, deci y centi cuando los prefijos están habilitados Enable All SI Prefixes Habilitar todos los prefijos del SI Enables automatic setting of prefix for denominator in addition to the numerator Habilita el uso automático de prefijos para el denominador, además del numerador Enable Denominator Prefixes Habilitar prefijos de denominador Off: J / K On: J * K^-1 Desactivado: J / K Activado: J * K^-1 Negative Exponents Exponentes negativos Off: (2 m)/s On: 2 (m/s) Desactivado: (2 m)/s Activado: 2 (m/s) Place Units Separately Colocar unidades por separado No Additional Conversion Ninguna conversión adicional Convert to Optimal SI Unit Convertir a unidades del SI óptimas If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Si habilitado: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Convertir a unidades mixtas Abbreviate Names Abreviar nombres Enabled Objects Objetos habilitados Variables Variables Units Unidades Unknowns Incógnitas Units in Physical Constants Unidades en constantes físicas If not enabled, treats all variables as unknown Si no activado, trata todas las variables como desconocidas Calculate Variables Calcular variables Disables/enables complex numbers in result Habilita/deshabilita números complejos en el resultado Allow Complex Result Permitir resultado complejo Disables/enables infinite numbers in result Habilita/deshabilita números infinitos en el resultado Allow Infinite Result Permitir resultado infinito Approximation Aproximación Always Exact Siempre exacto Try Exact Intentar exacto Approximate Aproximado Interval Arithmetic Aritmética de intervalo Interval Calculation Cálculo de intervalo Variance Formula Fórmula de varianza Change angle unit used in trigonometric functions Cambiar unidad de ángulo usada en funciones trigonométricas Angle Unit Unidad de ángulo None Ninguna Assumptions Suposiciones Algebraic Mode Modo algebraico Assume that unknown denominators are non-zero Asumir que denominadores desconocidos son distintos de cero Non-Zero Denominators Denominadores distintos de cero Warn when unknown denominators are assumed non-zero Advertir cuando denominadores desconocidos se asumen como distintos de cero Warn About Denominators Assumed Non-Zero Advertir por denominadores asumidos como distintos de cero Parsing Mode Modo de análisis Adaptive Parsing Análisis adaptativo Parse Implicit Multiplication First Analizar multiplicación implícita primero Conventional Parsing Análisis convencional Off: xy = x*y On: xy != x*y Desactivado: xy = x*y Activado: xy != x*y Limit Implicit Multiplication Limitar multiplicación implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analizar números decimales como aproximados con precisión igual a la cantidad de dígitos. Desactivado: 1.1 * 1.1 = 1.21 Activado: 1.1 * 1.1 ≈ 1.2 Read Precision Leer precisión _Precision _Precisión _Decimals _Decimales Calculate As You Type Calcular al escribir Chain Mode Modo de análisis Activate the RPN stack. Activar la pila de RPN. RPN Mode Modo RPN Meta Modes Meta modos Save Mode… Guardar modo… Delete Mode… Eliminar modo… Save Default _Mode Guardar _modo predeterminado Fu_nctions Fu_nciones _Variables _Variables _Units _Unidades _Contents _Contenidos Report a Bug Reportar un error Check for Updates Buscar actualizaciones _About _Acerca de Toggle minimal window Alternar ventana mínima Calculation result Resultado de cálculo _Keypad _Teclado Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Alterna el teclado persistente (permite mostrar el teclado y el historial simultáneamente) _History _Historial C_onversion C_onversión RPN Stack Pila RPN Insert the selected value Insertar el valor seleccionado Insert the selected text Insertar el texto seleccionado Copy the selected text Copiar el texto seleccionado Add the selected value(s) Sumar los valores seleccionados Subtract the selected value(s) Restar los valores seleccionados Multiply the selected value(s) Multiplicar los valores seleccionados Divide the the selected value(s) Dividir los valores seleccionados Raise to the power of the selected value Elevar a la potencia del valor seleccionado Calculate the square root of the selected value Calcular la raíz cuadrada del valor seleccionado History Historial Subtract the top value from the second value Restar el primer valor al segundo valor Multiply the top two values Multiplicar los dos primeros valores Divide the second value by the top value Divide el segundo valor entre el primer valor Raise the second value to the power of the top value Elevar el segundo valor a la potencia del primer valor Negate the top value (Ctrl+-) Negar el primer valor (Ctrl+-) Invert the top value Invertir el primer valor Calculate the square root of the top value Calcular la raíz cuadrada del primer valor Calculate the sum of all values Calcular la suma de todos los valores Rotate the stack or move selected register up Rotar la pila o mover el registro seleccionado hacia arriba Rotate the stack or move selected register down Rotar la pila o mover el registro seleccionado hacia abajo Swap the two top values or move the selected value to the top of the stack Intercambiar los dos primeros valores o mover el valor seleccionado encima de la pila Copy the selected or top value to the top of the stack Copiar el primer valor o el seleccionado encima de la pila Enter the top value from before the last numeric operation Ingresar el primer valor previo a la última operación numérica Delete the top or selected value Eliminar el primer valor o el valor seleccionado Edit the selected value Editar el valor seleccionado Clear the RPN stack Limpiar la pila RPN Unit(s) and prefix to convert result to Unidad(es) y prefijo(s) a los que convertir el resultado Convert Convertir Continuous conversion Conversión continua Automatically convert result to the current unit expression as long as the conversion box is visible. Convertir el resultado automáticamente a la expresión de unidad actual mientras la caja de conversión sea visible. Add prefix Añadir prefijo If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Si la expresión de unidad no contiene ningún prefijo, usar el prefijo óptimo. Esto puede ser anulado anteponiendo la expresión de unidad con "?" o "0". Conversion Conversión Show/hide programming keypad Mostrar/Ocultar teclado de programación Exact Exacto Fraction Fracción Numerical display Visualización numérica Pure Pura Number base Base numérica Time format Formato de fecha Roman Romano sin sin cos cos tan tan ln ln Equals Igual a sqrt sqrt sum sum Unknown variable Variable desconocida mod mod mean mean Store result as a variable Guardar resultado como variable STO Standard calculator button. Do not use more than three characters. STO Convert number bases Convertir bases numéricas Imaginary unit i (√-1) Unidad imaginaria i (√-1) Manage units Administrar unidades Conversion operator Operador de conversión Kilogram Kilogramo Two's complement input Entrada de complemento a dos Two's complement output Salida de complemento a dos Bitwise Exclusive OR OR exclusivo bit a bit Bitwise Left Shift Desplazamiento a la izquierda bit a bit Bitwise Right Shift Desplazamiento a la derecha bit a bit Floating point conversion Conversión de punto flotante Show/hide left keypad Mostrar/Ocultar teclado izquierdo Show/hide right keypad Mostrar/Ocultar teclado derecho DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultado anterior ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Añadir a expresión Persistent Keypad Teclado persistente Edit Editar Delete Eliminar Update Actualizar Insert Value Insertar valor Insert Text Insertar texto Insert Parsed Text Insertar texto analizado Copy Copiar Copy Full Text Copiar texto completo Search… Buscar… Add Bookmark… Añadir marcador… Bookmarks Marcadores Protect Proteger Move To Top Mover a la cima Remove Eliminar Clear All Limpiar todo _Copy _Copiar _Store… _Guardar… Save Image… Guardar imagen… _Factorize _Factorizar _Expand _Expandir _Normal _Normal Sc_ientific C_ientifica Purel_y Scientific Pura_mente científica Simp_le Simp_le _Binary _Binaria _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fracción decimal Exact Decimal Fraction Fracción decimal exacta Simple Fraction Fracción simple Mixed Fraction Fracción mixta _Abbreviate Names _Abreviar nombres C_onvert… C_onvertir… Convert to Base _Units Convertir a _unidades base Convert _to Optimal Unit Convertir a unidad óp_tima Use Optimal Prefix Usar prefijo óptimo Convert to Convertir a Convert to UTC Convertir a UTC Convert to Calendars Convertir a calendario Use prefixes for all units Usar prefijos para todas las unidades Enable All SI Prefi_xes Habilitar todos los prefi_jos del SI View/Edit Matrix Ver/Editar matriz View/Edit Vector Ver/Editar vector Copy Text Copiar texto To Top A la cima Swap Intercambiar Up Arriba Down Abajo Negate Negar Invert Invertir Square Cuadrado Square Root Raíz cuadrada Clear Stack Limpiar pila Select Number Base… Seleccionar base numérica… Store result Guardar resultado Insert the matrix/vector into the expression Insertar la matriz/vector en la expresión Rows Filas Number of rows in this matrix (rows displayed for vectors) Número de filas en esta matriz (filas mostradas para vectores) Columns Columnas Number of columns in this matrix (columns displayed for vectors) Número de columnas en esta matriz (columnas mostradas para vectores) If this is a matrix or vector Si esto es una matriz o un vector Elements Elementos Current element: Elemento actual: Edit Matrix Editar matriz Do not create/modify this matrix/vector No crear/modificar esta matriz/vector Create/modify the matrix/vector Crear/Modificar esta matriz/vector Accept the creation/modification of this matrix/vector Aceptar la creación/modificación de esta matriz/vector Name used to reference this variable in expressions Nombre usado para referenciar esta variable en expresiones Names Nombres Add new name Añadir nuevo nombre Apply changes to the selected name Aplicar cambios al nombre seleccionado Remove the selected name Eliminar el nombre seleccionado Abbreviation Abreviación Unicode Unicode Plural Plural Suffix Sufijo Reference Referencia Avoid input Evitar entrada Case sensitive Distingue mayúsculas y minúsculas Completion only Solo completado Number Bases Bases numéricas Roman numerals Números romanos BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Restar Multiply Multiplicar Divide Dividir Bitwise AND AND bit a bit Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear Limpiar Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ingresa dos valores, de los cuales como máximo uno es un porcentaje, y los otros serán calculados por tí Percentage Porcentaje Calculate Calcular Value 1 Valor 1 2 compared to 1 2 comparado a 1 Change from 1 to 2 Cambio de 1 a 2 Value 2 Valor 2 1 compared to 2 1 comparado a 2 Change from 2 to 1 Cambio de 2 a 1 Plot Graficar _Save _Guardar Save as png, svg, postscript, eps, latex or fig Guardar como png, svg, postscript, eps, latex o fig Vector/matrix Vector/Matriz Paired matrix Matriz emparejada if you want to split matrix in rows instead of columns Si quiere separar la matriz el filas en lugar de columnas X variable Variable X The variable name used in expression La variable usada en la expresión Style Estilo Line Línea Points Puntos Line with points Linea con puntos Boxes/bars Cajas/Barras Histogram Histograma Steps Pasos Candlesticks Candelabros Dots Punteado Smoothing Suavizado Monotonic Monotónico Natural cubic splines Spline cúbica natural Bezier Bezier Bezier (monotonic) Bezier (monotónico) Y-axis Eje Y Primary Primario Secondary Secundario _Remove _Eliminar Data Datos Minimum x value Valor mínimo de x Maximum x value Valor máximo de x Sampling rate Tasa de muestreo Step size Tamaño de paso Function Range Rango de función Display grid Mostrar cuadrícula Display full border Mostrar borde completo Minimum y value Valor mínimo de y Maximum y value Valor máximo de y Logarithmic x scale Escala logarítmica de x Logarithmic y scale Escala logarítmica de y X-axis label Etiqueta de eje x Y-axis label Etiqueta de eje y Line width Ancho de línea Color display Visualización de color Color Color Monochrome Monocromo Legend placement Ubicación de leyenda Top-left Superior izquierda Top-right Superior derecha Bottom-left Inferior izquierda Bottom-right Inferior derecha Below Abajo Outside Afuera Appearance Apariencia Precision Precisión _Recalculate _Recalcular Recalculate expression Recalcular expresión The number of significant digits to display/calculate (simple arithmetics are always calculated exact) El número de cifras significativas a mostrar/calcular (la aritmética simple siempre se calcula exactamente) Preferences Preferencias Save mode on exit Guardar modo al salir If the mode of the calculator shall be restored Si el modo de la calculadora debe ser restaurado Save definitions on exit Guardar definiciones al salir If changes to functions, units and variables shall be saved automatically Si los cambios a las funciones, unidades y variables deben ser guardados automáticamente Clear history on exit Limpiar historial al salir Allow multiple instances Permitir múltiples instancias Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permitir que múltiples instancias de la ventana principal de Qalculate! estén abiertas al mismo tiempo. Tenga en cuenta que solo el modo, historia y definiciones de última la instancia cerrada serán guardados. Notify when a new version is available Notificar cuando una nueva versión está disponible Use keyboard keys for RPN Usar teclas del teclado para RPN Use keyboard operator keys for RPN operations (+-*/^). Usar teclas de operación del teclado para las operaciones RPN (+-*/^). Use caret for bitwise XOR Usar circunflejo para XOR bit a bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Ingresar XOR (⊻) usando el circunflejo (^) del teclado (de lo contrario usar Ctrl+^). El operador de exponenciación (^) siempre puede ser ingresado usando Ctrl+*. Time limit for plot: Límite de tiempo para graficado: Behavior Comportamiento Enable Unicode symbols Habilitar símbolos unicode Disable this if you have problems with some fancy characters Deshabilita esto si tienes problemas con algunos caracteres especiales Ignore system language (requires restart) Ignorar idioma del sistema (requiere reinicio) Application name Nombre de aplicación Result Resultado Application name + result Nombre de aplicación + resultado Mode Modo Application name + mode Nombre de aplicación + modo Window title Título de ventana Default Predeterminado Button padding Función Number of expression lines Número de lineas para la expresión Display expression status Mostrar estado de la expresión If as-you-type expression status shall be displayed below the expression entry Si el estado de la expresión al escribir debe ser mostrado debajo de la entrada de expresión Persistent keypad Teclado persistente Look & Feel Aparencia Binary two's complement representation Representación binaria de complemento a dos If two's complement representation shall be used for negative binary numbers. Si la representación de complemento a dos debe ser usada para números binarios negativos Hexadecimal two's complement representation Representación hexadecimal de complemento a dos If two's complement representation shall be used for negative hexadecimal numbers. Si la representación de complemento a dos debe ser usada para números hexadecimales negativos Use lower case letters in non-decimal numbers Usar letras minúsculas en números no decimales If lower case letters should be used in numbers with non-decimal base Si las letras minúsculas deben ser usadas en números con base no decimal Alternative base prefixes Prefijos de base alternativos If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Si los números hexadecimales deben ser mostrados con "0x0" y los números binarios con "0b00" como prefijos Spell out logical operators Deletrear operadores lógicos If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Si los operadores lógicos deben ser mostrados como "&&"/"||" o "and"/"or" If "e" shall be used instead of "E" in numbers Si "e" debe ser usado en lugar de "E" en números Use E-notation instead of 10<sup><i>n</i></sup> Usar notación E en vez de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usar "e" minúscula (como en 1e10) Use 'j' as imaginary unit Usar "j" como la unidad imaginaria Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Usar "j" (en lugar de "i") como símbolo predeterminado para la unidad imaginaria, y colocarlo en frente de la parte imaginaria Use comma as decimal separator Usar coma como separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permitir puntos "." como separadores de miles en lugar de un separador decimal alternativo Ignore comma in numbers Ignorar comas en números Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permitir comas "," como separadores de miles en lugar de un separador de argumentos de función Ignore dots in numbers Ignorar puntos en números Digit grouping Agrupamiento de dígitos off Desactivado standard Estándar local Local Multiplication sign Signo de multiplicación Division sign Signo de división Copy digit separator Copiar dígito separador Deactivate to remove digit separator when copying result Desactivar para eliminar el separador de dígitos al copiar el resultado Numbers & Operators Números y operadores Use binary prefixes for information units Usar prefijos binarios para unidades de información Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usar prefijos binarios en lugar de decimales, como predeterminados para unidades de información (ej. bytes). Conversion to local currency Conversión a moneda local Automatically convert to the local currency when optimal unit conversion is activated. Automáticamente convertir a la moneda local cuando la conversión a unidad óptima esta activada. Update exchange rates on start Actualizar tasas de cambio al iniciar If current exchange rates shall be downloaded from the internet at program start Si las tasas de cambio deben ser descargadas del internet cuando el programa se inicia Exchange rates updates Actualizaciones de tasas de cambio Units & Currencies Unidades y monedas Show expression completion suggestions Mostrar sugerencias para completar expresiones Search titles and countries Buscar títulos y países Minimum characters Caracteres mínimos Popup delay (ms) Retraso de aparición (ms) Completion Completado Status warning color Color del estado de advertencia Status error color Color del estado de error Custom status font Fuente de estado personalizada If you want to use a font other than the default in the status display below the expression entry Si quiere usar una fuente distinta de la predeterminada en la visualización de estado debajo de la entrada de expresión Custom expression font Fuente de expresión personalizada If you want to use a font other than the default in the expression entry Si quiere usar una fuente distinta de la predeterminada en la entrada de expresión Custom result font Fuente de resultado personalizada If you want to use a font other than the default in the result display Si quiere usar una fuente distinta de la predeterminada en la visualización de resultado Custom keypad font Fuente de teclado personalizada If you want to use a font other than the default in the keypad Si quiere usar una fuente distinta de la predeterminada en el teclado Custom application font Fuente de aplicación personalizada If you want to use a font other than the default for the whole application Si quiere usar una fuente distinta de la predeterminada para toda la aplicación Text color Color de texto Fonts & Colors Fuentes y colores Other: Otro: Bijective base-26 Base biyectiva 26 <b>Result Base</b> <b>Base de resultado</b> <b>Expression Base</b> <b>Base de expresión</b> New Keyboard Shortcut Nuevo atajo de teclado Edit Variable Editar variable Advanced Avanzado Accept the creation/modification of this variable Aceptar la creación/modificación de esta variable x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Usar x, y, y z para el 1er, 2do y 3ro argumento de función respectivamente. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Usar \x, \y, y \z para el 1er, 2do y 3ro argumento de función respectivamente. Esto evita conflictos potenciales entre variables, funciones y unidades. Edit Unit Editar unidades Do not create/modify this unit No crear/modificar esta unidad Accept the creation/modification of this unit Aceptar la creación/modificación de esta unidad Singular form of this unit's name Forma singular de el nombre de esta unidad Title displayed in menus and in unit manager Título mostrado en menús y en el administrador de unidades System Sistema Imperial Imperial US Survey Tradicional EE.UU. (US Survey) Hide unit Ocultar unidad If this unit shall be hidden in menus Si esta unidad debe ser mostrada en menús Class Clase The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La clase a la que esta unidad pertenece. Las unidades de alias son definidas en relación a otra unidad, las unidades compuestas son una composición de un número de otras unidades. Las unidades base no son definidas en relación a otras unidades Base unit Unidad base Named derived unit Unidad derivada nombrada Derived unit Unidad derivada Base unit(s) Unidad(es) base Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to Unidad (para unidad alias) o unidades (para unidades compuestas) con las que esta unidad está definida Exponent Exponente Exponent of the base unit Exponente de la unidad base Relation Relación Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relación con la unidad base. Para relaciones lineares esto debería ser un número. Para relaciones no lineares use \x para el factor e \y para el exponente (ej: "\x + 273.15" para la relación entre grados Celsius y Kelvin). Relation is exact La relación es exacta If the relation is precise Si la relación es precisa Inverse relation Relación inversa Specify for non-linear relation, for conversion back to the base unit. Especificar para relación no linear, para la conversión de vuelta a la unidad base. Mix with base unit Combinar con la base unidad - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decide con qué unidades se combina la unidad base si existen múltiples opciones. - La unidad original no será combinada con unidades de prioridad menor. - Un número más bajo indica una más alta prioridad. Priority Prioridad Minimum base unit number Número mínimo de unidad base Use with prefixes by default Usar con prefijos por defecto Create a new unit Crear una nueva unidad Edit the selected unit Editar la unidad seleccionada Insert the selected unit into the expression entry Insertar la unidad seleccionada en la entrada de expresión C_onvert C_onvertir Convert the result to the selected unit Convertir el resultado a la unidad seleccionada Delete the selected unit Eliminar la unidad seleccionada (De)activate the selected unit (Des)activar la unidad seleccionada _Unit _Unidad Convert between units Convertir entre unidades = = Conver_sion Conver_sión Converted value Valor convertido Value to convert from Valor a convertir Type anywhere Escribir en cualquier lado Edit Unknown Variable Editar variable desconocida Do not create/modify this unknown variable No crear/modificar esta variable desconocida Accept the creation/modification of this unknown variable Aceptar la creación/modificación de esta variable desconocida Name used to reference this unknown variable in expressions Nombre usado para referenciar esta variable desconocida en expresiones Use custom assumptions Usar suposiciones personalizadas Type Tipo Real Number Número real Rational Number Número racional Sign Signo The category this unknown variable belongs to La categoría a la que esta variable desconocida pertenece Value of this variable (expression) Valor de esta variable (expresión) value is exact El valor es exacto If the value is precise Si el valor es preciso The category this variable belongs to La categoría a la que esta variable pertenece Create a new variable Crear una nueva variable Edit the selected variable Editar la variable seleccionada Insert the selected variable into the expression entry Insertar la variable seleccionada en la entrada de expresión Delete the selected variable Eliminar la variable seleccionada (De)activate the selected variable (Des)activar la variable seleccionada E_xport E_xportar _Variable _Variable Start a new instance of the application Iniciar una nueva instancia de la aplicación Display the application version Mostrar la versión de la aplicación Specify the window title Especificar el título de la ventana TITLE TÍTULO Expression to calculate Expresión a calcular [EXPRESSION] [EXPRESIÓN] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Escribe una expresión matemática encima, ej: "5 + 2 / 3", y presiona la tecla enter. ans ans Last Answer Última respuesta answer respuesta Answer 2 Respuesta 2 Answer 3 Respuesta 3 Answer 4 Respuesta 4 Answer 5 Respuesta 5 Failed to load global definitions! Falla al cargar las definiciones globales! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Todas By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Por defecto, solo una instancia (una ventana principal) de %s es permitida. Si múltiples instancias están abiertas simultáneamente, solo las definiciones (variables, funciones, etc.), modo, preferencias, e historia de la última ventana serán guardadas. ¿Quiere, a pesar de esto, cambiar el comportamiento predeterminado y permitir múltiples instancias simultáneas? c-format Right-click/long press: %s Clic derecho / pulsación larga: %s c-format Right-click: %s Clic derecho: %s c-format Middle-click: %s Clic medio: %s c-format Cycle through previous expression Recorrer expresiones previas Move cursor left or right Mover cursor a la izquierda o derecha Move cursor to beginning or end Mover cursor al principio o final Uncertainty/interval Incertidumbre/Intervalo Relative error Error relativo Argument separator Separador de argumentos Blank space Espacio en blanco New line Nueva línea Smart parentheses Paréntesis inteligentes Vector brackets Corchetes para vectores Left parenthesis Paréntesis izquierdo Left vector bracket Paréntesis recto izquierdo de vector Right parenthesis Paréntesis derecho Right vector bracket Paréntesis recto derecho de vector Decimal point Punto decimal Raise (Ctrl+*) Elevar (Ctrl+*) Add Añadir Backspace Retroceso Previous result (static) Resultado anterior (estático) Calculate expression Calcular expresión Set unknowns Definir incógnitas more Show further items in a submenu más Logical AND AND lógico Logical OR OR lógico Logical NOT NOT lógico Toggle Result Base Alternar base de resultado Open menu with stored variables Abrir menú con variables almacenadas Index Índice Calculate expression and add to stack Calcular expresión y añadir a la pila Flag Bandera Matrices Matrices Gregorian Gregoriano Revised Julian (Milanković) Juliano revisado (Milanković) Julian Julian Islamic (Hijri) Islámico (Hijri) Hebrew Hebreo Chinese Chino Persian (Solar Hijri) Persa (Hijri solar) Coptic Copto Ethiopian Etíope Indian (National) Indio (nacional) Action Acción Key combination Combinación de teclas Raise Elevar History Answer Value Valor de respuesta de historial History Index(es) Índice(s) de historial History index %s does not exist. Índice de historial %s no existe. c-format expression expresión History Parsed Expression Expresión de historia analizada Set Window Title Definir título de ventana Failed to open %s. %s Fallo al abrir %s. %s c-format Could not display help for Qalculate!. No se pudo mostrar la ayuda de Qalculate!. Could not display help for Qalculate!. %s No se pudo mostrar la ayuda de Qalculate!. %s c-format approx. aprox. Stop process Detener proceso Clear expression Limpiar expresión EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? ¿Quiere actualizar las tasas de cambio ahora? It has been %s day since the exchange rates last were updated. Ha pasado %s día desde la última actualización de las tasas de cambio. Han pasado %s días desde la última actualización de las tasas de cambio. c-format It has been %s days since the exchange rates last were updated. Do not ask again No preguntar de nuevo It took too long to generate the plot data. Tomó demasiado tiempo generar los datos de graficado. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Tomó demasiado tiempo generar los datos de graficado. Por favor disminuya la tasa de muestreo o aumente el límite de tiempo en las preferencias. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Cuando errores, advertencias u otra información son generados durante el cálculo, el icono a la derecha de la entrada de expresión cambia para indicar esto. Si mantienes el puntero sobre o hace clic en el icono, el mensaje aparecerá Path of executable not found. Ruta de ejecutable no encontrada. curl not found. No se encontró curl. Failed to run update script. %s Error al ejecutar el script de actualización. %s c-format Failed to check for updates. Fallo al buscar actualizaciones. No updates found. No se encontró ninguna actualización. A new version of %s is available at %s. Do you wish to update to version %s. Una nueva versión de %s está disponible en %s. ¿Quiere actualizar a la versión %s? c-format A new version of %s is available. You can get version %s at %s. Una nueva versión de %s está disponible. Puedes obtener la versión %s en %s. c-format Too many arguments for %s(). Demasiados argumentos para %s() c-format argument argumento Uncategorized No categorizado hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binario roman romano bijective biyectivo sexagesimal sexagesimal latitude Relación time tiempo bases bases calendars calendarios rectangular rectangular cartesian cartesiano exponential exponencial polar polar angle ángulo phasor fasor optimal óptimo base base mixed mixto fraction fracción factors factores partial fraction fracción parcial factorize factorizar expand expandir hexadecimal number número hexadecimal octal number número octal decimal number número decimal duodecimal number número duodecimal binary number número binario roman numerals números romanos bijective base-26 base biyectiva 26 sexagesimal number número sexagesimal 32-bit floating point punto flotante de 32 bits 64-bit floating point punto flotante de 64 bits 16-bit floating point punto flotante de 16 bits 80-bit (x86) floating point punto flotante de 80 bits (x86) 128-bit floating point punto flotante de 128 bits time format formato de tiempo number bases bases numéricas optimal unit unidad óptima base units unidades base mixed units unidades mixtas expanded partial fractions fracciones parciales expandidas complex rectangular form forma compleja rectangular complex exponential form forma compleja exponencial complex polar form forma compleja polar complex cis form forma compleja cis complex angle notation Notación compleja de ángulo complex phasor notation notación compleja de fasor UTC time zone huso horario UTC number base %s base numérica %s c-format Inactive Inactivo Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera datos del conjunto de datos %s para un objeto y propiedad determinada. Si "info" es ingresado como una propiedad, aparecerá una ventana de diálogo con todas las propiedades del objeto. c-format Example: Ejemplo: Arguments Argumentos optional optional argument opcional default: argument default, in description predeterminado: Requirement Requisito key indicating that the property is a data set key clave Acti_vate Acti_var a previous result un resultado anterior matrix matriz vector vector positive positivo non-positive no positivo negative negativo non-negative no negativo non-zero no cero boolean booleano integer entero rational racional real real complex complejo number número (not matrix) (no matriz) unknown desconocido default assumptions suposiciones predeterminadas Variable does not exist anymore. La variable ya no existe más. Data Retrieval Function Función de recuperación de datos Insert function Insertar función Insert function (dialog) Insertar función (diálogo) Insert variable Insertar variable Insert unit Insertar unidad Insert text Insertar texto Insert date Insertar fecha Insert vector Insertar vector Insert matrix Insertar matriz Insert smart parentheses Insertar paréntesis inteligentes Convert to unit Convertir a unidad Convert to unit (entry) Convertir a unidad (entrada) Convert to optimal unit Convertir a unidades óptimas Convert to base units Convertir a unidades base Convert to optimal prefix Convertir a prefijo óptimo Convert to number base Convertir a base numérica Factorize result Factorizar resultado Expand result Expandir resultado Expand partial fractions Expandir fracciones parciales RPN: down RPN: abajo RPN: up RPN: arriba RPN: swap RPN: intercambiar RPN: copy RPN: copiar RPN: lastx RPN: último x RPN: delete register RPN: eliminar registro RPN: clear stack RPN: limpiar pila Load meta mode Cargar modo meta Set expression base Definir base de expresión Set result base Definir base de resultado Toggle exact mode Alternar modo exacto Set angle unit to degrees Definir unidad de ángulos a grados Set angle unit to radians Definir unidad de ángulos a radianes Set angle unit to gradians Definir unidad de ángulos a gradianes Toggle simple fractions Alternar fracciones simples Toggle mixed fractions Alternar fracciones mixtas Toggle scientific notation Alternar notación científica Toggle simple notation Alternar notación simple Toggle RPN mode Alternar modo RPN Toggle calculate as you type Alternar calcular al escribir Toggle programming keypad Alternar teclado de programación Show keypad Mostrar teclado Show history Mostrar historial Search history Buscar historial Show conversion Mostrar conversión Show RPN stack Mostrar pila RPN Manage variables Administrar variables Manage functions Administrar funciones Manage data sets Administrar conjuntos de datos New variable Nueva variable New function Nueva función Open plot functions/data Abrir graficado de función/datos Open convert number bases Abrir conversión de bases numéricas Open floating point conversion Abrir conversión de punto flotante Open calender conversion Abrir conversión de calendario Open percentage calculation tool Abrir herramienta de cálculo de porcentaje Open periodic table Abrir tabla periódica Update exchange rates Actualizar tasas de cambio Copy result Copiar resultado Insert result Insertar texto Save result image Guardar imagen de resultado Help Ayuda Quit Salir Prefixes Prefijos No Prefix Ningún prefijo Optimal Prefix Prefijo óptimo Prefix Prefijo Complex angle/phasor notation Notación compleja de ángulo/fasor Number bases Bases numéricas Base units Unidades base Binary number Número binario Calendars Calendarios Complex cis form Forma compleja cis Decimal number Número decimal Duodecimal number Número duodecimal Complex exponential form Forma compleja exponencial Factors Factores 16-bit floating point binary format Formato binario de punto flotante de 16 bits 32-bit floating point binary format Formato binario de punto flotante de 32 bits 64-bit floating point binary format Formato binario de punto flotante de 64 bits 80-bit (x86) floating point binary format Formato binario de punto flotante de 80 bits (x86) 128-bit floating point binary format Formato binario de punto flotante de 128 bits Hexadecimal number Número hexadecimal Mixed units Unidades mixtas Octal number Número octal Optimal units Unidades óptimas Expanded partial fractions Fracciones parciales expandidas Complex polar form Forma compleja polar Complex rectangular form Forma compleja rectangular Sexagesimal number Número sexagesimal and y or o undefined indefinido result is too long see history resultado es muy largo ver historial calculation was aborted calculo fue detenido RPN Register Moved Registro RPN movido RPN Operation Operación RPN Processing… Procesando… result processing was aborted procesamiento de resultados fue detenido Factorizing… Factorizando… Expanding partial fractions… Expandiendo fracciones parciales… Expanding… Expandiendo… Calculating… Calculando… Converting… Convirtiendo… Fetching exchange rates. Buscando tasas de cambio. Time zone parsing failed. Analizado de husos horarios falló. Keep open Mantener abierto Enter RPN Enter (calculate and add to stack) Ingresar C_alculate C_alcular Apply to Stack Aplicar a la pila Argument Argumento True Verdadero False False Info Información Edit Unit (global) Editar unidad (global) New Unit Nueva unidad Empty name field. Campo de nombre vacío. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Una variable o unidad con el mismo nombre ya existe. ¿Quiere sobreescribirla? Base unit does not exist. La unidad base no existe. Edit Function (global) Editar función (global) New Function Nueva función Yes No No Empty expression field. Campo de expresión vacío. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Una función con el mismo nombre ya existe. ¿Quiere sobreescribir la función? Unit does not exist La unidad no existe Edit Unknown Variable (global) Editar variable desconocida (global) New Unknown Variable Nueva variable desconocida An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Variable (global) Editar variable (global) New Variable Nueva variable Empty value field. Campo de valor vacío. Edit Vector Editar vector Edit Vector (global) Editar vector (global) New Vector Nuevo vector Edit Matrix (global) Editar matriz (global) New Matrix Nueva matriz Vector Result Resultado de vector Matrix Result Resultado de matriz New Data Object Nuevo objeto de datos text texto approximate aproximado Edit Data Set (global) Editar conjunto de datos (global) New Data Set Nuevo conjunto de datos info información Property Propiedad No file name entered. Nombre de archivo no ingresado. No delimiter selected. Delimitador no seleccionado. Could not import from file %s No se pudo importar el archivo %s c-format No variable name entered. Nombre de variable no ingresado. No known variable with entered name found. No se encontró una variable conocida con nombre ingresado. Could not export to file %s No se pudo exportar el archivo %s c-format My Variables Mis variables Couldn't write definitions No se pudo guardar las definiciones Preset Predefinido Abort Abortar Undo Deshacer Redo Rehacer Completion Mode Modo de completado Limited strict completion Completado estricto limitado Strict completion Completado estricto Limited full completion Completado completo limitado Full completion Completado completo No completion Sin completado Save Mode Guardar modo Preset mode cannot be overwritten. Modo predefinido no puede ser sobreescrito. Delete Mode Eliminar modo Couldn't write preferences to %s No se pudieron guardar las preferencias en %s c-format never nunca ask preguntar %i day %i día %i días c-format %i days Copied Result was copied Copiado log10 function not found. Función log10 no encontrada. Search Buscar _Search _Buscar Remove Bookmark Eliminar marcador Add Bookmark Añadir marcador A bookmark with the selected name already exists. Do you want to overwrite it? Un marcador con el nombre seleccionado ya existe. ¿Quiere sobreescribirlo? No items found No se encontraron ítems Select date Seleccionar fecha Rectangular form Forma rectangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notación ángulo/fasor Optimal unit Unidad óptima Optimal prefix Prefijo óptimo All functions Todas las funciones All variables Todas las variables Select definitions file Seleccionar archivo de definiciones _Import _Importar Could not copy %s to %s. No se pudo copiar %s a %s. c-format Could not read %s. No se pudo leer %s. c-format Could not copy file to %s. No se pudo copiar el archivo a %s. c-format Unsupported base. Base no soportada. The selected Chinese year does not exist. El año chino seleccionado no existe. Conversion to Gregorian calendar failed. La conversión al calendario gregoriano falló. Calendar conversion failed for: %s. La conversión de calendario falló por: %s. c-format Select file to save PNG image to Seleccionar archivo al que guardar la imagen PNG. Allowed File Types Tipos de archivo permitidos All Files Todos los archivos Cannot delete unit as it is needed by other units. do not delete units that are used by other units No se puede eliminar la unidad porque está siendo usada por otras unidades. none ninguno result is too long resultado es muy largo translator-credits VicSanRoPe Mode not found. Modo no encontrado Elements (in horizontal order) Elementos (en orden horizontal) Select file to import Seleccionar archivo a importar _Open _Abrir Select file to export to Seleccionar archivo al que exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Existe un objeto en conflicto con el mismo nombre. Si continúas y guardas los cambios, el objeto en conflicto será sobreescrito o desactivado. ¿Quiere continuar? Set key combination Definir combinación de teclas Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Presiona la combinación de teclas que quieres usar para la acción (presiona Escape para cancelar). No keys Ninguna tecla Empty value. Valor vacío. Function not found. Función no encontrada. Variable not found. Variable no encontrada. Unit not found. Unidad no encontrada. The key combination is already in use. Do you wish to replace the current action? La combinación de teclas ta está en uso. ¿Quiere remplazar la acción actual? Select file to export Seleccionar archivo al que exportar Empty expression. Expresión vacía. Empty x variable. Variable x vacía. Element Data Datos de elementos Classification Clasificación Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalinotérreo Lanthanide Lantánido Actinide Actínido Transition Metal Metal de transición Metal Metal Metalloid Metaloide Polyatomic Non-Metal No metal poliatómico Diatomic Non-Metal No metal diatómico Noble Gas Gas noble Unknown chemical properties Propiedades químicas desconocidas No unknowns in result. No hay incógnitas en el resultado. Set Unknowns Definir incógnitas Copy result to clipboard Copiar resultado x x If a matrix or vectors shall be generated from the contents of the file Si se debe generar una matriz o vectores a partir del contenido del archivo Use dark theme Usar el tema oscuro Add the two top values Keypad Sumar los dos primeros valores u Manage units button u to Button for convert to operator a Add Keypad Sumar Base Unit Unidad base Alias Alias Composite Unit Unidad compuesta Fonts Fuentes Chain Calculation Cálculo de intervalo <b>Name</b> <b>Nombre</b> <b>Type</b> <b>Tipo</b> <b>Relation</b> <b>Relación</b> Adaptive parsing Análisis adaptativo 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i segundos c-format Ent Ent Defaults Predeterminados Customize Buttons Fuente de estado personalizada Names details Detalle de nombres ArgumentEditDialog Name: Nombre: Type: Tipo: Free Libre Number Número Integer Entero Symbol Símbolo Text Texto Date Fecha Vector Vector Matrix Matriz Boolean Booleano Angle Ángulo Object Objeto Function Función Unit Unidad Variable Variable File Archivo Enable rules and type test Habilitar reglas y prueba de tipo Custom condition: Condición personalizada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por ejemplo, si el argumento es una matriz que debe tener igual número de filas y columnas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Prohibir cero Handle vector Manejar vector Calculate function for each separate element in vector. Calcular función por cada elemento del vector por separado. Min Mínimo Include equals Incluir igual Max Máximo CSVDialog Import CSV File Importar archivo CSV Export CSV File Exportar archivo CSV Current result Resultado actual Matrix/vector variable: Variable de matriz/vector: File: Archivo: Import as Importar como matrix matriz vectors vectores Name: Nombre: First row: Primera fila: Includes headings Incluye encabezados Delimiter: Delimitador: Comma Coma Tabulator Tabulador Semicolon Punto y coma Space Espacio Other Otro Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? An unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Error Error Could not import from file %1 No se pudo importar el archivo %1 No matrix or vector variable with the entered name was found. No se encontró una variable de matriz o vector con nombre ingresado. Could not export to file %1 No se pudo exportar el archivo %1 CalendarConversionDialog Calendar Conversion Conversión de calendario Gregorian Gregoriano Hebrew Hebreo Islamic (Hijri) Islámico (Hijri) Persian (Solar Hijri) Persa (Hijri solar) Indian (National) Indio (nacional) Chinese Chino Julian Julian Revised Julian (Milanković) Juliano revisado (Milanković) Coptic Copto Ethiopian Etíope Error Error The selected Chinese year does not exist. El año chino seleccionado no existe. Conversion to Gregorian calendar failed. La conversión al calendario gregoriano falló. Calendar conversion failed for: %1. La conversión de calendario falló por: %1. DataObjectEditDialog %1: %1: Default Predeterminado Approximate Aproximado Exact Exacto Edit Data Object Editar objeto de datos New Data Object Nuevo objeto de datos DataPropertyEditDialog Name: Nombre: Title: Título: Descriptive name: Nombre descriptivo: Description: Descripción: Value type: Tipo de valor: Expression Expresión Number Número Text Texto Unit expression: Expresión de unidad: Use as key Usar como clave Case sensitive value Valor sensible a mayúsculas y minúsculas Approximate value Valor aproximado Value uses brackets Usa llaves Hide Ocultar Edit Data Property Editar propiedades de datos DataSetEditDialog General General Properties Propiedades Function Función Title: Título: Descriptive name: Nombre descriptivo: Data file: Archivo de datos: Description: Descripción: Copyright: Derechos de autor: Title Título Name Nombre Type Tipo Add Añadir Edit Editar Remove Eliminar Name: Nombre: Object argument name: Nombre del argumento de objeto: Property argument name: Nombre del argumento de propiedad: Default property: Propiedad por defecto: text texto approximate aproximado number número expression expresión key clave Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una función con el mismo nombre ya existe. ¿Quiere sobreescribir la función? Data Sets Conjuntos de datos Object Objeto Property Propiedad Edit Data Set Editar conjunto de datos New Data Set Nuevo conjunto de datos DataSetsDialog Data Sets Conjuntos de datos Data sets: Conjuntos de datos: New… Nuevo… Edit… Editar… Delete Eliminar Objects: Objetos: Data set description: Descripción del conjunto de datos: Object attributes: Atributos de objeto: Properties Propiedades key clave Data Retrieval Function Función de recuperación de datos argument argumento ExpressionEdit matrix matriz vector vector positive positivo non-positive no positivo negative negativo non-negative no negativo non-zero no cero boolean booleano integer entero rational racional real real complex complejo number número (not matrix) (no matriz) unknown desconocido default assumptions suposiciones predeterminadas Prefix: Prefijo: Complex Angle/Phasor Notation Notación compleja de ángulo/fasor Base units Unidades base Number Base Base numérica Binary-Coded Decimal Decimal codificado en binario Bijective Base-26 Base biyectiva 26 Binary Bumber número binario Binary Number Número binario Calendars Calendarios Complex cis Form Forma compleja cis Decimal Number Número decimal Duodecimal Number Número duodecimal Complex Exponential Form Forma compleja exponencial Factors Factores 16-bit Floating Point Binary Format Formato binario de punto flotante de 16 bits 32-bit Floating Point Binary Format Formato binario de punto flotante de 32 bits 64-bit Floating Point Binary Format Formato binario de punto flotante de 64 bits 80-bit (x86) Floating Point Binary Format Formato binario de punto flotante de 80 bits (x86) 128-bit Floating Point Binary Format Formato binario de punto flotante de 128 bits Fraction Fracción Decimal Fraction Fracción decimal Hexadecimal Number Número hexadecimal Latitude Latitud Longitude Longitud Mixed Units Unidades mixtas Octal Number Número octal Optimal Units Unidades óptimas Optimal Unit Unidad óptima Optimal Prefix Prefijo óptimo Expanded Partial Fractions Fracciones parciales expandidas Complex Polar Form Forma compleja polar Complex Rectangular Form Forma compleja rectangular Roman Numerals Números romanos Sexagesimal Number Número sexagesimal Time Format Formato de hora Unicode Unicode UTC Time Zone Huso horario UTC Undo Deshacer Redo Rehacer Cut Cortar Copy Copiar Paste Pegar Delete Eliminar Calculate Selection Calcular selección Insert Date… Insertar fecha… Insert Matrix… Insertar matriz… Select All Seleccionar todos Clear Limpiar Clear History Limpiar historial Completion Completado No completion Sin completado Limited strict completion Completado estricto limitado Strict completion Completado estricto Limited full completion Completado completo limitado Full completion Completado completo Delayed completion Completado retrasado Enable input method Habilitar método de entrada Expression Status Estado de la expresión Off Desactivado In history list In expression field With delay Con retraso Without delay Sin demora Automatically calculate selection Use input method Usar método de entrada Matrix Matriz Too many arguments for %1(). Demasiados argumentos para %1(). argument argumento %1: %1: comment comentario MC (memory clear) MC (limpiar la memoria) MS (memory store) MS (guardar en la memoria) M+ (memory plus) M+ (añadir a la memoria) M− (memory minus) M− (quitar de la memoria) factorize factorizar expand expandir hexadecimal hexadecimal hexadecimal number número hexadecimal octal octal octal number número octal decimal decimal decimal number número decimal duodecimal duodecimal duodecimal number número duodecimal binary binario binary number número binario roman romano roman numerals números romanos bijective biyectivo bijective base-26 base biyectiva 26 binary-coded decimal decimal codificado en binario sexagesimal sexagesimal sexagesimal number número sexagesimal latitude latitud longitude longitud 32-bit floating point punto flotante de 32 bits 64-bit floating point punto flotante de 64 bits 16-bit floating point punto flotante de 16 bits 80-bit (x86) floating point punto flotante de 80 bits (x86) 128-bit floating point punto flotante de 128 bits time tiempo time format formato de tiempo bases bases number bases bases numéricas calendars calendarios optimal óptima optimal unit unidad óptima prefix prefijo optimal prefix base base base units unidades base mixed mixtas mixed units unidades mixtas decimals decimal fraction fraction fracción factors factores partial fraction fracción parcial expanded partial fractions fracciones parciales expandidas rectangular rectangular cartesian cartesiano complex rectangular form forma compleja rectangular exponential exponencial complex exponential form forma compleja exponencial polar polar complex polar form forma compleja polar complex cis form forma compleja cis angle ángulo complex angle notation Notación compleja de ángulo phasor fasor complex phasor notation notación compleja de fasor UTC time zone huso horario UTC number base %1 base numérica %1 Data object Objeto de datos FPConversionDialog Floating Point Conversion (IEEE 754) Conversión de punto decimal (IEEE 754) Format Formato 16-bit (half precision) 16-bit (precisión media) 32-bit (single precision) 32-bit (precisión simple) 64-bit (double precision) 64-bit (precisión doble) 80-bit (x86 extended format) 80-bit (formato extendido x86) 128-bit (quadruple precision) 128-bit (precisión cuádruple) Microchip 24-bit Microchip 32-bit Value Valor Decimal value Valor decimal Binary representation Representación binaria Hexadecimal representation Representación hexadecimal Floating point value Valor de punto flotante Conversion error Error de conversión FunctionEditDialog Required Requerido Details Detalles Description Descripción Name: Nombre: Expression: Expresión: Argument references: Referencias de argumentos: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y y z (per ejemplo, "(x+y)/2"), o \x, \y, \z, \a, \b, … (per ejemplo, "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Utilice x, y y z (ej: "(x+y)/2"), o \x, \y, \z, \a, \b, … (ej: "(\x+\y)/2") Category: Categoría: Descriptive name: Nombre descriptivo: Hide function Ocultar función Example: Ejemplo: Description: Descripción: Condition: Condición: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condición que debe ser verdadera para la función (por ejemplo, si el segundo argumento debe ser mayor que el primero: "\y > \x") Sub-functions: Subfunciones: Expression Expresión Precalculate Precalcular Reference Referencia Add Añadir Edit Editar Remove Eliminar Arguments: Argumentos: Name Nombre Type Tipo Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una función con el mismo nombre ya existe. ¿Quiere sobreescribir la función? Edit Function Editar función New Function Nueva función FunctionsDialog Functions Funciones Category Categoría Function Función New… Nuevo… Edit… Editar… Deactivate Desactivar Delete Eliminar Calculate… Calcular… Apply Aplicar Insert Insertar Favorite Favorito argument argumento Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera datos del conjunto de datos %1 para un objeto y propiedad determinada. Si "info" es ingresado como una propiedad, aparecerá una ventana de diálogo con todas las propiedades del objeto. Example: Ejemplo: Arguments Argumentos optional optional argument opcional default: argument default predeterminado: Requirement: Required condition for function Requisito: Properties Propiedades %1: %1: key indicating that the property is a data set key clave Activate Activar All All functions Todas Uncategorized Sin categorizar User functions Funciones de usuario Favorites Favoritos Inactive Inactivas HistoryView Insert Value Insertar valor Insert Text Insertar texto Copy Copiar Copy Formatted Text Copiar texto formateado Copy unformatted ASCII Copiar ASCII sin formato Select All Seleccionar todos Search… Buscar… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Escribe una expresión matemática encima, ej: "5 + 2 / 3", y presiona la tecla enter. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Escribe una expresión matemática encima, ej: "5 + 2 / 3", y presiona la tecla enter. Exchange rate source(s): updated %1 Comment Comentario Protect Proteger Add Comment… Añadir comentario… Move to Top Mover a la cima Remove Eliminar Clear Limpiar Edit Comment… Editar comentario… Text: Texto: Search Buscar KeypadButton <i>Right-click/long press</i>: %1 <i>Clic derecho / pulsación larga</i>: %1 <i>Right-click</i>: %1 <i>Clic derecho</i>: %1 <i>Long press</i>: %1 <i>Pulsación larga</i>: %1 Open menu Menú abierto <i>Middle-click</i>: %1 <i>Clic medio</i>: %1 KeypadWidget Memory store Guardar en la memoria Memory clear Limpiar la memoria Memory recall Valor de la memoria Memory add Añadir a la memoria Memory subtract Quitar de la memoria STO Standard calculator button. Do not use more than three characters. STO Store Guardar New function Nueva función sin sin cos cos tan tan Exponentiation Potenciación Percent or remainder Por ciento o resto Uncertainty/interval Incertidumbre/intervalo Relative error Error relativo Interval Intervalo Move cursor left Mover cursor a la izquierda Move cursor to start Mover cursor al principio Move cursor right Mover cursor a la derecha Move cursor to end Mover cursor al final Logical AND AND lógico Logical OR OR lógico Bitwise Exclusive OR OR exclusivo bit a bit Logical NOT NOT lógico Bitwise Left Shift Desplazamiento a la izquierda bit a bit Bitwise Right Shift Desplazamiento a la derecha bit a bit cmp rot a→1 Expand partial fractions Expandir fracciones parciales Enable units in physical constants Habilitar unidades en constantes físicas All constants Todas las constantes Percentage Calculation Tool Herramienta de cálculo de porcentaje more más All units Todas las unidades All variables Todas las variables Action Acción Interval Display Visualización de intervalo Adaptive Adaptativo Significant digits Cifras significativas Plus/minus Más/menos Relative Relativo Concise Interval Calculation Cálculo de intervalo Variance formula Fórmula de varianza Interval arithmetic Aritmética de intervalo Allow concise uncertainty input Complex number form Forma de número complejo Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Ángulo/fasor Type Assumptions type Tipo Sign Assumptions sign Signo Default assumptions Suposiciones predeterminadas Number Número Real Real Rational Racional Integer Entero Boolean Booleano Unknown Unknown assumptions sign Desconocido Non-zero No cero Positive Positivo Non-negative No negativo Negative Negativo Non-positive No positivo Factorize Factorizar Expand Expandir Add column Add row Remove column Remove row Left parenthesis Paréntesis izquierdo Left vector bracket Paréntesis recto izquierdo de vector Right parenthesis Paréntesis derecho Right vector bracket Paréntesis recto derecho de vector Smart parentheses Paréntesis inteligentes Vector brackets Paréntesis rectos de vectores Argument separator Separador de argumentos Blank space Espacio en blanco New line Nueva línea Decimal point Punto decimal Previous result (static) Resultado anterior (estático) Multiplication Multiplicación Button Action Label: Etiqueta: Action: Acción: None Ninguna Value: Valor: Bitwise AND AND bit a bit Bitwise Shift Desplazamiento bit a bit Delete Eliminar Backspace Retroceso Addition Suma Plus Más Subtraction Resta Minus Menos Division División Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear expression Limpiar expresión Calculate expression Calcular expresión NamesEditDialog Name Nombre Abbreviation Abreviación Plural Plural Reference Referencia Avoid input Evitar entrada Unicode Unicode Suffix Sufijo Case sensitive Distingue mayúsculas y minúsculas Completion only Solo completado Add Edit Editar Remove Eliminar Warning Advertencia Illegal name Nombre ilegal A function with the same name already exists. Una función con el mismo nombre ya existe. A unit or variable with the same name already exists. Una unidad o variable con el mismo nombre ya existe. PercentageCalculationDialog Percentage Porcentaje Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Cambio de 1 a 2 Change from 2 to 1 Cambio de 2 a 1 2 compared to 1 2 comparado a 1 1 compared to 2 1 comparado a 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ingresa dos valores, de los cuales como máximo uno es un porcentaje, y los otros serán calculados por tí. Clear Limpiar PeriodicTableDialog Periodic Table Tabla periódica Element Data Datos de elementos Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalinotérreo Lanthanide Lantánido Actinide Actínido Transition Metal Metal de transición Metal Metal Metalloid Metaloide Polyatomic Non-Metal No metal poliatómico Diatomic Non-Metal No metal diatómico Noble Gas Gas noble Unknown chemical properties Propiedades químicas desconocidas Unknown Desconocido %1: %1: PlotDialog Plot Graficar Data Datos Title: Título: Expression: Expresión: Function Función Vector/matrix Vector/matriz Paired matrix Matriz emparejada Rows Filas X variable: Variable X: Style: Estilo: Line Línea Points Puntos Line with points Linea con puntos Boxes/bars Cajas/barras Histogram Histograma Steps Pasos Candlesticks Candelabros Dots Punteado Polar Polar Smoothing: Suavizado: None Ninguna Monotonic Monotónico Natural cubic splines Spline cúbica natural Bezier Bezier Bezier (monotonic) Bezier (monotónico) Y-axis: Eje Y: Primary Primario Secondary Secundario Add Añadir Apply Aplicar Remove Eliminar Category Categoría Title Título Expression Expresión Function Range Rango de función Minimum x value: Valor mínimo de x: Maximum x value: Valor máximo de x: Sampling rate: Tasa de muestreo: Step size: Tamaño de paso: Show real and imaginary parts Appearance Apariencia Display grid Mostrar cuadrícula Display full border Mostrar borde completo Minimum y value: Valor mínimo de y: Maximum y value: Valor máximo de y: Logarithmic x scale: Escala logarítmica de x: Logarithmic y scale: Escala logarítmica de y: X-axis label: Etiqueta de eje x: Y-axis label: Etiqueta de eje y: Line width: Ancho de línea: Legend placement: Ubicación de leyenda: Top-left Superior izquierda Top-right Superior derecha Bottom-left Inferior izquierda Bottom-right Inferior derecha Below Abajo Outside Afuera Calculating… Calculando… Cancel Cancelar Processing… Procesando… PreferencesDialog Look && Feel Aparencia Numbers && Operators Números y operadores Units && Currencies Unidades y monedas Parsing && Calculation Cálculo y análisis Ignore system language (requires restart) Ignorar idioma del sistema (requiere reinicio) Allow multiple instances Permitir múltiples instancias Clear history on exit Limpiar historial al salir Close application with Escape key Keep above other windows Mantener encima de otras ventanas Window title: Título de ventana: Application name Nombre de aplicación Result Resultado Application name + result Nombre de aplicación + resultado Workspace Espacio de trabajo Application name + workspace Nombre de aplicación + espacio de trabajo Style: Estilo: Default (requires restart) Default style Predeterminado (requiere reinicio) Dark mode Modo oscuro Colorize result Colorear resultado Custom result font Fuente de resultado personalizada Custom expression font Fuente de expresión personalizada Custom keypad font Fuente de teclado personalizada Custom application font Fuente de aplicación personalizada Custom result font: Fuente de resultado personalizada: Custom expression font: Fuente de expresión personalizada: Custom keypad font: Fuente de teclado personalizada: Custom application font: Fuente de aplicación personalizada: Display expression status Mostrar estado de la expresión Delay: Retraso: Expression after calculation: Expresión después del cálculo: Keep expression Mantén la expresión Clear expression Limpiar expresión Replace with result Reemplazar con resultado Replace with result if shorter Reemplazar con resultado si es más corto Use keyboard keys for RPN Usar teclas del teclado para RPN Parsing mode: Modo de análisis: Adaptive Adaptativo Conventional Convencional Implicit multiplication first Multiplicación implícita primero Chain Cadena RPN RPN Read precision Leer precisión Limit implicit multiplication Limitar multiplicación implícita Interval calculation: Cálculo de intervalo: Variance formula Fórmula de varianza Interval arithmetic Aritmética de intervalo Factorize result Factorizar resultado Binary two's complement representation Representación binaria de complemento a dos Hexadecimal two's complement representation Representación hexadecimal de complemento a dos Use lower case letters in non-decimal numbers Usar letras minúsculas en números no decimales Spell out logical operators Deletrear operadores lógicos Use E-notation instead of 10^x Usar notación E en vez de 10^x Preferences Preferencias ms milliseconds ms Use E-notation instead of 10^n Usar notación E en vez de 10^n Use 'j' as imaginary unit Usar "j" como la unidad imaginaria Use comma as decimal separator Usar coma como separador decimal Ignore comma in numbers Ignorar comas en números Ignore dots in numbers Ignorar puntos en números Copy unformatted ASCII by default Copiar como ASCII no formateado por defecto Round halfway numbers away from zero Redondear números intermedios lejos de cero Round halfway numbers to even Redondear números intermedios a pares Indicate repeating decimals Indicar decimales repetidos Language: Idioma: Max history lines saved: Use caret for bitwise XOR Usar circunflejo para XOR bit a bit Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Formatear resultado Expression status: Estado de la expresión: Off Desactivado In history list In expression field Status tooltip delay: Automatically calculate selection Expression in history: Expresión en el historial: Parsed Analizado Entered Ingresado Entered + parsed Ingresado + analizado Automatically copy result Copiar automáticamente el resultado Simplified percentage calculation Cálculo porcentual simplificado Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binario Hexadecimal Hexadecimal Binary bits: Automatic Automática Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Digit grouping: Agrupamiento de dígitos: None Ninguna Standard Estándar Local Local Automatically group digits in input (experimental) Interval display: Visualización de intervalo: Significant digits Cifras significativas Interval Intervalo Plus/minus Más/menos Concise Midpoint Punto medio Lower Inferior Upper Superior Rounding: Truncate all numbers Truncar todos los números Complex number form: Forma de número complejo: Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Ángulo/fasor Enable units Abbreviate names Abreviar nombres Use binary prefixes for information units Usar prefijos binarios para unidades de información Automatic unit conversion: Conversión automática de unidades: No conversion Sin conversión Base units Unidades base Optimal units Unidades óptimas Optimal SI units Unidades del SI óptimas Convert to mixed units Convertir a unidades mixtas Automatic unit prefixes: Prefijos automáticos: Copy unformatted ASCII without units Copiar como ASCII no formateado sin unidades Restart required Please restart the program for the language change to take effect. Default Predeterminado Calculate as you type delay: Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Ningún prefijos Prefixes for some units Prefijos para las unidades seleccionadas Prefixes also for currencies Prefijos también para monedas Prefixes for all units Prefijos para todas las unidades Enable all SI-prefixes Habilitar todos los prefijos del SI Enable denominator prefixes Habilitar prefijos de denominador Enable units in physical constants Habilitar unidades en constantes físicas Temperature calculation: Cálculo de temperatura: Absolute Absoluto Relative Relativo Hybrid Hibrido Exchange rates updates: Actualizaciones de tasas de cambio: %n day(s) %n día %n días days día día QApplication Execute expressions and commands from a file Ejecutar expresiones y comandos desde un archivo FILE ARCHIVO Start a new instance of the application Iniciar una nueva instancia de la aplicación Specify the window title Especificar el título de la ventana TITLE TÍTULO Display the application version Mostrar la versión de la aplicación Open workspace Expression to calculate Expresión a calcular [EXPRESSION] [EXPRESIÓN] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Por defecto, solo una instancia (una ventana principal) de %1 es permitida. Si múltiples instancias están abiertas simultáneamente, solo las definiciones (variables, funciones, etc.), modo, preferencias, e historia de la última ventana serán guardadas. ¿Quiere, a pesar de esto, cambiar el comportamiento predeterminado y permitir múltiples instancias simultáneas? Allow multiple instances? %1 is already running. Failed to load global definitions! Falla al cargar las definiciones globales! answer respuesta History Answer Value Valor de respuesta de historial History Index(es) Índice(s) de historial History index %s does not exist. Índice de historial %s no existe. Last Answer Última respuesta Answer 2 Respuesta 2 Answer 3 Respuesta 3 Answer 4 Respuesta 4 Answer 5 Respuesta 5 Memory Memoria Error Error Couldn't write preferences to %1 No se pudieron guardar las preferencias en %1 Function not found. Función no encontrada. Variable not found. Variable no encontrada. Unit not found. Unidad no encontrada. Unsupported base. Base no soportada. Unsupported value. QalculateQtSettings Update exchange rates? ¿Actualizar tasas de cambio? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Ha pasado %n día desde la última actualización de las tasas de cambio. ¿Quiere actualizar las tasas de cambio ahora? Han pasado %n días desde la última actualización de las tasas de cambio. ¿Quiere actualizar las tasas de cambio ahora? Fetching exchange rates. Buscando tasas de cambio. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Buscando tasas de cambio… Error Error Warning Advertencia Information Información Path of executable not found. Ruta de ejecutable no encontrada. curl not found. No se encontró curl. Failed to run update script. %1 Error al ejecutar el script de actualización. %1 Failed to check for updates. Fallo al buscar actualizaciones. No updates found. No se encontró ninguna actualización. A new version of %1 is available at %2. Do you wish to update to version %3? Una nueva versión de %1 está disponible en %2. ¿Quiere actualizar a la versión %3? A new version of %1 is available. You can get version %3 at %2. Una nueva versión de %1 está disponible. Puedes obtener la versión %3 en %2. Download %1: %2 Insert function Insertar función Insert function (dialog) Insertar función (diálogo) Insert variable Insertar variable Approximate result Negate Negar Invert Invertir Insert unit Insertar unidad Insert text Insertar texto Insert operator Insert date Insertar fecha Insert matrix Insertar matriz Insert smart parentheses Insertar paréntesis inteligentes Convert to unit Convertir a unidad Convert Convertir Convert to optimal unit Convertir a unidades óptimas Convert to base units Convertir a unidades base Convert to optimal prefix Convertir a prefijo óptimo Convert to number base Convertir a base numérica Factorize result Factorizar resultado Expand result Expandir resultado Expand partial fractions Expandir fracciones parciales RPN: down RPN: abajo RPN: up RPN: arriba RPN: swap RPN: intercambiar RPN: copy RPN: copiar RPN: lastx RPN: último x RPN: delete register RPN: eliminar registro RPN: clear stack RPN: limpiar pila Set expression base Definir base de expresión Set result base Definir base de resultado Set angle unit to degrees Definir unidad de ángulos a grados Set angle unit to radians Definir unidad de ángulos a radianes Set angle unit to gradians Definir unidad de ángulos a gradianes Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Alternar precisión Toggle max decimals Alternar decimales máximos Toggle min decimals Alternar decimales mínimos Toggle max/min decimals Alternar decimales máximos/mínimos Toggle RPN mode Alternar modo RPN Show general keypad Toggle programming keypad Alternar teclado de programación Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Buscar historial Clear history Limpiar historial Show variables Show functions Show units Show data sets Store result Guardar resultado MC (memory clear) MC (limpiar la memoria) MR (memory recall) MS (memory store) MS (guardar en la memoria) M+ (memory plus) M+ (añadir a la memoria) M− (memory minus) M− (quitar de la memoria) New variable Nueva variable New function Nueva función Open plot functions/data Abrir graficado de función/datos Open convert number bases Abrir conversión de bases numéricas Open floating point conversion Abrir conversión de punto flotante Open calender conversion Abrir conversión de calendario Open percentage calculation tool Abrir herramienta de cálculo de porcentaje Open periodic table Abrir tabla periódica Update exchange rates Actualizar tasas de cambio Copy result Copiar resultado Insert result Insertar texto Open mode menu Open menu Menú abierto Help Ayuda Quit Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Limpiar expresión Delete Eliminar Backspace Retroceso Home End Right Left Up Arriba Down Abajo Undo Deshacer Redo Rehacer Calculate expression Calcular expresión Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Predeterminado Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Cancelar Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Menú Menu (%1) Menú (%1) New Nuevo Function… Función… Variable/Constant… Variable/constante… Unknown Variable… Variable desconocida… Matrix… Matriz… Workspaces Espacios de trabajo Open… Abrir… Open default Abrir predeterminado Save Guardar Save As… Guardar como… Import CSV File… Importar archivo CSV… Export CSV File… Exportar archivo CSV… Functions Funciones Variables and Constants Variables y constantes Units Unidades Plot Functions/Data Graficar funciones/datos Floating Point Conversion (IEEE 754) Conversión de punto decimal (IEEE 754) Calendar Conversion Conversión de calendario Update Exchange Rates Actualizar tasas de cambio Normal Mode Modo normal RPN Mode Modo RPN Chain Mode Modo de cadena Keyboard Shortcuts Atajos de teclado Preferences Preferencias Help Ayuda Report a Bug Reportar un error Check for Updates Buscar actualizaciones About %1 Acerca de %1 Quit Cerrar Mode Modo Mode (%1) Modo (%1) General Display Mode Modo de visualización general Normal Normal Scientific Científica Engineering Ingeniería Simple Simple Angle Unit Unidad de ángulo Radians Radianes Degrees Grados Gradians Gradianes Approximation Aproximación Automatic Automatic approximation Automática Dual Dual approximation Dual Exact Exact approximation Exacto Approximate Aproximado Assumptions Suposiciones Type Assumptions type Tipo Number Número Real Real Rational Racional Integer Entero Boolean Booleano Sign Assumptions sign Signo Unknown Unknown assumptions sign Desconocido Non-zero No cero Positive Positivo Non-negative No negativo Negative Negativo Non-positive No positivo Result Base Base de resultado Binary Binario Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Otra Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Formato de fecha Roman numerals Números romanos Unicode Unicode Bijective base-26 Base biyectiva 26 Binary-encoded decimal (BCD) Decimal codificado en binario Custom: Number base Expression Base Base de expresión Other: Number base Otro: Precision: Precisión: Min decimals: Decimales mínimos: Max decimals: Decimales máximos: off Max decimals Desactivado Convert Convertir Convert (%1) Convertir (%1) Store Guardar Store (%1) Guardar (%1) Functions (%1) Funciones (%1) Keypad Teclado Keypad (%1) Teclado (%1) Number bases Bases numéricas Unit… Unidad… Data Sets Conjuntos de datos Percentage Calculation Tool Herramienta de cálculo de porcentaje Periodic Table Tabla periódica Units (%1) Unidades (%1) Plot Functions/Data (%1) Graficar funciones/datos (%1) Number Bases (%1) Bases numéricas (%1) Binary: Binario: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pila RPN Rotate the stack or move the selected register up (%1) Rotar la pila o mover el registro seleccionado hacia arriba (%1) Rotate the stack or move the selected register down (%1) Rotar la pila o mover el registro seleccionado hacia abajo (%1) Swap the top two values or move the selected value to the top of the stack (%1) Intercambiar los dos primeros valores o mover el valor seleccionado encima de la pila (%1) Copy the selected or top value to the top of the stack (%1) Copiar el primer valor o el seleccionado encima de la pila (%1) Enter the top value from before the last numeric operation (%1) Ingresar el primer valor previo a la última operación numérica (%1) Delete the top or selected value (%1) Eliminar el primer valor o el valor seleccionado (%1) Clear the RPN stack (%1) Limpiar la pila RPN (%1) New Function… Nueva función… Favorites Favoritos Recent Recientes User functions Funciones de usuario Open dialog Abrir cuadro de diálogo Show all functions Mostrar todas las funciones User units Unidades de usuario more más Prefixes Prefijos Show all units Mostrar todas las unidades User variables Variables de usuario Show all variables Mostrar todas las variables Powerful and easy to use calculator Calculadora poderosa y fácil de usar License: GNU General Public License version 2 or later Error Error Couldn't write definitions No se pudo guardar las definiciones hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binario roman romano bijective biyectivo sexagesimal sexagesimal latitude latitud longitude longitud time tiempo Time zone parsing failed. Analizado de husos horarios falló. bases bases calendars calendarios rectangular rectangular cartesian cartesiano exponential exponencial polar polar phasor fasor angle ángulo optimal óptimas base base mixed mixtas fraction fracción factors factores Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad Copy Copiar prefix prefijo partial fraction fracción parcial decimals factorize factorizar expand expandir Calculating… Calculando… Cancel Cancelar RPN Operation Operación RPN Factorizing… Factorizando… Expanding partial fractions… Expandiendo fracciones parciales… Expanding… Expandiendo… Converting… Convirtiendo… RPN Register Moved Registro RPN movido Processing… Procesando… Matrix Matriz Temperature Calculation Mode Modo de cálculo de temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). La expresión es ambigua. Por favor seleccione el modo de cálculo de temperatura (el modo puede ser cambiado después en las preferencias). Absolute Absoluto Relative Relativo Hybrid Hibrido Please select desired variant of the sinc function. Por favor seleccione la variante deseada de la función sinc. Unnormalized No normalizado Normalized Normalizado Interpretation of dots Interpretación de los puntos Please select interpretation of dots (".") (this can later be changed in preferences). Por favor seleccione la interpretación de los puntos (\".\") (esto puede ser cambiado después en las preferencias). Both dot and comma as decimal separators Ambos punto y coma como separadores decimales Dot as thousands separator Punto como separador de miles Only dot as decimal separator Solo punto como separador decimal Parsing Mode Modo de análisis The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). La expresión es ambigua. Por favor seleccione interpretación de expresiones con multiplicación implícita (esto puede ser cambiado después en las preferencias). Implicit multiplication first Multiplicación implícita primero Conventional Convencional Adaptive Adaptativo Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Añadir acción (%1) Edit Keyboard Shortcut New Keyboard Shortcut Nuevo atajo de teclado Action: Acción: Value: Valor: Set key combination Definir combinación de teclas Press the key combination you wish to use for the action. Presiona la combinación de teclas que quieres usar para la acción. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? La combinación de teclas ta está en uso. ¿Quiere remplazar la acción actual (%1)? Question Pregunta Add… Añadir… Edit… Editar… Remove Eliminar Gnuplot was not found No se encontró Gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) tiene que estar instalado por separado, tiene que y encontrarse en la ruta de búsqueda para que el graficado funcione. Example: Example of function usage Ejemplo: Enter RPN Enter Ingresar Calculate Calcular Apply to Stack Aplicar a la pila Insert Insertar Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again No preguntar de nuevo Keep open Mantener abierto Value Valor Argument Argumento %1: %1: Plot Graficar General General Programming Programación Algebra Álgebra Custom Personalizado None Ninguna Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Clic derecho / pulsación larga</i>: %1 Open menu Menú abierto Number Bases Bases numéricas Rotate the stack or move the selected register up Rotar la pila o mover el registro seleccionado hacia arriba Rotate the stack or move the selected register down Rotar la pila o mover el registro seleccionado hacia abajo Swap the top two values or move the selected value to the top of the stack Intercambiar los dos primeros valores o mover el valor seleccionado encima de la pila Delete the top or selected value Eliminar el primer valor o el valor seleccionado Enter the top value from before the last numeric operation Ingresar el primer valor previo a la última operación numérica Copy the selected or top value to the top of the stack Copiar el primer valor o el seleccionado encima de la pila Clear the RPN stack Limpiar la pila RPN Action Acción Key combination Combinación de teclas True Verdadero False False Info Información optional optional argument opcional Failed to open %1. %2 Fallo al abrir %1. %2 UnitEditDialog General General Relation Relación Name: Nombre: Category: Categoría: Descriptive name: Nombre descriptivo: System: Sistema: Imperial Imperial US Survey Tradicional EE.UU. (US Survey) Hide unit Ocultar unidad Description: Descripción: Class: Clase: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La clase a la que esta unidad pertenece. Las unidades de alias son definidas en relación a otra unidad, las unidades compuestas son una composición de un número de otras unidades. Las unidades base no son definidas en relación a otras unidades. Base unit Unidad base Named derived unit Unidad derivada nombrada Derived unit Unidad derivada Base unit(s): Unidad(es) base: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unidad (para unidad alias) o unidades (para unidades compuestas) con las que esta unidad está definida Exponent: Exponente: Relation: Relación: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relación con la unidad base. Para relaciones lineares esto debería ser un número.<br><br>Para relaciones no lineares use \x para el factor e \y para el exponente (ej: "\x + 273,15" para la relación entre grados Celsius y Kelvin). Inverse relation: Relación inversa: Specify for non-linear relation, for conversion back to the base unit. Especificar para relación no linear, para la conversión de vuelta a la unidad base. Mix with base unit Combinar con la base unidad Priority: Prioridad: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Número mínimo de unidad base: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Usar con prefijos por defecto Error Error Base unit does not exist. La unidad base no existe. Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? A variable or unit with the same name already exists. Do you want to overwrite it? Una variable o unidad con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Unit Editar unidades New Unit Nueva unidad UnitsDialog Units Unidades Category Categoría Unit Unidad New… Nuevo… Edit… Editar… Deactivate Desactivar Delete Eliminar Convert Convertir Insert Insertar Favorite Favorito Show hidden units Mostrar unidades ocultas Activate Activar All All units Todas Uncategorized Sin categorizar User units Unidades de usuario Favorites Favoritos Inactive Inactivas UnknownEditDialog Name: Nombre: Custom assumptions Suposiciones personalizadas Type: Tipo: Sign: Signo: Temporary Temporal Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Unknown Variable Editar variable desconocida New Unknown Variable Nueva variable desconocida VariableEditDialog Name: Nombre: Temporary Temporal Value: Valor: Required Requerido Description Descripción current result resultado actual Category: Categoría: Descriptive name: Nombre descriptivo: Hide variable Ocultar variable Description: Descripción: Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Variable Editar variable New Variable Nueva variable VariablesDialog Variables Variables Category Categoría Variable Variable New Nuevo Variable/Constant… Variable/constante… Unknown Variable… Variable desconocida… Matrix… Matriz… Edit… Editar… Export… Exportar… Deactivate Desactivar Delete Eliminar Insert Insertar Favorite Favorito a matrix una matriz a vector un vector positive positivo non-positive no positivo negative negativo non-negative no negativo non-zero no cero integer entero boolean booleano rational racional real real complex complejo number número not matrix no matriz unknown desconocido Default assumptions Suposiciones predeterminadas Activate Activar All All variables Todas Uncategorized Sin categorizar User variables Variables de usuario Favorites Favoritos Inactive Inactivas qalculate-qt-5.5.1/translations/qalculate-qt_fr.ts000066400000000000000000016625141475705355700223350ustar00rootroot00000000000000 Calculator Calculatrice Powerful and easy to use calculator Une calculatrice puissante et facile d'utilisation calculation;arithmetic;scientific;financial; calcul;arithmétique;scientifique;financier; Qalculate! (GTK UI) Qalculate! (GTK UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! est une calculatrice de bureau polyvalente et multi-plateforme. Elle est simple d'utilisation mais offre une puissance et une polyvalence normalement réservées aux logiciels de mathématique complexe, ainsi que d'outils utiles au quotidien (tels que la conversion de devises et le calcul de pourcentages). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Les fonctionnalités incluent une grande bibliothèque de fonctions personnalisables, d'unités de calculs et de conversion, de constantes physiques, de calculs symboliques (y compris les intégrales et équations), de précision arbitraire, de propagation des incertitudes, d'arithmétique d'intervalle, de traçage et une interface facile d'utilisation. Argument Rules Règles d'argument _Cancel _Fermer Do not save modifications Ne pas sauvegarder les modifications _OK _OK Accept the modification of argument rules Accepter la modification des règles d'argument Argument name Nom d'argument Free Libre Number Nombre Integer Entier Symbol Symbole Text Texte Date Date Vector Vecteur Matrix Matrice Positive number Nombre positif Non-zero number Nombre non nul Non-negative number Nombre positif ou nul Positive integer Entier positif Non-zero integer Entier non nul Non-negative integer Entier positif ou nul Boolean Booléen Object Objet Function Fonction Unit Unité Variable Variable File Fichier Angle Angle Data object Données de l'objet Data property Propriété des données Enable rules and type test Activer les règles et le type de test Custom condition Condition personnalisée For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Par exemple, si l'argument est une matrice qui doit être égal au nombre de lignes et de colonnes : lignes(\x) = colonnes(\x) Allow matrix Autoriser matrice Forbid zero Interdire zéro Handle vector Manche de vecteur Calculate function for each separate element in vector. Calculer la fonction de chaque élément distinct du vecteur. Min Min Include equals Inclure les égalités Max Max Type Type Name Nom Customize Keypad Buttons Personnaliser les boutons du clavier _Close _Fermer Label Intitulé Left-click Clic gauche Right-click Clic droit Middle-click Clic du milieu Reset Réinitialiser Button Action Bouton d'action Value Valeur Calendar Conversion Conversion calendrier Export CSV File Exporter en fichier CSV Current result Résultat actuel Matrix/vector variable Variable matrice/vecteur Delimiter Délimiteur Comma Virgule Tabulator Tabulation Semicolon Point virgule Space Espace Other Autre Import CSV File Importer un fichier CSV Do not import the file Ne pas importer le fichier Import the file Importer le fichier Import as Importer comme Descriptive name Nom descriptif Category Catégorie First row Première ligne Name of the data file to import Nom du fichier de données à importer If a matrix shall be generated from the contents of the file Si une matrice ou des vecteurs doivent être générés à partir du contenu du fichier Vectors Vecteurs If vectors shall be generated from the contents of the file Si une matrice ou des vecteurs doivent être générés à partir du contenu du fichier Name (or name prefix) used to reference generated variable(s) in expressions Nom (ou préfixe de nom) utilisé pour référencer les variables générées dans les expressions Title displayed in menus and in variable manager Titre affiché dans les menus et dans le gestionnaire de variables The first row with data to import in the file La première ligne de données à importer dans le fichier Includes headings Inclure les en-têtes If the first row contains column headings Si la première ligne contient des en-têtes de colonne Delimiter used to separate columns in the file Délimiteur utilisé pour séparer les colonnes du fichier Custom delimiter Délimiteur personnalisé Edit Data Property Éditer propriété des données Description Description Value Type Type de valeur Use as key Utiliser comme clé Case sensitive value Valeur sensible à la casse Approximate value Valeur approximative Value uses brackets Valeur utilise des crochets Hide Cacher Unit expression Expression d'unité Expression Expression Name used for reference Nom utilisé pour référencement Title displayed in menus and in data set manager Titre affiché dans les menus et dans le gestionnaire d'ensembles de données Description of this data property Description de cette propriété de données Edit Data Set Éditer l'ensemble de données Data file Fichier de données Copyright Copyright Description of this data set Description de cet ensemble de données General Général Properties: Propriétés : Definition of the properties of this data set Définition des propriétés de cet ensemble de données _New _Nouveau _Edit _Éditer _Delete _Supprimer Properties Propriétés Object argument name Nom d'argument de l'objet Property argument name Nom d'argument de propriété Default property Propriété par défaut Name used to invoke the function in expressions Nom utilisé pour invoquer la fonction dans les expressions Edit Data Object Éditer les données d'objet Do not create/modify this data object Ne pas créer/modifier cette donnée de l'objet Accept the creation/modification of this data object Accepter la création/modification de cette donnée d'objet Data Sets Ensembles de données Data Set Ensemble de données Create a new data set Créer un nouvel ensemble de données Edit the selected data set Éditer l'ensemble de données sélectionné Delete the selected data set Supprimer l'ensemble de données sélectionné Objects Objets Create a new data object Créer un nouveau objet de données Edit the selected data object Éditer les données de l'objet sélectionné Remove the selected data object Supprimer les données de l'objet sélectionné Data Set Description Description de l'ensemble de données Object Attributes Attributs d'objet Decimals Décimales Close this window Fermer cette fenêtre Min decimals Décimales min Max decimals Décimales max Minimal number of displayed decimals Nombre minimal de décimales à afficher Maximal number of decimals to display (and round to) Nombre maximal de décimales à afficher (et arrondir à). Floating Point Conversion Conversion en virgule flottante Hexadecimal representation Représentation hexadécimale Conversion error Erreur de conversion Binary representation Représentation binaire Floating point value Valeur en virgule flottante Format Format 16-bit (half precision) 16-bit (demi-précision) 32-bit (single precision) 32-bit (simple précision) 64-bit (double precision) 64-bit (double précision) 80-bit (x86 extended format) 80-bit (format x86 étendu) 128-bit (quadruple precision) 128-bit (quadruple précision) Microchip 24-bit Microchip 24-bit Microchip 32-bit Microchip 32-bit Edit Function Éditer la fonction _Help _Aide Name used to invoke this function in expressions Nom utilisé pour invoquer la fonction dans les expressions Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Utiliser \x pour le premier, \y pour le second et \z pour le troisième argument. Pour plus d'informations, cliquer sur le bouton d'Aide. Required Requis Condition Condition Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condition qui doit être vraie pour la fonction (ex : si le second argument doit être plus grand que le premier : "\y > \x") Sub-functions Sous-fonctions _Add _Ajouter _Remove _Supprimer Arguments Arguments Details Détails Title displayed in menus and in function manager Titre affiché dans les menus et dans le gestionnaire des fonctions Hide function Cacher fonction Example Exemple Precalculate Précalculer If this function shall be hidden in menus Si cette fonction doit être cachée dans les menus Functions Fonctions Categor_y Catégor_ie _Function _Fonction Descri_ption Descri_ption Create a new function Créer une nouvelle fonction Edit the selected function Éditer la fonction sélectionnée Delete the selected function Supprimer la fonction sélectionnée (De)activate the selected function (Dés)activer la fonction sélectionnée Deacti_vate Désacti_ver _Calculate _Calculer Insert (or execute) the selected function into the expression entry Insérer (ou exécuter) la fonction sélectionnée dans l'expression entrée _Apply _Appliquer Apply the selected function to the current expression Appliquer la fonction sélectionnée à l'expression actuelle Degrees Degrés Radians Radians Gradians Grades Default assumptions Suppositions par défaut Unknown Inconnue Not Matrix Pas de matrice Complex Complexe Real Réel Rational Rationnel Non-Zero Non nul Positive Positif Non-Negative Positif ou nul Negative Négatif Non-Positive Négatif ou nul _File _Fichier Unknown Variable Variable de l'inconnue Import CSV File… Importer un fichier CSV… Export CSV File… Exporter en fichier CSV… _Store Result… _Enregistrer le résultat… Save Result Image… Sauvegarder l'image de résultat… Save local functions, variables and units Sauvegarder les fonctions locales, variables et unités Save Definitions Sauvegarder les définitions Import Definitions File… Importer fichier de définitions… Fetch current exchange rates from the Internet Récupérer les taux de change actuels sur Internet Update Exchange Rates Mettre à jour les taux de change Plot Functions/Data Fonctions/Données du Graph Convert Number Bases Convertir les bases numériques Floating Point Conversion (IEEE 754) Conversion en virgule flottante (IEEE 754) Percentage Calculation Tool Outil de calcul de pourcentages Periodic Table Tableau périodique Minimal Window Fenêtre minimale _Quit _Quitter Variables Variables Units Unités Factorize Factoriser Expand Développer Apply partial fraction decomposition to the current result. Appliquer une décomposition de fraction partielle au résultat actuel. Expand Partial Fractions Développer les fractions partielles Set Unknowns… Définir les inconnues… Convert to Unit Convertir vers l'unité Set Prefix Définir le préfixe Convert to Unit Expression… Convertir en expression unitaire… Convert to Base Units Convertir en unités de base Convert to Optimal Unit Convertir en unité optimale Insert Date… Insérer une date… Insert Matrix… Insérer une matrice… Insert Vector… Insérer un vecteur… _Copy Result _Copier le résultat Copy Result as Unformatted ASCII Copier le résultat en ASCII non formaté Keyboard Shortcuts Raccourcis clavier _Preferences _Préférences _Mode _Mode Number Base Base numérique Select Result and Expression Base… Sélectionner le résultat et la base d'expression… Binary Binaire Octal Octal Decimal Décimal Duodecimal Duodécimal Hexadecimal Hexadécimal Other… Autre… Sexagesimal Sexagésimal Time Format Format de l'heure Roman Numerals Chiffres romains Numerical Display Affichage numérique Normal Normal Engineering Ingénieur Scientific Scientifique Purely Scientific Purement scientifique Simple Simple Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Désactivé : 1/7 ≈ 0,14285714 Activé : 1/7 = 0,142857 142857... Indicate Repeating Decimals Indiquer les décimales répétitives Show Ending Zeroes Afficher les zéros de fin Off: -x + y On: y - x Désactivé : -x + y Activé : y - x Sort Minus Last Trier les moins en dernier Round Halfway Numbers Away from Zero Arrondir les nombres à mi-chemin par rapport à zéro Round Halfway Numbers to Even Arrondir les nombres à mi-chemin pour égaliser Other Rounding Methods Autres méthodes d'arrondi Round Halfway Numbers to Odd Arrondir les nombres à mi-chemin à impairs Round Halfway Numbers Toward Zero Arrondir les nombres à mi-chemin vers zéro Round Halfway Numbers to Random Arrondir les nombres à mi-chemin au hasard Round Halfway Numbers Up Arrondir les chiffres à mi-chemin vers le haut Round Halfway Numbers Down Arrondir les chiffres à mi-chemin vers le bas Round Toward Zero Arrondir vers zéro Round Away from Zero Arrondir à partir de zéro Round Up Rassembler Round Down Arrondir vers le bas Complex Rectangular Form Forme algébrique complexe Complex Exponential Form Forme exponentielle complexe Complex Polar Form Forme polaire complexe Complex Angle/Phasor Notation Notation complexe angle/phaseur Rational Number Form Forme nombre rationnel 1/3 ≈ 0.33333 1/3 ≈ 0,33333 Decimal Fractions Fractions décimales 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1,5 Exact Decimal Fractions Fractions décimales exactes 6/4 = 3/2 6/4 = 3/2 Simple Fractions Fractions simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Fractions mixtes Mixed Mixed fraction Mixte Interval Display Affichage d'intervalle Off: 1/2 × pi ≈ 1.5707963 On: 1/2 × pi = 0.5 pi Désactivé : 1/2 × pi ≈ 1,5707963 Activé : 1/2 × pi = 0,5 pi Adaptive Adaptif Calculates an interval of possible values and keeps track of precision changes. Calcule un intervalle de valeurs possibles et assure le suivi des modifications de précision. Significant Digits Chiffres significatifs Interval Intervalle Plus/Minus Plus/Moins Relative Relatif Concise Concis Midpoint Point du milieu Allow concise uncertainty input Autoriser une saisie concise de l'incertitude Unit Display Affichage de l'unité Do not use any prefixes in result Ne pas utiliser de préfixes dans le résultat Show prefixes for primarily SI and CGS units. Afficher les préfixes pour les unités principalement SI et CGS. Use prefixes for selected units Utiliser des préfixes pour les unités sélectionnées Use prefixes also for currencies Utiliserz également des préfixes pour les devises Use prefixs for all units Utiliser des préfixes pour toutes les unités Enables automatic use of hekto, deka, deci and centi when prefixes are enabled Active automatiquement l'utilisation de hekto, déka, déci et centi lorsque les préfixes sont activés Enable All SI Prefixes Activer tous les préfixes SI Enables automatic setting of prefix for denominator in addition to the numerator Permet la définition automatique du préfixe du dénominateur en plus du numérateur Enable Denominator Prefixes Activer les préfixes du dénominateur Off: J / K On: J·K^-1 Désactivé : J / K Activé : J·K^-1 Negative Exponents Exposants négatifs Off: (2 m)/s On: 2 (m/s) Désactivé : (2 m)/s Activé : 2 (m/s) Place Units Separately Placer les unités séparément No Additional Conversion Aucune conversion supplémentaire Convert to Optimal SI Unit Convertir en unité SI optimale If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Si activé : 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Convertir en unités mixtes Abbreviate Names Noms abrégés Enabled Objects Objets activés Unknowns Inconnues Units in Physical Constants Unités en constantes physiques If not enabled, treats all variables as unknown S'il n'est pas activé, traite toutes les variables comme des inconnues Calculate Variables Calculer les variables Disables/enables complex numbers in result Désactive/active les nombres complexes dans le résultat Allow Complex Result Autoriser les résultats complexes Disables/enables infinite numbers in result Désactive/active les nombres infinis comme résultat Allow Infinite Result Autoriser infini comme résultat Approximation Approximation Always Exact Toujours exact Try Exact Essayer exactitude Approximate Approximatif Interval Arithmetic Arithmétique des intervalles Interval Calculation Calcul d'intervalle Variance Formula Formule d'écart Change angle unit used in trigonometric functions Changer l'unité d'angle utilisée dans les fonctions trigonométriques Angle Unit Unité d'angle None Aucune Assumptions Suppositions Algebraic Mode Mode algébrique Assume that unknown denominators are non-zero Supposons que les dénominateurs inconnus soient différents de zéro Non-Zero Denominators Dénominateurs non nuls Warn when unknown denominators are assumed non-zero Avertir lorsque des dénominateurs inconnus sont supposés différents de zéro Warn About Denominators Assumed Non-Zero Avertir des dénominateurs supposés non nuls Parsing Mode Mode d'analyse Adaptive Parsing Analyse adaptative Parse Implicit Multiplication First Analyser d'abord la multiplication implicite Conventional Parsing Analyse conventionnelle Chain Syntax Syntaxe de la chaîne RPN Syntax Syntaxe NPI Off: 100 + 20% = 100 + 20/100 = 100.2 On: 100 + 20% = 100 × 120% = 120 Désactivé: 100 + 20% = 100 + 20/100 = 100,2 Activé: 100 + 20% = 100 × 120% = 120 no-c-format Simplified Percentage Calculation Calcul de pourcentage simplifié Off: xy = x × y On: xy != x × y Désactivé : xy = x × y Activé : xy != x × y Limit Implicit Multiplication Limiter la multiplication implicite Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 × 1.1 = 1.21 On: 1.1 × 1.1 ≈ 1.2 Analyser les nombres décimaux de manière approximative avec une précision égale au nombre de chiffres. Désactivé: 1.1 × 1.1 = 1.21 Activé: 1.1 × 1.1 ≈ 1.2 Read Precision Lire précision _Precision _Précision _Decimals _Décimals Calculate As You Type Calcul lors de la saisie Chain Mode Mode chaîne Activate the RPN stack. Activer la pile NPI. RPN Mode Mode NPI Meta Modes Modes méta Save Mode… Sauvegarder mode… Delete Mode… Supprimer mode… Save Default _Mode Sauvegarder _Mode par défaut Fu_nctions Fo_nctions _Variables _Variables _Units _Unités _Contents Manuel Report a Bug Reporter un bug Check for Updates Vérifier les mises à jour _About _À propos Toggle minimal window Basculer en fenêtre minimale Calculation result Résultat du calcul _Keypad _Clavier Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Active/désactive le clavier permanent (permet d'afficher simultanément le clavier et l'historique) _History _Historique C_onversion C_onversion RPN Stack Pile NPI Insert the selected value Insérer la valeur sélectionnée Insert the selected text Insérer le texte sélectionné Copy the selected text Copier le texte sélectionné Add the selected value(s) Ajouter la valeur selectionnée Subtract the selected value(s) Soustraire les valeurs sélectionnées Multiply the selected value(s) Multiplier les valeurs sélectionnées Divide the the selected value(s) Diviser les valeurs sélectionnées Raise to the power of the selected value Élever la valeur sélectionnée à la puissance Calculate the square root of the selected value Calculer la racine carrée de la valeur sélectionnée History Historique Subtract the top value from the second value Soustrayez la valeur supérieure de la deuxième valeur Multiply the top two values Multipliez les deux premières valeurs Divide the second value by the top value Divisez la deuxième valeur par la valeur supérieure Raise the second value to the power of the top value Augmentez la deuxième valeur à la puissance de la valeur supérieure Negate the top value (Ctrl+-) Annuler la valeur supérieure (Ctrl+-) Invert the top value Inverser la valeur supérieure Calculate the square root of the top value Calculer la racine carrée de la valeur supérieure Calculate the sum of all values Calcule la somme de toutes les valeurs Rotate the stack or move selected register up Faire pivoter la pile ou déplacer le registre sélectionné vers le haut Rotate the stack or move selected register down Faire pivoter la pile ou déplacer le registre sélectionné vers le bas Swap the two top values or move the selected value to the top of the stack Échangez les deux valeurs supérieures ou déplacez la valeur sélectionnée vers le haut de la pile Copy the selected or top value to the top of the stack Copiez la valeur sélectionnée ou supérieure en haut de la pile Enter the top value from before the last numeric operation Entrez la valeur supérieure avant la dernière opération numérique Delete the top or selected value Supprimer la valeur supérieure ou sélectionnée Edit the selected value Éditer la valeur sélectionnée Clear the RPN stack Vider la pile NPI Unit(s) and prefix to convert result to Unité(s) et préfixe vers lesquels convertir le résultat Convert Convertir Continuous conversion Conversion continue Automatically convert result to the current unit expression as long as the conversion box is visible. Converti automatiquement le résultat dans l'expression unité actuel aussi longtemps que la boîte de conversion est visible. Add prefix Ajouter préfixe If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Si l'expression unitaire ne contient pas de préfixe, utiliser le préfixe optimal. Ceci peut être écrasé en ajoutant à l'expression unitaire "?" ou "0". Conversion Conversion Show/hide programming keypad Afficher/masquer le clavier de programmation Exact Exact Fraction Fraction Numerical display Affichage numérique Pure Pur Number base Base numérique Time format Format de l'heure Roman Romain sin sin cos cos tan tan ln ln Equals Égal sqrt sqrt sum sum Unknown variable Variable inconnue mod mod mean moyenne Store result as a variable Enregistrer le résultat sous forme de variable STO Standard calculator button. Do not use more than three characters. STO Convert number bases Convertir des bases numériques Imaginary unit i (√-1) Unité imaginaire i (√-1) Manage units Gérer les unités Conversion operator Opérateur de conversion Kilogram Kilogramme Two's complement input Entrée du complément à deux Two's complement output Sortie du complément à deux Bitwise Exclusive OR Bitwise Exclusive OR Bitwise Left Shift Décalage gauche Bitwise Bitwise Right Shift Décalage droite Bitwise Floating point conversion Conversion en virgule flottante Show/hide left keypad Afficher/masquer le clavier gauche Show/hide right keypad Afficher/masquer le clavier droite DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Résultat précédent ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Ajouter à l'expression Persistent Keypad Clavier permanent Edit Éditer Delete Supprimer Update Mettre à jour Insert Value Insérer valeur Insert Text Insérer texte Insert Parsed Text Insérer texte analysé Copy Copier Copy Unformatted ASCII Copier ASCII non formaté Copy Full Text Copier le texte entier Search… Rechercher… Search by Date… Rechercher par date… Add Bookmark… Ajouter favoris… Bookmarks Favoris Protect Protéger Move To Top Se déplacer en haut Remove Supprimer Clear All Effacer tout Show Parsed Expression Afficher l'expression analysée Show Result Afficher le résultat _Copy _Copier _Store… _Enregistrer… Save Image… Sauvegarder l'image… _Factorize _Factoriser _Expand _Développer _Normal _Normal Sc_ientific Sc_ientifique Purel_y Scientific Puremen_t scientifique Simp_le Simp_le _Binary _Binaire _Octal _Octal _Decimal _Décimal _Hexadecimal _Hexadécimal Decimal Fraction Fraction décimale Exact Decimal Fraction Fraction décimale exacte Simple Fraction Fraction simple Mixed Fraction Fraction mixte _Abbreviate Names _Noms abrégés C_onvert… C_onvertir… Convert to Base _Units Convertir en _unités de base Convert _to Optimal Unit Convertir _en unité optimale Use Optimal Prefix Utiliser le préfixe optimal Convert to Convertir vers Convert to UTC Convertir vers UTC Convert to Calendars Convertir vers calendriers Use prefixes for all units Utiliser des préfixes pour toutes les unités Enable All SI Prefi_xes Activer tous SI Prefi_xes View/Edit Matrix Afficher/éditer matrice View/Edit Vector Afficher/Éditer vecteur Show Parsed Expression in Result Field Afficher l'expression analysée dans le champ de résultat Copy Text Copier texte To Top En haut Swap Échanger Up Haut Down Bas Negate Rejeter Invert Intervertir Square Carré Square Root Racine carrée Clear Stack Vider pile Select Number Base… Sélectionner la base numérique… Display Expression Status Afficher l'état de l'expression Store result Enregistrer résultat Add result Add current result to variable value Ajouter résultat Subtract result Subtruct current result from variable value Soustraire résultat _Insert _Insérer Insert the matrix/vector into the expression Insérer la matrice/vecteur dans l'expression Elements Éléments Number of rows in this matrix (rows displayed for vectors) Nombre de lignes dans cette matrice (lignes affichées pour les vecteurs) Number of columns in this matrix (columns displayed for vectors) Nombre de colonnes dans cette matrice (colonnes affichées pour les vecteurs) If this is a matrix or vector Si c'est une matrice ou un vecteur Current element: Élément actuel : Edit Matrix Éditer matrice Accept the creation/modification of this matrix/vector Accepter la création/modification de cette matrice/vecteur Name used to reference this variable in expressions Nom utilisé pour référencer cette variable dans les expressions Temporary Temporaire Hide variable Cacher variable Names Noms Number Bases Bases numériques Binary value Valeur binaire Decimal value Valeur décimale Octal value Valeur octale Roman numerals Chiffres romains Hexadecimal value Valeur hexadécimale Show/hide keypad Afficher/masquer le clavier BIN BIN OCT OCT DEC DÉC DUO DUO HEX HEX ROM ROM Subtract Soustraire Multiply Multiplier Divide Diviser Bitwise AND Bitwise AND Bitwise OR Bitwise OR Bitwise NOT Bitwise NOT Clear Effacer Enter two values, of which at most one is a percentage, and the others will be calculated for you. Entrez deux valeurs, dont au plus une est un pourcentage, et les autres seront calculées pour vous. Percentage Pourcentage Calculate Calculer Value 1 Valeur 1 2 compared to 1 2 comparé à 1 Change from 1 to 2 Différence de 1 à 2 Value 2 Valeur 2 1 compared to 2 1 comparé à 2 Change from 2 to 1 Différence de 2 à 1 Plot Graph _Save _Sauvegarder Save as png, svg, postscript, eps, latex or fig Sauvegarder en png, svg, postscript, eps, latex ou fig Title Titre Vector/matrix Vecteur/matrice Paired matrix Matrice appariée Rows Lignes if you want to split matrix in rows instead of columns si vous souhaitez diviser la matrice en lignes au lieu de colonnes X variable Variable X The variable name used in expression Le nom de la variable utilisé dans l'expression Style Style Line Lignes Points Points Line with points Ligne avec des points Boxes/bars Boîtes/barres Histogram Histogramme Steps Etapes Candlesticks Chandeliers Dots Points Polar Polaire Smoothing Lissage Monotonic Monotonie Natural cubic splines Cannelures cubiques naturelles Bezier Bézier Bezier (monotonic) Bézier (monotonie) Y-axis Axe Y Primary Primaire Secondary Secondaire Data Données Minimum x value Valeur minimum de x Maximum x value Valeur maximum de x Sampling rate Taux d'échantillonnage Step size Taille de l'étape Function Range Portée de la fonction Display grid Afficher la grille Display full border Afficher la bordure complète Minimum y value Valeur minimum de y Maximum y value Valeur maximum de y Logarithmic x scale Échelle logarithmique x Logarithmic y scale Échelle logarithmique y X-axis label Intitulé axe X Y-axis label Intitulé axe Y Line width Largeur de ligne Color display Couleur d'affichage Color Couleur Monochrome Monochrome Legend placement Placement de la légende Top-left Haut à gauche Top-right Haut à droite Bottom-left Bas à gauche Bottom-right Bas à droite Below Au dessous Outside À l'extérieur Appearance Apparence Precision Précision _Recalculate _Recalculer Recalculate expression Recalculer l'expression The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Le nombre de chiffres significatifs à afficher/calculer (l'arithmétique simple est toujours calculé exactement). Preferences Préférences Save definitions on exit Sauvegarder les définitions à la fermeture If changes to functions, units and variables shall be saved automatically Si les modifications effectuées sur les fonctions, unités et variables doivent être enregistrées automatiquement Clear history on exit Effacer l'historique à la fermeture Max history lines saved Nombre maximum de lignes d'historique enregistrées Save history to separate file Enregistrer l'historique dans un fichier séparé Allow multiple instances Permettre plusieurs instances Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permet d'ouvrir plusieurs instances de Qalculate! en même temps. Noter que seulement le mode, historique et définitions de la dernière instance fermée seront sauvegardés. Notify when a new version is available Avertir lorsqu'une nouvelle version est disponible Save mode on exit Sauvegarder le mode à la fermeture If the mode of the calculator shall be restored Si le mode de la calculatrice doit être restauré Close application with Escape key Fermez l'application avec la touche Échap Close the application with the Escape key if the expression field is empty. Fermez l'application avec la touche Échap si le champ d'expression est vide. Use keyboard keys for RPN Utiliser les touches du clavier pour NPI Use keyboard operator keys for RPN operations (+-*/^). Utiliser les touches d'opérateur du clavier pour les opérations NPI (+-*/^). Use caret for bitwise XOR Utiliser le caret pour le bitwise XOR Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. L'entrée XOR (⊻) utilisera le caret (^) du clavier (sinon utiliser Ctrl+^). L'opérateur d'exponentiation (^) peut être toujours saisi grâce à Ctrl+*. Expression in history Expression dans l'historique Parsed Analysé Entered Entré Entered + parsed Entré + analysé Add calculate-as-you-type result to history Ajouter le résultat calculer au fur et à mesure de la saisie à l'historique Delay: Délai: Time limit for plot: Durée maximale des graphs: Behavior Comportement Use system tray icon Utiliser l'icône de la barre d'état système Hides the application in the system tray when the main window is closed Masque l'application dans la barre d'état système lorsque la fenêtre principale est fermée Hide on startup Masquer au démarrage Remember window position Garder la position de la fenêtre Keep above other windows Rester au-dessus des autres fenêtres Keep the main window above other windows (depending on platform and settings this might not work) Gardez la fenêtre principale au-dessus des autres fenêtres (en fonction de la plate-forme et des paramètres, cela peut ne pas fonctionner) Enable Unicode symbols Activer les symboles Unicode Disable this if you have problems with some fancy characters Désactiver cette option, si vous rencontrez des problèmes avec certains caractères spéciaux Ignore system language (requires restart) Ignorer la langue du système (redémarrage nécessaire) Button padding Garniture de bouton Default Défaut / / Application name Nom de l'application Result Résultat Application name + result Nom de l'application + résultat Mode Mode Application name + mode Nom de l'application + mode Window title Titre de la fenêtre Theme Thème Light Clair Dark Sombre High contrast Contraste élevé Dark high contrast Contraste élevé et sombre Language Langue Tooltips Info-bulles Show all Afficher tout Hide in keypad Masquer dans le clavier Hide all Tout masquer Number of expression lines Nombre de lignes d'expression Display expression status Afficher l'état de l'expression If as-you-type expression status shall be displayed below the expression entry Si l'état de l'expression au fur et à mesure doit être affiché sous l'entrée de l'expression Show parsed expression in result field Afficher l'expression analysée dans le champ de résultat If as-you-type expression interpretation shall be displayed in the result field Si l'interprétation de l'expression au fur et à mesure de la frappe doit être affichée dans le champ de résultat Persistent keypad Clavier permanent Look & Feel Apparence et présentation If two's complement representation shall be used for negative binary numbers. Si la représentation en complément à deux doit être utilisée pour les nombres binaires négatifs. If two's complement representation shall be used for negative hexadecimal numbers. Si la représentation en complément à deux doit être utilisée pour les nombres hexadécimaux négatifs. Enables two's complement representation for input of negative binary numbers. All binary numbers starting with 1 are negative, unless binary bits is set. Active la représentation en complément à deux pour la saisie de nombres binaires négatifs. Tous les nombres binaires commençant par 1 sont négatifs, sauf si des bits binaires sont définis. Enables two's complement representation for input of negative hexadecimal numbers. All hexadecimal numbers starting with 8 or higher are negative, unless binary bits is set. Active la représentation en complément à deux pour la saisie de nombres hexadécimaux négatifs. Tous les nombres hexadécimaux commençant par 8 ou plus sont négatifs, sauf si des bits binaires sont définis. Binary bits Bits binaires Automatic Automatique Use lower case letters in non-decimal numbers Utiliser les lettres minuscules pour les nombres non décimaux If lower case letters should be used in numbers with non-decimal base Si des lettres minuscules doivent être utilisées dans des nombres avec une base non décimale Use special duodecimal symbols Utilisez des symboles duodécimaux spéciaux If ↊ and ↋ (or X and E) shall be used instead of A and B for digits 10 and 11 in numbers with base 12 Si ↊ et ↋ (ou X et E)doivent être utilisés à la place de A et B pour les chiffres 10 et 11 dans les nombres en base 12 Alternative base prefixes Préfixes de base alternatifs If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Si les nombres hexadécimaux doivent être affichés avec "0x0" et les nombres binaires avec "0b00" comme préfixes Spell out logical operators Épelez les opérateurs logiques If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Si logique et/ou doit être affiché comme "&&"/"||" ou "et"/"ou" If "e" shall be used instead of "E" in numbers Si "e" doit être utilisé à la place de "E" dans les chiffres Use E-notation instead of 10<sup><i>n</i></sup> Utilisez la notation E au lieu de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Utilisez un "e" minuscule (comme dans 1e10) Use comma as decimal separator Utiliser la virgule comme séparateur décimal Use 'j' as imaginary unit Utilisez 'j' comme unité imaginaire Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front of the imaginary part. Utilisez 'j' (au lieu de 'i') comme symbole par défaut pour l'unité imaginaire et placez-le devant la partie imaginaire. Ignore comma in numbers Ignorer la virgule dans les nombres Allow commas, ',', to be used as thousands separator instead of as an function argument separator Autoriser l'utilisation des virgules, ',', comme séparateur de milliers au lieu de séparateur d'argument de fonction Copy result as unformatted ASCII by default Copier le résultat au format ASCII non formaté par défaut Ignore dots in numbers Ignorer les points dans les nombres Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Autoriser l'utilisation des points, '.', comme séparateur de milliers plutôt que comme signe décimal alternatif Digit grouping Regroupement de chiffres off désactivé standard standard local local Multiplication sign Signe de multiplication Division sign Signe de division Numbers & Operators Nombres et opérateurs Use binary prefixes for information units Utiliser des préfixes binaires pour les unités d'information Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Utiliser les préfixes binaires, à la place des décimales, pour les informations (ex : bytes). Copy unformatted ASCII without units Copier l'ASCII non formaté sans unités Conversion to local currency Conversion vers devise locale Automatically convert to the local currency when optimal unit conversion is activated. Conversion automatique vers la devise locale lorsque la conversion d'unités optimale est activée. Exchange rates updates Mises à jour des taux de change Temperature calculation mode: Mode calcul de la température: Absolute Absolu Hybrid Hybride Units & Currencies Unités et devises Show expression completion suggestions Afficher les suggestions de complétion d'expression Search titles and countries Rechercher les titres et pays Minimum characters Caractères minimum Popup delay (ms) Délai d'apparition (ms) Completion Complétion Custom status font Police du status personnalisée If you want to use a font other than the default in the status display below the expression entry Si vous voulez utiliser une autre police que celle par défaut pour l'affichage du status en dessous de l'expression entrée Custom expression font Police d'expression personnalisée If you want to use a font other than the default in the expression entry Si vous voulez utiliser une autre police que celle utilisé par défaut dans l'expression entrée Custom result font Police personnalisée des résultats If you want to use a font other than the default in the result display Si vous voulez utiliser une autre police que celle par défaut pour l'affichage des résultats Custom keypad font Police personnalisée du clavier If you want to use a font other than the default in the keypad Si vous voulez utiliser une autre police que celle par défaut pour le clavier Status warning color Couleur avertisseur du status Status error color Couleur erreur du status Text color Couleur de texte Custom application font Police de l'application personnalisée If you want to use a font other than the default for the whole application Si vous voulez utiliser une police différence que celle utilisée par défaut pour toute l'application Custom history font Police de l'historique personnalisée Fonts & Colors Polices et couleurs Other: Autre : Bijective base-26 Bijectif base-26 <b>Result Base</b> <b>Résultat base</b> <b>Expression Base</b> <b>Expression base</b> New Keyboard Shortcut Nouveau raccourci clavier Add Action Ajouter action Edit Unit Éditer unité Do not create/modify this unit Ne pas créer/modifier cette unité Accept the creation/modification of this unit Accepter la création/modification de cette unité System Système Hide unit Cacher unité Imperial Impérial US Survey US étude Title displayed in menus and in unit manager Titre affiché dans les menus et le gestionnaire d'unités Singular form of this unit's name Nom au singulier de cette unité Class Classe The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe à laquelle appartient cette unité. Les unités dérivées nommées sont définies par rapport à une seule autre unité, avec un exposant facultatif, tandis que les unités dérivées (non nommées) sont définies par une expression d'unité avec une ou plusieurs unités. Base unit Unité de base Named derived unit Unité dérivée nommée Derived unit Unité dérivée Base unit(s) Unité(s) de base Exponent Exposant Relation Relation Inverse relation Rapport inversé Mix with base unit Mélanger avec l'unité de base Priority Priorité Minimum base unit number Numéro d'unité de base minimum Exponent of the base unit Exposant de l'unité de base Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unité (pour une unité dérivée nommée) ou expression d'unité (pour une unité dérivée non nommée) par rapport à laquelle cette unité est définie Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation avec l'unité de base. Pour les relations linéaires, cela devrait simplement être un nombre. Pour les relations non linéaires, utilisez \x pour le facteur et \y pour l'exposant (par exemple "\x + 273,15" pour la relation entre les degrés Celsius et Kelvin). Specify for non-linear relation, for conversion back to the base unit. Spécifiez pour une relation non linéaire, pour la reconversion vers l'unité de base. Use with prefixes by default Utiliser avec des préfixes par défaut Convert between units Convertir entre les unités = = Conver_sion Conver_sion Converted value Valeur convertie Value to convert from Valeur à convertir _Unit _Unité Create a new unit Créer une nouvelle unité Edit the selected unit Éditer l'unité sélectionnée Delete the selected unit Supprimer l'unité sélectionnée (De)activate the selected unit (Dés)activer l'unité sélectionnée Insert the selected unit into the expression entry Insérer l'unité sélectionnée dans l'expression entrée C_onvert C_onvertir Convert the result to the selected unit Convertir le résultat vers l'unité sélectionnée Type anywhere Taper n'importe où Edit Unknown Variable Éditer la variable de l'inconnue Use custom assumptions Utiliser des suppositions personnalisées Sign Signe Real Number Nombre réel Rational Number Nombre rationnel Name used to reference this unknown variable in expressions Nom utilisé pour référencer cette variable de l'inconnue dans les expressions Edit Variable Éditer variable The category this variable belongs to La catégorie à laquelle appartient cette variable _Variable _Variable Create a new variable Crée une nouvelle variable Edit the selected variable Modifie la variable sélectionnée Delete the selected variable Supprime la variable sélectionnée (De)activate the selected variable (Dés)active la variable sélectionnée Insert the selected variable into the expression entry Insérer la variable sélectionnée dans l'expression entrée E_xport E_xporter Empty value. La valeur est vide. Function not found. La fonction n'a pas été trouvée. Variable not found. La variable n'a pas été trouvée. Unit not found. L'unité n'a pas été trouvée. Mode not found. Le mode n'a pas été trouvé. Unsupported base. La base n'est pas supportée. Unsupported value. Valeur non prise en charge. Cycle through previous expression Parcourir l'expression précédente Move cursor left or right Déplacer le curseur de gauche ou droite Move cursor to beginning or end Déplacer le curseur au début ou à la fin Uncertainty/interval Incertitude/intervalle Relative error Erreur relative Argument separator Séparateur d'arguments Blank space Espace vide New line Nouvelle ligne Smart parentheses Parenthèses intelligentes Vector brackets Crochets de vecteur Left parenthesis Parenthèse gauche Left vector bracket Crochet gauche du vecteur Right parenthesis Parenthèse droite Right vector bracket Crochet droit du vecteur Decimal point Virgule Raise Élever Add Ajouter M+ (memory plus) M+ (mémoire +) MC (memory clear) MC (mémoire effacée) Backspace Retour arrière M− (memory minus) M− (mémoire -) Previous result (static) Résultat précédent (statique) Calculate expression Calculer l'expression MR (memory recall) MR (rappel de mémoire) MS (memory store) MS (magasin de mémoire) Action Action The selected Chinese year does not exist. L'année chinoise sélectionnée n'existe pas. Conversion to Gregorian calendar failed. La conversion au format du calendrier grégorien a échoué. Calendar conversion failed for: %s. Conversion vers le calendrier impossible pour : %s. c-format Gregorian Grégorien Revised Julian (Milanković) Julien révisé (Milanković) Julian Julien Islamic (Hijri) Islamique (Hijri) Hebrew Hébraïque Chinese Chinois Persian (Solar Hijri) Persan (Hijri solaire) Coptic Copte Ethiopian Éthiopien Indian (National) Indien (National) All if no category has been selected (previously selected has been renamed/deleted), select "All" Tout Uncategorized Non classé Clear expression Effacer l'expression Flag Drapeau text texte approximate approximatif number nombre expression expression key indicating that the property is a data set key clé Empty name field. Nom du champ vide. Edit Data Set (global) Éditer ensemble de données (global) New Data Set Nouveau ensemble de données A function with the same name already exists. Do you want to overwrite the function? Une fonction portant le même nom existe déjà. Voulez-vous l'écraser ? Property Propriété Data Retrieval Function Fonction de récupération de données argument argument New Data Object Nouveau objet de données approx. approx. and et or ou undefined indéfini Fetching exchange rates. Récupération des taux de change. Do you wish to update the exchange rates now? Souhaitez-vous mettre à jour les taux de change maintenant ? It has been %s day since the exchange rates last were updated. Cela fait %s jour que les taux de change ont été mis à jour pour la dernière fois. Cela fait %s jours que les taux de change ont été mis à jour pour la dernière fois. c-format It has been %s days since the exchange rates last were updated. Do not ask again Ne plus demander Select file to export to Sélectionner le fichier à exporter _Open _Ouvrir No file name entered. Pas de nom de fichier entré. No delimiter selected. Pas de délimiteur sélectionné. No variable name entered. Pas de nom de variable entré. No known variable with entered name found. Aucune variable connue avec le nom saisi n'a été trouvée. Could not export to file %s Ne peut exporter depuis le fichier %s c-format a previous result un résultat précédent matrix matrice vector vecteur positive positif non-positive négatif et non nul negative négatif non-negative positif et non nul non-zero non nul boolean booléen integer entier rational rationnel real réel complex complexe (not matrix) (pas de matrice) unknown inconnue default assumptions suppositions par défaut Prefix Préfixe Base Units Unités de base Binary-Coded Decimal Décimal codé en binaire Bijective Base-26 Bijectif base-26 Binary Number Nombre binaire Calendars Calendriers Complex cis Form Forme cis complexe Decimal Number Nombre décimal Duodecimal Number Nombre duodécimal Factors Facteurs 16-bit Floating Point Binary Format Format binaire à virgule flottante - 16 bits 32-bit Floating Point Binary Format Format binaire à virgule flottante - 32 bits 64-bit Floating Point Binary Format Format binaire à virgule flottante - 64 bits 80-bit (x86) Floating Point Binary Format Format binaire à virgule flottante - 80 bits (x86) 128-bit Floating Point Binary Format Format binaire à virgule flottante - 128 bits Hexadecimal Number Nombre hexadécimale Latitude Latitude Longitude Longitude Mixed Units Unités mixtes Octal Number Nombre octal Optimal Units Unités optimales Expanded Partial Fractions Fractions partielles développées Optimal Prefix Préfixe optimal Sexagesimal Number Nombre sexagésimal Unicode Unicode UTC Time Zone Fuseau horaire UTC Stop process Arrêter le processus Calculate expression and add to stack Calculer l'expression et l'ajouter à la pile Select date Sélectionner date Clear History Effacer l'historique Abort Interrompre Undo Défaire Redo Refaire Completion Mode Mode complétion Limited strict completion Complétion stricte limitée Strict completion Complétion stricte Limited full completion Complétion complète limitée Full completion Complétion complète No completion Pas de complétion Delayed completion Complétion retardée Customize completion… Personnaliser complétion… EXACT EXACTE APPROX APPROX RPN NPI CHN Chain mode CHN ROMAN ROMAIN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FONC UNIT UNITÉ VAR VAR INF INF CPLX CPLX Too many arguments for %s(). Trop d'arguments pour %s(). c-format factorize factoriser expand développer hexadecimal hexadécimal hexadecimal number nombre hexadécimal octal octal octal number nombre octal decimal décimal decimal number nombre décimal duodecimal duodécimal duodecimal number nombre duodécimal binary binaire binary number nombre binaire roman romain roman numerals chiffres romains bijective bijectif bijective base-26 bijectif base-26 binary-coded decimal décimal codé en binaire sexagesimal sexagésimal sexagesimal number nombre sexagésimal latitude latitude longitude longitude 32-bit floating point Virgule flottante 32-bits 64-bit floating point Virgule flottante 64-bits 16-bit floating point Virgule flottante 16-bits 80-bit (x86) floating point Virgule flottante 80-bits (x86) 128-bit floating point Virgule flottante 128-bits time temps time format fuseau horaire bases bases number bases bases numériques calendars calendriers optimal optimal optimal unit unité optimale prefix préfixe optimal prefix préfixe optimal base base base units unités de base mixed mixte mixed units unités mixtes factors facteurs partial fraction fraction partielle expanded partial fractions fractions partielles développées rectangular algébrique cartesian cartésien complex rectangular form form algébrique complexe exponential exponentielle complex exponential form forme exponentielle complexe polar polaire complex polar form forme polaire complexe complex cis form forme cis complexe angle angle complex angle notation notation complexe angle phasor phaseur complex phasor notation notation complexe phaseur UTC time zone fuseau horaire UTC number base %s base numérique %s c-format decimals décimales decimal fraction fraction décimale fraction fraction Reference Référence Edit Function (global) Éditer fonction (global) New Function Nouvelle fonction Empty expression field. Expression du champ vide. User functions Fonctions utilisateur Inactive Inactif Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Retrouve les données depuis l'ensemble de données %s pour un objet et propriété donnés. Si "info" est inscrit comme propriété, une fenêtre de dialogue apparaîtra avec toutes les propriétés de l'objet. c-format Example: Exemple : optional optional argument optionnel default: argument default, in description par défaut: Requirement Nécessaire Acti_vate Acti_ver History Answer Value Valeur de réponse de l'historique answer résultat History Index(es) Index(es) de l'historique History index %s does not exist. L'index de l'historique %s n'existe pas. c-format History Parsed Expression Expression analysée par l'historique It took too long to generate the plot data. Cela a pris trop de temps pour générer les données du graph. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. La génération des données de tracé a pris trop de temps. Veuillez diminuer le taux d'échantillonnage ou augmenter la limite de temps dans les préférences. RPN Register Moved Registre NPI déplacé RPN Operation Opération NPI Search Rechercher _Search _Rechercher Remove Bookmark Suppriver favoris Add Bookmark Ajouter favoris A bookmark with the selected name already exists. Do you want to overwrite it? Un favoris portant le même nom existe déjà. Voulez-vous l'écraser ? No items found Aucun élément trouvé Index Index Select file to import Sélectionner le fichier à importer A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Could not import from file %s Ne peut importer depuis le fichier %s c-format Select file Sélectionner un fichier Keep open Garder ouvert Enter RPN Enter (calculate and add to stack) Entrer C_alculate C_alculer Apply to Stack Appliquer à la pile Argument Argument True Vrai False Faux Info Info Right-click/long press: %s Clic droit/pression longue : %s c-format Right-click: %s Clic droit : %s c-format Middle-click: %s Clic du milieu : %s c-format Raise (Ctrl+*) Élever (Ctrl+*) Set unknowns Définir inconnues more Show further items in a submenu plus Logical AND Logical AND Logical OR Logical OR Logical NOT Logical NOT Toggle Result Base Basculer la base de résultats Open menu with stored variables Ouvrir le menu avec les variables enregistrées log10 function not found. fonction log10 n'a pas été trouvée. All functions Toutes les fonctions All variables Toutes les variables Variable does not exist anymore. La variable n'existe plus. ENTER Entr Execute expressions and commands from a file Exécuter des expressions et des commandes à partir d'un fichier FILE FICHIER Start a new instance of the application Démarre une nouvelle instance de l'application Display the application version Affiche la version de l'application Specify the window title Spécifie le titre de la fenêtre TITLE TITRE Expression to calculate L'expression à calculer [EXPRESSION] [EXPRESSION] Failed to load global definitions! Impossible de charger les définitions globales ! c-format By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Par défaut, seulement une instance (une fenêtre principale) de %s est autorisée. Si plusieurs instances sont ouvertes simultanément, seulement les définitions (variables, fonctions, etc.), mode, préférences et l'historique de la dernière fenêtre fermée seront sauvegardés. Voulez-vous, malgré cela, changer le comportement par défaut et autoriser plusieurs instances simultanées ? c-format Set Window Title Définir le titre de la fenêtre Exchange rate source: Source du taux de change: Sources de taux de change: Exchange rate sources: updated %s %s mis à jour %s mis à jour c-format When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Lorsque des erreurs, des avertissements et d'autres informations sont générés pendant le calcul, l'icône dans le coin supérieur droit de l'entrée d'expression change pour refléter cela. Si vous maintenez le pointeur sur l'icône ou cliquez sur l'icône, le message s'affichera. Path of executable not found. Impossible de trouver le chemin de l'exécutable. curl not found. impossible de trouver curl. Failed to run update script. %s Impossible d'exécuter le script de mise à jour. %s c-format Failed to check for updates. Échec de la vérification des mises à jour. No updates found. Aucune mise à jour trouvée. _Download _Télécharger A new version of %s is available at %s. Do you wish to update to version %s? Une nouvelle version de %s est disponible à %s. Souhaitez-vous le mettre à jour vers la version %s ? c-format A new version of %s is available. You can get version %s at %s. Une nouvelle version de %s est disponible. Vous pouvez télécharger la version %s de %s. c-format Temperature Calculation Mode Mode de calcul de température The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner le mode de calcul de la température (le mode pourra être modifié ultérieurement dans les préférences). Sinc Function Fonction Sinc Please select desired variant of the sinc function. Veuillez sélectionner la variante souhaitée de la fonction sinc. Unnormalized Non normalisé Normalized Normalisé Interpretation of dots Interprétation des points Please select interpretation of dots (".") (this can later be changed in preferences). Veuillez sélectionner l'interprétation des points (".") (cela peut être modifié ultérieurement dans les préférences). Both dot and comma as decimal separators Le point et la virgule comme séparateurs décimaux Dot as thousands separator Point comme séparateur de milliers Only dot as decimal separator Seul un point comme séparateur décimal The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner l'interprétation des expressions avec multiplication implicite (cela peut être modifié ultérieurement dans les préférences). Implicit multiplication first Multiplication implicite en premier Conventional Conventionnelle Percentage Interpretation Interprétation du pourcentage Please select interpretation of percentage addition. Veuillez sélectionner l'interprétation de l'addition en pourcentage. Add percentage of original value Ajouter un pourcentage de la valeur d'origine Add percentage multiplied by 1/100 Ajouter un pourcentage multiplié par 1/100 My Variables Mes variables Processing… Traitement en cours… Factorizing… Factorisation en cours… Expanding partial fractions… Développement des fractions partielles… Expanding… Développement en cours… Calculating… Calcul en cours… Converting… Conversion en cours… Time zone parsing failed. L'analyse du fuseau horaire a échoué. Failed to open %s. %s Impossible d'ouvrir %s. %s c-format Couldn't write definitions Ne peut pas écrire de définitions Ignore Ignorer Cancel Annuler Retry Réessayer Couldn't write history to %s L'historique n'a pas pu être écrite pour %s c-format Couldn't write preferences to %s Impossible d'écrire les préférences dans %s c-format Select definitions file Sélectionner le fichier de définitions _Import _Importer XML Files Fichiers XML Could not copy %s to %s. Ne peut pas copier %s vers %s. c-format Could not read %s. Ne peut pas lire %s. c-format Could not copy file to %s. Ne peut pas copier le fichier vers %s. c-format translator-credits crédits-traducteur User variables Variables utilisateur User units Unités utilisateur No unknowns in result. Aucune inconnue dans le résultat. Set Unknowns Définir les inconnues Qalculate! Qalculate! ans résultat Last Answer Dernier résultat Answer 2 Résultat 2 Answer 3 Résultat 3 Answer 4 Résultat 4 Answer 5 Résultat 5 Memory Mémoire none aucun Elements (in horizontal order) Éléments (dans l'ordre horizontale) Vector Result Résultat vecteur Matrix Result Résultat matrice Edit Vector Éditer vecteur Edit Vector (global) Éditer vecteur (global) New Vector Nouveau vecteur Edit Matrix (global) Éditer matrice (global) New Matrix Nouvelle matrice Unit does not exist L'unité n'existe pas Save Mode Sauvegarder mode Preset mode cannot be overwritten. Le mode préréglage ne peut pas être écrasé. Delete Mode Supprimer mode Prefixes Préfixes No Prefix Pas de préfixe Preset Prédéfini Illegal name Nom illégale A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Un objet portant le même nom existe déjà. Si vous continuez et sauvegardez les changements, l'objet en conflit sera écrasé ou désactivé. Abbreviation Abréviation Plural Pluriel Avoid input Évitez les entrées Suffix Suffixe Case sensitive Sensible à la casse Completion only Complétion seulement result is too long le résultat est trop long Could not display help for Qalculate!. Impossible d'afficher l'aide pour Qalculate!. Could not display help for Qalculate!. %s Impossible d'afficher l'aide pour Qalculate!. %s c-format Element Data Données de l'élément Classification Classification Alkali Metal Métal alcalin Alkaline-Earth Metal Métal alcalino-terreux Lanthanide Lanthanide Actinide Actinide Transition Metal Métal de transition Metal Métal Metalloid Métalloïde Polyatomic Non-Metal Polyatomique (Non-métal) Diatomic Non-Metal Diatomique (Non-métal) Noble Gas Gaz noble Unknown chemical properties Propriétés chimiques inconnues Select file to export Sélectionner le fichier à exporter Allowed File Types Types de fichiers autorisés All Files Tous les fichiers Empty expression. L'expression est vide. Empty x variable. La variable x est vide. Gnuplot was not found. Impossible de trouver Gnuplot. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) a besoin d'être installé séparement, et indiquer son chemin d'installation dans la recherche de chemin de l'exécutable, pour faire fonctionner les graphs. c-format never jamais ask demandé %i day %i jour %i jours c-format %i days Please restart the program for the language change to take effect. Veuillez redémarrer l'application pour que le changement de langue prenne effet. result processing was aborted le traitement du résultat a été interrompu result is too long see history le résultat est trop long voir l'historique calculation was aborted le calcul a été interrompu Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Entrer une expression mathématique au dessus, ex : "5 + 2 / 3", et appuyer sur le bouton entrée. Select file to save PNG image to Sélectionner le fichier à enregistrer en image PNG Copied Result was copied Copié Copy result to clipboard Copier le résultat dans le presse-papier Set key combination Définir la combinaison de touches Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Appuyer sur la combinaison de touches que vous souhaitez utiliser pour l'action (appuyer sur Echap pour annuler). No keys Pas de touches The key combination is already in use. Do you wish to replace the current action? La combinaison de touches est déjà utilisée. Souhaitez-vous remplacer l'action en cours ? Key combination Combinaison de touches Edit Unit (global) Éditer unité (global) New Unit Nouvelle unité Base unit does not exist. L'unité de base n'existe pas. Cannot delete unit as it is needed by other units. do not delete units that are used by other units Impossible de supprimer l'unité car d'autres unités en ont besoin. Edit Unknown Variable (global) Éditer variable d'inconnue (global) New Unknown Variable Nouvelle variable de l'inconnue Insert function Insérer fonction Insert function (dialog) Insérer fonction (dialogue) Insert variable Insérer variable Insert unit Insérer unité Insert text Insérer texte Insert date Insérer date Insert vector Insérer vecteur Insert matrix Insérer matrice Insert smart parentheses Insérer parenthèses intelligentes Convert to unit Convertir en unité Convert to unit (entry) Convertir en unité (entrée) Convert to optimal unit Convertir en unité optimale Convert to base units Convertir en unités de base Convert to optimal prefix Convertir en préfixe optimal Convert to number base Convertir en base numérique Factorize result Factoriser le résultat Expand result Développer le résultat Expand partial fractions Développer les fractions partielles RPN: down NPI : down RPN: up NPI : up RPN: swap NPI : swap RPN: copy NPI : copier RPN: lastx NPI : lastx RPN: delete register NPI : supprimer registre RPN: clear stack NPI : vider pile Load meta mode Charger le mode méta Set expression base Définir la base d'expression Set result base Définir la base de résultats Toggle exact mode Basculer en mode exact Set angle unit to degrees Définir l'unité d'angle en degrés Set angle unit to radians Définir l'unité d'angle en radians Set angle unit to gradians Définir l'unité d'angle sur les grades Toggle simple fractions Bascule fractions simples Toggle mixed fractions Bascule fractions mixtes Toggle scientific notation Bascule notation scientifique Toggle simple notation Bascule notation simple Toggle precision Basculer la précision Toggle max decimals Basculer le nombre maximum de décimales Toggle min decimals Basculer le nombre minimal de décimales Toggle max/min decimals Basculer les décimales max/min Toggle RPN mode Bascule mode NPI Toggle calculate as you type Active/Désactive le calcul lors de la saisie Toggle programming keypad Basculer le clavier de programmation Show keypad Afficher le clavier Show history Afficher l'historique Search history Historique des recherches Clear history Effacer l'historique Show conversion Afficher conversion Show RPN stack Afficher la pile NPI Manage variables Gérer les variables Manage functions Gérer les fonctions Manage data sets Gérer les ensembles de données New variable Nouvelle variable New function Nouvelle fonction Open plot functions/data Ouvrir graph fonctions/données Open convert number bases Ouvrir convertisseur de bases numériques Open floating point conversion Ouvrir convertisseur à virgule flottante Open calendar conversion Ouvrir conversion calendrier Open percentage calculation tool Ouvrir l'outil de calcul de pourcentages Open periodic table Ouvrir le tableau périodique Update exchange rates Mettre à jour les taux de change Copy result Copier le résultat Insert result Insérer le résultat Save result image Sauvegarder le résultat en image Help Aide Quit Quitter Toggle chain mode Basculer le mode chaîne Toggle keep above Basculer garder au-dessus Show/hide completion Afficher/masquer l'achèvement Perform completion (activate first item) Effectuer la complétion (activer le premier élément) Formatted result Résultat formaté Unformatted ASCII result Résultat ASCII non formaté Unformatted ASCII result without units Résultat ASCII non formaté sans unités Formatted expression Expression formatée Unformatted ASCII expression Expression ASCII non formatée Formatted expression + result Expression formatée + résultat Unformatted ASCII expression + result Expression ASCII non formatée + résultat Edit Variable (global) Éditer variable (global) New Variable Nouvelle variable Empty value field. Valeur du champ vide. a matrix une matrice a vector un vecteur not matrix pas de matrice Update exchange rates on start Mettre à jour les taux de change au démarrage If current exchange rates shall be downloaded from the internet at program start Si les taux de change actuels doivent être téléchargés à partir d'Internet au démarrage du programme. Truncate All Numbers Nombre octal Number bases Bases numériques Binary-coded decimal Décimales min. Rectangular form Forme algébrique Exponential form Forme exponentielle Polar form Forme polaire Angle/phasor notation Notation angle/phaseur Base units Unités de base Optimal unit Unité optimale Description of this function Description de cette fonction Definition of this function's arguments Définition des arguments de cette fonction Add entered argument definition Ajouter une définition d'argument entrée Modify selected argument Éditer l'argument sélectionné Remove selected argument Supprimer l'argument sélectionné Rules Règles Edit conditions for selected argument Éditer les conditions pour l'argument sélectionné Calculate the subfunction only once, before the parent function Calculer la sous-fonction qu'une seule fois, avant la fonction parente Add entered subfunction Ajouter sous-fonction entrée Apply changes to the selected subfunction Appliquer les changement à la sous-fonction sélectionnée Remove the selected subfunction Supprimer la sous-fonction sélectionnée Function (simplified) Fonction (simplifiée) Columns Colonnes Add new name Ajouter nouveau nom Apply changes to the selected name Appliquer les changements au nom selectionné Remove the selected name Supprimer le nom sélectionné Advanced Avancé Accept the creation/modification of this variable Accepter la création/modification de cette variable x, y, z x, y, z \x, \y, \z \x, \y, \z If the relation is precise Si la relation est précise Value of this variable (expression) Valeur de cette variable (expresion) value is exact la valeur est exacte If the value is precise Si la valeur est précise Matrices Matrices Yes Oui No Non A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Un objet portant le même nom existe déjà. Si vous continuez et sauvegardez les changements, l'objet en conflit sera écrasé ou désactivé. Voulez-vous réellement continuer ? expression function expression Deactivate to remove digit separator when copying result Désactiver pour supprimer le séparateur de chiffres lors de la copie du résultat Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Désactivé : 2.5 ≈ 3, 1.5 ≈ 2 Activé : 2.5 ≈ 2, 1.5 ≈ 2 Manage Variables Gestion des variables Manage Functions Gestion des fonctions Manage Units Gestion des unités Manage Data Sets Gestion des ensembles de données Arguments: Arguments : info info A variable or unit with the same name already exists. Do you want to overwrite it? Une variable ou unité portant le même nom existe déjà. Voulez-vous l'écraser ? Do not create/modify this data set Ne pas créer/modifier cet ensemble de données Accept the creation/modification of this data set Accepter la création/modification de cet ensemble de données Do not create/modify this function Ne pas créer/modifier cette fonction Accept the creation/modification of this function Accepter la création/modification de cette fonction Close this dialog Fermer cette boîte de dialogue Do not create/modify this matrix/vector Ne pas créer/modifier cette matrice/vecteur Create/modify the matrix/vector Créer/modifier cette matrice/vecteur Do not create/modify this unknown variable Ne pas créer/modifier cette variable de l'inconnue Accept the creation/modification of this unknown variable Accepter la création/modification de cette variable de l'inconnue Select a file Sélectionner un fichier Complex angle/phasor notation Notation complexe angle/phaseur Complex exponential form Forme exponentielle complexe Expanded partial fractions Fractions partielles développées Complex polar form Forme polaire complexe Complex rectangular form Forme algébrique complexe x x If a matrix or vectors shall be generated from the contents of the file Si une matrice ou des vecteurs doivent être générés à partir du contenu du fichier Use dark theme Utiliser le thème sombre u Manage units button u to Button for convert to operator vers Add Keypad Ajouter Alias Alias Fonts Polices Chain Calculation Calculatrice <b>Name</b> <b>Nom</b> <b>Relation</b> <b>Relation</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i secondes c-format ArgumentEditDialog Name: Nom : Type: Type : Free Libre Number Nombre Integer Entier Symbol Symbole Text Texte Date Date Vector Vecteur Matrix Matrice Boolean Booléen Angle Angle Object Objet Function Fonction Unit Unité Variable Variable File Fichier Enable rules and type test Activer les règles et le type de test Custom condition: Condition personnalisée : For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Par exemple, si l'argument est une matrice qui doit être égal au nombre de lignes et de colonnes : lignes(\x) = colonnes(\x) Allow matrix Autoriser matrice Forbid zero Interdire zéro Handle vector Manche de vecteur Calculate function for each separate element in vector. Calculer la fonction de chaque élément distinct du vecteur. Min Min Include equals Inclure les égalités Max Max CSVDialog Import CSV File Importer un fichier CSV Export CSV File Exporter en fichier CSV Current result Résultat actuel Matrix/vector variable: Variable matrice/vecteur : File: Fichier : Import as Importer comme matrix matrice vectors vecteurs Name: Nom : First row: Première ligne : Includes headings Inclure les en-têtes Delimiter: Délimiteur : Comma Virgule Tabulator Tabulation Semicolon Point virgule Space Espace Other Autre Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Error Erreur Could not import from file %1 Ne peut importer depuis le fichier %1 No matrix or vector variable with the entered name was found. Aucune variable matricielle ou vectorielle avec le nom saisi n'a été trouvée. Could not export to file %1 Ne peut exporter depuis le fichier %1 CalendarConversionDialog Calendar Conversion Conversion calendrier Gregorian Grégorien Hebrew Hébraïque Islamic (Hijri) Islamique (Hijri) Persian (Solar Hijri) Persan (Hijri solaire) Indian (National) Indien (National) Chinese Chinois Julian Julien Revised Julian (Milanković) Julien révisé (Milanković) Coptic Copte Ethiopian Éthiopien Error Erreur The selected Chinese year does not exist. L'année chinoise sélectionnée n'existe pas. Conversion to Gregorian calendar failed. La conversion au format du calendrier grégorien a échoué. Calendar conversion failed for: %1. Conversion vers le calendrier impossible pour : %1. DataObjectEditDialog %1: %1 : Default Défaut Approximate Approximatif Exact Exact Edit Data Object Éditer les données d'objet New Data Object Nouveau objet de données DataPropertyEditDialog Name: Nom : Descriptive name: Nom descriptif : Description: Description : Value type: Type de valeur : Expression Expression Number Nombre Text Texte Unit expression: Expression d'unité : Use as key Utiliser comme clé Case sensitive value Valeur sensible à la casse Approximate value Valeur approximative Value uses brackets Valeur utilise des crochets Hide Cacher Edit Data Property Éditer propriété des données DataSetEditDialog General Général Properties Propriétés Function Fonction Descriptive name: Nom descriptif : Data file: Fichier de données : Description: Description : Copyright: Copyright : Title Titre Name Nom Type Type Add Ajouter Edit Éditer Remove Supprimer Name: Nom : Object argument name: Nom d'argument de l'objet : Property argument name: Nom d'argument de propriété : Default property: Propriété par défaut : text texte approximate approximatif number nombre expression expression key clé Question Question A function with the same name already exists. Do you want to overwrite the function? Une fonction portant le même nom existe déjà. Voulez-vous l'écraser ? Data Sets Ensembles de données Object Objet Property Propriété Edit Data Set Éditer l'ensemble de données New Data Set Nouveau ensemble de données DataSetsDialog Data Sets Ensembles de données Data sets: Ensembles de données : New… Nouveau… Edit… Éditer… Delete Supprimer Objects: Objets : Data set description: Description de l'ensemble de données : Object attributes: Attributs d'objet : Properties Propriétés key clé Data Retrieval Function Fonction de récupération de données argument argument ExpressionEdit matrix matrice vector vecteur positive positif non-positive négatif et non nul negative négatif non-negative positif et non nul non-zero non nul boolean booléen integer entier rational rationnel real réel complex complexe number nombre (not matrix) (pas de matrice) unknown inconnue default assumptions suppositions par défaut Prefix: Préfixe : Complex Angle/Phasor Notation Notation complexe angle/phaseur Base units Unités de base Number Base Base numérique Binary-Coded Decimal Décimal codé en binaire Bijective Base-26 Bijectif base-26 Binary Number Nombre binaire Calendars Calendriers Complex cis Form Forme cis complexe Decimal Number Nombre décimal Duodecimal Number Nombre duodécimal Complex Exponential Form Forme exponentielle complexe Factors Facteurs 16-bit Floating Point Binary Format Format binaire à virgule flottante - 16 bits 32-bit Floating Point Binary Format Format binaire à virgule flottante - 32 bits 64-bit Floating Point Binary Format Format binaire à virgule flottante - 64 bits 80-bit (x86) Floating Point Binary Format Format binaire à virgule flottante - 80 bits (x86) 128-bit Floating Point Binary Format Format binaire à virgule flottante - 128 bits Fraction Fraction Decimal Fraction Fraction décimale Hexadecimal Number Nombre hexadécimale Latitude Latitude Longitude Longitude Mixed Units Unités mixtes Octal Number Nombre octal Optimal Unit Unité optimale Optimal Prefix Préfixe optimal Expanded Partial Fractions Fractions partielles développées Complex Polar Form Forme polaire complexe Complex Rectangular Form Forme algébrique complexe Roman Numerals Chiffres romains Sexagesimal Number Nombre sexagésimal Time Format Format de l'heure Unicode Unicode UTC Time Zone Fuseau horaire UTC Undo Défaire Redo Refaire Cut Couper Copy Copier Paste Coller Delete Supprimer Calculate Selection Calculer la sélection Insert Date… Insérer une date… Insert Matrix… Insérer une matrice… Select All Sélectionner tout Clear Effacer Clear History Effacer l'historique Completion Complétion No completion Pas de complétion Limited strict completion Complétion stricte limitée Strict completion Complétion stricte Limited full completion Complétion complète limitée Full completion Complétion complète Delayed completion Complétion retardée Expression Status L'état de l'expression Off Désactivé In history list Dans la liste historique In expression field Dans le champ d'expression With delay Avec retard Without delay Sans délai Automatically calculate selection Use input method Utiliser la méthode de saisie Matrix Matrice Too many arguments for %1(). Trop d'arguments pour %1(). argument argument %1: %1 : comment commentaire MC (memory clear) MC (mémoire effacée) MS (memory store) MS (magasin de mémoire) M+ (memory plus) M+ (mémoire +) M− (memory minus) M− (mémoire −) factorize factoriser expand développer hexadecimal hexadécimal hexadecimal number nombre hexadécimal octal octal octal number nombre octal decimal décimal decimal number nombre décimal duodecimal duodécimal duodecimal number nombre duodécimal binary binaire binary number nombre binaire roman romain roman numerals chiffres romains bijective bijectif bijective base-26 bijectif base-26 binary-coded decimal décimal codé en binaire sexagesimal sexagésimal sexagesimal number nombre sexagésimal latitude latitude longitude longitude 32-bit floating point Virgule flottante 32-bits 64-bit floating point Virgule flottante 64-bits 16-bit floating point Virgule flottante 16-bits 80-bit (x86) floating point Virgule flottante 80-bits (x86) 128-bit floating point Virgule flottante 128-bits time temps time format fuseau horaire bases bases number bases bases numériques calendars calendriers optimal optimal optimal unit unité optimale prefix préfixe optimal prefix préfixe optimal base base base units unités de base mixed mixte mixed units unités mixtes factors facteurs partial fraction fraction partielle expanded partial fractions fractions partielles développées rectangular algébrique cartesian cartésien complex rectangular form form algébrique complexe exponential exponentielle complex exponential form forme exponentielle complexe polar polaire complex polar form forme polaire complexe complex cis form forme cis complexe angle angle complex angle notation notation complexe angle phasor phaseur complex phasor notation notation complexe phaseur UTC time zone fuseau horaire UTC number base %1 base numérique %1 decimals décimales decimal fraction fraction décimale fraction fraction Data object Données de l'objet FPConversionDialog Floating Point Conversion (IEEE 754) Conversion en virgule flottante (IEEE 754) Format Format 16-bit (half precision) 16-bit (demi-précision) 32-bit (single precision) 32-bit (simple précision) 64-bit (double precision) 64-bit (double précision) 80-bit (x86 extended format) 80-bit (format x86 étendu) 128-bit (quadruple precision) 128-bit (quadruple précision) Microchip 24-bit Microchip 24-bit Microchip 32-bit Microchip 32-bit Value Valeur Binary representation Représentation binaire Hexadecimal representation Représentation hexadécimale Floating point value Valeur en virgule flottante Conversion error Erreur de conversion FunctionEditDialog Required Requis Details Détails Description Description Name: Nom : Expression: Expression : Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Utilisez x, y et z (ex : "(x+y)/2"), ou \x, \y, \z, \a, \b, … (ex : "(\x+\y)/2") Category: Catégorie : Descriptive name: Nom descriptif : Hide function Cacher fonction Example: Exemple : Description: Description : Condition: Condition : Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condition qui doit être vraie pour la fonction (ex : si le second argument doit être plus grand que le premier : "\y > \x") Sub-functions: Sous-fonctions : Expression Expression Precalculate Précalculer Reference Référence Add Ajouter Edit Éditer Remove Supprimer Arguments: Arguments : Name Nom Type Type Question Question A function with the same name already exists. Do you want to overwrite the function? Une fonction portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Function Éditer la fonction New Function Nouvelle fonction FunctionsDialog Functions Fonctions Category Catégorie Function Fonction New… Nouveau… Edit… Éditer… Deactivate Désactiver Delete Supprimer Calculate… Calculer… Apply Appliquer Insert Insérer Favorite Favori Inactive Inactif Uncategorized Non classé argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Retrouve les données depuis l'ensemble de données %1 pour un objet et propriété donnés. Si "info" est inscrit comme propriété, une fenêtre de dialogue apparaîtra avec toutes les propriétés de l'objet. Example: Exemple : Arguments Arguments optional optional argument optionnel default: argument default par défaut : Requirement: Required condition for function Nécessaire : Properties Propriétés %1: %1 : key indicating that the property is a data set key clé Activate Activer Favorites Favoris User functions Fonctions utilisateur All All functions Tout HistoryView Search… Rechercher… Search by Date… Rechercher par date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Entrer une expression mathématique au dessus, ex : "5 + 2 / 3", et appuyer sur le bouton entrée. Exchange rate source(s): Source du taux de change: Sources du taux de change: updated %1 %1 mis à jour %1 mis à jour Comment Commentaire Insert Value Insérer valeur Insert Text Insérer texte Copy Copier Copy unformatted ASCII Copier ASCII non formaté Select All Sélectionner tout Protect Protéger Add Comment… Ajouter un commentaire… Move to Top Se déplacer en haut Remove Supprimer Clear Effacer Edit Comment… Éditer le commentaire… Search Rechercher Text: Texte : KeypadButton <i>Right-click/long press</i>: %1 <i>Clic droit/pression longue</i> : %1 <i>Right-click</i>: %1 <i>Clic droit</i> : %1 <i>Long press</i>: %1 <i>Pression longue</i> : %1 Open menu Ouvrir le menu <i>Middle-click</i>: %1 <i>Clic du milieu</i> : %1 KeypadWidget Memory store Magasin de mémoire Memory clear Mémoire effacée Memory recall Rappel de mémoire Memory add Mémoire + Memory subtract Mémoire − STO Standard calculator button. Do not use more than three characters. STO Store Enregistrer New function Nouvelle fonction sin sin cos cos tan tan Exponentiation Exponentiation Factorize Factoriser Expand Développer Percent or remainder Pourcentage ou reste Uncertainty/interval Incertitude/intervalle Relative error Erreur relative Interval Intervalle Move cursor left Déplacer le curseur vers la gauche Move cursor to start Déplacer le curseur au début Move cursor right Déplacer le curseur vers la droite Move cursor to end Déplacer le curseur à la fin Bitwise AND Bitwise AND Logical AND Logical AND Bitwise OR Bitwise OR Logical OR Logical OR Bitwise Exclusive OR Bitwise Exclusive OR Bitwise NOT Bitwise NOT Logical NOT Logical NOT Bitwise Left Shift Décalage gauche Bitwise Bitwise Right Shift Décalage droite Bitwise cmp cmp rot rot a→1 a→1 Expand partial fractions Développer les fractions partielles Add column Ajouter une colonne Add row Ajouter une ligne Remove column Supprimer la colonne Remove row Supprimer la ligne Left parenthesis Parenthèse gauche Left vector bracket Crochet gauche du vecteur Right parenthesis Parenthèse droite Right vector bracket Crochet droit du vecteur Smart parentheses Parenthèses intelligentes Vector brackets Crochets de vecteur Argument separator Séparateur d'arguments Blank space Espace vide New line Nouvelle ligne Decimal point Virgule Previous result (static) Résultat précédent (statique) Multiplication Multiplication Bitwise Shift Décalage Bitwise Delete Supprimer Backspace Retour arrière Addition Addition Plus Plus Subtraction Soustraction Minus Moins Division Division Clear expression Effacer l'expression Calculate expression Calculer l'expression Enable units in physical constants Activer unités en constantes physiques All constants Toutes les constantes Percentage Calculation Tool Outil de calcul de pourcentages more plus All units Toutes les unités All variables Toutes les variables Button Action Bouton d'action Label: Intitulé : Action Action None Aucune Value: Valeur : Interval Display Affichage d'intervalle Adaptive Adaptif Significant digits Chiffres significatifs Plus/minus Plus/moins Relative Relatif Concise Concis Interval Calculation Calcul d'intervalle Variance formula Formule d'écart Interval arithmetic Arithmétique des intervalles Allow concise uncertainty input Autoriser une saisie concise de l'incertitude Complex number form Forme de nombre complexe Rectangular Rectangulaire Exponential Exponentielle Polar Polaire Angle/phasor Angle/phaseur Type Assumptions type Type Number Nombre Real Réel Rational Rationnel Integer Entier Boolean Booléen Sign Assumptions sign Signe Unknown Unknown assumptions sign Inconnue Non-zero Non nul Positive Positif Non-negative Positif ou nul Negative Négatif Non-positive Négatif ou nul Default assumptions Suppositions par défaut NamesEditDialog Name Nom Reference Référence Abbreviation Abréviation Plural Pluriel Avoid input Évitez les entrées Suffix Suffixe Case sensitive Sensible à la casse Completion only Complétion seulement Add Ajouter Edit Éditer Remove Supprimer Warning Avertissement Illegal name Nom illégale A function with the same name already exists. Une fonction portant le même nom existe déjà. A unit or variable with the same name already exists. Une unité ou variable portant le même nom existe déjà. PercentageCalculationDialog Percentage Pourcentage Value 1 Valeur 1 Value 2 Valeur 2 Change from 1 to 2 Différence de 1 à 2 Change from 2 to 1 Différence de 2 à 1 2 compared to 1 2 comparé à 1 1 compared to 2 1 comparé à 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Entrez deux valeurs, dont au plus une est un pourcentage, et les autres seront calculées pour vous. Clear Effacer PeriodicTableDialog Periodic Table Tableau périodique Element Data Données de l'élément Alkali Metal Métal alcalin Alkaline-Earth Metal Métal alcalino-terreux Lanthanide Lanthanide Actinide Actinide Transition Metal Métal de transition Metal Métal Metalloid Métalloïde Polyatomic Non-Metal Polyatomique (Non-métal) Diatomic Non-Metal Diatomique (Non-métal) Noble Gas Gaz noble Unknown chemical properties Propriétés chimiques inconnues Unknown Inconnue %1: %1 : PlotDialog Plot Graph Data Données Title: Titre : Expression: Expression : Function Fonction Vector/matrix Vecteur/matrice Paired matrix Matrice appariée Rows Lignes X variable: Variable X : Style: Style : Line Lignes Points Points Line with points Ligne avec des points Boxes/bars Boîtes/barres Histogram Histogramme Steps Etapes Candlesticks Chandeliers Dots Points Polar Polaire Smoothing: Lissage : None Aucune Monotonic Monotonie Natural cubic splines Cannelures cubiques naturelles Bezier Bézier Bezier (monotonic) Bézier (monotonie) Y-axis: Axe Y : Primary Primaire Secondary Secondaire Add Ajouter Apply Appliquer Remove Supprimer Title Titre Expression Expression Function Range Portée de la fonction Minimum x value: Valeur minimum de x : Maximum x value: Valeur maximum de x : Sampling rate: Taux d'échantillonnage : Step size: Taille de l'étape : Show real and imaginary parts Montrer des pièces réelles et imaginaires Appearance Apparence Display grid Afficher la grille Display full border Afficher la bordure complète Minimum y value: Valeur minimum de y : Maximum y value: Valeur maximum de y : Logarithmic x scale: Échelle logarithmique x : Logarithmic y scale: Échelle logarithmique y : X-axis label: Intitulé axe X : Y-axis label: Intitulé axe Y : Line width: Largeur de ligne : Legend placement: Placement de la légende : Top-left Haut à gauche Top-right Haut à droite Bottom-left Bas à gauche Bottom-right Bas à droite Below Au dessous Outside À l'extérieur Calculating… Calcul en cours… Cancel Annuler Processing… Traitement en cours… PreferencesDialog Preferences Préférences Ignore system language (requires restart) Ignorer la langue du système (redémarrage nécessaire) Language: Langue : Default Défaut Allow multiple instances Permettre plusieurs instances Clear history on exit Effacer l'historique à la fermeture Max history lines saved: The length of "Nombre maximum de lignes d'historique enregistrées" is problematic Lignes d'historique enregistrées : Close application with Escape key Fermez l'application avec la touche Échap Use keyboard keys for RPN Utiliser les touches du clavier pour NPI Use caret for bitwise XOR Utiliser le caret pour le bitwise XOR Keep above other windows Rester au-dessus des autres fenêtres Preserve history height Préserver la hauteur de l'historique Do not change the height of history list when keypad or number bases are show or hidden. Ne modifiez pas la hauteur de la liste historique lorsque le clavier ou les bases numériques sont affichés ou masqués. Window title: Titre de la fenêtre : Application name Nom de l'application Result Résultat Application name + result Nom de l'application + résultat Workspace Espace de travail Application name + workspace Nom de l'application + espace de travail Tooltips: Info-bulles : Show all Afficher tout Hide in keypad Masquer dans le clavier Hide all Tout masquer Style: Style: Default (requires restart) Default style Défaut (redémarrage nécessaire) Dark mode Thème sombre Disable cursor blinking Colorize result Coloriser le résultat Format result Formater le résultat Custom result font: Police de résultat personnalisée: Custom expression font: Police d'expression personnalisée: Custom keypad font: Police du clavier personnalisée: Custom application font: Police de l'application personnalisée: Expression status: État de l'expression : Off Désactivé In history list Dans la liste historique In expression field Dans le champ d'expression Status tooltip delay: Délai de l'info-bulle d'état: ms milliseconds ms Calculate as you type delay: Calculez au fur et à mesure que vous tapez le délai: Automatically calculate selection Expression in history: Expression dans l'historique : Parsed Analysé Entered Entré Entered + parsed Entré + analysé Expression after calculation: Expression après calcul: Keep expression Gardez l'expression Clear expression Effacer l'expression Replace with result Remplacer par le résultat Replace with result if shorter Remplacer par le résultat s'il est plus court Automatically copy result Copier automatiquement le résultat Parsing mode: Mode d'analyse : Adaptive Adaptif Conventional Conventionnelle Implicit multiplication first Multiplication implicite en premier Chain Chaîne RPN NPI Simplified percentage calculation Calcul de pourcentage simplifié Read precision Lire précision Allow concise uncertainty input Autoriser une saisie concise de l'incertitude Limit implicit multiplication Limiter la multiplication implicite Interpret unrecognized symbols as variables Interpréter les symboles non reconnus comme des variables Interval calculation: Calcul d'intervalle : Variance formula Formule d'écart Interval arithmetic Arithmétique des intervalles Factorize result Factoriser le résultat Two's complement output: Sortie du complément à deux : Two's complement input: Entrée du complément à deux : Binary Binaire Hexadecimal Hexadécimal Binary bits: Bits binaires: Automatic Automatique Use lower case letters in non-decimal numbers Utiliser les lettres minuscules pour les nombres non décimaux Use special duodecimal symbols Utilisez des symboles duodécimaux spéciaux Use dot as multiplication sign Utiliser le point comme signe de multiplication Use Unicode division slash in output Utiliser la barre oblique de division Unicode en sortie Spell out logical operators Épelez les opérateurs logiques Use E-notation instead of 10^n Utilisez la notation E au lieu de 10^n Use 'j' as imaginary unit Utilisez 'j' comme unité imaginaire Use comma as decimal separator Utiliser la virgule comme séparateur décimal Ignore comma in numbers Ignorer la virgule dans les nombres Ignore dots in numbers Ignorer les points dans les nombres Indicate repeating decimals Indiquer les décimales répétitives Copy unformatted ASCII by default Copier ASCII non formaté par défault Digit grouping: Regroupement de chiffres : None Aucune Standard Standard Local Local Automatically group digits in input (experimental) Groupement automatique des chiffres en entrée (expérimental) Interval display: Affichage d'intervalle : Significant digits Chiffres significatifs Interval Intervalle Plus/minus Plus/moins Relative Relatif Concise Concis Midpoint Point du milieu Lower Inférieure Upper Supérieure Rounding: Arrondi: Round halfway numbers away from zero Arrondir les nombres à mi-chemin par rapport à zéro Round halfway numbers to even Arrondir les nombres à mi-chemin pour égaliser Round halfway numbers to odd Arrondir les nombres à mi-chemin à impairs Round halfway numbers toward zero Arrondir les nombres à mi-chemin vers zéro Round halfway numbers to random Arrondir les nombres à mi-chemin au hasard Round halfway numbers up Arrondir les chiffres à mi-chemin vers le haut Round halfway numbers down Arrondir les chiffres à mi-chemin vers le bas Round toward zero Arrondir vers zéro Round away from zero Arrondir à partir de zéro Round up Rassembler Round down Arrondir vers le bas Complex number form: Forme polaire complexe: Rectangular Rectangulaire Exponential Exponentielle Polar Polaire Angle/phasor Angle/phaseur Enable units Activer les unités Abbreviate names Noms abrégés Use binary prefixes for information units Utiliser des préfixes binaires pour les unités d'information Automatic unit conversion: Conversion automatique des unités: No conversion Pas de conversion Base units Unités de base Optimal units Unités optimales Optimal SI units Unités SI optimales Convert to mixed units Convertir en unités mixtes Automatic unit prefixes: Préfixes d'unités automatiques: No prefixes Pas de préfixes Prefixes for some units Préfixes pour les unités sélectionnées Prefixes also for currencies Également des préfixes pour les devises Prefixes for all units Préfixes pour toutes les unités Enable all SI-prefixes Activer tous les préfixes SI Enable denominator prefixes Activer les préfixes du dénominateur Enable units in physical constants Activer unités en constantes physiques Copy unformatted ASCII without units Copier l'ASCII non formaté sans unités Temperature calculation: Mode de calcul de température : Absolute Absolu Hybrid Hybride Exchange rates updates: Mises à jour des taux de change : %n day(s) %n jour %n jours Look && Feel Apparence et présentation Numbers && Operators Nombres et opérateurs Units && Currencies Unités et devises Parsing && Calculation Analyse && Calcul Restart required Redémarrage nécessaire Please restart the program for the language change to take effect. Veuillez redémarrer l'application pour que le changement de langue prenne effet. QApplication Execute expressions and commands from a file Exécuter des expressions et des commandes à partir d'un fichier FILE FICHIER Start a new instance of the application Démarre une nouvelle instance de l'application Specify the window title Spécifie le titre de la fenêtre TITLE TITRE Display the application version Affiche la version de l'application Open workspace Espace de travail ouvert Expression to calculate L'expression à calculer [EXPRESSION] [EXPRESSION] Allow multiple instances? Permettre plusieurs instances? By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Par défaut, seulement une instance (une fenêtre principale) de %1 est autorisée. Si plusieurs instances sont ouvertes simultanément, seulement les définitions (variables, fonctions, etc.), mode, préférences et l'historique de la dernière fenêtre fermée seront sauvegardés. Voulez-vous, malgré cela, changer le comportement par défaut et autoriser plusieurs instances simultanées ? %1 is already running. %1 est déjà en cours d'exécution. Failed to load global definitions! Impossible de charger les définitions globales ! History Answer Value Valeur de réponse de l'historique answer résultat History Index(es) Index(es) de l'historique History index %s does not exist. L'index de l'historique %s n'existe pas. Last Answer Dernier résultat Answer 2 Résultat 2 Answer 3 Résultat 3 Answer 4 Résultat 4 Answer 5 Résultat 5 Memory Mémoire Error Erreur Couldn't write preferences to %1 Impossible d'écrire les préférences dans %1 Function not found. La fonction n'a pas été trouvée. Variable not found. La variable n'a pas été trouvée. Unit not found. L'unité n'a pas été trouvée. Unsupported base. La base n'est pas supportée. Unsupported value. Valeur non prise en charge. QalculateQtSettings Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Update exchange rates? Mettre à jour les taux de change ? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Cela fait %n jour que les taux de change ont été mis à jour pour la dernière fois. Souhaitez-vous mettre à jour les taux de change maintenant? Cela fait %n jours que les taux de change ont été mis à jour pour la dernière fois. Souhaitez-vous mettre à jour les taux de change maintenant? Fetching exchange rates… Récupération des taux de change… Error Erreur Warning Avertissement Information Information Path of executable not found. Impossible de trouver le chemin de l'exécutable. curl not found. impossible de trouver curl. Failed to run update script. %1 Impossible d'exécuter le script de mise à jour. %1 Failed to check for updates. Échec de la vérification des mises à jour. No updates found. Aucune mise à jour trouvée. A new version of %1 is available at %2. Do you wish to update to version %3? Une nouvelle version de %1 est disponible à %2. Souhaitez-vous le mettre à jour vers la version %3? A new version of %1 is available. You can get version %3 at %2. Une nouvelle version de %1 est disponible. Vous pouvez télécharger la version %3 de %2. Download Télécharger %1: %2 %1 : %2 Insert function Insérer fonction Insert function (dialog) Insérer fonction (dialogue) Insert variable Insérer variable Approximate result Résultat approximatif Negate Rejeter Invert Intervertir Insert unit Insérer unité Insert text Insérer texte Insert operator Insérer un opérateur Insert date Insérer date Insert matrix Insérer matrice Insert smart parentheses Insérer parenthèses intelligentes Convert to unit Convertir en unité Convert Convertir Convert to optimal unit Convertir en unité optimale Convert to base units Convertir en unités de base Convert to optimal prefix Convertir en préfixe optimal Convert to number base Convertir en base numérique Factorize result Factoriser le résultat Expand result Développer le résultat Expand partial fractions Développer les fractions partielles RPN: down NPI : down RPN: up NPI : up RPN: swap NPI : swap RPN: copy NPI : copier RPN: lastx NPI : lastx RPN: delete register NPI : supprimer registre RPN: clear stack NPI : vider pile Set expression base Définir la base d'expression Set result base Définir la base de résultats Set angle unit to degrees Définir l'unité d'angle en degrés Set angle unit to radians Définir l'unité d'angle en radians Set angle unit to gradians Définir l'unité d'angle sur les grades Active normal display mode Mode d'affichage normal actif Activate scientific display mode Activer le mode d'affichage scientifique Activate engineering display mode Activer le mode d'affichage ingénierie Activate simple display mode Activer le mode d'affichage simple Toggle precision Basculer la précision Toggle max decimals Basculer le nombre maximum de décimales Toggle min decimals Basculer le nombre minimal de décimales Toggle max/min decimals Basculer les décimales max/min Toggle RPN mode Bascule mode NPI Show general keypad Afficher le clavier général Toggle programming keypad Basculer le clavier de programmation Toggle algebra keypad Basculer le clavier en algèbre Toggle custom keypad Basculer le clavier en personnalisé Show/hide keypad Afficher/masquer le clavier Search history Historique des recherches Clear history Effacer l'historique Show variables Afficher les variables Show functions Afficher les fonctions Show units Afficher les unités Show data sets Afficher les ensembles de données Store result Enregistrer résultat MC (memory clear) MC (mémoire effacée) MR (memory recall) MR (rappel de mémoire) MS (memory store) MS (magasin de mémoire) M+ (memory plus) M+ (mémoire +) M− (memory minus) M− (mémoire −) New variable Nouvelle variable New function Nouvelle fonction Open plot functions/data Ouvrir graph fonctions/données Open convert number bases Ouvrir convertisseur de bases numériques Open floating point conversion Ouvrir convertisseur à virgule flottante Open calender conversion Ouvrir conversion calendrier Open percentage calculation tool Ouvrir l'outil de calcul de pourcentages Open periodic table Ouvrir le tableau périodique Update exchange rates Mettre à jour les taux de change Copy result Copier le résultat Insert result Insérer le résultat Open mode menu Menu du mode ouvert Open menu Ouvrir le menu Help Aide Quit Quitter Toggle chain mode Basculer le mode chaîne Toggle keep above Basculer garder au-dessus Show completion (activate first item) Afficher l'achèvement (activer le premier élément) Clear expression Effacer l'expression Delete Supprimer Backspace Retour arrière Home Accueil End Fin Right Droite Left Gauche Up Haut Down Bas Undo Défaire Redo Refaire Calculate expression Calculer l'expression Expression history next Historique des expressions suivant Expression history previous Historique des expressions précédent Open functions menu Ouvrir le menu des fonctions Open units menu Ouvrir le menu des unités Open variables menu Ouvrir le menu des variables Toggle fraction format in current result Default Défaut Formatted result Résultat formaté Unformatted ASCII result Résultat ASCII non formaté Unformatted ASCII result without units Résultat ASCII non formaté sans unités Formatted expression Expression formatée Unformatted ASCII expression Expression ASCII non formatée Formatted expression + result Expression formatée + résultat Unformatted ASCII expression + result Expression ASCII non formatée + résultat QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Annuler Close Only used when Qt translation is missing Fermer &Yes Only used when Qt translation is missing &Oui &No Only used when Qt translation is missing &Non &Open Only used when Qt translation is missing &Ouvrir &Save Only used when Qt translation is missing &Sauvegarder &Select All Only used when Qt translation is missing &Sélectionner tout Look in: Only used when Qt translation is missing Regarder dans: File &name: Only used when Qt translation is missing Nom de &fichier: Files of type: Only used when Qt translation is missing QalculateWindow Show toolbar Afficher la barre d'outils Menu Menu New Nouveau Function… Fonction… Variable/Constant… Variable/constante… Unknown Variable… Variable de l'inconnue… Matrix… Matrice… Unit… Unité… Workspaces Espaces de travail Open… Ouvrir… Open default Ouvrir par défaut Save Enregistrer Save As… Enregistrer sous… Import CSV File… Importer un fichier CSV… Export CSV File… Exporter en fichier CSV… Functions Fonctions Variables and Constants Variables et constantes Units Unités Data Sets Ensembles de données Plot Functions/Data Fonctions/Données du Graph Floating Point Conversion (IEEE 754) Conversion en virgule flottante (IEEE 754) Calendar Conversion Conversion calendrier Percentage Calculation Tool Outil de calcul de pourcentages Periodic Table Tableau périodique Update Exchange Rates Mettre à jour les taux de change Normal Mode Mode normal RPN Mode Mode NPI Chain Mode Mode chaîne Keyboard Shortcuts Raccourcis clavier Preferences Préférences Open Settings Folder(s) Ouvrir le dossier de paramètres Ouvrir les dossiers de paramètres Help Aide Report a Bug Reporter un bug Check for Updates Vérifier les mises à jour About %1 À propos de %1 Quit Quitter Mode Mode General Display Mode Mode d'affichage général Normal Normal Scientific Scientifique Engineering Ingénierie Simple Simple Angle Unit Unité d'angle Radians Radians Degrees Degrés Gradians Grades Other Autre Approximation Approximation Automatic Automatic approximation Automatique Dual Dual approximation Double Exact Exact approximation Exact Approximate Approximatif Assumptions Suppositions Type Assumptions type Type Number Nombre Real Réel Rational Rationnel Integer Entier Boolean Booléen Sign Assumptions sign Signe Unknown Unknown assumptions sign Inconnue Non-zero Non nul Positive Positif Non-negative Positif ou nul Negative Négatif Non-positive Négatif ou nul Result Base Base de résultats Binary Binaire Octal Octal Decimal Décimal Hexadecimal Hexadécimal Duodecimal Duodécimal Sexagesimal Sexagésimal Time format Format de l'heure Roman numerals Chiffres romains Unicode Unicode Bijective base-26 Bijectif base-26 Binary-encoded decimal (BCD) Décimal codé en binaire Custom: Number base Personnalisée: Expression Base Base d'expression Precision: Précision: Min decimals: Décimales min: Max decimals: Décimales max: off Max decimals désactivé Convert Convertir Store Magasin Plot Graph Number bases Bases numériques Keypad Clavier General Général Programming Programmation Algebra Algèbre Custom Personnalisé Number Pad Pavé numérique None Aucune Always Show Number Pad Toujours afficher le pavé numérique Separate Menu Buttons Boutons de menu séparés Reset Keypad Position Réinitialiser la position du clavier Binary: Binaire: Octal: Octal: Decimal: Décimal: Hexadecimal: Hexadécimal: RPN Stack Pile NPI Icons only Icônes uniquement Text only Texte uniquement Text beside icons Texte à côté des icônes Text under icons Texte sous les icônes Copy Copier <i>Right-click/long press</i>: %1 <i>Clic droit/pression longue</i> : %1 Open menu Ouvrir le menu Number Bases Bases numériques Rotate the stack or move the selected register up Faire pivoter la pile ou déplacer le registre sélectionné vers le haut Rotate the stack or move the selected register down Faire pivoter la pile ou déplacer le registre sélectionné vers le bas Swap the top two values or move the selected value to the top of the stack Échangez les deux valeurs supérieures ou déplacez la valeur sélectionnée vers le haut de la pile Delete the top or selected value Supprimer la valeur supérieure ou sélectionnée Enter the top value from before the last numeric operation Entrez la valeur supérieure avant la dernière opération numérique Copy the selected or top value to the top of the stack Copiez la valeur sélectionnée ou supérieure en haut de la pile Clear the RPN stack Vider la pile NPI New Function… Nouvelle fonction… Favorites Favoris Recent Récent User functions Fonctions utilisateur Open dialog Ouvrir la boîte de dialogue Show all functions Afficher toutes les fonctions User units Unités utilisateur more plus Prefixes Préfixes Show all units Afficher toutes les unités User variables Variables utilisateur Show all variables Afficher toutes les variables Powerful and easy to use calculator Une calculatrice puissante et facile d'utilisation License: GNU General Public License version 2 or later Licence : GNU General Public License version 2 ou ultérieure %1: %1 : Error Erreur Couldn't write definitions Ne peut pas écrire de définitions hexadecimal hexadécimal octal octal decimal décimal duodecimal duodécimal binary binaire roman romain bijective bijectif sexagesimal sexagésimal latitude latitude longitude longitude time temps Time zone parsing failed. L'analyse du fuseau horaire a échoué. bases bases calendars calendriers rectangular algébrique cartesian cartésien exponential exponentielle polar polaire phasor phaseur angle angle optimal optimal prefix préfixe base base mixed mixte factors facteurs partial fraction fraction partielle decimals décimales fraction fraction factorize factoriser expand développer Calculating… Calcul en cours… Cancel Annuler RPN Operation Opération NPI Factorizing… Factorisation en cours… Expanding partial fractions… Développement des fractions partielles… Expanding… Développement en cours… Converting… Conversion en cours… RPN Register Moved Registre NPI déplacé Processing… Traitement en cours… Matrix Matrice Temperature Calculation Mode Mode de calcul de température The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner le mode de calcul de la température (le mode pourra être modifié ultérieurement dans les préférences). Absolute Absolu Relative Relatif Hybrid Hybride Please select desired variant of the sinc function. Veuillez sélectionner la variante souhaitée de la fonction sinc. Unnormalized Non normalisé Normalized Normalisé Interpretation of dots Interprétation des points Please select interpretation of dots (".") (this can later be changed in preferences). Veuillez sélectionner l'interprétation des points (".") (cela peut être modifié ultérieurement dans les préférences). Both dot and comma as decimal separators Le point et la virgule comme séparateurs décimaux Dot as thousands separator Point comme séparateur de milliers Only dot as decimal separator Seul un point comme séparateur décimal Parsing Mode Mode d'analyse The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner l'interprétation des expressions avec multiplication implicite (cela peut être modifié ultérieurement dans les préférences). Implicit multiplication first Multiplication implicite en premier Conventional Conventionnelle Adaptive Adaptif Percentage Interpretation Interprétation du pourcentage Please select interpretation of percentage addition Veuillez sélectionner l'interprétation de l'addition en pourcentage Add percentage of original value Ajouter un pourcentage de la valeur d'origine Add percentage multiplied by 1/100 Ajouter un pourcentage multiplié par 1/100 Add Action (%1) Ajouter action (%1) Edit Keyboard Shortcut Éditer raccourci clavier New Keyboard Shortcut Nouveau raccourci clavier Action Action Value: Valeur: Set key combination Définir la combinaison de touches Press the key combination you wish to use for the action. Appuyer sur la combinaison de touches que vous souhaitez utiliser pour l'action. Reserved key combination Combinaison de touches réservée Question Question The key combination is already in use. Do you wish to replace the current action (%1)? La combinaison de touches est déjà utilisée. Souhaitez-vous remplacer l'action en cours (%1)? Key combination Combinaison de touches Add… Ajouter… Edit… Éditer… Remove Supprimer Gnuplot was not found Impossible de trouver Gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) a besoin d'être installé séparement, et indiquer son chemin d'installation dans la recherche de chemin de l'exécutable, pour faire fonctionner les graphs. Example: Example of function usage Exemple : Keep open Garder ouvert Enter RPN Enter Entrer Calculate Calculer Apply to Stack Appliquer à la pile Insert Insérer Value Valeur Argument Argument True Vrai False Faux Info Info optional optional argument optionnel Failed to open %1. %2 Impossible d'ouvrir %1. %2 Failed to open workspace Échec de l'ouverture de l'espace de travail Couldn't save workspace Impossible d'enregistrer l'espace de travail Save file? Enregistrer le fichier? Do you want to save the current workspace? Voulez-vous enregistrer l'espace de travail actuel? Do not ask again Ne plus demander UnitEditDialog General Général Relation Relation Name: Nom : Category: Catégorie : Descriptive name: Nom descriptif : System: Système: Imperial Impérial US Survey US étude Hide unit Cacher unité Description: Description : Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe à laquelle appartient cette unité. Les unités dérivées nommées sont définies par rapport à une seule autre unité, avec un exposant facultatif, tandis que les unités dérivées (non nommées) sont définies par une expression d'unité avec une ou plusieurs unités. Base unit Unité de base Named derived unit Unité dérivée nommée Derived unit Unité dérivée Base unit(s): Unité(s) de base : Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unité (pour une unité dérivée nommée) ou expression d'unité (pour une unité dérivée non nommée) par rapport à laquelle cette unité est définie Exponent: Exposant: Relation: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation avec l'unité de base. Pour les relations linéaires, cela devrait simplement être un nombre<br><br>Pour les relations non linéaires, utilisez \x pour le facteur et \y pour l'exposant (par exemple "\x + 273,15" pour la relation entre les degrés Celsius et Kelvin). Inverse relation: Rapport inversé: Specify for non-linear relation, for conversion back to the base unit. Spécifiez pour une relation non linéaire, pour la reconversion vers l'unité de base. Mix with base unit Mélanger avec l'unité de base Priority: Priorité: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Numéro d'unité de base minimum : Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Utiliser avec des préfixes par défaut Error Erreur Base unit does not exist. L'unité de base n'existe pas. Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Unit Éditer unité New Unit Nouvelle unité UnitsDialog Units Unités Category Catégorie Unit Unité New… Nouveau… Edit… Éditer… Deactivate Désactiver Delete Supprimer Convert Convertir Insert Insérer Favorite Favori Show hidden units Afficher les unités cachées Inactive Inactif Uncategorized Non classé Activate Activer Favorites Favoris User units Unités utilisateur All All units Tout UnknownEditDialog Name: Nom : Custom assumptions Suppositions personnalisées Type: Type: Sign: Signe: Temporary Temporaire Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Unknown Variable Éditer la variable de l'inconnue New Unknown Variable Nouvelle variable de l'inconnue VariableEditDialog Required Requis Description Description Name: Nom : Value: Valeur : current result résultat actuel Temporary Temporaire Category: Catégorie : Descriptive name: Nom descriptif : Hide variable Cacher variable Description: Description : Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Variable Éditer variable New Variable Nouvelle variable VariablesDialog Variables Variables Category Catégorie Variable Variable New Nouveau Variable/Constant… Variable/constante… Unknown Variable… Variable inconnue… Matrix… Matrice… Edit… Éditer… Export… Exporter… Deactivate Désactiver Delete Supprimer Insert Insérer Favorite Favori Inactive Inactif Uncategorized Non classé a matrix une matrice a vector un vecteur positive positif non-positive négatif et non nul negative négatif non-negative positif et non nul non-zero non nul integer entier boolean booléen rational rationnel real réel complex complexe number nombre not matrix pas de matrice unknown inconnue Default assumptions Suppositions par défaut Activate Activer Favorites Favoris User variables Variables utilisateur All All variables Tout qalculate-qt-5.5.1/translations/qalculate-qt_nl.ts000066400000000000000000014555751475705355700223460ustar00rootroot00000000000000 Qalculate! Qalculate! Powerful and easy to use calculator Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Argument Rules Regels met betrekking tot argumenten Do not save modifications Wijzigingen niet opslaan Accept the modification of argument rules De wijziging van de regels accepteren met betrekking tot argumenten Enable rules and type test Test voor regels en type toestaan Custom condition Aangepaste conditie For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Vb. indien het argument een matrix is die evenveel rijen als kolommen moet hebben: rijen(\x) = kolommen(\x) Allow matrix Matrix toestaan Forbid zero Nul niet toestaan Min Min Include equals Ook is gelijk aan Max Max Value Waarde Argument name Naam van argument Calendar Conversion Kalenderconversie Export CSV File CSV-bestand exporteren Current result Huidig antwoord Matrix/vector variable Matrix/vector-variabele File Bestand Delimiter Scheidingsteken Comma Komma Tabulator Tabtoets Semicolon Puntkomma Space Spatie Other Overig Import CSV File CSV-bestand importeren Do not import the file Bestand niet importeren Import the file Het bestand importeren Name of the data file to import Naam van het te importeren gegevensbestand Select a file Selecteer een bestand Import as Importeren als Matrix Matrix Vectors Vectoren Name Naam Name (or name prefix) used to reference generated variable(s) in expressions Naam (of voorvoegsel voor naam) gebruikt voor aangemaakte variabele(n) in expressies Descriptive name Beschrijvende naam Title displayed in menus and in variable manager Titel getoond in menu's en in variabelenbeheerder Category Categorie First row Eerste rij The first row with data to import in the file De eerste rij gegevens die in het bestand moet worden geïmporteerd Includes headings Koppen inbegrepen If the first row contains column headings Of de eerste rij kolomkoppen bevat Delimiter used to separate columns in the file Scheidingsteken voor de kolommen in het bestand Custom delimiter Standaard scheidingsteken Edit Data Property Gegevenseigenschap bewerken Do not create/modify this data set Deze gegevensverzameling niet aanmaken/wijzigen Accept the creation/modification of this data set Aanmaken/wijziging accepteren van deze gegevensverzameling Name used for reference Naam voor referentie Properties Eigenschappen Title displayed in menus and in data set manager Titel getoond in menu's en in beheerder voor gegevensverzamelingen Description Beschrijving Description of this data property Beschrijving van deze gegevenseigenschap Value Type Waardetype Text Tekst Number Getal Expression Expressie Hide Verbergen Use as key Gebruiken als sleutelwaarde Approximate value Benaderde waarde Case sensitive value Hoofdlettergevoelige waarde Value uses brackets Waarde met vierkante haakjes Unit expression Eenheidexpressie Edit Data Set Gegevensverzameling bewerken Title Titel Data file Gegevensbestand Description of this data set Beschrijving van deze gegevensverzameling Copyright Copyright General Algemeen Properties: Eigenschappen: Definition of the properties of this data set Definitie van de eigenschappen van deze gegevensverzameling _New _Nieuw _Edit B_ewerken _Delete Wissen Name used to invoke the function in expressions Naam voor functie in expressies Object argument name Naam objectargument Property argument name Naam eigenschapsargument Default property Standaardeigenschap Function Functie Edit Data Object Gegevensobject bewerken Do not create/modify this data object Dit gegevensobject niet aanmaken/wijzigen Accept the creation/modification of this data object Aanmaken/wijzigen accepteren van dit gegevensobject Data Sets new dataset Gegevensverzamelingen Data Set Gegevensverzameling Create a new data set Een nieuwe gegevensverzameling aanmaken Edit the selected data set De geselecteerde gegevensverzameling bewerken Delete the selected data set De geselecteerde gegevensverzameling wissen Objects Objecten Create a new data object Een nieuwe gegevensobject aanmaken Edit the selected data object De geselecteerde gegevensobject bewerken Remove the selected data object Geselecteerd gegevensobject verwijderen Data Set Description Beschrijving gegevensverzameling Object Attributes Objectattributen Decimals Decimalen Close this window Dit venster sluiten Min decimals Min decimalen Max decimals Max decimalen Minimal number of displayed decimals Minimum aantal te tonen decimalen Maximal number of decimals to display (and round to) Maximum aantal te tonen decimalen (en voor afronden) Decimal value Decimale waarde Binary value Binaire waarde Octal value Octale waarde Hexadecimal value Hexadecimale waarde Edit Function Functie bewerken _Help _Help Do not create/modify this function Deze functie niet aanmaken/wijzigen Accept the creation/modification of this function Aanmaken/wijzigen accepteren van deze functie Name used to invoke this function in expressions Naam voor deze functie in expressies Title displayed in menus and in function manager Titel getoond in menu's en in functiebeheerder Hide function Functie verbergen If this function shall be hidden in menus Of deze functie in de menu's verborgen moet zijn Description of this function Beschrijving van deze functie Condition Conditie Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Conditie die waar moet zijn voor de functie (bv. indien het tweede argument groter moet zijn dan het eerste: "\y > \x") Sub-Functions Subfuncties Arguments: Argumenten: Definition of this function's arguments Definitie van de argumenten voor deze functie Free Vrij Integer Geheel Symbol Symbool Date Datum Vector Vector Positive number Positief getal Non-zero number Getal ongelijk aan nul Non-negative number Niet negatief getal Positive integer Positief geheel getal Non-zero integer Geheel getal ongelijk aan nul Non-negative integer Niet-negatief geheel getal Boolean Booleaans Object Object Unit Eenheid Variable Variabele Angle Hoek Data object Gegevensobject Data property Gegevenseigenschap _Add _Toevoegen Add entered argument definition Ingevoerde argumentdefinitie toevoegen _Apply _Toepassen Modify selected argument Geselecteerd argument wijzigen Remove selected argument Geselecteerd argument verwijderen Rules Regels Edit conditions for selected argument Condities bewerken voor geselecteerd argument Close this dialog Dit dialoog sluiten Precalculate Voorberekenen Calculate the subfunction only once, before the parent function Bereken de subfunctie slechts een keer, nog voor de functie waarin die wordt gebruikt Add entered subfunction Ingevoerde subfunctie toevoegen Functions Functies Create a new function Maak een nieuwe functie aan Edit the selected function De geselecteerde functie bewerken _Insert _Invoegen Insert (or execute) the selected function into the expression entry De geselecteerde functie invoegen (of uitvoeren) bij het invoeren van de expressie Delete the selected function De geselecteerde functie wissen (De)activate the selected function De geselecteerde functie (de)activeren Deacti_vate Uit_schakelen Apply the selected function to the current expression Pas de geselecteerde functie toe op het huidige expressie Categor_y Categor_y _Function _Functie Descri_ption Beschrij_ving Degrees Booggraden Radians Radialen Gradians Decimale graden Default assumptions Standaard aannames Unknown Onbekende Not Matrix Geen matrix Complex Complex Real Reëel Rational Rationaal Non-Zero Ongelijk aan nul Positive Positief Non-Negative Niet-negatief Negative Negatief Non-Positive Niet-positief _File _Bestand Unknown Variable Onbekende variabele Function (simplified) Functie (vereenvoudigd) Import CSV File… CSV-bestand importeren… Export CSV File… CSV-bestand exporteren… _Store Result… _Antwoord opslaan… Save Result Image… Afbeelding van het antwoord opslaan… Save local functions, variables and units Lokale functies, variabelen en eenheden opslaan Save Definitions Definities opslaan Import Definitions File… Definitiesbestand importeren… Fetch current exchange rates from the Internet Haal huidige wisselkoersen op van het internet Update Exchange Rates Wisselkoersen bijwerken Plot Functions/Data Functies/gegevens plotten Convert Number Bases Getallen converteren naar ander grondtal Percentage Calculation Tool Percentage berekenen Periodic Table Periodiek systeem _Quit A_fsluiten Manage Variables Variabelen beheren Manage Functions Functies beheren Manage Units Eenheden beheren Manage Data Sets Gegevensverzamelingen beheren Factorize Ontbinden in factoren Expand Uitwerken Expand Partial Fractions Splitsen in partiële breuken Set Unknowns… Onbekenden een waarde geven… Convert to Unit Converteren naar eenheid Set Prefix Voorvoegsel instellen Convert to Unit Expression… Converteren naar eenheidexpressie… Convert to Base Units Converteren naar basiseenheden Convert to Optimal Unit Converteren naar meest geschikte eenheid Insert Date… Datum invoegen… Insert Matrix… Matrix invoegen… Insert Vector… Vector invoegen… _Copy Result _Antwoord kopiëren _Preferences _Voorkeuren _Mode _Modus Number Base Grondtal talstelsel Select Result and Expression Base… Selecteer grondtal voor antwoord en expressie… Binary Binair Octal Octaal Decimal Decimaal Duodecimal Duodecimaal Hexadecimal Hexadecimaal Other… Overig… Sexagesimal Sexagesimaal Time Format Tijdnotatie Roman Numerals Romeinse cijfers Numerical Display Tonen getal Normal Normaal Engineering Technisch Scientific Wetenschappelijk Purely Scientific Zuiver wetenschappelijk Simple Eenvoudig Indicate Repeating Decimals Oneindige reeksen aangeven Show Ending Zeroes Afsluitende nullen weergeven Round Halfway Numbers to Even Tussenliggende getallen naar even afronden Sort Minus Last Minus laatst sorteren Complex Rectangular Form Complexe rechthoekige vorm Complex Exponential Form Complexe exponentiële vorm Complex Polar Form Complexe polaire vorm Complex Angle/Phasor Notation Complexe hoeknotatie Rational Number Form Vorm van rationale getallen Decimal Fractions Decimale vorm Exact Decimal Fractions Exacte decimale vorm Simple Fractions Onegte breuken Mixed Fractions Gemengde getallen Interval Display Tonen interval Unit Display Tonen eenheid Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Automatisch gebruik van hecto, deca, deci en centi is mogelijk wanneer voorvoegsels zijn toegestaan Enable All SI Prefixes Alle SI-voorvoegsels toestaan Enables automatic setting of prefix for denominator in addition to the numerator Hiermee is het automatisch instellen van een voorvoegsel mogelijk voor de noemer naast dat voor de teller Enable Denominator Prefixes Voorvoegsel voor noemer toestaan Negative Exponents Negatieve exponenten Place Units Separately Eenheden afzonderlijk plaatsen No Additional Conversion Geen extra conversie Convert to Optimal SI Unit Converteren naar meest geschikte SI-eenheid Convert to Mixed Units Converteren naar gemengde eenheden Abbreviate Names Namen afkorten Enabled Objects Ingeschakelde objecten Variables Variabelen Units Eenheden Unknowns Onbekenden Units in Physical Constants Eenheden in natuurkundige constanten If not enabled, treats all variables as unknown Indien niet ingeschakeld worden alle variabelen als onbekenden beschouwd Calculate Variables Variabelen berekenen Disables/enables complex numbers in result Complexe antwoorden wel/niet toestaan Allow Complex Result Complexe antwoorden toestaan Disables/enables infinite numbers in result Oneindige antwoorden wel/niet toestaan Allow Infinite Result Oneindige antwoorden toestaan Approximation Benadering Always Exact Altijd exact Try Exact Exact proberen Approximate Benaderd Interval Calculation Interval berekening Change angle unit used in trigonometric functions Hoekeenheid in goniometrische functies wijzigen Angle Unit Hoekeenheid None Geen Assumptions Aannames Algebraic Mode Algebraïsche modus Assume that unknown denominators are non-zero Onbekende noemers ongelijk aan nul aannemen Non-Zero Denominators Noemers ongelijk aan nul Warn when unknown denominators are assumed non-zero Waarschuwen wanneer onbekende noemers ongelijk nul worden aangenomen Warn About Denominators Assumed Non-Zero Waarschuwen als noemers ongelijk nul worden aangenomen Parsing Mode Interpretatie modus RPN Syntax RPN-notatie Limit Implicit Multiplication Impliciet vermenigvuldigen beperken Read Precision Nauwkeurigheid lezen _Precision _Nauwkeurigheid _Decimals _Decimalen RPN Mode RPN-modus Meta Modes Metamodes Save Mode… Modus opslaan… Delete Mode… Modus wissen… Save Default _Mode Standaard _modus opslaan Fu_nctions F_uncties _Variables _Variabelen _Units _Eenheden _Contents _Inhoud _About _Info over _Keypad Numerie_ke toetse _History Gesc_hiedenis C_onversion C_onversie RPN Stack RPN-stapelgeheugen History Geschiedenis Unit(s) and prefix to convert result to Eenhe(i)d(en) en voorvoegsel waarin antwoord moet worden uitgedrukt Convert Converteren Continuous conversion Continue conversie Add prefix Voeg voorvoegsel toe Conversion Conversie Exact Exact Fraction Breuk Numerical display Tonen getal Number base Grondtal Time format Tijdnotatie Roman Romeins sin sin cos cos tan tan ln ln sqrt sqrt Unknown variable Onbekende variabele Store result as a variable Antwoord opslaan als variabele Convert number bases Getallen converteren naar ander grondtal Manage units Eenheden beheren DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Vorig antwoord EXP EXP Edit Bewerken Delete Wissen Copy Kopiëren _Copy _Kopiëren _Store… _Opslaan… Save Image… Afbeelding opslaan… _Factorize _Ontbinden in factoren _Expand _Uitwerken _Normal _Normaal Sc_ientific Wetenschappel_ijk Purel_y Scientific _Zuiver wetenschappelijk Simp_le Een_voudig _Binary _Binair _Octal _Octaal _Decimal _Decimaal _Hexadecimal _Hexadecimaal Decimal Fraction Decimale vorm Exact Decimal Fraction Exacte decimale vorm Simple Fraction Onegte breuk Mixed Fraction Gemengde getal _Abbreviate Names Namen _afkorten C_onvert… C_onverteren… Convert to Base _Units Converteren naar basis_eenheden Convert _to Optimal Unit Converteren _naar meest geschikte eenheid Use Optimal Prefix Converteren naar meest geschikte voorvoegsel Convert to Converteren naar Convert to UTC Converteren naar UTC Convert to Calendars Converteren naar kalendars Enable All SI Prefi_xes Alle _SI-voorvoegsels toestaan View/Edit Matrix Matrix bekijken/bewerken View/Edit Vector Vector bekijken/bewerken Select Number Base… Selecteer grondtal… Store result Antwoord opslaan Insert the matrix/vector into the expression De geselecteerde matrix/vector in de expressie invoegen Rows Rijen Number of rows in this matrix (rows displayed for vectors) Aantal rijen in deze matrix (vectoren worden als rijen getoond) Columns Kolommen Number of columns in this matrix (columns displayed for vectors) Aantal kolommen in deze matrix (vectoren worden als kolommen getoond) If this is a matrix or vector Indien dit een matrix of vector is Elements Elementen Current element: Huidig element: Edit Matrix Matrix bewerken Do not create/modify this matrix/vector Deze matrix/vector niet aanmaken/wijzigen Create/modify the matrix/vector Aanmaken/wijzigen van de matrix/vector Accept the creation/modification of this matrix/vector Aanmaken/wijzigen van deze matrix/vector accepteren Name used to reference this variable in expressions Naam voor deze variabele in expressies Names Namen Abbreviation Afkorting Unicode Unicode Plural Meervoud Suffix Achtervoegsel Reference Referentie Avoid input Invoer vermijden Case sensitive Hoofdlettergevoelig Number Bases Grondtallen voor talstelsels Roman numerals Romeinse cijfers BIN BIN OCT OCT HEX HEX Subtract Aftrekken Multiply Vermenigvuldigen Divide Delen Clear Leegmaken Value 1 Waarde 1 Value 2 Waarde 2 Plot Plot _Save Opslaan Save as png, svg, postscript, eps, latex or fig Opslaan als png, svg, postscript, eps, latex of fig Vector/matrix Vector/matrix Paired matrix Gepaarde matrix if you want to split matrix in rows instead of columns indien u matrix wilt splitsen in rijen in plaats van kolommen X variable Variabele x The variable name used in expression De naam van de variabele in expressie Style Stijl Line Lijn Points Punten Line with points Lijn met punten Boxes/bars Balken Histogram Histogram Steps Stappen Candlesticks Kaarsdiagrammen Dots Puntjes Smoothing Gladstrijken Monotonic Monotoon Natural cubic splines Natuurlijke kubische splines Bezier Bézier Bezier (monotonic) Bézier (monotoon) Y-axis Y-as: Primary Primair Secondary Secondair _Remove _Wissen Data Gegevens Sampling rate Bemonsteringsfrequentie Step size Stapgrootte Function Range Functiebereik Display grid Rooster tonen Display full border Volledige rand tonen Logarithmic x scale Logaritmische schaal x-as Logarithmic y scale Logaritmische schaal y-as X-axis label Tekst bij de x-as Y-axis label Tekst bij de y-as Color display Kleuren Color Kleur Monochrome Zwartwit Legend placement Plaatsen legenda Top-left Linksboven Top-right Rechtsboven Bottom-left Linksonder Bottom-right Rechtsonder Below Onder Outside Er buiten Appearance Uiterlijk Precision Nauwkeurigheid _Recalculate _Opnieuw berekenen Recalculate expression Expressie opnieuw berekenen The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Het aantal te tonen/berekenen significante cijfers (eenvoudige berekeningen zijn altijd exact) Preferences Voorkeuren Save mode on exit Modus opslaan bij verlaten If the mode of the calculator shall be restored Indien de modus van de rekenmachine moet worden teruggezet Save definitions on exit Definities opslaan bij verlaten If changes to functions, units and variables shall be saved automatically Indien veranderingen in functies, eenheden en variabelen automatisch moeten worden opgeslagen Behavior Gedrag Enable Unicode symbols Unicode toestaan Disable this if you have problems with some fancy characters Dit uitschakelen als er problemen zijn met bijzondere karakters Result Antwoord Mode Modus Default Standaard / / 3 3 Display expression status Expressiestatus tonen If as-you-type expression status shall be displayed below the expression entry Indien status expressie zoals u-die-intypt moet worden getoond onder de invoer van de expressie Look & Feel Uitstraling & gevoel If lower case letters should be used in numbers with non-decimal base Indien kleine letters moeten worden gebruikt in niet-decimale getallen Alternative base prefixes Alternatieve voorvoegsels voor het grondtal If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Of hexadecimale getallen moeten worden getoond met het voorvoegsel "0x0" en binaire getallen net het voorvoegsel "0b00" Spell out logical operators Logische operatoren voluit spellen If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Indien logische and/or moeten worden getoond als "&&"/"||" of als "and"/"or" If "e" shall be used instead of "E" in numbers Indien in getallen "e" moet worden gebruikt in plaats van "E" Use lower case "e" (as in 1e10) Kleine letter "e" gebruiken (Bv. 1e10) Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Toestaan dat punten, '.', worden gebruikt als scheidingsteken voor duizendtallen in plaats van als een alternatief decimaal teken Ignore comma in numbers Komma in getallen negeren Ignore dots in numbers Punten in getallen negeren Multiplication sign Teken voor vermenigvuldigen Division sign Teken voor deling Update exchange rates on start Wisselkoersen ophalen bij opstarten If current exchange rates shall be downloaded from the internet at program start Indien huidige wisselkoersen moeten worden opgehaald van het internet bij het starten van het programma Exchange rates updates Wisselkoersen ophalen Status warning color Kleur waarschuwingstatus Status error color Kleur foutstatus Custom status font Aangepast lettertype voor status If you want to use a font other than the default in the status display below the expression entry Indien u voor het tonen van de status onder de invoer van expressies een ander dan het standaardfont wilt gebruiken Custom expression font Aangepast lettertype voor expressie If you want to use a font other than the default in the expression entry Indien u bij het invoeren van expressies een ander dan het standaardfont wilt gebruiken Custom result font Aangepast lettertype voor antwoord If you want to use a font other than the default in the result display Indien u voor het tonen van het antwoord een ander dan het standaardfont wilt gebruiken Fonts & Colors Lettertypen & kleuren Other: Overig: <b>Result Base</b> <b>Grondtal van antwoord</b> <b>Expression Base</b> <b>Grondtal van expressie</b> Edit Variable Variabele bewerken Accept the creation/modification of this variable Aanmaken/wijzigen van deze variabele accepteren Edit Unit Eenheid bewerken Do not create/modify this unit Deze eenheid niet aanmaken/wijzigen Accept the creation/modification of this unit Aanmaken/wijzigen van deze eenheid accepteren Singular form of this unit's name Enkelvoud voor deze eenheid Title displayed in menus and in unit manager Titel getoond in menu's en in eenheidbeheerder System Systeem Imperial Imperial US Survey US Survey Hide unit Eenheid verbergen If this unit shall be hidden in menus Indien deze eenheid in de menu's verborgen moet zijn Class Klasse Base unit Basiseenheid Named derived unit Benoemde afgeleide eenheid Derived unit Afgeleide eenheid Base unit(s) Basiseenheid(en) Exponent Exponent Exponent of the base unit Exponent van de basiseenheid Relation Relatie Relation is exact Relatie is exact If the relation is precise Indien de relatie precies is Inverse relation Inverse relatie Create a new unit Een nieuwe eenheid aanmaken Edit the selected unit De geselecteerde eenheid bewerken Insert the selected unit into the expression entry De geselecteerde eenheid in de ingevoerde expressie invoegen C_onvert C_onverteren Convert the result to the selected unit Het antwoord converteren naar de geselecteerde eenheid Delete the selected unit De geselecteerde eenheid wissen (De)activate the selected unit De geselecteerde eenheid (de)activeren _Unit _Eenheid Convert between units Converteren tussen eenheden = = Conver_sion Conver_sie Converted value Geconverteerde waarde Value to convert from Waarde die moet worden geconverteerd Edit Unknown Variable Onbekende variabele bewerken Do not create/modify this unknown variable Deze onbekende variabele niet aanmaken/wijzigen Accept the creation/modification of this unknown variable Aanmaken/wijzigen van deze onbekende variabele accepteren Name used to reference this unknown variable in expressions Naam voor deze onbekende variabele in expressies Use custom assumptions Aangepaste aannames gebruiken Type Type Real Number Reëel getal Rational Number Rationaal getal Sign Teken The category this unknown variable belongs to De categorie van deze onbekende variabele Value of this variable (expression) Waarde van deze variabele (expressie) value is exact waarde is exact If the value is precise Indien de waarde precies is The category this variable belongs to De categorie van deze variabele Create a new variable Een nieuwe variabele aanmaken Edit the selected variable De geselecteerde variabele bewerken Insert the selected variable into the expression entry De geselecteerde variabele invoegen in de ingevoerde expressie Delete the selected variable De geselecteerde variabele wissen (De)activate the selected variable De geselecteerde variabele (de)activeren E_xport E_xporteren _Variable _Variabele ans antw Last Answer Laatste antwoord answer antwoord Answer 2 Antwoord 2 Answer 3 Antwoord 3 Answer 4 Antwoord 4 Answer 5 Antwoord 5 Failed to load global definitions! Inlezen van globale definities is mislukt! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Alles Decimal point Decimale komma Raise (Ctrl+*) Machtsverheffen (Ctrl+*) Add Optellen Calculate expression Expressie berekenen Set unknowns Onbekenden een waarde geven Index Index Calculate expression and add to stack Expressie berekenen en aan het stapelregister toevoegen Matrices Matrices Action Actie Raise Machtsverheffen expression expressie Could not display help for Qalculate!. %s Help kan niet worden getoond voor Qalculate!. %s c-format approx. benadering EXACT EXACT APPROX BENADERING RPN RPN ROMAN ROMEINS DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT EENH VAR VAR INF INF CPLX CPLX Too many arguments for %s(). Te veel argumenten voor %s(). c-format argument argument Uncategorized Niet-gecategoriseerd hexadecimal hexadecimaal octal octaal decimal decimaal duodecimal duodecimaal binary binair roman romeins sexagesimal sexagesimaal time tijd bases grondtallen calendars kalenders rectangular rechthoekig cartesian cartesisch exponential exponentiële polar polair angle hoek optimal optimale base basis mixed gemengde fraction breuk factors factoren partial fraction partiële breuken hexadecimal number hexadecimaal getal octal number octaal getal decimal number decimaal getal duodecimal number dodecimaal getal binary number binair getal roman numerals romeinse cijfers sexagesimal number sexagesimaal getal time format tijdnotatie number bases grondtallen optimal unit meest geschikte eenheid base units basiseenheden mixed units gemengde eenheden expanded partial fractions splitsen in partiële breuken complex rectangular form complexe rechthoekige vorm complex exponential form complexe exponentiële vorm complex polar form complexe polaire vorm complex cis form complexe cis-vorm complex angle notation complexe hoeknotatie complex phasor notation complexe hoeknotatie UTC time zone UTC-tijdzone number base %s grondtal %s c-format Inactive Inactief Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Haalt gegevens op van een gegeven object of eigenschap uit de gegevensverzameling %s. Indien als eigenschap "info" wordt ingetypt krijgt u een dialoogvenster te zien waarin alle eigenschappen van het object worden genoemd. c-format Example: bv. Arguments Argumenten optional optional argument optioneel default: argument default, in description standaard: Requirement Vereiste key indicating that the property is a data set key toets Acti_vate Acti_veren a previous result een vorig antwoord matrix matrix vector vector positive positief non-positive niet-positief negative negatief non-negative niet-negatief non-zero ongelijk nul boolean booleaans integer geheel rational rationaal real reëel complex complex number getal (not matrix) (geen matrix) unknown onbekend default assumptions standaard aannames Variable does not exist anymore. Variabele bestaat niet meer. Data Retrieval Function Functie voor ophalen gegevens Convert to unit Converteren naar eenheid Manage variables Variabelen beheren Manage functions Functies beheren Manage data sets Gegevensverzamelingen beheren New variable Nieuwe variabele New function Nieuwe functie Open plot functions/data Functies/gegevens plotten Open convert number bases Getallen converteren naar ander grondtal Open calender conversion Kalenderconversie Open percentage calculation tool Percentage berekenen Open periodic table Periodiek systeem Update exchange rates Wisselkoersen bijwerken Copy result Antwoord kopiëren Save result image Afbeelding van het antwoord opslaan Help Help Quit Afsluiten Prefixes Voorvoegsels No Prefix Geen voorvoegsel Optimal Prefix Meest geschikte voorvoegsel Prefix Voorvoegsel Complex angle/phasor notation Complexe hoeknotatie Number bases Grondtallen Base units Basiseenheden Binary number Binair getal Calendars Kalendars Complex cis form Complexe cis-vorm Decimal number Decimaal getal Duodecimal number Duodecimaal getal Complex exponential form Complexe exponentiële vorm Factors Factoren Hexadecimal number Hexadecimaal getal Mixed units Gemengde eenheden Octal number Octaal getal Optimal units Meest geschikte eenheden Expanded partial fractions Partiële breuken Complex polar form Complexe polaire vorm Complex rectangular form Complexe rechthoekige vorm Sexagesimal number Sexagesimaal getal and and or or undefined ongedefinieerd result is too long see history antwoord te lang zie geschiedenis calculation was aborted berekening werd afgebroken RPN Register Moved RPN-register is verplaatst RPN Operation RPN-bewerking Processing… Verwerken… result processing was aborted berekening werd afgebroken Factorizing… Ontbinden in factoren… Expanding partial fractions… Splitsen in partiële breuken… Expanding… Uitwerken… Calculating… Berekenen… Converting… Converteert… Fetching exchange rates. Wisselkoersen worden opgehaald. C_alculate _Berekenen Argument Argument True Waar False Onwaar Info Info Edit Unit (global) Eenheid bewerken (globaal) New Unit Nieuwe eenheid Empty name field. Geen naam opgegeven. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Er bestaat al een variabele of eenheid met deze naam. Wilt u die overschrijven? Base unit does not exist. Basiseenheid bestaat niet. Edit Function (global) Functie bewerken (globaal) New Function Nieuwe functie Yes Ja No Nee Empty expression field. Expressieveld is leeg. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Er bestaat al een functie met deze naam. Wilt u die overschrijven? Unit does not exist Eenheid bestaat niet Edit Unknown Variable (global) Onbekende variabele bewerken (globaal) New Unknown Variable Nieuwe onbekende variabele An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Edit Variable (global) Variabele bewerken (globaal) New Variable Nieuwe variabele Empty value field. Geen waarde opgegeven. Edit Vector Vector bewerken Edit Vector (global) Vector bewerken (globaal) New Vector Nieuwe vector Edit Matrix (global) Matrix bewerken (globaal) New Matrix Nieuwe matrix Vector Result Vector-antwoord Matrix Result Matrix-antwoord New Data Object Nieuw gegevensobject text tekst approximate benaderd Edit Data Set (global) Gegevensverzameling bewerken (globaal) New Data Set Nieuwe gegevensverzameling info info Property Eigenschap No file name entered. Geen bestandsnaam opgegeven. No delimiter selected. Geen scheidingsteken geselecteerd. Could not import from file %s Kon niet importeren uit bestand %s c-format No variable name entered. Geen naam opgegeven voor variabele. No known variable with entered name found. Geen bekende variabele met opgegeven naam gevonden. Could not export to file %s Kon niet exporteren naar bestand %s c-format My Variables Mijn variabelen Couldn't write definitions Kon definities niet schrijven Preset Voorinstelling Save Mode Modus opslaan Preset mode cannot be overwritten. Vooringestelde modus kan niet worden overschreven. Delete Mode Modus wissen Couldn't write preferences to %s Kon de voorkeurinstellingen niet schrijven naar %s c-format never nooit ask vragen %i day %i dag %i dagen c-format %i days Copied Result was copied Gekopieerd log10 function not found. kon log10-functie niet vinden. Select date Datum selecteren Rectangular form Rechthoekig vorm Exponential form Exponentiële vorm Polar form Polaire vorm Angle/phasor notation Hoeknotatie Optimal unit Meest geschikte eenheid Optimal prefix Meest geschikte voorvoegsel All functions Alle functies All variables Alle variabelen Select file to save PNG image to Bestand voor opslaan PNG-afbeelding selecteren Allowed File Types Toegestane bestandstypes All Files Alle bestanden Cannot delete unit as it is needed by other units. do not delete units that are used by other units Kan eenheid niet wissen omdat die nodig is voor andere eenheden. none geen result is too long antwoord te lang translator-credits Rinse de Vries <RinseDeVries@home.nl> Jaap Woldringh <jjh.woldringh@planet.nl> Elements (in horizontal order) Elementen (horizontale volgorde) Select file to import Te importeren bestand selecteren Select file to export to Bestand waarnaar moet worden geëxporteerd selecteren A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Er is een conflicterend object met dezelfde naam. Indien u verder gaat en veranderingen opslaat wordt dit conflicterend object overschreven of inactief gemaakt. Wilt u verdergaan? Select file to export Te exporteren bestand selecteren Empty expression. Expressie niet gegeven. Empty x variable. Variabele x niet gegeven. Classification Indeling Alkali Metal Alkalisch metaal Alkaline-Earth Metal Alkalisch aardmetaal Lanthanide Lanthanide Actinide Actinide Transition Metal Overgangsmetaal Metal Metaal Metalloid Metalloïde (halfmetaal) Polyatomic Non-Metal Polyatomisch niet-metaal Diatomic Non-Metal Diatomisch niet-metaal Noble Gas Edelgas No unknowns in result. Geen onbekenden in antwoord. Set Unknowns Onbekenden een waarde geven Copy result to clipboard Antwoord kopiëren x x If a matrix or vectors shall be generated from the contents of the file Of een matrix of vectoren moeten worden aangemaakt van de inhoud van het bestand Add Keypad Optellen 1 1 Base Unit Basiseenheid Alias Alias Composite Unit Samengestelde eenheid Fonts Lettertypen Chain Calculation Interval berekening <b>Name</b> <b>Naam</b> <b>Type</b> <b>Type</b> <b>Relation</b> <b>Relatie</b> Never nooit %i seconds %i seconden c-format Ent Ent Defaults Standaard Customize Buttons Aangepast lettertype voor status Names details Namen details approx benadering Rational number form Rationale getalform Decimal fractions Decimale vorm Exact decimal fractions Exacte decimale vorm Simple fractions Onegte breuken Mixed fractions Gemengde getallen settitle Titel 0 0 10 10 7 7 General Keypad Algemeen 2 2 float16 binary number binair getal float32 binary number binair getal float64 binary number binair getal float128 binary number binair getal Clear the RPN stack (Ctrl+Shift+Delete) Het RPN-stapelgeheugen (stack) wissen Open plot dialog Dit dialoog sluiten ∠ (angle) ∠ (hoek) Copy Value Text Waardetype number base %li grondtal %li Base Units Basiseenheden 10^x (Ctrl+Shift+E) 10^x (Ctrl+Shift+E) <i>e</i> <i>f(x)</i> x<sup>2</sup> x<sup>2</sup> 1/2 2 x<sup>3</sup> x<sup>y</sup> 1/3 1 x<sup>4</sup> x<sup>y</sup> 1/4 1 x<sup>5</sup> x<sup>y</sup> 1/5 1 x<sup>6</sup> x<sup>y</sup> 1/6 1 x<sup>7</sup> x<sup>y</sup> 1/7 1 x<sup>8</sup> x<sup>y</sup> 1/8 1 x<sup>9</sup> x<sup>y</sup> Insert Date... Invoegen Percent Procent Simplify Vereenvoudigen _Simplify _Vereenvoudigen Simplifying… Vereenvoudigen… Sine Sinus Cosine Cosinus Tangent Tangens Natural logarithm Natuurlijke logaritme Summation function Sommatie functie Factorial Faculteit Archimedes' constant Archimede's constante 4 4 5 5 6 6 8 8 9 9 11 1 * * ** * Forms of Fractions F_ractionele breuk Form of Fractions F_ractionele breuk Fractional Display Tonen breuk Decimal (Try Exact) Decimaal (Exact proberen) Combined Gecombineerd Fractional display Tonen breuk Exact rationals Exacte rationale getallen Fraction D_ecimal D_ecimale breuk Fraction Decimal (Try Exact) Decimale breuk (Exact proberen) Fraction Co_mbined Breuk geco_mbineerd Utilities Hulpmiddelen Always exact Altijd exact Try exact Exact proberen Relation to the base unit (usually just a number) Relatie tot de basiseenheid (gewoonlijk een getal) You probably do not need to define this U hoeft dit waarschijnlijk niet te definiëren _Execute _Uitvoeren Unit to convert to Eenheid waarnaar moet worden geconverteerd Indicate Infinite Series Oneindige reeksen aangeven RPN Stack Only RPN-stapelgeheugen Use only keypad keys for RPN operations (+-*/^) and use the rest of the keyboard for expression entry Voor RPN-bewerkingen alleen het numerieke deel van het toetsenbord gebruiken, en het hele toetsenbord voor het invoeren van expressies Complex Number Complex getal + + - - . . No default angle unit Een nieuwe eenheid aanmaken Create new function Maak een nieuwe functie aan Use default assumptions standaard aannames <b>7</b> <b>Naam</b> <b>8</b> <b>Naam</b> <b>9</b> <b>Naam</b> <b>4</b> <b>Naam</b> <b>5</b> <b>Naam</b> <b>6</b> <b>Naam</b> <b>*</b> <b>Naam</b> <b>/</b> <b>Naam</b> <b>1</b> <b>Naam</b> <b>2</b> <b>Naam</b> <b>3</b> <b>Naam</b> <b>+</b> <b>Naam</b> <b>-</b> <b>Naam</b> <b>0</b> <b>Naam</b> <b>.</b> <b>Naam</b> <b>=</b> <b>Naam</b> <i>x<sup>y</sup></i> x<sup>y</sup> <i>x</i> <i>f(x)</i> <i>y</i> <i>f(x)</i> <i>z</i> <i>f(x)</i> <i>x</i>! <i>f(x)</i> <i>f(x)</i> <i>f(x)</i> Toggle fractional number display Tonen van breuken aan/uit Raise by two Tot de tweede macht Base-10 logarithm Logaritme met grondtal 10 log log Toggle hyperbolic functions Hyperbolische functies aan/uit hyp hyp Toggle inverse functions Inverse functies aan/uit inv inv Deg Deg Rad Rad Gra Gra Wget arguments Argumenten voor wget Arguments (in addition to timeout and output file) passed to wget when fetching exchange rates Argumenten (naast tijdlimiet en uitvoerbestand) doorgegeven aan wget wanneer wisselkoersen worden opgehaald You need to download exchange rates to be able to convert between different currencies. You can later get current exchange rates by selecting “Update Exchange Rates” under the File menu. Do you want to fetch exchange rates now from the Internet? U moet de wisselkoersen ophalen om van de ene naar de andere munteenheid te kunnen converteren. U kunt de huidige wisselkoersen ophalen door "Wisselkoersen ophalen" te selecteren in het menu Bestand. Wilt u de wisselkoersen nu ophalen van het internet? Could not display help. %s Help kan niet worden getoond. %s (De)activate use of Reverse Polish Notation syntax in expressions Gebruik van expressies in RPN (omgekeerde Poolse notatie) (de)activeren (De)activate the Reverse Polish Notation mode De RPN-modus (omgekeerde Poolse notatie) (de)activeren x! x! Edit value of selected register Inhoud van het geselecteerde register bewerken _Clear _Leegmaken Enables separate placement of units Afzonderlijk plaatsen van eenheden wordt toegestaan (De)activate limits to implicit multiplication Beperkingen (de)activeren voor impliciete vermenigvuldiging Convert result to entered unit expression Antwoord converteren naar ingevoerde expressie voor eenheid Do the conversion and close this window De conversie doorvoeren en dit venster sluiten _Selector _Keuze <span size="small"> </span> <span size="small"> </span> <span size="small">STATUS</span> <span size="small">STATUS</span> SI SI CGS CGS Temporary Tijdelijk Import CSV File... CSV-bestand importeren... Export CSV File... CSV-bestand exporteren... Set Unknowns... Onbekenden een waarde geven... Other... Overig... Save Mode... Modus opslaan... Delete Mode... Modus wissen... C_onvert... C_onverteren... <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- the queer calculator</span> <i>http://qalculate.sourceforge.net/</i> <i>License:</i> GNU General Public Licence <i>Author:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- de "queer" rekenmachine</span> <i>http://qalculate.sourceforge.net/</i> <i>Licentie:</i> GNU General Public Licence <i>Auteur:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson About Qalculate! Over Qalculate! Category that the generated variable(s) shall belong to Categorie voor de nieuwe varabele(n) Argument type Type van argument Modify selected subfunction Geselecteerde subfunctie wijzigen The category this function belongs to De categorie waartoe deze functie behoort a function, unit or variable een functie, eenheid of variabele Abort operation Bewerking afbreken Ans Antw Binary Octal Decimal Hexadecimal Sexagesimal Time format Roman Other... Binair Octaal Decimaal Hexadecimaal Sexagesimaal Tijdnotatie Romeins Overig... Enable Prefixes Voorvoegsels toestaan Enable _Prefixes _Voorvoegsels toestaan Normal Engineering Scientific Pure Simple Normaal Wetenschappelijk Technisch Zuiver Eenvoudig Progress... Voortgang... Category that this variable belongs to Categorie waartoe deze variabele behoort Font Lettertype Select custom font Aangepast lettertype selecteren The category this unit belongs to De categorie van deze eenheid C_onvert Result Antwoord c_onverteren Select status font Lettertype voor status selecteren Halogen Halogeen Transactinide Transactinide ArgumentEditDialog Name: Naam: Type: Type: Free Vrij Number Getal Integer Geheel Symbol Symbool Text Tekst Date Datum Vector Vector Matrix Matrix Boolean Booleaans Angle Hoek Object Object Function Functie Unit Eenheid Variable Variabele File Bestand Enable rules and type test Test voor regels en type toestaan Custom condition: Aangepaste conditie: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Vb. indien het argument een matrix is die evenveel rijen als kolommen moet hebben: rijen(\x) = kolommen(\x) Allow matrix Matrix toestaan Forbid zero Nul niet toestaan Handle vector Calculate function for each separate element in vector. Min Min Include equals Ook is gelijk aan Max Max CSVDialog Import CSV File CSV-bestand importeren Export CSV File CSV-bestand exporteren Current result Huidig antwoord Matrix/vector variable: Matrix/vector-variabele: File: Bestand: Import as Importeren als matrix matrix vectors vectoren Name: Naam: First row: Eerste rij: Includes headings Koppen inbegrepen Delimiter: Scheidingsteken: Comma Komma Tabulator Tabtoets Semicolon Puntkomma Space Spatie Other Overig Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Error Fout Could not import from file %1 Kon niet importeren uit bestand %1 No matrix or vector variable with the entered name was found. Geen matrix of vectorvariabele met opgegeven naam gevonden. Could not export to file %1 Kon niet exporteren naar bestand %1 CalendarConversionDialog Calendar Conversion Kalenderconversie Gregorian Hebrew Islamic (Hijri) Persian (Solar Hijri) Indian (National) Chinese Julian Revised Julian (Milanković) Coptic Ethiopian Error Fout The selected Chinese year does not exist. Conversion to Gregorian calendar failed. Calendar conversion failed for: %1. DataObjectEditDialog %1: %1: Default Standaard Approximate Benaderd Exact Exact Edit Data Object Gegevensobject bewerken New Data Object Nieuw gegevensobject DataPropertyEditDialog Name: Naam: Title: Titel: Descriptive name: Beschrijvende naam: Description: Beschrijving: Value type: Waardetype: Expression Expressie Number Getal Text Tekst Unit expression: Eenheidexpressie: Use as key Gebruiken als sleutelwaarde Case sensitive value Hoofdlettergevoelige waarde Approximate value Benaderde waarde Value uses brackets Waarde met vierkante haakjes Hide Verbergen Edit Data Property Gegevenseigenschap bewerken DataSetEditDialog General Algemeen Properties Eigenschappen Function Functie Title: Titel: Descriptive name: Beschrijvende naam: Data file: Gegevensbestand: Description: Beschrijving: Copyright: Copyright: Title Titel Name Naam Type Type Add Toevoegen Edit Bewerken Remove Wissen Name: Naam: Object argument name: Naam objectargument: Property argument name: Naam eigenschapsargument: Default property: Standaardeigenschap: text tekst approximate benaderd number getal expression expressie key sleutel Question Vraag A function with the same name already exists. Do you want to overwrite the function? Er bestaat al een functie met deze naam. Wilt u die overschrijven? Data Sets Gegevensverzamelingen Object Object Property Eigenschap Edit Data Set Gegevensverzameling bewerken New Data Set Nieuwe gegevensverzameling DataSetsDialog Data Sets Gegevensverzamelingen Data sets: Gegevensverzamelingen: New… Nieuw… Edit… Bewerken… Delete Wissen Objects: Objecten: Data set description: Beschrijving gegevensverzameling: Object attributes: Objectattributen: Properties Eigenschappen key sleutel Data Retrieval Function Functie voor ophalen gegevens argument argument ExpressionEdit matrix matrix vector vector positive positief non-positive niet-positief negative negatief non-negative niet-negatief non-zero ongelijk nul boolean booleaans integer geheel rational rationaal real reëel complex complex number getal (not matrix) (geen matrix) unknown onbekend default assumptions standaard aannames Prefix: voorvoegsel: Complex Angle/Phasor Notation Complexe hoeknotatie Base units Basiseenheden Number Base Grondtal talstelsel Binary-Coded Decimal BCD-code Bijective Base-26 Binary Number Binair getal Calendars Kalendars Complex cis Form Complexe cis-vorm Decimal Number Decimaal getal Duodecimal Number Duodecimaal getal Complex Exponential Form Complexe exponentiële vorm Factors Factoren 16-bit Floating Point Binary Format 32-bit Floating Point Binary Format 64-bit Floating Point Binary Format 80-bit (x86) Floating Point Binary Format 128-bit Floating Point Binary Format Fraction Breuk Decimal Fraction Decimale vorm Hexadecimal Number Hexadecimaal getal Latitude Breedtegraad Longitude Lengtegraad Mixed Units Gemengde eenheden Octal Number Octaal getal Optimal Unit Meest geschikte eenheid Optimal Prefix Meest geschikte voorvoegsel Expanded Partial Fractions Partiële breuken Complex Polar Form Complexe polaire vorm Complex Rectangular Form Complexe rechthoekige vorm Roman Numerals Romeinse cijfers Sexagesimal Number Sexagesimaal getal Time Format Tijdnotatie Unicode Unicode UTC Time Zone UTC-tijdzone Undo Ongedaan maken Redo Opnieuw doen Cut Knippen Copy Kopiëren Paste Plakken Delete Wissen Calculate Selection Selectie bereken Insert Date… Datum invoegen… Insert Matrix… Matrix invoegen… Select All Alles selecteren Clear Leegmaken Clear History Completion No completion Limited strict completion Strict completion Limited full completion Full completion Delayed completion Expression Status Expressiestatus Off Uit In history list In expression field With delay Met vertraging Without delay Zonder vertraging Automatically calculate selection Use input method Invoermethode gebruiken Matrix Matrix Too many arguments for %1(). Te veel argumenten voor %1(). argument argument %1: %1: comment opmerking MC (memory clear) MS (memory store) M+ (memory plus) M− (memory minus) factorize expand hexadecimal hexadecimaal hexadecimal number hexadecimaal getal octal octaal octal number octaal getal decimal decimaal decimal number decimaal getal duodecimal duodecimaal duodecimal number dodecimaal getal binary binair binary number binair getal roman romeins roman numerals romeinse cijfers bijective bijective base-26 binary-coded decimal BCD-code sexagesimal sexagesimaal sexagesimal number sexagesimaal getal latitude breedtegraad longitude langtegraad 32-bit floating point 64-bit floating point 16-bit floating point 80-bit (x86) floating point 128-bit floating point time tijd time format tijdnotatie bases grondtallen number bases grondtallen calendars kalenders optimal optimale optimal unit meest geschikte eenheid prefix voorvoegsel optimal prefix base basis base units basiseenheden mixed gemengde mixed units gemengde eenheden decimals decimal fraction fraction breuk factors factoren partial fraction partiële breuken expanded partial fractions splitsen in partiële breuken rectangular rechthoekig cartesian cartesisch complex rectangular form complexe rechthoekige vorm exponential exponentiële complex exponential form complexe exponentiële vorm polar polair complex polar form complexe polaire vorm complex cis form complexe cis-vorm angle hoek complex angle notation complexe hoeknotatie phasor complex phasor notation complexe hoeknotatie UTC time zone UTC-tijdzone number base %1 grondtal %1 Data object Gegevensobject FPConversionDialog Floating Point Conversion (IEEE 754) Format 16-bit (half precision) 32-bit (single precision) 64-bit (double precision) 80-bit (x86 extended format) 128-bit (quadruple precision) Microchip 24-bit Microchip 32-bit Value Waarde Decimal value Decimale waarde Binary representation Hexadecimal representation Floating point value Conversion error FunctionEditDialog Required Vereist Details Details Description Beschrijving Name: Naam: Expression: Expressie: Argument references: Verwijzingen naar argumenten: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y en z (bijv. "(x+y)/2"), of \x, \y, \z, \a, \b, … (bijv. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Gebruik x, y en z (bv. "(x+y)/2"), of \x, \y, \z, \a, \b, … (bv. "(\x+\y)/2") Category: Categorie: Descriptive name: Beschrijvende naam: Hide function Functie verbergen Example: Description: Beschrijving: Condition: Conditie: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Conditie die waar moet zijn voor de functie (bv. indien het tweede argument groter moet zijn dan het eerste: "\y > \x") Sub-functions: Subfuncties: Expression Expressie Precalculate Voorberekenen Reference Referentie Add Toevoegen Edit Bewerken Remove Wissen Arguments: Argumenten: Name Naam Type Type Question Vraag A function with the same name already exists. Do you want to overwrite the function? Er bestaat al een functie met deze naam. Wilt u die overschrijven? Edit Function Functie bewerken New Function Nieuwe functie FunctionsDialog Functions Functies Category Categorie Function Functie New… Nieuw… Edit… Bewerken… Deactivate Uitschakelen Delete Wissen Calculate… Berekenen… Apply Toepassen Insert Invoegen Favorite Favoriet argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Haalt gegevens op van een gegeven object of eigenschap uit de gegevensverzameling %1. Indien als eigenschap "info" wordt ingetypt krijgt u een dialoogvenster te zien waarin alle eigenschappen van het object worden genoemd. Example: Voorbeeld: Arguments Argumenten optional optional argument optioneel default: argument default standaard: Requirement: Required condition for function Vereiste: Properties Eigenschappen %1: %1: key indicating that the property is a data set key sleutel Activate Activeren All All functions Alles Uncategorized Niet-gecategoriseerd User functions Gebruikersfuncties Favorites Favorieten Inactive Inactief HistoryView Insert Value Insert Text Copy Kopiëren Copy Formatted Text Opgemaakte tekst kopiëren Copy unformatted ASCII Niet-opgemaakte ASCII kopiëren Select All Alles selecteren Search… Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Exchange rate source(s): updated %1 Comment Opmerking Protect Add Comment… Voeg opmerking toe… Move to Top Remove Wissen Clear Leegmaken Edit Comment… Opmerking bewerken… Text: Tekst: Search KeypadButton <i>Right-click/long press</i>: %1 <i>Right-click</i>: %1 <i>Long press</i>: %1 Open menu Menu openen <i>Middle-click</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. Store Opslaan New function Nieuwe functie sin sin cos cos tan tan Exponentiation Percent or remainder Uncertainty/interval Relative error Interval Move cursor left Move cursor to start Move cursor right Move cursor to end Logical AND Logical OR Bitwise Exclusive OR Logical NOT Bitwise Left Shift Bitwise Right Shift cmp rot a→1 Expand partial fractions Enable units in physical constants Eenheden in natuurkundige constanten All constants Alle constanten Percentage Calculation Tool Percentage berekenen more All units Alle eenheden All variables Alle variabelen Action Actie Interval Display Tonen interval Adaptive Significant digits Plus/minus Relative Concise Interval Calculation Interval berekening Variance formula Interval arithmetic Allow concise uncertainty input Complex number form Complexe form Rectangular Exponential Polar Angle/phasor Type Assumptions type Type Sign Assumptions sign Teken Default assumptions Standaard aannames Number Getal Real Reëel Rational Rationaal Integer Geheel Boolean Booleaans Unknown Unknown assumptions sign Onbekende Non-zero Ongelijk aan nul Positive Positief Non-negative Niet-negatief Negative Negatief Non-positive Niet-positief Factorize Ontbinden in factoren Expand Uitwerken Add column Add row Remove column Remove row Left parenthesis Left vector bracket Right parenthesis Right vector bracket Smart parentheses Vector brackets Argument separator Blank space New line Decimal point Decimale komma Previous result (static) Multiplication Button Action Label: Action: Actie: None Geen Value: Bitwise AND Bitwise Shift Delete Wissen Backspace Addition Plus Subtraction Minus Division Bitwise OR Bitwise NOT Clear expression Calculate expression Expressie berekenen NamesEditDialog Name Naam Abbreviation Afkorting Plural Meervoud Reference Referentie Avoid input Invoer vermijden Unicode Unicode Suffix Achtervoegsel Case sensitive Hoofdlettergevoelig Completion only Add Edit Bewerken Remove Wissen Warning Illegal name Ongeldige naam A function with the same name already exists. Er bestaat al een functie met deze naam. A unit or variable with the same name already exists. Er bestaat al een eenheid of variabele met deze naam. PercentageCalculationDialog Percentage Value 1 Waarde 1 Value 2 Waarde 2 Change from 1 to 2 Change from 2 to 1 2 compared to 1 1 compared to 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Clear Leegmaken PeriodicTableDialog Periodic Table Periodiek systeem Element Data Alkali Metal Alkalisch metaal Alkaline-Earth Metal Alkalisch aardmetaal Lanthanide Lanthanide Actinide Actinide Transition Metal Overgangsmetaal Metal Metaal Metalloid Metalloïde (halfmetaal) Polyatomic Non-Metal Polyatomisch niet-metaal Diatomic Non-Metal Diatomisch niet-metaal Noble Gas Edelgas Unknown chemical properties Unknown Onbekende %1: %1: PlotDialog Plot Plot Data Gegevens Title: Titel: Expression: Expressie: Function Functie Vector/matrix Vector/matrix Paired matrix Gepaarde matrix Rows Rijen X variable: Variabele x: Style: Stijl: Line Lijn Points Punten Line with points Lijn met punten Boxes/bars Balken Histogram Histogram Steps Stappen Candlesticks Kaarsdiagrammen Dots Puntjes Polar Smoothing: Gladstrijken: None Geen Monotonic Monotoon Natural cubic splines Natuurlijke kubische splines Bezier Bézier Bezier (monotonic) Bézier (monotoon) Y-axis: Y-as: Primary Primair Secondary Secondair Add Toevoegen Apply Toepassen Remove Wissen Title Titel Expression Expressie Function Range Functiebereik Minimum x value: Maximum x value: Sampling rate: Bemonsteringsfrequentie: Step size: Stapgrootte: Show real and imaginary parts Appearance Uiterlijk Display grid Rooster tonen Display full border Volledige rand tonen Minimum y value: Maximum y value: Logarithmic x scale: Logaritmische schaal x-as: Logarithmic y scale: Logaritmische schaal y-as: X-axis label: Tekst bij de x-as: Y-axis label: Tekst bij de y-as: Line width: Legend placement: Plaatsen legenda: Top-left Linksboven Top-right Rechtsboven Bottom-left Linksonder Bottom-right Rechtsonder Below Onder Outside Er buiten Calculating… Berekenen… Cancel Annuleren Processing… Verwerken… PreferencesDialog Look && Feel Numbers && Operators Units && Currencies Parsing && Calculation Ignore system language (requires restart) Allow multiple instances Clear history on exit Close application with Escape key Keep above other windows Window title: Application name Result Antwoord Application name + result Style: Stijl: Default (requires restart) Default style Dark mode Colorize result Custom result font Aangepast lettertype voor antwoord Custom expression font Aangepast lettertype voor expressie Preferences Voorkeuren Workspace Application name + workspace Custom result font: Custom expression font: Custom keypad font: Custom application font: Display expression status Expressiestatus tonen ms milliseconds ms Expression after calculation: Keep expression Clear expression Replace with result Replace with result if shorter Use keyboard keys for RPN Language: Taal: Max history lines saved: Use caret for bitwise XOR Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Expression status: Expressiestatus: Off Uit In history list In expression field Status tooltip delay: Automatically calculate selection Expression in history: Parsed Entered Entered + parsed Automatically copy result Parsing mode: Adaptive Conventional Implicit multiplication first Chain RPN RPN Simplified percentage calculation Read precision Allow concise uncertainty input Limit implicit multiplication Interpret unrecognized symbols as variables Interval calculation: Variance formula Interval arithmetic Factorize result Use lower case letters in non-decimal numbers Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Spell out logical operators Logische operatoren voluit spellen Use E-notation instead of 10^n Use 'j' as imaginary unit Use comma as decimal separator Ignore comma in numbers Komma in getallen negeren Ignore dots in numbers Punten in getallen negeren Indicate repeating decimals Copy unformatted ASCII by default Digit grouping: None Geen Standard Local Automatically group digits in input (experimental) Interval display: Significant digits Interval Plus/minus Concise Midpoint Lower Upper Rounding: Round halfway numbers away from zero Round halfway numbers to even Complex number form: Rectangular Exponential Polar Angle/phasor Enable units Abbreviate names Use binary prefixes for information units Automatic unit conversion: No conversion Base units Basiseenheden Optimal units Meest geschikte eenheden Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Restart required Please restart the program for the language change to take effect. Default Standaard Calculate as you type delay: Two's complement output: Two's complement input: Binary Binair Hexadecimal Hexadecimaal Binary bits: Automatic Automatisch Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Enable units in physical constants Eenheden in natuurkundige constanten Temperature calculation: Absolute Relative Hybrid Exchange rates updates: %n day(s) %n dag %n dagen days dag dagen QApplication Execute expressions and commands from a file FILE Start a new instance of the application Specify the window title TITLE Display the application version Open workspace Expression to calculate [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Allow multiple instances? %1 is already running. Failed to load global definitions! Inlezen van globale definities is mislukt! answer antwoord History Answer Value History Index(es) History index %s does not exist. Last Answer Laatste antwoord Answer 2 Antwoord 2 Answer 3 Antwoord 3 Answer 4 Antwoord 4 Answer 5 Antwoord 5 Memory Error Fout Couldn't write preferences to %1 Kon de voorkeurinstellingen niet schrijven naar %1 Function not found. Variable not found. Unit not found. Unsupported base. Unsupported value. QalculateQtSettings Update exchange rates? Wisselkoersen bijwerken? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Fetching exchange rates. Wisselkoersen worden opgehaald. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Error Fout Warning Information Path of executable not found. curl not found. Failed to run update script. %1 Failed to check for updates. No updates found. A new version of %1 is available at %2. Do you wish to update to version %3? A new version of %1 is available. You can get version %3 at %2. Download %1: %2 Insert function Insert function (dialog) Insert variable Approximate result Negate Invert Insert unit Insert text Insert operator Insert date Insert matrix Insert smart parentheses Convert to unit Converteren naar eenheid Convert Converteren Convert to optimal unit Convert to base units Convert to optimal prefix Convert to number base Factorize result Expand result Expand partial fractions RPN: down RPN: up RPN: swap RPN: copy RPN: lastx RPN: delete register RPN: clear stack Set expression base Set result base Set angle unit to degrees Set angle unit to radians Set angle unit to gradians Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Show general keypad Toggle programming keypad Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Clear history Show variables Show functions Show units Show data sets Store result Antwoord opslaan MC (memory clear) MR (memory recall) MS (memory store) M+ (memory plus) M− (memory minus) New variable Nieuwe variabele New function Nieuwe functie Open plot functions/data Functies/gegevens plotten Open convert number bases Getallen converteren naar ander grondtal Open floating point conversion Open calender conversion Kalenderconversie Open percentage calculation tool Percentage berekenen Open periodic table Periodiek systeem Update exchange rates Wisselkoersen bijwerken Copy result Antwoord kopiëren Insert result Open mode menu Open menu Menu openen Help Help Quit Afsluiten Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Delete Wissen Backspace Home End Right Left Up Down Undo Ongedaan maken Redo Opnieuw doen Calculate expression Expressie berekenen Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Standaard Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Annuleren Close Only used when Qt translation is missing Sluiten &Yes Only used when Qt translation is missing &Ja &No Only used when Qt translation is missing &Nee &Open Only used when Qt translation is missing &Openen &Save Only used when Qt translation is missing Op&slaan &Select All Only used when Qt translation is missing &Alles selecteren Look in: Only used when Qt translation is missing Kijk in: File &name: Only used when Qt translation is missing Bestands&naam: Files of type: Only used when Qt translation is missing Bestanden van type: QalculateWindow Menu Menu Menu (%1) Menu (%1) New Nieuw Function… Functie… Variable/Constant… Variabel/constant… Unknown Variable… Onbekende variabele… Matrix… Matrix… Workspaces Werkruimten Open… Open default Standaard openen Save Opslaan Save As… Opslaan als… Import CSV File… CSV-bestand importeren… Export CSV File… CSV-bestand exporteren… Functions Functies Variables and Constants Variabelen en constanten Units Eenheden Plot Functions/Data Functies/gegevens plotten Floating Point Conversion (IEEE 754) Calendar Conversion Kalenderconversie Update Exchange Rates Wisselkoersen bijwerken Normal Mode Normale modus RPN Mode RPN-modus Chain Mode Keyboard Shortcuts Preferences Voorkeuren Help Help Report a Bug Check for Updates About %1 Over %1 Quit Afsluiten Mode Modus Mode (%1) Modus (%1) General Display Mode Algemene weergavemodus Normal Normaal Scientific Wetenschappelijk Engineering Technisch Simple Eenvoudig Angle Unit Hoekeenheid Radians Radialen Degrees Booggraden Gradians Decimale graden Approximation Benadering Automatic Automatic approximation Automatisch Dual Dual approximation Dubbel Exact Exact approximation Exact Approximate Benaderd Assumptions Aannames Type Assumptions type Type Number Getal Real Reëel Rational Rationaal Integer Geheel Boolean Booleaans Sign Assumptions sign Teken Unknown Unknown assumptions sign Onbekende Non-zero Ongelijk aan nul Positive Positief Non-negative Niet-negatief Negative Negatief Non-positive Niet-positief Result Base Grondtal voor antwoord Binary Binair Octal Octaal Decimal Decimaal Hexadecimal Hexadecimaal Other Overig Duodecimal Duodecimaal Sexagesimal Sexagesimaal Time format Tijdnotatie Roman numerals Romeinse cijfers Unicode Unicode Bijective base-26 Binary-encoded decimal (BCD) BCD-Code Custom: Number base Expression Base Grondtal voor expressie Other: Number base Overig: Precision: Nauwkeurigheid: Min decimals: Min decimalen: Max decimals: Max decimalen: off Max decimals Convert Converteren Convert (%1) Converteren (%1) Store Opslaan Store (%1) Opslaan (%1) Functions (%1) Functies (%1) Keypad Numerieke toetse Keypad (%1) Numerieke toetse (%1) Number bases Grondtallen Unit… Eenheid… Data Sets Gegevensverzamelingen Percentage Calculation Tool Percentage berekenen Periodic Table Periodiek systeem Units (%1) Eenheden (%1) Plot Functions/Data (%1) Functies/gegevens plotten (%1) Number Bases (%1) Grondtallen (%1) Binary: Binair: Octal: Octaal: Decimal: Decimaal: Hexadecimal: Hexadecimaal: RPN Stack RPN-stapelgeheugen Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 Open menu Menu openen New Function… Nieuwe functie… Favorites Favorieten Recent User functions Gebruikersfuncties Open dialog Show all functions User units Gebruikerseenheden more Prefixes Voorvoegsels Show all units User variables Gebruikersvariabelen Show all variables Powerful and easy to use calculator Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden License: GNU General Public License version 2 or later Error Fout Couldn't write definitions Kon definities niet schrijven hexadecimal hexadecimaal octal octaal decimal decimaal duodecimal duodecimaal binary binair roman romeins bijective sexagesimal sexagesimaal latitude breedtegraad longitude lengtegraad time tijd Time zone parsing failed. bases grondtallen calendars kalenders rectangular rechthoekig cartesian cartesisch exponential exponentiële polar polair phasor angle hoek optimal optimale base basis mixed gemengde fraction breuk factors factoren Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad Copy Kopiëren prefix voorvoegsel partial fraction partiële breuken decimals factorize expand Calculating… Berekenen… Cancel Annuleren RPN Operation RPN-bewerking Factorizing… Ontbinden in factoren… Expanding partial fractions… Splitsen in partiële breuken… Expanding… Uitwerken… Converting… Converteert… RPN Register Moved RPN-register is verplaatst Processing… Verwerken… Matrix Matrix Temperature Calculation Mode The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Absolute Relative Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Only dot as decimal separator Parsing Mode Interpretatie modus The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first Conventional Adaptive Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Actie toevoegen (%1) Edit Keyboard Shortcut New Keyboard Shortcut Action: Actie: Value: Set key combination Press the key combination you wish to use for the action. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? Question Vraag Add… Toevoegen… Edit… Bewerken… Remove Wissen Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. Example: Example of function usage Voorbeeld: Enter RPN Enter Calculate Berekenen Apply to Stack Insert Invoegen Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Keep open Value Waarde Argument Argument %1: %1: Plot Plot General Algemeen Programming Algebra Custom None Geen Separate Menu Buttons Reset Keypad Position Number Bases Grondtallen voor talstelsels Rotate the stack or move the selected register up Rotate the stack or move the selected register down Swap the top two values or move the selected value to the top of the stack Delete the top or selected value Enter the top value from before the last numeric operation Copy the selected or top value to the top of the stack Clear the RPN stack Action Actie Key combination True Waar False Onwaar Info Info optional optional argument optioneel Failed to open %1. %2 UnitEditDialog General Algemeen Relation Relatie Name: Naam: Category: Categorie: Descriptive name: Beschrijvende naam: System: Systeem: Imperial Imperial US Survey US Survey Hide unit Eenheid verbergen Description: Beschrijving: Class: Klasse: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Base unit Basiseenheid Named derived unit Benoemde afgeleide eenheid Derived unit Afgeleide eenheid Base unit(s): Basiseenheid(en): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Exponent: Exponent: Relation: Relatie: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Inverse relation: Inverse relatie: Specify for non-linear relation, for conversion back to the base unit. Mix with base unit Priority: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Error Fout Base unit does not exist. Basiseenheid bestaat niet. Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? A variable or unit with the same name already exists. Do you want to overwrite it? Er bestaat al een variabele of eenheid met deze naam. Wilt u die overschrijven? Edit Unit Eenheid bewerken New Unit Nieuwe eenheid UnitsDialog Units Eenheden Category Categorie Unit Eenheid New… Nieuw… Edit… Bewerken… Deactivate Uitschakelen Delete Wissen Convert Converteren Insert Invoegen Favorite Favoriet Show hidden units Toon verborgen eenheden Activate Activeren All All units Alles Uncategorized Niet-gecategoriseerd User units Gebruikerseenheden Favorites Favorieten Inactive Inactief UnknownEditDialog Name: Naam: Custom assumptions Aangepaste aannames Type: Type: Sign: Teken: Temporary Tijdelijk Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Edit Unknown Variable Onbekende variabele bewerken New Unknown Variable Nieuwe onbekende variabele VariableEditDialog Name: Naam: Temporary Tijdelijk Value: Required Vereist Description Beschrijving current result huidig antwoord Category: Categorie: Descriptive name: Beschrijvende naam: Hide variable Variabele verbergen Description: Beschrijving: Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Edit Variable Variabele bewerken New Variable Nieuwe variabele VariablesDialog Variables Variabelen Category Categorie Variable Variabele New Nieuw Variable/Constant… Variabel/constant… Unknown Variable… Onbekende variabele… Matrix… Matrix… Edit… Bewerken… Export… Exporteren… Deactivate Uitschakelen Delete Wissen Insert Invoegen Favorite Favoriet a matrix een matrix a vector een vector positive positief non-positive niet-positief negative negatief non-negative niet-negatief non-zero ongelijk nul integer geheel boolean booleaans rational rationaal real reëel complex complex number getal not matrix geen matrix unknown onbekend Default assumptions Standaard aannames Activate Activeren All All variables Alles Uncategorized Niet-gecategoriseerd User variables Gebruikersvariabelen Favorites Favorieten Inactive Inactief qalculate-qt-5.5.1/translations/qalculate-qt_pt_BR.ts000066400000000000000000016177171475705355700227410ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora potente e fácil de usar calculation;arithmetic;scientific;financial; calculadora;aritmética;científica;financeira; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! é uma calculadora para desktop multiplataforma e multiuso. É simples de usar, mas fornece poder e versatilidade normalmente vistas em pacotes de matemática complicados, além de ferramentas úteis para as necessidades diárias (como conversão de moeda e cálculo de porcentagem). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Os recursos incluem uma grande biblioteca de funções personalizáveis, cálculos e conversão de unidades, constantes físicas, cálculos simbólicos (incluindo integrais e equações), precisão arbitrária, propagação de erros, aritmética de intervalos, plotagem e uma interface amigável. Argument Rules Regras de argumento _Cancel _Cancelar Do not save modifications Não salvar modificações _OK _OK Accept the modification of argument rules Aceitar modificação de regras de argumento Enable rules and type test Ativar regras e teste de tipo Custom condition Condição personalizada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx Keyboard Shortcuts Atalhos do teclado _Close _Fechar Label Etiqueta Left-click Botão esquerdo Right-click Botão direito Middle-click Botão do meio Reset Redefinir Value Valor Argument name Nome do argumento Calendar Conversion Conversão de calendário Export CSV File Exportar arquivo CSV Current result Resultado atual Matrix/vector variable Variável matriz/vetor File Arquivo Delimiter Delimitador Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Import CSV File Importar arquivo CSV Do not import the file Não importar o arquivo Import the file Importar o arquivo Name of the data file to import Nome do arquivo de dados a ser importado Select a file Selecionar um arquivo Import as Importar como Matrix Matriz If a matrix shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do arquivo Vectors Vetores If vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do arquivo Name Nome Name (or name prefix) used to reference generated variable(s) in expressions Nome (ou prefixo do nome) usado para referenciar variáveis geradas em expressões Descriptive name Nome descritivo Title displayed in menus and in variable manager Título exibido nos menus e no gerenciador de variáveis Category Categoria First row Primeira linha The first row with data to import in the file A primeira linha com dados a serem importados no arquivo Includes headings Incluir cabeçalhos If the first row contains column headings Se a primeira linha deve conter cabeçalhos de coluna Delimiter used to separate columns in the file Delimitador usado para separar colunas no arquivo Custom delimiter Delimitador personalizado Edit Data Property Editar propriedades de dados Do not create/modify this data set Não criar/modificar este conjunto de dados Accept the creation/modification of this data set Aceitar a criação/modificação deste conjunto de dados Name used for reference Nome usado para referência Properties Propriedades Title displayed in menus and in data set manager Título exibido nos menus e no gerenciador de conjunto de dados Description Descrição Description of this data property Descrição desta propriedade de dados Value Type Tipo de valor Text Texto Number Número Expression Expressão Hide Ocultar Use as key Usar como chave Approximate value Valor aproximado Case sensitive value Valor sensível a maiúsculas e minúsculas Value uses brackets Valor usa colchetes Unit expression Expressão de unidade Edit Data Set Editar conjunto de dados Title Título Data file Arquivo de dados Description of this data set Descrição deste conjunto de dados Copyright Direitos autorais General Geral Properties: Propriedades: Definition of the properties of this data set Definição das propriedades deste conjunto de dados _New _Novo _Edit _Editar _Delete _Excluir Name used to invoke the function in expressions Nome usado para chamar a função em expressões Object argument name Nome do argumento do objeto Property argument name Nome do argumento da propriedade Default property Propriedade padrão Function Função Edit Data Object Editar Objeto de Dados Do not create/modify this data object Não criar/modificar este objeto de dados Accept the creation/modification of this data object Aceitar a criação/modificação deste objeto de dados Data Sets new dataset Conjuntos de dados Data Set Conjunto de dados Create a new data set Criar um novo conjunto de dados Edit the selected data set Editar o conjunto de dados selecionado Delete the selected data set Excluir o conjunto de dados selecionado Objects Objetos Create a new data object Criar um novo objeto de dados Edit the selected data object Editar o objeto de dados selecionado Remove the selected data object Remover o objeto de dados selecionados Data Set Description Descrição do conjunto de dados Object Attributes Atributos do objeto Decimals Decimais Close this window Fechar esta janela Min decimals Decimais mínimos Max decimals Decimais máximos Minimal number of displayed decimals Número mínimo de casas decimais exibidas Maximal number of decimals to display (and round to) Número máximo de casas decimais a serem exibidas (e arredondadas) Floating Point Conversion Conversão de ponto flutuante Decimal value Valor decimal Binary value Valor binário Octal value Valor octal Hexadecimal representation Representação hexadecimal Conversion error Erro de conversão Binary representation Representação binária Floating point value Valor do ponto flutuante Format Formato 16-bit (half precision) 16-bit (precisão média) 32-bit (single precision) 32-bit (precisão única) 64-bit (double precision) 64-bit (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Hexadecimal value Valor hexadecimal Edit Function Editar Função _Help _Ajuda Do not create/modify this function Não criar/modificar esta função Accept the creation/modification of this function Aceitar a criação/modificação desta função Name used to invoke this function in expressions Nome usado para chamar esta função em expressões Title displayed in menus and in function manager Título exibido nos menus e no gerenciador de funções Hide function Ocultar função If this function shall be hidden in menus Caso a função esteja oculta nos menus Description of this function Descrição desta função Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Use \x para o primeiro, \y para o segundo e \z para o terceiro argumento. Para mais informações, clique no botão de ajuda. Condition Condição Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-Functions Subfunções Arguments: Argumentos: Definition of this function's arguments Definição dos argumentos desta função Free Livre Integer Inteiro Symbol Símbolo Date Data Vector Vetor Positive number Número positivo Non-zero number Número diferente de zero Non-negative number Número não-negativo Positive integer Número inteiro positivo Non-zero integer Inteiro diferente de zero Non-negative integer Inteiro não-negativo Boolean Boleano Object Objeto Unit Unidade Variable Variável Angle Ângulo Data object Onjeto de dados Data property Propriedade de dados _Add _Adicionar Add entered argument definition Adicionar definição de argumento inserido _Apply _Aplicar Modify selected argument Modificar argumento selecionado Remove selected argument Remover argumento selecionado Rules Regras Edit conditions for selected argument Editar condições para o argumento selecionado Close this dialog Fechar este diálogo Precalculate Pré-calcular Calculate the subfunction only once, before the parent function Calcular a subfunção apenas uma vez, antes da função pai Add entered subfunction Adicionar subfunção inserida Apply changes to the selected subfunction Aplicar alterações à subfunção selecionada Remove the selected subfunction Remover a subfunção selecionada Functions Funções Create a new function Criar uma nova função Edit the selected function Editar a função selecionada _Insert _Inserir Insert (or execute) the selected function into the expression entry Inserir (ou executar) a função selecionada na entrada da expressão Delete the selected function Excluir a função selecionada (De)activate the selected function Desativar a função selecionada Deacti_vate Desati_var Apply the selected function to the current expression Aplicar função selecionada à expressão atual Categor_y Categor_ia _Function _Função Descri_ption Desc_rição Degrees Graus Radians Radianos Gradians Grados Default assumptions Suposições padrão Unknown Desconhecido Not Matrix Não-matriz Complex Complexo Real Real Rational Racional Non-Zero Diferente de zero Positive Positivo Non-Negative Não-negativo Negative Negativo Non-Positive Não-positivo _File _Arquivo Unknown Variable Variável desconhecida Function (simplified) Função (simplificada) Import CSV File… Importar arquivo CSV… Export CSV File… Exportar arquivo CSV… _Store Result… _Guardar resultado… Save Result Image… Salvar imagem do resultado… Save local functions, variables and units Salvar funções, variáveis e unidades Save Definitions Salvar definições Import Definitions File… Importar arquivo de definições… Fetch current exchange rates from the Internet Buscar taxas de câmbio atualizadas na Internet Update Exchange Rates Atualizar taxas de câmbio Plot Functions/Data Funções/dados de plotagem Convert Number Bases Converter bases numéricas Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Percentage Calculation Tool Ferramenta de Cálculo de Porcentagem Periodic Table Tabela Periódica Minimal Window Janela mínima _Quit _Sair Manage Variables Gerenciar Variáveis Manage Functions Gerenciar Funções Manage Units Gerenciar Unidades Manage Data Sets Gerenciar Conjuntos de Dados Factorize Fatorar Expand Expandir Apply partial fraction decomposition to the current result. Aplicar decomposição de fração parcial ao resultado atual. Expand Partial Fractions Expandir Frações Parciais Set Unknowns… Definir Incógnitos… Convert to Unit Converter em Unidade Set Prefix Definir Prefixo Convert to Unit Expression… Converter em Expressão de Unidade… Convert to Base Units Converter em Unidades Base Convert to Optimal Unit Converter em Unidade Ideal Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Insert Vector… Inserir Vetor… _Copy Result _Copiar resultado Customize Keypad Buttons Personalizar botões do teclado _Preferences _Preferências _Mode _Modo Number Base Base numérica Select Result and Expression Base… Selecionar resultado e base de expressão… Binary Binário Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Outro… Sexagesimal Sexagesimal Time Format Formato da hora Roman Numerals Números romanos Numerical Display Exibição numérica Normal Normal Engineering Engenharia Scientific Científica Purely Scientific Puramente Científica Simple Simples Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desativado: 1/7 ≈ 0.14285714 Ativado: 1/7 = 0.142857 142857... Indicate Repeating Decimals Indicar decimais repetidos Show Ending Zeroes Mostrar zeros finais Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desativado: 2.5 ≈ 3, 1.5 ≈ 2 Ativado: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Arredondar números até a metade Off: -x + y On: y - x Desativado: -x + y Ativado: y - x Sort Minus Last Classificar menos último Complex Rectangular Form Forma retangular complexa Complex Exponential Form Forma exponencial complexa Complex Polar Form Forma polar complexa Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Rational Number Form Forma do número racional 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Frações decimais 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Frações decimais exatas 6/4 = 3/2 6/4 = 3/2 Simple Fractions Frações simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Frações mistas Interval Display Exibição de intervalo Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desativado: 1/2*pi ≈ 1.5707963 Ativado: 1/2*pi = 0.5 pi Adaptive Adaptativa Calculates an interval of possible values and keeps track of precision changes. Calcula um intervalo de valores possíveis e acompanha mudanças de precisão. Significant Digits Dígitos Significativos Interval Intervalo Plus/Minus Mais/Menos Midpoint Ponto médio Unit Display Exibir Unidade Do not use any prefixes in result Não usar nenhum prefixo no resultado Show prefixes for primarily SI and CGS units. Mostrar prefixos principalmente para unidades SI e CGS. Use prefixes for selected units Usar prefixos para unidades selecionadas Use prefixes also for currencies Usar prefixos também para moedas Use prefixs for all units Usar prefixos em todas as unidades Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Permite o uso automático de hekto, deka, deci e centi quando os prefixos estão ativados Enable All SI Prefixes Ativar Todos os Prefixos SI Enables automatic setting of prefix for denominator in addition to the numerator Ativar a configuração automática de prefixo para o denominador, além do numerador Enable Denominator Prefixes Ativar Prefixos de Denominador Off: J / K On: J * K^-1 Desativado: J / K Ativado: J * K^-1 Negative Exponents Expoentes negativos Off: (2 m)/s On: 2 (m/s) Desativado: (2 m)/s Ativado: 2 (m/s) Place Units Separately Colocar unidades separadamente No Additional Conversion Nenhuma conversão adicional Convert to Optimal SI Unit Converter em unidade SI ideal If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Se ativado: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Converter em unidades mistas Abbreviate Names Abreviar nomes Enabled Objects Objetos ativados Variables Variáveis Units Unidades Unknowns Desconhecidos Units in Physical Constants Unidades em constantes físicas If not enabled, treats all variables as unknown Se não estiver ativado, trata todas as variáveis como desconhecidas Calculate Variables Calcular variáveis Disables/enables complex numbers in result Desativar/ativar números complexos no resultado Allow Complex Result Permitir resultado complexo Disables/enables infinite numbers in result Desativar/ativar números infinitos no resultado Allow Infinite Result Permitir resultado infinito Approximation Aproximação Always Exact Sempre exato Try Exact Tentar exato Approximate Aproximado Interval Arithmetic Aritmética de intervalo Interval Calculation Cálculo de intervalo Variance Formula Fórmula de variância Change angle unit used in trigonometric functions Alterar unidade de ângulo usada em funções trigonimétricas Angle Unit Unidade de ângulo None Nenhum Assumptions Suposições Algebraic Mode Modo Algébrico Assume that unknown denominators are non-zero Assume que os denominadores incógnitos são diferentes de zero Non-Zero Denominators Denominadores diferentes de zero Warn when unknown denominators are assumed non-zero Avisar quando denominadores incógnitos são assumidos diferentes de zero Warn About Denominators Assumed Non-Zero Avisar sobre denominadores considerados diferentes de zero Parsing Mode Modo de análise Adaptive Parsing Análise adaptativa Parse Implicit Multiplication First Analisar primeiro multiplicação implícita Conventional Parsing Análise convencional RPN Syntax Sintaxe RPN Off: xy = x*y On: xy != x*y Desativado: xy = x*y Ativado: xy != x*y Limit Implicit Multiplication Limitar multiplicação implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analisa números decimais como aproximados com precisão igual ao número de dígitos. Desativado: 1.1 * 1.1 = 1.21 Ativado: 1.1 * 1.1 ≈ 1.2 Read Precision Ler precisão _Precision _Precisão _Decimals _Decimais Calculate As You Type Calcular ao digitar Activate the RPN stack. Ative a pilha RPN. RPN Mode Modo RPN Meta Modes Meta Modos Save Mode… Salvar modo… Delete Mode… Excluir modo… Save Default _Mode Salvar _modo padrão Fu_nctions Fu_nções _Variables _Variáveis _Units _Unidades _Contents _Conteúdo Report a Bug Reportar um erro Check for Updates Verificar atualizações _About _Sobre Toggle minimal window Alternar janela mínima Calculation result Resultado do cálculo _Keypad _Teclado Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Ativar teclado persistente (permite exibir o teclado e o histórico simultaneamente) _History _Histórico C_onversion C_onversão RPN Stack Pilha RPN Insert the selected value Inserir o valor selecionado Insert the selected text Inserir o texto selecionado Copy the selected text Copiar o texto selecionado Add the selected value(s) Adicionar os valores selecionados Subtract the selected value(s) Subtrair os valores selecionados Multiply the selected value(s) Multiplicar os valores selecionados Divide the the selected value(s) Dividir os valores selecionados Raise to the power of the selected value Aumentar a potência do valor selecionado Calculate the square root of the selected value Calcular a raiz quadrada do valor selecionado History Histórico Subtract the top value from the second value Subtrair o valor superior do segundo valor Multiply the top two values Multiplicar os dois principais valores Divide the second value by the top value Dividir o segundo valor pelo valor superior Raise the second value to the power of the top value Aumentar o segundo valor para a potência do valor superior Negate the top value (Ctrl+-) Negar o valor superior (Ctrl+-) Invert the top value Inverter o valor superior Calculate the square root of the top value Calcular a raiz quadrada do valor superior Calculate the sum of all values Calcular a soma de todos os valores Rotate the stack or move selected register up Gire a pilha ou mova o registro selecionado para cima Rotate the stack or move selected register down Gire a pilha ou mova o registro selecionado para baixo Swap the two top values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Enter the top value from before the last numeric operation Digite o valor superior antes da última operação numérica Delete the top or selected value Excluir o valor selecionado ou superior Edit the selected value Editar o valor selecionado Clear the RPN stack Limpar a pilha RPN Unit(s) and prefix to convert result to Unidade(s) e prefixo para converter o resultado em Convert Converter Continuous conversion Conversão contínua Automatically convert result to the current unit expression as long as the conversion box is visible. Converter automaticamente o resultado na expressão de unidade atual, desde que a caixa de conversão esteja visível. Add prefix Adicionar prefixo If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Se a expressão da unidade não contiver nenhum prefixo, use o prefixo ideal. Isso pode ser substituído ao adicionar a expressão da unidade com "?" ou "0". Conversion Conversão Show/hide programming keypad Mostrar/ocultar teclado de programação Exact Exato Fraction Fração Numerical display Exibição numérica Pure Puro Number base Base numérica Time format Formato de tempo Roman Romano sin sin cos cos tan tan ln ln Equals Igual a sqrt sqrt sum sum Unknown variable Variável desconhecida mod mod mean mean Store result as a variable Guardar o resultado como uma variável STO Standard calculator button. Do not use more than three characters. STO Convert number bases Converter bases numéricas Imaginary unit i (√-1) Unidade imaginária i (√-1) Manage units Gerenciar unidades Conversion operator Operador de conversão Kilogram Quilograma Two's complement input Entrada do complemento para dois Two's complement output Saída do complemento para dois Bitwise Exclusive OR OR exclusivo bit-a-bit Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit Floating point conversion Conversão de ponto flutuante Show/hide left keypad Mostrar/ocultar teclado esquerdo Show/hide right keypad Mostrar/ocultar teclado direito DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultado anterior ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Adicionar à Expressão Persistent Keypad Teclado persistente Edit Editar Delete Excluir Update Atualizar Insert Value Inserir valor Insert Text Inserir texto Insert Parsed Text Inserir texto analisado Copy Copiar Copy Full Text Copiar todo o texto Search… Procurar… Add Bookmark… Adicionar marcador… Bookmarks Marcador Protect Proteger Move To Top Mover para o topo Remove Remover Clear All Limpar tudo _Copy _Copiar _Store… _Armazenar… Save Image… Salvar imagem… _Factorize _Fatorar _Expand _Expandir _Normal _Normal Sc_ientific C_ientífica Purel_y Scientific Pura_mente científica Simp_le Simp_les _Binary _Binária _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fração decimal Exact Decimal Fraction Fração decimal exata Simple Fraction Fração simples Mixed Fraction Fração mista _Abbreviate Names _Abreviar nomes C_onvert… C_onverter… Convert to Base _Units Converter em _unidades base Convert _to Optimal Unit Conver_ter em unidade ideal Use Optimal Prefix Usar prefixo ideal Convert to Converter para Convert to UTC Converter para UTC Convert to Calendars Converter em calendários Use prefixes for all units Usar prefixos em todas as unidades Enable All SI Prefi_xes Ativar Todos os Prefi_xos SI View/Edit Matrix Ver/Editar Matriz View/Edit Vector Ver/Editar Vetor Copy Text Copiar texto To Top Para cima Swap Trocar Up Acima Down Abaixo Negate Negar Invert Inverter Square Quadrado Square Root Raiz quadrada Clear Stack Limpar pilha Select Number Base… Selecionar Base Numérica… Store result Guardar resultado Insert the matrix/vector into the expression Inserir a matriz/vetor na expressão Rows Linhas Number of rows in this matrix (rows displayed for vectors) Número de linhas nesta matriz (linhas exibidas para vetores) Columns Colunas Number of columns in this matrix (columns displayed for vectors) Número de colunas nesta matriz (colunas exibidas para vetores) If this is a matrix or vector Se isso é uma matriz ou vetor Elements Elementos Current element: Elemento atual: Edit Matrix Editar Matriz Do not create/modify this matrix/vector Não criar/modificar esta matriz/vetor Create/modify the matrix/vector Criar/modificar esta matriz/vetor Accept the creation/modification of this matrix/vector Aceitar a criação/modificação desta matriz/vetor Name used to reference this variable in expressions Nome usado para referenciar esta variável em expressões Names Nomes Add new name Adicionar novo nome Apply changes to the selected name Aplicar alterações ao nome selecionado Remove the selected name Remover o nome selecionado Abbreviation Abreviação Unicode Unicode Plural Plural Suffix Sufixo Reference Referência Avoid input Evitar entrada Case sensitive Maiúsc. e Minúsculas Completion only Apenas conclusão Number Bases Bases Numéricas Roman numerals Números romanos BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Subtrair Multiply Multiplicar Divide Dividir Bitwise AND Bit-a-bit AND Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear Limpar Enter two values, of which at most one is a percentage, and the others will be calculated for you. Digite dois valores, dos quais no máximo um é uma porcentagem, e os outros serão calculados para você. Percentage Percentagem Calculate Calcular Value 1 Valor 1 2 compared to 1 2 comparado a 1 Change from 1 to 2 Alterar de 1 para 2 Value 2 Valor 2 1 compared to 2 1 comparado a 2 Change from 2 to 1 Alterar de 2 para 1 Plot Plotagem _Save _Salvar Save as png, svg, postscript, eps, latex or fig Salvar como png, svg, postscript, eps, latex ou fig Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada if you want to split matrix in rows instead of columns se desejar dividir a matriz em linhas em vez de colunas X variable Variável X The variable name used in expression O nome da variável usada na expressão Style Estilo Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontilhado Smoothing Suavização Monotonic Monotônica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotônica) Y-axis Eixo Y Primary Primário Secondary Secundário _Remove _Remover Data Dados Minimum x value Valor mínimo x Maximum x value Valor máximo x Sampling rate Taxa de amostragem Step size Tamanho do passo Function Range Faixa de Funções Display grid Exibir grade Display full border Exibir borda completa Minimum y value Valor mínimo y Maximum y value Valor máximo y Logarithmic x scale Escala logarítmica x Logarithmic y scale Escala logarítmica y X-axis label Etiqueta do eixo X Y-axis label Etiqueta do eixo Y Line width Espessura da linha Color display Exibição de cores Color Cores Monochrome Monocromática Legend placement Posição da legenda Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Appearance Aparência Precision Precisão _Recalculate _Recalcular Recalculate expression Recalcular expressão The number of significant digits to display/calculate (simple arithmetics are always calculated exact) O número de dígitos significativos a serem exibidos/calculados (aritmética simples é sempre calculada exatamente) Preferences Preferências Save mode on exit Salvar modo ao sair If the mode of the calculator shall be restored Para que o modo da calculadora seja restaurado Save definitions on exit Salvar definições ao sair If changes to functions, units and variables shall be saved automatically Para que alterações em funções, unidades e variáveis sejam salvas automaticamente Clear history on exit Limpar histórico ao sair Allow multiple instances Permitir várias instâncias Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permite que várias instâncias da janela principal do Qalculate! sejam abertas. Observe que apenas o modo, histórico e definições da última instância fechada serão salvos. Notify when a new version is available Notificar quando uma nova versão estiver disponível Use keyboard keys for RPN Usar teclado para RPN Use keyboard operator keys for RPN operations (+-*/^). Usar as teclas de operação no teclado para operações RPN (+-*/^). Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Inserir XOR (⊻) usando circunflexo (^) no teclado (caso contrário, use Ctrl+^). O operador de exponenciação (^) sempre pode ser inserido ao usar Ctrl+*. Time limit for plot: Tempo limite para plotagem: Behavior Comportamento Enable Unicode symbols Ativar símbolos Unicode Disable this if you have problems with some fancy characters Desative isso se você tiver problemas com alguns caracteres extravagantes Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Remember window position Lembrar posição da janela Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Mode Modo Application name + mode Nome do programa + modo Window title Título da janela Default Padrão Number of expression lines Número de linhas de expressão Display expression status Exibir status da expressão If as-you-type expression status shall be displayed below the expression entry Para que o status da expressão, conforme você digita, seja exibido abaixo da entrada da expressão Persistent keypad Teclado persistente Look & Feel Aparência Binary two's complement representation Representação binária do complemento para dois If two's complement representation shall be used for negative binary numbers. Para que a representação do complemento para dois seja usada para números binários negativos. Hexadecimal two's complement representation Representação hexadecimal do complemento para dois If two's complement representation shall be used for negative hexadecimal numbers. Para que a representação do complemento para dois seja usada para números hexadecimais negativos. Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais If lower case letters should be used in numbers with non-decimal base Para que letras minúsculas sejam usadas em números com base não-decimal Alternative base prefixes Prefixos base alternativos If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Para que números hexadecimais sejam exibidos com "0x0" e números binários com "0b00" como prefixos Spell out logical operators Soletrar operadores lógicos If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Para que o lógico and/or seja exibido como "&&"/"||" ou "and"/"or" If "e" shall be used instead of "E" in numbers Para que "e" seja usado em vez de "E" em números Use E-notation instead of 10<sup><i>n</i></sup> Usar notação E em vez de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usar letras minúsculas "e" (como em 1e10) Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Usar 'j' (em vez de 'i') como símbolo padrão para a unidade imaginária e coloque-o na frente da parte imaginária. Use comma as decimal separator Usar vírgula como separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permite que pontos, '.', sejam usados como separador de milhares em vez de como um sinal decimal alternativo Ignore comma in numbers Ignorar vírgula em números Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permite que vírgulas, ',', sejam usadas como separador de milhares em vez de como separador de argumentos de função Ignore dots in numbers Ignorar pontos em números Digit grouping Agrupamento de dígitos off desligado standard padrão local local Multiplication sign Sinal de multiplicação Division sign Sinal de divisão Copy digit separator Copiar separador de dígitos Deactivate to remove digit separator when copying result Desative para remover o separador de dígitos ao copiar o resultado Numbers & Operators Números e operadores Use binary prefixes for information units Usar prefixos binários para unidades de informações Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usar prefixos binários, em vez de decimais, como padrão para unidades de informação (ex. bytes). Conversion to local currency Conversão para moeda local Automatically convert to the local currency when optimal unit conversion is activated. Converter automaticamente para a moeda local quando a conversão ideal de unidades estiver ativada. Update exchange rates on start Atualizar taxas de câmbio ao inicializar If current exchange rates shall be downloaded from the internet at program start Para que as taxas de câmbio sejam baixadas da internet no início do programa Exchange rates updates Atualizações das taxas de câmbio Units & Currencies Unidades e moedas Show expression completion suggestions Mostrar sugestões de conclusão de expressão Search titles and countries Pesquisar títulos e países Minimum characters Caracteres mínimos Popup delay (ms) Atraso da janela pop-up (ms) Completion Conclusão Status warning color Cor do status de erro Status error color Cor do status de erro Custom status font Fonte de status personalizada If you want to use a font other than the default in the status display below the expression entry Se você desejar usar uma fonte diferente da padrão na exibição de status abaixo da entrada da expressão Custom expression font Fonte da expressão personalizada If you want to use a font other than the default in the expression entry Se você desejar usar uma fonte diferente da padrão na entrada da expressão Custom result font Fonte do resultado personalizada If you want to use a font other than the default in the result display Se você desejar usar uma fonte diferente da padrão na exibição do resultado Custom keypad font Fonte do teclado personalizada If you want to use a font other than the default in the keypad Se você desejar usar uma fonte diferente da padrão no teclado Custom application font Fonte do programa personalizada If you want to use a font other than the default for the whole application Se você desejar usar uma fonte diferente da padrão em todo o programa Text color Cor do texto Fonts & Colors Fontes e cores Other: Outra: Bijective base-26 Base bijetiva-26 <b>Result Base</b> <b>Resultado da Base</b> <b>Expression Base</b> <b>Base de Expressão</b> New Keyboard Shortcut Novo atalho de teclado Edit Variable Editar Variável Advanced Avançado Accept the creation/modification of this variable Aceitar a criação/modificação desta variável x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Use x, y e z para o 1º, 2º e 3º argumento da função, respectivamente. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. Isso evita possíveis conflitos com variáveis, funções e unidades. Edit Unit Editar Unidade Do not create/modify this unit Não criar/modificar esta unidade Accept the creation/modification of this unit Aceitar a criação/modificação desta unidade Singular form of this unit's name Forma singular do nome desta unidade Title displayed in menus and in unit manager Título exibido nos menus e no gerenciador de unidades System Sistema Imperial Imperial US Survey US Survey Hide unit Ocultar unidade If this unit shall be hidden in menus Caso a unidade esteja oculta nos menus Class Classe Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s) Unidade(s) base Exponent Expoente Exponent of the base unit Exponent of the base unit Relation Relação Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número. Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273.15" para a relação entre graus Celsius e Kelvin). Relation is exact Relação é exata If the relation is precise Se a relação é precisa Inverse relation Relação inversa Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decide com quais unidades a unidade base é mesclada se existirem várias opções. - A unidade original não será mesclada com unidades de menor prioridade. - Um valor mais baixo significa prioridade mais alta. Priority Prioridade Minimum base unit number Número mínimo da unidade base Use with prefixes by default Use com prefixos por padrão Create a new unit Criar uma nova unidade Edit the selected unit Editar a unidade selecionada Insert the selected unit into the expression entry Inserir a unidade selecionada na entrada da expressão C_onvert C_onverter Convert the result to the selected unit Converter o resultado na unidade selecionada Delete the selected unit Excluir a unidade selecionada (De)activate the selected unit Desativar a unidade selecionada _Unit _Unidade Convert between units Converter entre unidades = = Conver_sion Conver_são Converted value Valor convertido Value to convert from Valor para converter Type anywhere Digitar em qualquer lugar Edit Unknown Variable Editar Variável Desconhecida Do not create/modify this unknown variable Não criar/modificar esta variável desconhecida Accept the creation/modification of this unknown variable Aceitar a criação/modificação desta variável desconhecida Name used to reference this unknown variable in expressions Nome usado para referenciar esta variável desconhecida em expressões Use custom assumptions Usar suposições personalizadas Type Tipo Real Number Número real Rational Number Número racional Sign Sinal The category this unknown variable belongs to A categoria à qual essa variável pertence Value of this variable (expression) Valor desta variável (expressão) value is exact valor é exato If the value is precise Se o valor for preciso The category this variable belongs to A categoria à qual essa variável pretence Create a new variable Criar uma nova variável Edit the selected variable Editar a variável selecionada Insert the selected variable into the expression entry Insira a variável selecionada na entrada da expressão Delete the selected variable Excluir a variável selecionada (De)activate the selected variable Desativar a variável selecionada E_xport E_xportar _Variable _Variável Start a new instance of the application Iniciar uma nova instância do programa Display the application version Exibir a versão do programa Specify the window title Especifica o título da janela TITLE TITLE Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. ans ans Last Answer Última resposta answer resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Failed to load global definitions! Falha ao carregar definições globais! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Todas By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %s é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão salvas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? c-format Right-click/long press: %s Botão direito/pressionar e segurar: %s c-format Right-click: %s Botão direito: %s c-format Middle-click: %s Botão do meio: %s c-format Cycle through previous expression Percorrer pela expressão anterior Move cursor left or right Mover cursor para esquerda ou direita Move cursor to beginning or end Mover cursor para o início ou fim Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Decimal point Ponto decimal Raise (Ctrl+*) Aumentar (Ctrl+*) Add Adicionar Backspace Backspace Previous result (static) Resultado anterior (estático) Calculate expression Calcular expressão Set unknowns Definir incógnitos more Show further items in a submenu mais Logical AND Lógico AND Logical OR Lógico OR Logical NOT Lógico NOT Toggle Result Base Alternar base de resultados Open menu with stored variables Abrir menu com variáveis armazenadas Index Índice Calculate expression and add to stack Calcular expressão e adicionar à pilha Flag Bandeira Matrices Matrizes Gregorian Gregoriano Revised Julian (Milanković) Juliano revisado (Milanković) Julian Juliano Islamic (Hijri) Islâmico (Hijri) Hebrew Hebreu Chinese Chinês Persian (Solar Hijri) Persa (Hijri Solar) Coptic Cóptico Ethiopian Etíope Indian (National) Indiano (Nacional) Action Ação Key combination Combinação de teclas Raise Aumentar History Answer Value Valor da resposta do histórico History Index(es) Índice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. c-format expression expressão History Parsed Expression Expressão analisada historicamente Set Window Title Definir título da janela Failed to open %s. %s Falha ao abrir %s. %s c-format Could not display help for Qalculate!. Não foi possível exibir a ajuda do Qalculate!. Could not display help for Qalculate!. %s Não foi possível exibir a ajuda do Qalculate!. %s c-format approx. aprox. Stop process Parar processo Clear expression Limpar expressão EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC VAR FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Deseja atualizar as taxas de câmbio agora? It has been %s day since the exchange rates last were updated. Faz %s dia desde a última atualização das taxas de câmbio. Faz %s dias desde a última atualização das taxas de câmbio. c-format It has been %s days since the exchange rates last were updated. Do not ask again Não perguntar novamente It took too long to generate the plot data. Demorou muito para gerar os dados da plotagem. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Demorou muito para gerar os dados da plotagem. Diminua a taxa de amostragem ou aumente o limite de tempo nas preferências. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Quando erros, avisos e outras informações são geradas durante o cálculo, o ícone à direita da entrada da expressão é alterado para exibir isso. Ao segurar o ponteiro do mouse ou clicar no ícone, a mensagem será mostrada. Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %s Falha ao executar o script de atualização. %s c-format Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %s is available at %s. Do you wish to update to version %s. Uma nova versão do %s está disponível em %s. Deseja atualizar para a versão %s. c-format A new version of %s is available. You can get version %s at %s. Uma nova versão do %s está disponível. Você pode obter a versão %s em %s. c-format Too many arguments for %s(). Argumentos em excesso para %s(). c-format argument argumento Uncategorized Sem categoria hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal time hora bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar angle ângulo phasor fasor optimal ideal base base mixed mesclado fraction fração factors fatores partial fraction fração parcial factorize fatorar expand expandir hexadecimal number número hexadecimal octal number número octal decimal number número decimal duodecimal number número duodecimal binary number número binário roman numerals numerais romanos bijective base-26 base bijetiva-26 sexagesimal number número sexagesimal 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time format formato de hora number bases bases numéricas optimal unit unidade ideal base units unidades de base mixed units unidades mescladas expanded partial fractions frações parciais expandidas complex rectangular form forma retangular complexa complex exponential form forma exponencial complexa complex polar form forma polar complexa complex cis form forma cis complexa complex angle notation notação complexa de ângulo complex phasor notation notação complexa de fasor UTC time zone Fuso horário UTC number base %s número base %s c-format Inactive Inativo Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %s para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. c-format Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default, in description padrão: Requirement Requerimento key indicating that the property is a data set key chave Acti_vate Ati_var a previous result um resultado anterior matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Variable does not exist anymore. A variável não existe mais. Data Retrieval Function Função de Recuperação de Dados Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Insert unit Inserir unidade Insert text Inserir texto Insert date Inserir data Insert vector Inserir vetor Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert to unit (entry) Converter em unidade (entrada) Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: excluir registro RPN: clear stack RPN: limpar pilha Load meta mode Carregar modo meta Set expression base Definir base de expressão Set result base Definir base de resultados Toggle exact mode Alternar modo exato Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Toggle simple fractions Alternar frações simples Toggle mixed fractions Alternar frações mescladas Toggle scientific notation Alternar notação científica Toggle simple notation Alternar notação simples Toggle RPN mode Alternar modo RPN Toggle calculate as you type Alternar para calcular ao digitar Toggle programming keypad Alternar teclado de programação Show keypad Mostrar teclado Show history Mostrar histórico Search history Pesquisar no histórico Show conversion Mostrar conversão Show RPN stack Mostrar pilha RPN Manage variables Gerenciar variáveis Manage functions Gerenciar funções Manage data sets Gerenciar conjuntos de dados New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de porcentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Save result image Salvar imagem do resultado Help Ajuda Quit Sair Prefixes Prefixos No Prefix Nenhum prefixo Optimal Prefix Prefixo ideal Prefix Prefixo Complex angle/phasor notation Notação completa de ângulo/fasor Number bases Bases numéricas Base units Unidades base Binary number Número binário Calendars Calendários Complex cis form Forma cis complexa Decimal number Número decimal Duodecimal number Número duodecimal Complex exponential form Forma exponencial complexa Factors Fatores 16-bit floating point binary format Formato binário de ponto flutuante de 16-bit 32-bit floating point binary format Formato binário de ponto flutuante de 32-bit 64-bit floating point binary format Formato binário de ponto flutuante de 64-bit 80-bit (x86) floating point binary format Formato binário de ponto flutuante de 80-bit (x86) 128-bit floating point binary format Formato binário de ponto flutuante de 128-bit Hexadecimal number Número hexadecimal Mixed units Unidades mistas Octal number Número octal Optimal units Unidades ideais Expanded partial fractions Frações parciais expandidas Complex polar form Forma polar complexa Complex rectangular form Forma retangular complexa Sexagesimal number Número sexagesimal and e or ou undefined indefinido result is too long see history resultado é muito longo ver histórico calculation was aborted cálculo abortado RPN Register Moved Registro RPN Movido RPN Operation Operação RPN Processing… Processando… result processing was aborted processamento de resultado abortado Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Calculating… Calculando… Converting… Convertendo… Fetching exchange rates. Buscando taxas de câmbio. Time zone parsing failed. Falha na análise do fuso horário. Keep open Manter aberto Enter RPN Enter (calculate and add to stack) Enter C_alculate C_alcular Apply to Stack Aplicar à pilha Argument Argumento True Verdadeiro False Falso Info Informação Edit Unit (global) Editar unidade (global) New Unit Nova unidade Empty name field. Campo de nome vazio. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Base unit does not exist. A unidade base não existe. Edit Function (global) Editar Função (global) New Function Nova Função Yes Sim No Não Empty expression field. Campo de expressão vazio. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Unit does not exist A unidade não existe Edit Unknown Variable (global) Editar Variável Desconhecida (global) New Unknown Variable Nova variável desconhecida An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable (global) Editar Variáveis (global) New Variable Nova Variável Empty value field. Campo de valor vazio. Edit Vector Editar Vetor Edit Vector (global) Editar Vetor (global) New Vector Novo Vetor Edit Matrix (global) Editar Matriz (global) New Matrix Nova Matriz Vector Result Resultado do Vetor Matrix Result Resultado da Matriz New Data Object Novo Objeto de Dados text texto approximate aproximado Edit Data Set (global) Editar Conjunto de Dados (global) New Data Set Novo conjunto de dados info info Property Propriedade No file name entered. Nenhum nome de arquivo digitado. No delimiter selected. Nenhum delimitador selecionado. Could not import from file %s Não foi possível importar do arquivo %s c-format No variable name entered. Nenhum nome de variável digitado. No known variable with entered name found. Nenhuma variável conhecida com o nome digitado encontrada. Could not export to file %s Não foi possível exportar para o arquivo %s c-format My Variables Minhas Variáveis Couldn't write definitions Não foi possível gravar definições Preset Predefinição Abort Abortar Undo Desfazer Redo Refazer Completion Mode Modo de conclusão Limited strict completion Conclusão estrita limitada Strict completion Conclusão estrita Limited full completion Conclusão completa limitada Full completion Conclusão completa No completion Sem conclusão Save Mode Salvar modo Preset mode cannot be overwritten. O modo predefinido não pode ser substituído. Delete Mode Excluir modo Couldn't write preferences to %s Não foi possível gravar preferências em %s c-format never nunca ask perguntar %i day %i dia %i dias c-format %i days Copied Result was copied Copiado log10 function not found. função log10 não encontrada. Search Pesquisar _Search _Pesquisar Remove Bookmark Remover marcador Add Bookmark Adicionar marcador A bookmark with the selected name already exists. Do you want to overwrite it? Um marcador com o nome selecionado já existe. Você deseja sobrescrevê-lo? No items found Nenhum item encontrado Select date Selecionar data Rectangular form Forma retangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notação de ângulo/fasor Optimal unit Unidade ideal Optimal prefix Prefixo ideal All functions Todas as funções All variables Todas as variáveis Select definitions file Selecionar arquivo de definições _Import _Importar Could not copy %s to %s. Não foi possível copiar %s para %s. c-format Could not read %s. Não foi possível ler %s. c-format Could not copy file to %s. Não foi possível copiar o arquivo para %s. c-format Unsupported base. Base não suportada. The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %s. Falha na conversão do calendário para: %s. c-format Gnuplot was not found. Gnuplot não encontrado. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. c-format Select file to save PNG image to Selecione o arquivo para salvar a imagem PNG Allowed File Types Tipos de arquivo permitidos All Files Todos os arquivos Cannot delete unit as it is needed by other units. do not delete units that are used by other units Não é possível excluir a unidade, pois ela é necessária para outras unidades. none nenhum result is too long resultado é muito longo translator-credits Fúlvio Alves <fga.fulvio@gmail.com> Mode not found. Modo não encontrado. Elements (in horizontal order) Elementos (em ordem horizontal) Select file to import Selecionar arquivo para importar _Open _Abrir Select file to export to Selecionar o arquivo para o qual exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Existe um objeto conflitante com o mesmo nome. Se você continuar e salvar as alterações, o objeto conflitante será substituído ou desativado. Você quer continuar? Set key combination Definir combinação de teclas Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Pressione a combinação de teclas que deseja usar para a ação (pressione Escape para cancelar). No keys Sem teclas Empty value. Valor vazio. Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. The key combination is already in use. Do you wish to replace the current action? A combinação de teclas já está em uso. Deseja substituir a ação atual? Select file to export Selecionar arquivo para exportar Empty expression. Expressão vazia. Empty x variable. Variável x vazia. Element Data Dados do elemento Classification Classificação Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatômico Diatomic Non-Metal Não-metal diatômico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas No unknowns in result. Não há incógnitas no resultado. Set Unknowns Definir incógnitas Copy result to clipboard Copiar resultado x x If a matrix or vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do arquivo Use dark theme Usar tema escuro Add the two top values Keypad Adicionar os dois principais valores u Manage units button u to Button for convert to operator em Add Keypad Adicionar Base Unit Unidade base Alias Alias Composite Unit Unidade composta Fonts Fontes Chain Calculation Cálculo de intervalo <b>Name</b> <b>Nome</b> <b>Type</b> <b>Tipo</b> <b>Relation</b> <b>Relação</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i segundos c-format Ent Ent Defaults Padrões Customize Buttons Fonte de status personalizada Names details Detalhes dos nomes Rational number form Forma do número racional Decimal fractions Frações decimais Exact decimal fractions Frações decimais exatas Simple fractions Frações simples Mixed fractions Frações mistas ArgumentEditDialog Name: Nome: Type: Tipo: Free Livre Number Número Integer Inteiro Symbol Símbolo Text Texto Date Data Vector Vetor Matrix Matriz Boolean Boleano Angle Ângulo Object Objeto Function Função Unit Unidade Variable Variável File Arquivo Enable rules and type test Ativar regras e teste de tipo Custom condition: Condição personalizada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx CSVDialog Import CSV File Importar arquivo CSV Export CSV File Exportar arquivo CSV Current result Resultado atual Matrix/vector variable: Variável matriz/vetor: File: Arquivo: Import as Importar como matrix matriz vectors vetores Name: Nome: First row: Primeira linha: Includes headings Incluir cabeçalhos Delimiter: Delimitador: Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Question A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Error Could not import from file %1 Não foi possível importar do arquivo %1 No matrix or vector variable with the entered name was found. Could not export to file %1 Não foi possível exportar para o arquivo %1 CalendarConversionDialog Calendar Conversion Conversão de calendário Gregorian Gregoriano Hebrew Hebreu Islamic (Hijri) Islâmico (Hijri) Persian (Solar Hijri) Persa (Hijri Solar) Indian (National) Indiano (Nacional) Chinese Chinês Julian Juliano Revised Julian (Milanković) Juliano revisado (Milanković) Coptic Cóptico Ethiopian Etíope Error The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %1. Falha na conversão do calendário para: %1. DataObjectEditDialog %1: %1: Default Padrão Approximate Aproximado Exact Exato Edit Data Object Editar Objeto de Dados New Data Object Novo Objeto de Dados DataPropertyEditDialog Name: Nome: Title: Título: Descriptive name: Nome descritivo: Description: Descrição: Value type: Tipo de valor: Expression Expressão Number Número Text Texto Unit expression: Expressão de unidade: Use as key Usar como chave Case sensitive value Valor sensível a maiúsculas e minúsculas Approximate value Valor aproximado Value uses brackets Valor usa colchetes Hide Ocultar Edit Data Property Editar propriedades de dados DataSetEditDialog General Geral Properties Propriedades Function Função Title: Título: Descriptive name: Nome descritivo: Data file: Arquivo de dados: Description: Descrição: Copyright: Direitos autorais: Title Título Name Nome Type Tipo Add Adicionar Edit Editar Remove Remover Name: Nome: Object argument name: Nome do argumento do objeto: Property argument name: Nome do argumento da propriedade: Default property: Propriedade padrão: text texto approximate aproximado number número expression expressão key chave Question A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Data Sets Conjuntos de dados Object Objeto Property Propriedade Edit Data Set Editar conjunto de dados New Data Set Novo conjunto de dados DataSetsDialog Data Sets Conjuntos de dados Data sets: Conjuntos de dados: New… Novo… Edit… Editar… Delete Excluir Objects: Objetos: Data set description: Descrição do conjunto de dados: Object attributes: Atributos do objeto: Properties Propriedades key chave Data Retrieval Function Função de Recuperação de Dados argument argumento ExpressionEdit matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Prefix: Prefixo: Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Base units Unidades base Number Base Base numérica Binary-Coded Decimal Codificação binária decimal Bijective Base-26 Base bijetiva-26 Binary Number Número binário Calendars Calendários Complex cis Form Forma cis complexa Decimal Number Número decimal Duodecimal Number Número duodecimal Complex Exponential Form Forma exponencial complexa Factors Fatores 16-bit Floating Point Binary Format Formato binário de ponto flutuante de 16-bit 32-bit Floating Point Binary Format Formato binário de ponto flutuante de 32-bit 64-bit Floating Point Binary Format Formato binário de ponto flutuante de 64-bit 80-bit (x86) Floating Point Binary Format Formato binário de ponto flutuante de 80-bit (x86) 128-bit Floating Point Binary Format Formato binário de ponto flutuante de 128-bit Fraction Fração Decimal Fraction Fração decimal Hexadecimal Number Número hexadecimal Latitude Longitude Mixed Units Unidades mistas Octal Number Número octal Optimal Unit Unidade ideal Optimal Prefix Prefixo ideal Expanded Partial Fractions Frações parciais expandidas Complex Polar Form Forma polar complexa Complex Rectangular Form Forma retangular complexa Roman Numerals Números romanos Sexagesimal Number Número sexagesimal Time Format Formato da hora Unicode Unicode UTC Time Zone Fuso horário UTC Undo Desfazer Redo Refazer Cut Cortar Copy Copiar Paste Colar Delete Excluir Calculate Selection Calcular seleção Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Select All Selecionar tudo Clear Limpar Clear History Limpar histórico Completion Conclusão No completion Sem conclusão Limited strict completion Conclusão estrita limitada Strict completion Conclusão estrita Limited full completion Conclusão completa limitada Full completion Conclusão completa Delayed completion Expression Status Status da expressão Off Desligado In history list In expression field With delay Com atraso Without delay Sem atraso Automatically calculate selection Use input method Use o método de entrada Matrix Matriz Too many arguments for %1(). Argumentos em excesso para %1(). argument argumento %1: %1: comment comentário MC (memory clear) MS (memory store) M+ (memory plus) M− (memory minus) factorize fatorar expand expandir hexadecimal hexadecimal hexadecimal number número hexadecimal octal octal octal number número octal decimal decimal decimal number número decimal duodecimal duodecimal duodecimal number número duodecimal binary binário binary number número binário roman romanos roman numerals numerais romanos bijective bijetivo bijective base-26 base bijetiva-26 binary-coded decimal codificação binária decimal sexagesimal sexagesimal sexagesimal number número sexagesimal latitude longitude 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time hora time format formato de hora bases bases number bases bases numéricas calendars calendários optimal ideal optimal unit unidade ideal prefix prefixo optimal prefix base base base units unidades de base mixed mesclado mixed units unidades mescladas decimals decimal fraction fraction fração factors fatores partial fraction fração parcial expanded partial fractions frações parciais expandidas rectangular retangular cartesian cartesiano complex rectangular form forma retangular complexa exponential exponencial complex exponential form forma exponencial complexa polar polar complex polar form forma polar complexa complex cis form forma cis complexa angle ângulo complex angle notation notação complexa de ângulo phasor fasor complex phasor notation notação complexa de fasor UTC time zone fuso horário UTC number base %1 número base %1 Data object Onjeto de dados FPConversionDialog Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Format Formato 16-bit (half precision) 16-bit (precisão média) 32-bit (single precision) 32-bit (precisão única) 64-bit (double precision) 64-bit (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Microchip 24-bit Microchip 32-bit Value Valor Decimal value Valor decimal Binary representation Representação binária Hexadecimal representation Representação hexadecimal Floating point value Valor do ponto flutuante Conversion error Erro de conversão FunctionEditDialog Required Obrigatório Details Detalhes Description Descrição Name: Nome: Expression: Expressão: Argument references: Referência de argumento: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y e z (por exemplo "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Usar x, y e z (por exemplo, "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo, "(\x+\y)/2") Category: Categoria: Descriptive name: Nome descritivo: Hide function Ocultar função Example: Exemplo: Description: Descrição: Condition: Condição: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-functions: Subfunções: Expression Expressão Precalculate Pré-calcular Reference Referência Add Adicionar Edit Editar Remove Remover Arguments: Argumentos: Name Nome Type Tipo Question A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Edit Function Editar Função New Function Nova Função FunctionsDialog Functions Funções Category Categoria Function Função New… Novo… Edit… Editar… Deactivate Desativar Delete Excluir Calculate… Calcular… Apply Aplicar Insert Inserir Favorite Favorito argument argumento Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %1 para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default padrão: Requirement: Required condition for function Requerimento: Properties Propriedades %1: %1: key indicating that the property is a data set key chave Activate Ativar All All functions Todas Uncategorized Sem categoria User functions Funções de usuário Favorites Favoritos Inactive Inativo HistoryView Insert Value Inserir valor Insert Text Inserir texto Copy Copiar Copy Formatted Text Copiar texto formatado Copy unformatted ASCII Copiar ASCII não formatado Select All Selecionar tudo Search… Procurar… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. Exchange rate source(s): updated %1 Comment Comentário Protect Proteger Add Comment… Adicionar Comentário… Move to Top Mover para o topo Remove Remover Clear Limpar Edit Comment… Editar Comentário… Text: Texto: Search Pesquisar KeypadButton <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar e segurar</i>: %1 <i>Right-click</i>: %1 <i>Botão direito</i>: %1 <i>Long press</i>: %1 <i>Pressionar e segurar</i>: %1 Open menu <i>Middle-click</i>: %1 <i>Botão do meio</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. STO Store Armazenar New function Nova função sin sin cos cos tan tan Exponentiation Exponenciação Percent or remainder Por cento ou resto Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Interval Intervalo Move cursor left Mover cursor para esquerda Move cursor to start Mover cursor para o início Move cursor right Mover cursor para direita Move cursor to end Mover cursor para fim Logical AND Lógico AND Logical OR Lógico OR Bitwise Exclusive OR OR exclusivo bit-a-bit Logical NOT Lógico NOT Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit cmp rot a→1 Expand partial fractions Expandir frações parciais Enable units in physical constants Activar unidades em constantes físicas All constants Todas as constantes Percentage Calculation Tool Ferramenta de Cálculo de Porcentagem more mais All units Todas as unidades All variables Todas as variáveis Action Ação Interval Display Exibição de intervalo Adaptive Adaptativa Significant digits Dígitos Significativos Plus/minus Mais/menos Relative Concise Interval Calculation Cálculo de intervalo Variance formula Interval arithmetic Allow concise uncertainty input Complex number form Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Type Assumptions type Tipo Sign Assumptions sign Sinal Default assumptions Suposições padrão Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Factorize Fatorar Expand Expandir Add column Add row Remove column Remove row Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Decimal point Ponto decimal Previous result (static) Resultado anterior (estático) Multiplication Multiplicação Button Action Label: Etiqueta: Action: Ação: None Nenhum Value: Valor: Bitwise AND Bit-a-bit AND Bitwise Shift Deslocamento bit-a-bit Delete Excluir Backspace Backspace Addition Adição Plus Mais Subtraction Subtração Minus Menos Division Divisão Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear expression Limpar expressão Calculate expression Calcular expressão NamesEditDialog Name Nome Abbreviation Abreviação Plural Plural Reference Referência Avoid input Evitar entrada Unicode Unicode Suffix Sufixo Case sensitive Maiúsc. e Minúsculas Completion only Apenas conclusão Add Adicionar Edit Editar Remove Remover Warning Illegal name A function with the same name already exists. Uma função com o mesmo nome já existe. A unit or variable with the same name already exists. Uma unidade ou variável com o mesmo nome já existe. PercentageCalculationDialog Percentage Percentagem Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Alterar de 1 para 2 Change from 2 to 1 Alterar de 2 para 1 2 compared to 1 2 comparado a 1 1 compared to 2 1 comparado a 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Digite dois valores, dos quais no máximo um é uma porcentagem, e os outros serão calculados para você. Clear Limpar PeriodicTableDialog Periodic Table Tabela Periódica Element Data Dados do elemento Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatômico Diatomic Non-Metal Não-metal diatômico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas Unknown Desconhecido %1: %1: PlotDialog Plot Plotagem Data Dados Title: Título: Expression: Expressão: Function Função Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada Rows Linhas X variable: Variável X: Style: Estilo: Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontilhado Polar Polar Smoothing: Suavização: None Nenhum Monotonic Monotônica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotônica) Y-axis: Eixo Y: Primary Primário Secondary Secundário Add Adicionar Apply Aplicar Remove Remover Title Título Expression Expressão Function Range Faixa de Funções Minimum x value: Valor mínimo x: Maximum x value: Valor máximo x: Sampling rate: Taxa de amostragem: Step size: Tamanho do passo: Show real and imaginary parts Appearance Aparência Display grid Exibir grade Display full border Exibir borda completa Minimum y value: Valor mínimo y: Maximum y value: Valor máximo y: Logarithmic x scale: Escala logarítmica x: Logarithmic y scale: Escala logarítmica y: X-axis label: Etiqueta do eixo X: Y-axis label: Etiqueta do eixo Y: Line width: Espessura da linha: Legend placement: Posição da legenda: Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Calculating… Calculando… Cancel Cancelar Processing… Processando… PreferencesDialog Look && Feel Aparência Numbers && Operators Números e operadores Units && Currencies Unidades e moedas Parsing && Calculation Análise e cálculo Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Allow multiple instances Permitir várias instâncias Clear history on exit Limpar histórico ao sair Close application with Escape key Keep above other windows Window title: Título da janela: Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Workspace Espaço de trabalho Application name + workspace Nome do programa + espaço de trabalho Style: Estilo: Default (requires restart) Default style Dark mode Tema escuro Colorize result Custom result font Fonte do resultado personalizada Custom expression font Fonte da expressão personalizada Custom keypad font Fonte do teclado personalizada Custom application font Fonte do programa personalizada Custom result font: Fonte do resultado personalizada: Custom expression font: Fonte da expressão personalizada: Custom keypad font: Fonte do teclado personalizada: Custom application font: Fonte do programa personalizada: Display expression status Exibir status da expressão Expression after calculation: Keep expression Clear expression Limpar expressão Replace with result Replace with result if shorter Use keyboard keys for RPN Usar teclado para RPN Parsing mode: Modo de análise: Adaptive Adaptativa Conventional Convencional Implicit multiplication first Primeiro multiplicação implícita Chain RPN RPN Read precision Ler precisão Limit implicit multiplication Limitar multiplicação implícita Interval calculation: Cálculo de intervalo: Variance formula Interval arithmetic Factorize result Fatorar resultado Binary two's complement representation Representação binária do complemento para dois Hexadecimal two's complement representation Representação hexadecimal do complemento para dois Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais Spell out logical operators Soletrar operadores lógicos Use E-notation instead of 10^x Usar notação E em vez de 10^x Preferences Preferências ms milliseconds ms Use E-notation instead of 10^n Usar notação E em vez de 10^n Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use comma as decimal separator Usar vírgula como separador decimal Ignore comma in numbers Ignorar vírgula em números Ignore dots in numbers Ignorar pontos em números Round halfway numbers away from zero Round halfway numbers to even Arredondar números até a metade Indicate repeating decimals Indicar decimais repetidos Language: Idioma: Max history lines saved: Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Expression status: Status da expressão: Off Desligado In history list In expression field Status tooltip delay: Automatically calculate selection Expression in history: Parsed Entered Entered + parsed Automatically copy result Simplified percentage calculation Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binário Hexadecimal Hexadecimal Binary bits: Automatic Automática Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Copy unformatted ASCII by default Digit grouping: Agrupamento de dígitos: None Nenhum Standard Padrão Local Local Automatically group digits in input (experimental) Interval display: Exibição de intervalo: Significant digits Dígitos Significativos Interval Intervalo Plus/minus Mais/menos Concise Midpoint Ponto médio Lower Upper Rounding: Complex number form: Forma de nùmero complexo: Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Enable units Abbreviate names Abreviar nomes Use binary prefixes for information units Usar prefixos binários para unidades de informações Automatic unit conversion: No conversion Base units Unidades base Optimal units Unidades ideais Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Restart required Reinício necessário Please restart the program for the language change to take effect. Por favor, reinicie a aplicação para que a alteração de idioma tenha efeito. Default Padrão Calculate as you type delay: Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Ativar prefixos de denominador Enable units in physical constants Activar unidades em constantes físicas Temperature calculation: Absolute Relative Hybrid Exchange rates updates: Atualizações das taxas de câmbio: %n day(s) %n dia %n dias days dia dias QApplication Execute expressions and commands from a file FILE ARQUIVO Start a new instance of the application Iniciar uma nova instância do programa Specify the window title Especifica o título da janela TITLE TITLE Display the application version Exibir a versão do programa Open workspace Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %1 é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão salvas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? Allow multiple instances? %1 is already running. Failed to load global definitions! Falha ao carregar definições globais! answer resposta History Answer Value Valor da resposta do histórico History Index(es) Índice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. Last Answer Última resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Error Couldn't write preferences to %1 Não foi possível gravar preferências em %1 Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. Unsupported base. Base não suportada. Unsupported value. QalculateQtSettings Update exchange rates? Atualizações das taxas de câmbio? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Faz %n dia desde a última atualização das taxas de câmbio. Deseja atualizar as taxas de câmbio agora? Faz %n dias desde a última atualização das taxas de câmbio. Deseja atualizar as taxas de câmbio agora? Fetching exchange rates. Buscando taxas de câmbio. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Buscando taxas de câmbio… Error Warning Information Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %1 Falha ao executar o script de atualização. %1 Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %1 is available at %2. Do you wish to update to version %3? Uma nova versão do %1 está disponível em %2. Deseja atualizar para a versão %3. A new version of %1 is available. You can get version %3 at %2. Uma nova versão do %1 está disponível. Você pode obter a versão %3 em %2. Download %1: %2 Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Approximate result Negate Negar Invert Inverter Insert unit Inserir unidade Insert text Inserir texto Insert operator Insert date Inserir data Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert Converter Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: excluir registro RPN: clear stack RPN: limpar pilha Set expression base Definir base de expressão Set result base Definir base de resultados Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Alternar modo RPN Show general keypad Toggle programming keypad Alternar teclado de programação Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Pesquisar no histórico Clear history Limpar histórico Show variables Show functions Show units Show data sets Store result Guardar resultado MC (memory clear) MR (memory recall) MS (memory store) M+ (memory plus) M− (memory minus) New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de porcentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Insert result Open mode menu Open menu Help Ajuda Quit Sair Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Limpar expressão Delete Excluir Backspace Backspace Home End Right Left Up Acima Down Abaixo Undo Desfazer Redo Refazer Calculate expression Calcular expressão Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Padrão Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Cancelar Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu New Novo Function… Função… Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Workspaces Espaços de trabalho Open… Abrir… Open default Abrir padrão Save Salvar Save As… Salvar como… Import CSV File… Importar arquivo CSV… Export CSV File… Exportar arquivo CSV… Functions Funções Variables and Constants Variáveis e constantes Units Unidades Plot Functions/Data Funções/dados de plotagem Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Calendar Conversion Conversão de calendário Update Exchange Rates Atualizar taxas de câmbio Normal Mode Modo normal RPN Mode Modo RPN Chain Mode Keyboard Shortcuts Atalhos do teclado Preferences Preferências Help Ajuda Report a Bug Reportar um erro Check for Updates Verificar atualizações About %1 Sobre o %1 Quit Sair Mode Modo Mode (%1) Modo (%1) General Display Mode Modo de exibição geral Normal Normal Scientific Científica Engineering Engenharia Simple Simples Angle Unit Unidade de ângulo Radians Radianos Degrees Graus Gradians Grados Approximation Aproximação Automatic Automatic approximation Automática Dual Dual approximation Dupla Exact Exact approximation Exato Approximate Aproximado Assumptions Suposições Type Assumptions type Tipo Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Sign Assumptions sign Sinal Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Result Base Base de resultados Binary Binário Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Outro Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Formato de hora Roman numerals Números romanos Unicode Unicode Bijective base-26 Base bijetiva-26 Binary-encoded decimal (BCD) Codificação binária decimal Custom: Number base Expression Base Base de expressão Other: Number base Outra: Precision: Precisão: Min decimals: Decimais mínimos: Max decimals: Decimais máximos: off Max decimals desligado Convert Converter Convert (%1) Converter (%1) Store Armazenar Store (%1) Guardar (%1) Functions (%1) Funções (%1) Keypad Teclado Keypad (%1) Teclado (%1) Number bases Bases numéricas Unit… Unidade… Data Sets Conjuntos de dados Percentage Calculation Tool Ferramenta de Cálculo de Porcentagem Periodic Table Tabela Periódica Units (%1) Unidades (%1) Plot Functions/Data (%1) Funções/dados de plotagem (%1) Number Bases (%1) Bases numéricas (%1) Binary: Binário: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pilha RPN Rotate the stack or move the selected register up (%1) Gire a pilha ou mova o registro selecionado para cima (%1) Rotate the stack or move the selected register down (%1) Gire a pilha ou mova o registro selecionado para baixo (%1) Swap the top two values or move the selected value to the top of the stack (%1) Troque os valores superiores ou mova o valor selecionado para o topo da pilha (%1) Copy the selected or top value to the top of the stack (%1) Copie o valor selecionado ou superior para o topo da pilha (%1) Enter the top value from before the last numeric operation (%1) Digite o valor superior antes da última operação numérica (%1) Delete the top or selected value (%1) Excluir o valor selecionado ou superior (%1) Clear the RPN stack (%1) Limpar a pilha RPN (%1) New Function… Nova função… Favorites Favoritos Recent Recentes User functions Funções de usuário Open dialog Show all functions User units Unidades de usuário more mais Prefixes Prefixos Show all units User variables Variáveis de usuário Show all variables Powerful and easy to use calculator Calculadora potente e fácil de usar License: GNU General Public License version 2 or later Error Couldn't write definitions Não foi possível gravar definições hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal latitude longitude time hora Time zone parsing failed. Falha na análise do fuso horário. bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar phasor fasor angle ângulo optimal ideal base base mixed mesclado fraction fração factors fatores Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad Copy Copiar prefix prefixo partial fraction fração parcial decimals factorize fatorar expand expandir Calculating… Calculando… Cancel Cancelar RPN Operation Operação RPN Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Converting… Convertendo… RPN Register Moved Registro RPN Movido Processing… Processando… Matrix Matriz Temperature Calculation Mode The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Absolute Relative Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Only dot as decimal separator Parsing Mode Modo de análise The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first Primeiro multiplicação implícita Conventional Convencional Adaptive Adaptativa Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Adicionar ação (%1) Edit Keyboard Shortcut New Keyboard Shortcut Novo atalho de teclado Action: Ação: Value: Valor: Set key combination Definir combinação de teclas Press the key combination you wish to use for the action. Pressione a combinação de teclas que deseja usar para a ação. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? A combinação de teclas já está em uso. Deseja substituir a ação atual (%1)? Question Add… Adicionar… Edit… Editar… Remove Remover Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. Example: Example of function usage Exemplo: Enter RPN Enter Enter Calculate Calcular Apply to Stack Aplicar à pilha Insert Inserir Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Não perguntar novamente Keep open Manter aberto Value Valor Argument Argumento %1: %1: Plot Plotagem General Geral Programming Programação Algebra Álgebra Custom None Nenhum Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar e segurar</i>: %1 Open menu Number Bases Bases Numéricas Rotate the stack or move the selected register up Gire a pilha ou mova o registro selecionado para cima Rotate the stack or move the selected register down Gire a pilha ou mova o registro selecionado para baixo Swap the top two values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Delete the top or selected value Excluir o valor selecionado ou superior Enter the top value from before the last numeric operation Digite o valor superior antes da última operação numérica Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Clear the RPN stack Limpar a pilha RPN Action Ação Key combination Combinação de teclas True Verdadeiro False Falso Info Informação optional optional argument opcional Failed to open %1. %2 Falha ao abrir %1. %2 UnitEditDialog General Geral Relation Relação Name: Nome: Category: Categoria: Descriptive name: Nome descritivo: System: Sistema: Imperial Imperial US Survey US Survey Hide unit Ocultar unidade Description: Descrição: Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s): Unidade(s) base: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Exponent: Expoente: Relation: Relação: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número.<br><br>Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273,15" para a relação entre graus Celsius e Kelvin). Inverse relation: Relação inversa: Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base Priority: Prioridade: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Número mínimo da unidade base: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Use com prefixos por padrão Base unit does not exist. A unidade base não existe. Error A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Question A variable or unit with the same name already exists. Do you want to overwrite it? Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unit Editar Unidade New Unit Nova unidade UnitsDialog Units Unidades Category Categoria Unit Unidade New… Novo… Edit… Editar… Deactivate Desativar Delete Excluir Convert Converter Insert Inserir Favorite Favorito Show hidden units Mostrar unidades ocultas Activate Ativar All All units Todas Uncategorized Sem categoria User units Unidades de usuário Favorites Favoritos Inactive Inativo UnknownEditDialog Name: Nome: Custom assumptions Suposições personalizadas Type: Tipo: Sign: Sinal: Temporary Temporária Question A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unknown Variable Editar Variável Desconhecida New Unknown Variable Nova variável desconhecida VariableEditDialog Name: Nome: Temporary Temporária Value: Valor: Required Obrigatório Description Descrição current result resultado atual Category: Categoria: Descriptive name: Nome descritivo: Hide variable Ocultar variável Description: Descrição: Question A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable Editar Variável New Variable Nova Variável VariablesDialog Variables Variáveis Category Categoria Variable Variável New Novo Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Edit… Editar… Export… Exportar… Deactivate Desativar Delete Excluir Insert Inserir Favorite Favorito a matrix uma matriz a vector um vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero integer inteiro boolean boleano rational racional real real complex complexo number número not matrix não matriz unknown desconhecido Default assumptions Suposições padrão Activate Ativar All All variables Todas Uncategorized Sem categoria User variables Variáveis de usuário Favorites Favoritos Inactive Inativo qalculate-qt-5.5.1/translations/qalculate-qt_pt_PT.ts000066400000000000000000016036121475705355700227460ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora potente e fácil de usar calculation;arithmetic;scientific;financial; calculadora;aritmética;científica;financeira; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! é uma calculadora para desktop multiplataforma e multiuso. É simples de usar, mas fornece poder e versatilidade normalmente vistas em pacotes de matemática complicados, além de ferramentas úteis para as necessidades diárias (como conversão de moeda e cálculo de percentagem). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Os recursos incluem uma grande biblioteca de funções personalizáveis, cálculos e conversão de unidades, constantes físicas, cálculos simbólicos (incluindo integrais e equações), precisão arbitrária, propagação de erros, aritmética de intervalos, plotagem e uma interface amigável. Argument Rules Regras de argumento _Cancel _Cancelar Do not save modifications Não gravar modificações _OK _OK Accept the modification of argument rules Aceitar modificação de regras de argumento Enable rules and type test Ativar regras e teste de tipo Custom condition Condição personalizada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx Keyboard Shortcuts Atalhos do teclado _Close _Fechar Label Etiqueta Left-click Botão esquerdo Right-click Botão direito Middle-click Botão do meio Reset Redefinir Value Valor Argument name Nome do argumento Calendar Conversion Conversão de calendário Export CSV File Exportar ficheiro CSV Current result Resultado atual Matrix/vector variable Variável matriz/vetor File Ficheiro Delimiter Delimitador Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Import CSV File Importar ficheiro CSV Do not import the file Não importar o ficheiro Import the file Importar o ficheiro Name of the data file to import Nome do ficheiro de dados a ser importado Select a file Selecionar um ficheiro Import as Importar como Matrix Matriz If a matrix shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do ficheiro Vectors Vetores If vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do ficheiro Name Nome Name (or name prefix) used to reference generated variable(s) in expressions Nome (ou prefixo do nome) usado para referenciar variáveis geradas em expressões Descriptive name Nome descritivo Title displayed in menus and in variable manager Título exibido nos menus e no gestor de variáveis Category Categoria First row Primeira linha The first row with data to import in the file A primeira linha com dados a serem importados no ficheiro Includes headings Incluir cabeçalhos If the first row contains column headings Se a primeira linha deve conter cabeçalhos de coluna Delimiter used to separate columns in the file Delimitador usado para separar colunas no ficheiro Custom delimiter Delimitador personalizado Edit Data Property Editar propriedades de dados Do not create/modify this data set Não criar/modificar este conjunto de dados Accept the creation/modification of this data set Aceitar a criação/modificação deste conjunto de dados Name used for reference Nome usado para referência Properties Propriedades Title displayed in menus and in data set manager Título exibido nos menus e no gestor de conjunto de dados Description Descrição Description of this data property Descrição desta propriedade de dados Value Type Tipo de valor Text Texto Number Número Expression Expressão Hide Ocultar Use as key Usar como chave Approximate value Valor aproximado Case sensitive value Valor sensível a maiúsculas e minúsculas Value uses brackets Valor usa colchetes Unit expression Expressão de unidade Edit Data Set Editar conjunto de dados Title Título Data file Ficheiro de dados Description of this data set Descrição deste conjunto de dados Copyright Direitos autorais General Geral Properties: Propriedades: Definition of the properties of this data set Definição das propriedades deste conjunto de dados _New _Novo _Edit _Editar _Delete _Eliminar Name used to invoke the function in expressions Nome usado para chamar a função em expressões Object argument name Nome do argumento do objeto Property argument name Nome do argumento da propriedade Default property Propriedade padrão Function Função Edit Data Object Editar Objeto de Dados Do not create/modify this data object Não criar/modificar este objeto de dados Accept the creation/modification of this data object Aceitar a criação/modificação deste objeto de dados Data Sets new dataset Conjuntos de dados Data Set Conjunto de dados Create a new data set Criar um novo conjunto de dados Edit the selected data set Editar o conjunto de dados selecionado Delete the selected data set Eliminar o conjunto de dados selecionado Objects Objetos Create a new data object Criar um novo objeto de dados Edit the selected data object Editar o objeto de dados selecionado Remove the selected data object Remover o objeto de dados selecionados Data Set Description Descrição do conjunto de dados Object Attributes Atributos do objeto Decimals Decimais Close this window Fechar esta janela Min decimals Decimais mínimos Max decimals Decimais máximos Minimal number of displayed decimals Número mínimo de casas decimais exibidas Maximal number of decimals to display (and round to) Número máximo de casas decimais a serem exibidas (e arredondadas) Floating Point Conversion Conversão de ponto flutuante Decimal value Valor decimal Binary value Valor binário Octal value Valor octal Hexadecimal representation Representação hexadecimal Conversion error Erro de conversão Binary representation Representação binária Floating point value Valor do ponto flutuante Format Formato 16-bit (half precision) 16-bit (precisão média) 32-bit (single precision) 32-bit (precisão única) 64-bit (double precision) 64-bit (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Hexadecimal value Valor hexadecimal Edit Function Editar Função _Help _Ajuda Do not create/modify this function Não criar/modificar esta função Accept the creation/modification of this function Aceitar a criação/modificação desta função Name used to invoke this function in expressions Nome usado para chamar esta função em expressões Title displayed in menus and in function manager Título exibido nos menus e no gestor de funções Hide function Ocultar função If this function shall be hidden in menus Caso a função esteja oculta nos menus Description of this function Descrição desta função Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Use \x para o primeiro, \y para o segundo e \z para o terceiro argumento. Para mais informações, clique no botão de ajuda. Condition Condição Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-Functions Subfunções Arguments: Argumentos: Definition of this function's arguments Definição dos argumentos desta função Free Livre Integer Inteiro Symbol Símbolo Date Data Vector Vetor Positive number Número positivo Non-zero number Número diferente de zero Non-negative number Número não-negativo Positive integer Número inteiro positivo Non-zero integer Inteiro diferente de zero Non-negative integer Inteiro não-negativo Boolean Boleano Object Objeto Unit Unidade Variable Variável Angle Ângulo Data object Onjeto de dados Data property Propriedade de dados _Add _Adicionar Add entered argument definition Adicionar definição de argumento inserido _Apply _Aplicar Modify selected argument Modificar argumento selecionado Remove selected argument Remover argumento selecionado Rules Regras Edit conditions for selected argument Editar condições para o argumento selecionado Close this dialog Fechar este diálogo Precalculate Pré-calcular Calculate the subfunction only once, before the parent function Calcular a subfunção apenas uma vez, antes da função pai Add entered subfunction Adicionar subfunção inserida Apply changes to the selected subfunction Aplicar alterações à subfunção selecionada Remove the selected subfunction Remover a subfunção selecionada Functions Funções Create a new function Criar uma nova função Edit the selected function Editar a função selecionada _Insert _Inserir Insert (or execute) the selected function into the expression entry Inserir (ou executar) a função selecionada na entrada da expressão Delete the selected function Eliminar a função selecionada (De)activate the selected function Desativar a função selecionada Deacti_vate Desati_var Apply the selected function to the current expression Aplicar função selecionada à expressão atual Categor_y Categor_ia _Function _Função Descri_ption Desc_rição Degrees Graus Radians Radianos Gradians Grados Default assumptions Suposições padrão Unknown Desconhecido Not Matrix Não-matriz Complex Complexo Real Real Rational Racional Non-Zero Diferente de zero Positive Positivo Non-Negative Não-negativo Negative Negativo Non-Positive Não-positivo _File _Ficheiro Unknown Variable Variável desconhecida Function (simplified) Função (simplificada) Import CSV File… Importar ficheiro CSV… Export CSV File… Exportar ficheiro CSV… _Store Result… _Guardar resultado… Save Result Image… Gravar imagem do resultado… Save local functions, variables and units Gravar funções, variáveis e unidades Save Definitions Gravar definições Import Definitions File… Importar ficheiro de definições… Fetch current exchange rates from the Internet Buscar taxas de câmbio atualizadas na Internet Update Exchange Rates Atualizar taxas de câmbio Plot Functions/Data Funções/dados de plotagem Convert Number Bases Converter bases numéricas Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Percentage Calculation Tool Ferramenta de Cálculo de Percentagem Periodic Table Tabela Periódica Minimal Window Janela mínima _Quit _Sair Manage Variables Gerenciar Variáveis Manage Functions Gerenciar Funções Manage Units Gerenciar Unidades Manage Data Sets Gerenciar Conjuntos de Dados Factorize Fatorar Expand Expandir Apply partial fraction decomposition to the current result. Aplicar decomposição de fração parcial ao resultado atual. Expand Partial Fractions Expandir Frações Parciais Set Unknowns… Definir Incógnitos… Convert to Unit Converter em Unidade Set Prefix Definir Prefixo Convert to Unit Expression… Converter em Expressão de Unidade… Convert to Base Units Converter em Unidades Base Convert to Optimal Unit Converter em Unidade Ideal Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Insert Vector… Inserir Vetor… _Copy Result _Copiar resultado Customize Keypad Buttons Personalizar botões do teclado _Preferences _Preferências _Mode _Modo Number Base Base numérica Select Result and Expression Base… Selecionar resultado e base de expressão… Binary Binário Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Outro… Sexagesimal Sexagesimal Time Format Formato da hora Roman Numerals Números romanos Numerical Display Exibição numérica Normal Normal Engineering Engenharia Scientific Científica Purely Scientific Puramente Científica Simple Simples Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desativado: 1/7 ≈ 0.14285714 Ativado: 1/7 = 0.142857 142857... Indicate Repeating Decimals Indicar decimais repetidos Show Ending Zeroes Mostrar zeros finais Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desativado: 2.5 ≈ 3, 1.5 ≈ 2 Ativado: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Arredondar números até a metade Off: -x + y On: y - x Desativado: -x + y Ativado: y - x Sort Minus Last Classificar menos último Complex Rectangular Form Forma retangular complexa Complex Exponential Form Forma exponencial complexa Complex Polar Form Forma polar complexa Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Rational Number Form Forma do número racional 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Frações decimais 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Frações decimais exatas 6/4 = 3/2 6/4 = 3/2 Simple Fractions Frações simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Frações mistas Interval Display Exibição de intervalo Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desativado: 1/2*pi ≈ 1.5707963 Ativado: 1/2*pi = 0.5 pi Adaptive Adaptativa Calculates an interval of possible values and keeps track of precision changes. Calcula um intervalo de valores possíveis e acompanha mudanças de precisão. Significant Digits Dígitos Significativos Interval Intervalo Plus/Minus Mais/Menos Midpoint Ponto médio Unit Display Exibir Unidade Do not use any prefixes in result Não usar nenhum prefixo no resultado Show prefixes for primarily SI and CGS units. Mostrar prefixos principalmente para unidades SI e CGS. Use prefixes for selected units Usar prefixos para unidades selecionadas Use prefixes also for currencies Usar prefixos também para moedas Use prefixs for all units Usar prefixos em todas as unidades Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Permite o uso automático de hekto, deka, deci e centi quando os prefixos estão ativados Enable All SI Prefixes Ativar Todos os Prefixos SI Enables automatic setting of prefix for denominator in addition to the numerator Ativar a configuração automática de prefixo para o denominador, além do numerador Enable Denominator Prefixes Ativar Prefixos de Denominador Off: J / K On: J * K^-1 Desativado: J / K Ativado: J * K^-1 Negative Exponents Expoentes negativos Off: (2 m)/s On: 2 (m/s) Desativado: (2 m)/s Ativado: 2 (m/s) Place Units Separately Colocar unidades separadamente No Additional Conversion Nenhuma conversão adicional Convert to Optimal SI Unit Converter em unidade SI ideal If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Se ativado: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Converter em unidades mistas Abbreviate Names Abreviar nomes Enabled Objects Objetos ativados Variables Variáveis Units Unidades Unknowns Desconhecidos Units in Physical Constants Unidades em constantes físicas If not enabled, treats all variables as unknown Se não estiver ativado, trata todas as variáveis como desconhecidas Calculate Variables Calcular variáveis Disables/enables complex numbers in result Desativar/ativar números complexos no resultado Allow Complex Result Permitir resultado complexo Disables/enables infinite numbers in result Desativar/ativar números infinitos no resultado Allow Infinite Result Permitir resultado infinito Approximation Aproximação Always Exact Sempre exato Try Exact Tentar exato Approximate Aproximado Interval Arithmetic Aritmética de intervalo Interval Calculation Cálculo de intervalo Variance Formula Fórmula de variância Change angle unit used in trigonometric functions Alterar unidade de ângulo usada em funções trigonimétricas Angle Unit Unidade de ângulo None Nenhum Assumptions Suposições Algebraic Mode Modo Algébrico Assume that unknown denominators are non-zero Assume que os denominadores incógnitos são diferentes de zero Non-Zero Denominators Denominadores diferentes de zero Warn when unknown denominators are assumed non-zero Avisar quando denominadores incógnitos são assumidos diferentes de zero Warn About Denominators Assumed Non-Zero Avisar sobre denominadores considerados diferentes de zero Parsing Mode Modo de análise Adaptive Parsing Análise adaptativa Parse Implicit Multiplication First Analisar primeiro multiplicação implícita Conventional Parsing Análise convencional RPN Syntax Sintaxe RPN Off: xy = x*y On: xy != x*y Desativado: xy = x*y Ativado: xy != x*y Limit Implicit Multiplication Limitar multiplicação implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analisa números decimais como aproximados com precisão igual ao número de dígitos. Desativado: 1.1 * 1.1 = 1.21 Ativado: 1.1 * 1.1 ≈ 1.2 Read Precision Ler precisão _Precision _Precisão _Decimals _Decimais Calculate As You Type Calcular ao digitar Activate the RPN stack. Ative a pilha RPN. RPN Mode Modo RPN Meta Modes Meta Modos Save Mode… Gravar modo… Delete Mode… Eliminar modo… Save Default _Mode Gravar _modo padrão Fu_nctions Fu_nções _Variables _Variáveis _Units _Unidades _Contents _Conteúdo Report a Bug Reportar um erro Check for Updates Verificar atualizações _About _Sobre Toggle minimal window Alternar janela mínima Calculation result Resultado do cálculo _Keypad _Teclado Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Ativar teclado persistente (permite exibir o teclado e o histórico simultaneamente) _History _Histórico C_onversion C_onversão RPN Stack Pilha RPN Insert the selected value Inserir o valor selecionado Insert the selected text Inserir o texto selecionado Copy the selected text Copiar o texto selecionado Add the selected value(s) Adicionar os valores selecionados Subtract the selected value(s) Subtrair os valores selecionados Multiply the selected value(s) Multiplicar os valores selecionados Divide the the selected value(s) Dividir os valores selecionados Raise to the power of the selected value Aumentar a potência do valor selecionado Calculate the square root of the selected value Calcular a raiz quadrada do valor selecionado History Histórico Subtract the top value from the second value Subtrair o valor superior do segundo valor Multiply the top two values Multiplicar os dois principais valores Divide the second value by the top value Dividir o segundo valor pelo valor superior Raise the second value to the power of the top value Aumentar o segundo valor para a potência do valor superior Negate the top value (Ctrl+-) Negar o valor superior (Ctrl+-) Invert the top value Inverter o valor superior Calculate the square root of the top value Calcular a raiz quadrada do valor superior Calculate the sum of all values Calcular a soma de todos os valores Rotate the stack or move selected register up Gire a pilha ou mova o registo selecionado para cima Rotate the stack or move selected register down Gire a pilha ou mova o registo selecionado para baixo Swap the two top values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Enter the top value from before the last numeric operation Digite o valor superior antes da última operação numérica Delete the top or selected value Eliminar o valor selecionado ou superior Edit the selected value Editar o valor selecionado Clear the RPN stack Limpar a pilha RPN Unit(s) and prefix to convert result to Unidade(s) e prefixo para converter o resultado em Convert Converter Continuous conversion Conversão contínua Automatically convert result to the current unit expression as long as the conversion box is visible. Converter automaticamente o resultado na expressão de unidade atual, desde que a caixa de conversão esteja visível. Add prefix Adicionar prefixo If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Se a expressão da unidade não contiver nenhum prefixo, use o prefixo ideal. Isso pode ser substituído ao adicionar a expressão da unidade com "?" ou "0". Conversion Conversão Show/hide programming keypad Mostrar/ocultar teclado de programação Exact Exato Fraction Fração Numerical display Exibição numérica Pure Puro Number base Base numérica Time format Formato de tempo Roman Romano sin sin cos cos tan tan ln ln Equals Igual a sqrt sqrt sum sum Unknown variable Variável desconhecida mod mod mean mean Store result as a variable Guardar o resultado como uma variável STO Standard calculator button. Do not use more than three characters. STO Convert number bases Converter bases numéricas Imaginary unit i (√-1) Unidade imaginária i (√-1) Manage units Gerenciar unidades Conversion operator Operador de conversão Kilogram Quilograma Two's complement input Entrada do complemento para dois Two's complement output Saída do complemento para dois Bitwise Exclusive OR OR exclusivo bit-a-bit Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit Floating point conversion Conversão de ponto flutuante Show/hide left keypad Mostrar/ocultar teclado esquerdo Show/hide right keypad Mostrar/ocultar teclado direito DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultado anterior ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Adicionar à Expressão Persistent Keypad Teclado persistente Edit Editar Delete Eliminar Update Atualizar Insert Value Inserir valor Insert Text Inserir texto Insert Parsed Text Inserir texto analisado Copy Copiar Copy Full Text Copiar todo o texto Search… Procurar… Add Bookmark… Adicionar marcador… Bookmarks Marcador Protect Proteger Move To Top Mover para o topo Remove Remover Clear All Limpar tudo _Copy _Copiar _Store… _Armazenar… Save Image… Gravar imagem… _Factorize _Fatorar _Expand _Expandir _Normal _Normal Sc_ientific C_ientífica Purel_y Scientific Pura_mente científica Simp_le Simp_les _Binary _Binária _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fração decimal Exact Decimal Fraction Fração decimal exata Simple Fraction Fração simples Mixed Fraction Fração mista _Abbreviate Names _Abreviar nomes C_onvert… C_onverter… Convert to Base _Units Converter em _unidades base Convert _to Optimal Unit Conver_ter em unidade ideal Use Optimal Prefix Usar prefixo ideal Convert to Converter para Convert to UTC Converter para UTC Convert to Calendars Converter em calendários Use prefixes for all units Usar prefixos em todas as unidades Enable All SI Prefi_xes Ativar Todos os Prefi_xos SI View/Edit Matrix Ver/Editar Matriz View/Edit Vector Ver/Editar Vetor Copy Text Copiar texto To Top Para cima Swap Trocar Up Acima Down Abaixo Negate Negar Invert Inverter Square Quadrado Square Root Raiz quadrada Clear Stack Limpar pilha Select Number Base… Selecionar Base Numérica… Store result Guardar resultado Insert the matrix/vector into the expression Inserir a matriz/vetor na expressão Rows Linhas Number of rows in this matrix (rows displayed for vectors) Número de linhas nesta matriz (linhas exibidas para vetores) Columns Colunas Number of columns in this matrix (columns displayed for vectors) Número de colunas nesta matriz (colunas exibidas para vetores) If this is a matrix or vector Se isso é uma matriz ou vetor Elements Elementos Current element: Elemento atual: Edit Matrix Editar Matriz Do not create/modify this matrix/vector Não criar/modificar esta matriz/vetor Create/modify the matrix/vector Criar/modificar esta matriz/vetor Accept the creation/modification of this matrix/vector Aceitar a criação/modificação desta matriz/vetor Name used to reference this variable in expressions Nome usado para referenciar esta variável em expressões Names Nomes Add new name Adicionar novo nome Apply changes to the selected name Aplicar alterações ao nome selecionado Remove the selected name Remover o nome selecionado Abbreviation Abreviação Unicode Unicode Plural Plural Suffix Sufixo Reference Referência Avoid input Evitar entrada Case sensitive Maiúsc. e Minúsculas Completion only Apenas preenchimento Number Bases Bases Numéricas Roman numerals Números romanos BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Subtrair Multiply Multiplicar Divide Dividir Bitwise AND Bit-a-bit AND Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear Limpar Enter two values, of which at most one is a percentage, and the others will be calculated for you. Digite dois valores, dos quais no máximo um é uma percentagem, e os outros serão calculados para você. Percentage Percentagem Calculate Calcular Value 1 Valor 1 2 compared to 1 2 comparado a 1 Change from 1 to 2 Alterar de 1 para 2 Value 2 Valor 2 1 compared to 2 1 comparado a 2 Change from 2 to 1 Alterar de 2 para 1 Plot Plotagem _Save _Gravar Save as png, svg, postscript, eps, latex or fig Gravar como png, svg, postscript, eps, latex ou fig Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada if you want to split matrix in rows instead of columns se desejar dividir a matriz em linhas em vez de colunas X variable Variável X The variable name used in expression O nome da variável usada na expressão Style Estilo Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontilhado Smoothing Suavização Monotonic Monotónica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotónica) Y-axis Eixo Y Primary Primário Secondary Secundário _Remove _Remover Data Dados Minimum x value Valor mínimo x Maximum x value Valor máximo x Sampling rate Taxa de amostragem Step size Tamanho do passo Function Range Faixa de Funções Display grid Exibir grade Display full border Exibir borda completa Minimum y value Valor mínimo y Maximum y value Valor máximo y Logarithmic x scale Escala logarítmica x Logarithmic y scale Escala logarítmica y X-axis label Etiqueta do eixo X Y-axis label Etiqueta do eixo Y Line width Espessura da linha Color display Exibição de cores Color Cores Monochrome Monocromática Legend placement Posição da legenda Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Appearance Aparência Precision Precisão _Recalculate _Recalcular Recalculate expression Recalcular expressão The number of significant digits to display/calculate (simple arithmetics are always calculated exact) O número de dígitos significativos a serem exibidos/calculados (aritmética simples é sempre calculada exatamente) Preferences Preferências Save mode on exit Gravar modo ao sair If the mode of the calculator shall be restored Para que o modo da calculadora seja restaurado Save definitions on exit Gravar definições ao sair If changes to functions, units and variables shall be saved automatically Para que alterações em funções, unidades e variáveis sejam guardadas automaticamente Clear history on exit Limpar histórico ao sair Allow multiple instances Permitir várias instâncias Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permite que várias instâncias da janela principal do Qalculate! sejam abertas. Observe que apenas o modo, histórico e definições da última instância fechada serão guardados. Notify when a new version is available Notificar quando uma nova versão estiver disponível Use keyboard keys for RPN Usar teclado para RPN Use keyboard operator keys for RPN operations (+-*/^). Usar as teclas de operação no teclado para operações RPN (+-*/^). Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Inserir XOR (⊻) usando circunflexo (^) no teclado (caso contrário, use Ctrl+^). O operador de exponenciação (^) sempre pode ser inserido ao usar Ctrl+*. Time limit for plot: Tempo limite para plotagem: Behavior Comportamento Enable Unicode symbols Ativar símbolos Unicode Disable this if you have problems with some fancy characters Desative isso se você tiver problemas com alguns caracteres extravagantes Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Remember window position Lembrar posição da janela Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Mode Modo Application name + mode Nome do programa + modo Window title Título da janela Default Padrão Number of expression lines Número de linhas de expressão Display expression status Exibir estado da expressão If as-you-type expression status shall be displayed below the expression entry Para que o estado da expressão, conforme você digita, seja exibido abaixo da entrada da expressão Persistent keypad Teclado persistente Look & Feel Aparência Binary two's complement representation Representação binária do complemento para dois If two's complement representation shall be used for negative binary numbers. Para que a representação do complemento para dois seja usada para números binários negativos. Hexadecimal two's complement representation Representação hexadecimal do complemento para dois If two's complement representation shall be used for negative hexadecimal numbers. Para que a representação do complemento para dois seja usada para números hexadecimais negativos. Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais If lower case letters should be used in numbers with non-decimal base Para que letras minúsculas sejam usadas em números com base não-decimal Alternative base prefixes Prefixos base alternativos If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Para que números hexadecimais sejam exibidos com "0x0" e números binários com "0b00" como prefixos Spell out logical operators Soletrar operadores lógicos If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Para que o lógico and/or seja exibido como "&&"/"||" ou "and"/"or" If "e" shall be used instead of "E" in numbers Para que "e" seja usado em vez de "E" em números Use E-notation instead of 10<sup><i>n</i></sup> Usar notação E em vez de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usar letras minúsculas "e" (como em 1e10) Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Usar 'j' (em vez de 'i') como símbolo padrão para a unidade imaginária e coloque-o na frente da parte imaginária. Use comma as decimal separator Usar vírgula como separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permite que pontos, '.', sejam usados como separador de milhares em vez de como um sinal decimal alternativo Ignore comma in numbers Ignorar vírgula em números Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permite que vírgulas, ',', sejam usadas como separador de milhares em vez de como separador de argumentos de função Ignore dots in numbers Ignorar pontos em números Digit grouping Agrupamento de dígitos off desligado standard padrão local local Multiplication sign Sinal de multiplicação Division sign Sinal de divisão Copy digit separator Copiar separador de dígitos Deactivate to remove digit separator when copying result Desative para remover o separador de dígitos ao copiar o resultado Numbers & Operators Números e operadores Use binary prefixes for information units Usar prefixos binários para unidades de informações Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usar prefixos binários, em vez de decimais, como padrão para unidades de informação (ex. bytes). Conversion to local currency Conversão para moeda local Automatically convert to the local currency when optimal unit conversion is activated. Converter automaticamente para a moeda local quando a conversão ideal de unidades estiver ativada. Update exchange rates on start Atualizar taxas de câmbio ao inicializar If current exchange rates shall be downloaded from the internet at program start Para que as taxas de câmbio sejam baixadas da internet no início do programa Exchange rates updates Atualizações das taxas de câmbio Units & Currencies Unidades e moedas Show expression completion suggestions Mostrar sugestões de preenchimento de expressão Search titles and countries Pesquisar títulos e países Minimum characters Caracteres mínimos Popup delay (ms) Atraso da janela pop-up (ms) Completion Preenchimento Status warning color Cor do estado de erro Status error color Cor do estado de erro Custom status font Fonte de estado personalizada If you want to use a font other than the default in the status display below the expression entry Se você desejar usar uma fonte diferente da padrão na exibição de estado abaixo da entrada da expressão Custom expression font Fonte da expressão personalizada If you want to use a font other than the default in the expression entry Se você desejar usar uma fonte diferente da padrão na entrada da expressão Custom result font Fonte do resultado personalizada If you want to use a font other than the default in the result display Se você desejar usar uma fonte diferente da padrão na exibição do resultado Custom keypad font Fonte do teclado personalizada If you want to use a font other than the default in the keypad Se você desejar usar uma fonte diferente da padrão no teclado Custom application font Fonte do programa personalizada If you want to use a font other than the default for the whole application Se você desejar usar uma fonte diferente da padrão em todo o programa Text color Cor do texto Fonts & Colors Fontes e cores Other: Outra: Bijective base-26 Base bijetiva-26 <b>Result Base</b> <b>Resultado da Base</b> <b>Expression Base</b> <b>Base de Expressão</b> New Keyboard Shortcut Novo atalho de teclado Edit Variable Editar Variável Advanced Avançado Accept the creation/modification of this variable Aceitar a criação/modificação desta variável x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Use x, y e z para o 1º, 2º e 3º argumento da função, respectivamente. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. Isso evita possíveis conflitos com variáveis, funções e unidades. Edit Unit Editar Unidade Do not create/modify this unit Não criar/modificar esta unidade Accept the creation/modification of this unit Aceitar a criação/modificação desta unidade Singular form of this unit's name Forma singular do nome desta unidade Title displayed in menus and in unit manager Título exibido nos menus e no gestor de unidades System Sistema Imperial Imperial US Survey US Survey Hide unit Ocultar unidade If this unit shall be hidden in menus Caso a unidade esteja oculta nos menus Class Classe Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s) Unidade(s) base Exponent Expoente Exponent of the base unit Exponent of the base unit Relation Relação Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número. Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273.15" para a relação entre graus Celsius e Kelvin). Relation is exact Relação é exata If the relation is precise Se a relação é precisa Inverse relation Relação inversa Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decide com quais unidades a unidade base é mesclada se existirem várias opções. - A unidade original não será mesclada com unidades de menor prioridade. - Um valor mais baixo significa prioridade mais alta. Priority Prioridade Minimum base unit number Número mínimo da unidade base Use with prefixes by default Use com prefixos por padrão Create a new unit Criar uma nova unidade Edit the selected unit Editar a unidade selecionada Insert the selected unit into the expression entry Inserir a unidade selecionada na entrada da expressão C_onvert C_onverter Convert the result to the selected unit Converter o resultado na unidade selecionada Delete the selected unit Eliminar a unidade selecionada (De)activate the selected unit Desativar a unidade selecionada _Unit _Unidade Convert between units Converter entre unidades = = Conver_sion Conver_são Converted value Valor convertido Value to convert from Valor para converter Type anywhere Digitar em qualquer lugar Edit Unknown Variable Editar Variável Desconhecida Do not create/modify this unknown variable Não criar/modificar esta variável desconhecida Accept the creation/modification of this unknown variable Aceitar a criação/modificação desta variável desconhecida Name used to reference this unknown variable in expressions Nome usado para referenciar esta variável desconhecida em expressões Use custom assumptions Usar suposições personalizadas Type Tipo Real Number Número real Rational Number Número racional Sign Sinal The category this unknown variable belongs to A categoria à qual essa variável pertence Value of this variable (expression) Valor desta variável (expressão) value is exact valor é exato If the value is precise Se o valor for preciso The category this variable belongs to A categoria à qual essa variável pretence Create a new variable Criar uma nova variável Edit the selected variable Editar a variável selecionada Insert the selected variable into the expression entry Insira a variável selecionada na entrada da expressão Delete the selected variable Eliminar a variável selecionada (De)activate the selected variable Desativar a variável selecionada E_xport E_xportar _Variable _Variável Start a new instance of the application Iniciar uma nova instância do programa Display the application version Exibir a versão do programa Specify the window title Especifica o título da janela TITLE TITLE Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. ans ans Last Answer Última resposta answer resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Failed to load global definitions! Falha ao carregar definições globais! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Todas By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %s é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão guardadas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? c-format Right-click/long press: %s Botão direito/pressionar e segurar: %s c-format Right-click: %s Botão direito: %s c-format Middle-click: %s Botão do meio: %s c-format Cycle through previous expression Percorrer pela expressão anterior Move cursor left or right Mover cursor para esquerda ou direita Move cursor to beginning or end Mover cursor para o início ou fim Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Decimal point Ponto decimal Raise (Ctrl+*) Aumentar (Ctrl+*) Add Adicionar Backspace Backspace Previous result (static) Resultado anterior (estático) Calculate expression Calcular expressão Set unknowns Definir incógnitos more Show further items in a submenu mais Logical AND Lógico AND Logical OR Lógico OR Logical NOT Lógico NOT Toggle Result Base Alternar base de resultados Open menu with stored variables Abrir menu com variáveis armazenadas Index Índice Calculate expression and add to stack Calcular expressão e adicionar à pilha Flag Bandeira Matrices Matrizes Gregorian Gregoriano Revised Julian (Milanković) Juliano revisado (Milanković) Julian Juliano Islamic (Hijri) Islâmico (Hijri) Hebrew Hebreu Chinese Chinês Persian (Solar Hijri) Persa (Hijri Solar) Coptic Cóptico Ethiopian Etíope Indian (National) Indiano (Nacional) Action Ação Key combination Combinação de teclas Raise Aumentar History Answer Value Valor da resposta do histórico History Index(es) Índice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. c-format expression expressão History Parsed Expression Expressão analisada historicamente Set Window Title Definir título da janela Failed to open %s. %s Falha ao abrir %s. %s c-format Could not display help for Qalculate!. Não foi possível exibir a ajuda do Qalculate!. Could not display help for Qalculate!. %s Não foi possível exibir a ajuda do Qalculate!. %s c-format approx. aprox. Stop process Parar processo Clear expression Limpar expressão EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC VAR FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Deseja atualizar as taxas de câmbio agora? It has been %s day since the exchange rates last were updated. Faz %s dia desde a última atualização das taxas de câmbio. Faz %s dias desde a última atualização das taxas de câmbio. c-format It has been %s days since the exchange rates last were updated. Do not ask again Não perguntar novamente It took too long to generate the plot data. Demorou muito para gerar os dados da plotagem. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Demorou muito para gerar os dados da plotagem. Diminua a taxa de amostragem ou aumente o limite de tempo nas preferências. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Quando erros, avisos e outras informações são geradas durante o cálculo, o ícone à direita da entrada da expressão é alterado para exibir isso. Ao segurar o ponteiro do mouse ou clicar no ícone, a mensagem será mostrada. Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %s Falha ao executar o script de atualização. %s c-format Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %s is available at %s. Do you wish to update to version %s. Uma nova versão do %s está disponível em %s. Deseja atualizar para a versão %s. c-format A new version of %s is available. You can get version %s at %s. Uma nova versão do %s está disponível. Você pode obter a versão %s em %s. c-format Too many arguments for %s(). Argumentos em excesso para %s(). c-format argument argumento Uncategorized Sem categoria hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal time hora bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar angle ângulo phasor fasor optimal ideal base base mixed mesclado fraction fração factors fatores partial fraction fração parcial factorize fatorar expand expandir hexadecimal number número hexadecimal octal number número octal decimal number número decimal duodecimal number número duodecimal binary number número binário roman numerals numerais romanos bijective base-26 base bijetiva-26 sexagesimal number número sexagesimal 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time format formato de hora number bases bases numéricas optimal unit unidade ideal base units unidades de base mixed units unidades mescladas expanded partial fractions frações parciais expandidas complex rectangular form forma retangular complexa complex exponential form forma exponencial complexa complex polar form forma polar complexa complex cis form forma cis complexa complex angle notation notação complexa de ângulo complex phasor notation notação complexa de fasor UTC time zone Fuso horário UTC number base %s número base %s c-format Inactive Inativo Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %s para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. c-format Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default, in description padrão: Requirement Requerimento key indicating that the property is a data set key chave Acti_vate Ati_var a previous result um resultado anterior matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Variable does not exist anymore. A variável não existe mais. Data Retrieval Function Função de Recuperação de Dados Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Insert unit Inserir unidade Insert text Inserir texto Insert date Inserir data Insert vector Inserir vetor Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert to unit (entry) Converter em unidade (entrada) Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: eliminar registo RPN: clear stack RPN: limpar pilha Load meta mode Carregar modo meta Set expression base Definir base de expressão Set result base Definir base de resultados Toggle exact mode Alternar modo exato Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Toggle simple fractions Alternar frações simples Toggle mixed fractions Alternar frações mescladas Toggle scientific notation Alternar notação científica Toggle simple notation Alternar notação simples Toggle RPN mode Alternar modo RPN Toggle calculate as you type Alternar para calcular ao digitar Toggle programming keypad Alternar teclado de programação Show keypad Mostrar teclado Show history Mostrar histórico Search history Pesquisar no histórico Show conversion Mostrar conversão Show RPN stack Mostrar pilha RPN Manage variables Gerenciar variáveis Manage functions Gerenciar funções Manage data sets Gerenciar conjuntos de dados New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de percentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Save result image Gravar imagem do resultado Help Ajuda Quit Sair Prefixes Prefixos No Prefix Nenhum prefixo Optimal Prefix Prefixo ideal Prefix Prefixo Complex angle/phasor notation Notação completa de ângulo/fasor Number bases Bases numéricas Base units Unidades base Binary number Número binário Calendars Calendários Complex cis form Forma cis complexa Decimal number Número decimal Duodecimal number Número duodecimal Complex exponential form Forma exponencial complexa Factors Fatores 16-bit floating point binary format Formato binário de ponto flutuante de 16-bit 32-bit floating point binary format Formato binário de ponto flutuante de 32-bit 64-bit floating point binary format Formato binário de ponto flutuante de 64-bit 80-bit (x86) floating point binary format Formato binário de ponto flutuante de 80-bit (x86) 128-bit floating point binary format Formato binário de ponto flutuante de 128-bit Hexadecimal number Número hexadecimal Mixed units Unidades mistas Octal number Número octal Optimal units Unidades ideais Expanded partial fractions Frações parciais expandidas Complex polar form Forma polar complexa Complex rectangular form Forma retangular complexa Sexagesimal number Número sexagesimal and e or ou undefined indefinido result is too long see history resultado é muito longo ver histórico calculation was aborted cálculo abortado RPN Register Moved Registro RPN Movido RPN Operation Operação RPN Processing… Processando… result processing was aborted processamento de resultado abortado Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Calculating… Calculando… Converting… Convertendo… Fetching exchange rates. Buscando taxas de câmbio. Time zone parsing failed. Falha na análise do fuso horário. Keep open Manter aberto Enter RPN Enter (calculate and add to stack) Enter C_alculate C_alcular Apply to Stack Aplicar à pilha Argument Argumento True Verdadeiro False Falso Info Informação Edit Unit (global) Editar unidade (global) New Unit Nova unidade Empty name field. Campo de nome vazio. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Base unit does not exist. A unidade base não existe. Edit Function (global) Editar Função (global) New Function Nova Função Yes Sim No Não Empty expression field. Campo de expressão vazio. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Unit does not exist A unidade não existe Edit Unknown Variable (global) Editar Variável Desconhecida (global) New Unknown Variable Nova variável desconhecida An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable (global) Editar Variáveis (global) New Variable Nova Variável Empty value field. Campo de valor vazio. Edit Vector Editar Vetor Edit Vector (global) Editar Vetor (global) New Vector Novo Vetor Edit Matrix (global) Editar Matriz (global) New Matrix Nova Matriz Vector Result Resultado do Vetor Matrix Result Resultado da Matriz New Data Object Novo Objeto de Dados text texto approximate aproximado Edit Data Set (global) Editar Conjunto de Dados (global) New Data Set Novo conjunto de dados info info Property Propriedade No file name entered. Nenhum nome de ficheiro digitado. No delimiter selected. Nenhum delimitador selecionado. Could not import from file %s Não foi possível importar do ficheiro %s c-format No variable name entered. Nenhum nome de variável digitado. No known variable with entered name found. Nenhuma variável conhecida com o nome digitado encontrada. Could not export to file %s Não foi possível exportar para o ficheiro %s c-format My Variables Minhas Variáveis Couldn't write definitions Não foi possível gravar definições Preset Predefinição Abort Abortar Undo Desfazer Redo Refazer Completion Mode Modo de preenchimento Limited strict completion Preenchimento rigoroso limitado Strict completion Preenchimento rigoroso Limited full completion Preenchimento total limitado Full completion Preenchimento total No completion Sem preenchimento Save Mode Gravar modo Preset mode cannot be overwritten. O modo predefinido não pode ser substituído. Delete Mode Eliminar modo Couldn't write preferences to %s Não foi possível gravar preferências em %s c-format never nunca ask perguntar %i day %i dia %i dias c-format %i days Copied Result was copied Copiado log10 function not found. função log10 não encontrada. Search Pesquisar _Search _Pesquisar Remove Bookmark Remover marcador Add Bookmark Adicionar marcador A bookmark with the selected name already exists. Do you want to overwrite it? Um marcador com o nome selecionado já existe. Você deseja sobrescrevê-lo? No items found Nenhum item encontrado Select date Selecionar data Rectangular form Forma retangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notação de ângulo/fasor Optimal unit Unidade ideal Optimal prefix Prefixo ideal All functions Todas as funções All variables Todas as variáveis Select definitions file Selecionar ficheiro de definições _Import _Importar Could not copy %s to %s. Não foi possível copiar %s para %s. c-format Could not read %s. Não foi possível ler %s. c-format Could not copy file to %s. Não foi possível copiar o ficheiro para %s. c-format Unsupported base. Base não suportada. The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %s. Falha na conversão do calendário para: %s. c-format Gnuplot was not found. Gnuplot não encontrado. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. c-format Select file to save PNG image to Selecione o ficheiro para gravar a imagem PNG Allowed File Types Tipos de ficheiro permitidos All Files Todos os ficheiros Cannot delete unit as it is needed by other units. do not delete units that are used by other units Não é possível eliminar a unidade, pois ela é necessária para outras unidades. none nenhum result is too long resultado é muito longo translator-credits Fúlvio Alves <fga.fulvio@gmail.com> Mode not found. Modo não encontrado. Elements (in horizontal order) Elementos (em ordem horizontal) Select file to import Selecionar ficheiro para importar _Open _Abrir Select file to export to Selecionar o ficheiro para o qual exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Existe um objeto conflitante com o mesmo nome. Se você continuar e gravar as alterações, o objeto conflitante será substituído ou desativado. Você quer continuar? Set key combination Definir combinação de teclas Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Pressione a combinação de teclas que deseja usar para a ação (pressione Escape para cancelar). No keys Sem teclas Empty value. Valor vazio. Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. The key combination is already in use. Do you wish to replace the current action? A combinação de teclas já está em uso. Deseja substituir a ação atual? Select file to export Selecionar ficheiro para exportar Empty expression. Expressão vazia. Empty x variable. Variável x vazia. Element Data Dados do elemento Classification Classificação Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatómico Diatomic Non-Metal Não-metal diatómico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas No unknowns in result. Não há incógnitas no resultado. Set Unknowns Definir incógnitas Copy result to clipboard Copiar resultado x x If a matrix or vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do ficheiro Use dark theme Usar tema escuro Add the two top values Keypad Adicionar os dois principais valores u Manage units button u to Button for convert to operator em Add Keypad Adicionar Base Unit Unidade base Alias Alias Composite Unit Unidade composta Fonts Fontes Chain Calculation Cálculo de intervalo <b>Name</b> <b>Nome</b> <b>Type</b> <b>Tipo</b> <b>Relation</b> <b>Relação</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i segundos c-format Ent Ent Defaults Padrões Customize Buttons Fonte de estado personalizada Names details Detalhes dos nomes Rational number form Forma do número racional Decimal fractions Frações decimais Exact decimal fractions Frações decimais exatas Simple fractions Frações simples Mixed fractions Frações mistas ArgumentEditDialog Name: Nome: Type: Tipo: Free Livre Number Número Integer Inteiro Symbol Símbolo Text Texto Date Data Vector Vetor Matrix Matriz Boolean Boleano Angle Ângulo Object Objeto Function Função Unit Unidade Variable Variável File Ficheiro Enable rules and type test Ativar o teste de regras e tipo Custom condition: Condição personalizada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx CSVDialog Import CSV File Importar ficheiro CSV Export CSV File Exportar ficheiro CSV Current result Resultado atual Matrix/vector variable: Variável matriz/vetor: File: Ficheiro: Import as Importar como matrix matriz vectors vetores Name: Nome: First row: Primeira linha: Includes headings Incluir cabeçalhos Delimiter: Delimitador: Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Error Erro Could not import from file %1 Não foi possível importar do ficheiro %1 No matrix or vector variable with the entered name was found. Não foi encontrada nenhuma variável matriz ou vetorial com o nome introduzido. Could not export to file %1 Não foi possível exportar para o ficheiro %1 CalendarConversionDialog Calendar Conversion Conversão de calendário Gregorian Gregoriano Hebrew Hebreu Islamic (Hijri) Islâmico (Hijri) Persian (Solar Hijri) Persa (Hijri Solar) Indian (National) Indiano (Nacional) Chinese Chinês Julian Juliano Revised Julian (Milanković) Juliano revisado (Milanković) Coptic Cóptico Ethiopian Etíope Error Erro The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %1. Falha na conversão do calendário para: %1. DataObjectEditDialog %1: %1: Default Padrão Approximate Aproximado Exact Exato Edit Data Object Editar Objeto de Dados New Data Object Novo Objeto de Dados DataPropertyEditDialog Name: Nome: Title: Título: Descriptive name: Nome descritivo: Description: Descrição: Value type: Tipo de valor: Expression Expressão Number Número Text Texto Unit expression: Expressão de unidade: Use as key Usar como chave Case sensitive value Valor sensível a maiúsculas e minúsculas Approximate value Valor aproximado Value uses brackets Valor usa parênteses Hide Ocultar Edit Data Property Editar propriedades de dados DataSetEditDialog General Geral Properties Propriedades Function Função Title: Título: Descriptive name: Nome descritivo: Data file: Ficheiro de dados: Description: Descrição: Copyright: Direitos de autor: Title Título Name Nome Type Tipo Add Adicionar Edit Editar Remove Remover Name: Nome: Object argument name: Nome do argumento do objeto: Property argument name: Nome do argumento da propriedade: Default property: Propriedade padrão: text texto approximate aproximado number número expression expressão key chave Question Questão A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja substituir a função? Data Sets Conjuntos de dados Object Objeto Property Propriedade Edit Data Set Editar conjunto de dados New Data Set Novo conjunto de dados DataSetsDialog Data Sets Conjuntos de dados Data sets: Conjuntos de dados: New… Novo… Edit… Editar… Delete Eliminar Objects: Objetos: Data set description: Descrição do conjunto de dados: Object attributes: Atributos do objeto: Properties Propriedades key chave Data Retrieval Function Função de recuperação de dados argument argumento ExpressionEdit matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Prefix: Prefixo: Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Base units Unidades base Number Base Base numérica Binary-Coded Decimal Codificação binária decimal Bijective Base-26 Base bijetiva-26 Binary Number Número binário Calendars Calendários Complex cis Form Forma cis complexa Decimal Number Número decimal Duodecimal Number Número duodecimal Complex Exponential Form Forma exponencial complexa Factors Fatores 16-bit Floating Point Binary Format Formato binário de ponto flutuante de 16-bit 32-bit Floating Point Binary Format Formato binário de ponto flutuante de 32-bit 64-bit Floating Point Binary Format Formato binário de ponto flutuante de 64-bit 80-bit (x86) Floating Point Binary Format Formato binário de ponto flutuante de 80-bit (x86) 128-bit Floating Point Binary Format Formato binário de ponto flutuante de 128-bit Fraction Fração Decimal Fraction Fração decimal Hexadecimal Number Número hexadecimal Latitude Latitude Longitude Longitude Mixed Units Unidades mistas Octal Number Número octal Optimal Unit Unidade ideal Optimal Prefix Prefixo ideal Expanded Partial Fractions Frações parciais expandidas Complex Polar Form Forma polar complexa Complex Rectangular Form Forma retangular complexa Roman Numerals Números romanos Sexagesimal Number Número sexagesimal Time Format Formato da hora Unicode Unicode UTC Time Zone Fuso horário UTC Undo Desfazer Redo Refazer Cut Cortar Copy Copiar Paste Colar Delete Eliminar Calculate Selection Calcular seleção Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Select All Selecionar tudo Clear Limpar Clear History Limpar histórico Completion Preenchimento No completion Sem preenchimento Limited strict completion Preenchimento rigoroso limitado Strict completion Preenchimento estrita Limited full completion Preenchimento total limitado Full completion Preenchimento total Delayed completion Preenchimento atrasado Expression Status Estado da expressão Off Desligado In history list Na lista do histórico In expression field No campo de expressão With delay Com atraso Without delay Sem atraso Automatically calculate selection Use input method Use o método de entrada Matrix Matriz Too many arguments for %1(). Argumentos em excesso para %1(). argument argumento %1: %1: comment comentário MC (memory clear) MC(limpar memória) MS (memory store) MS (armazenar memória) M+ (memory plus) M+ (mais memória) M− (memory minus) M− (menos memória) factorize fatorar expand expandir hexadecimal hexadecimal hexadecimal number número hexadecimal octal octal octal number número octal decimal decimal decimal number número decimal duodecimal duodecimal duodecimal number número duodecimal binary binário binary number número binário roman romanos roman numerals numerais romanos bijective bijetivo bijective base-26 base bijetiva-26 binary-coded decimal codificação binária decimal sexagesimal sexagesimal sexagesimal number número sexagesimal latitude latitude longitude longitude 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time hora time format formato de hora bases bases number bases bases numéricas calendars calendários optimal ideal optimal unit unidade ideal prefix prefixo optimal prefix prefixo ideal base base base units unidades de base mixed mesclado mixed units unidades mescladas decimals decimais decimal fraction fração decimal fraction fração factors fatores partial fraction fração parcial expanded partial fractions frações parciais expandidas rectangular retangular cartesian cartesiano complex rectangular form forma retangular complexa exponential exponencial complex exponential form forma exponencial complexa polar polar complex polar form forma polar complexa complex cis form forma cis complexa angle ângulo complex angle notation notação complexa de ângulo phasor fasor complex phasor notation notação complexa de fasor UTC time zone fuso horário UTC number base %1 número base %1 Data object Onjeto de dados FPConversionDialog Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Format Formato 16-bit (half precision) 16-bits (precisão média) 32-bit (single precision) 32-bits (precisão única) 64-bit (double precision) 64-bits (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Microchip 24-bit Microchip 24-bits Microchip 32-bit Microchip 32-bits Value Valor Decimal value Valor decimal Binary representation Representação binária Hexadecimal representation Representação hexadecimal Floating point value Valor do ponto flutuante Conversion error Erro de conversão FunctionEditDialog Required Obrigatório Details Detalhes Description Descrição Name: Nome: Expression: Expressão: Argument references: Referência de argumento: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y e z (por exemplo "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Usar x, y e z (por exemplo, "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo, "(\x+\y)/2") Category: Categoria: Descriptive name: Nome descritivo: Hide function Ocultar função Example: Exemplo: Description: Descrição: Condition: Condição: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-functions: Subfunções: Expression Expressão Precalculate Pré-calcular Reference Referência Add Adicionar Edit Editar Remove Remover Arguments: Argumentos: Name Nome Type Tipo Question Questão A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Edit Function Editar Função New Function Nova Função FunctionsDialog Functions Funções Category Categoria Function Função New… Novo… Edit… Editar… Deactivate Desativar Delete Eliminar Calculate… Calcular… Apply Aplicar Insert Inserir Favorite Favorito argument argumento Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %1 para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default padrão: Requirement: Required condition for function Requerimento: Properties Propriedades %1: %1: key indicating that the property is a data set key chave Activate Ativar All All functions Todas Uncategorized Sem categoria User functions Funções de utilizador Favorites Favoritos Inactive Inativo HistoryView Insert Value Inserir valor Insert Text Inserir texto Copy Copiar Copy Formatted Text Copiar texto formatado Copy unformatted ASCII Copiar ASCII não formatado Select All Selecionar tudo Search… Procurar… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e prima a tecla Enter. Exchange rate source(s): Fonte da taxa de câmbio: Fontes da taxa de câmbio: updated %1 atualizado %1 atualizados %1 Comment Comentário Protect Proteger Add Comment… Adicionar comentário… Move to Top Mover para o topo Remove Remover Clear Limpar Edit Comment… Editar comentário… Text: Texto: Search Pesquisar KeypadButton <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar e segurar</i>: %1 <i>Right-click</i>: %1 <i>Botão direito</i>: %1 <i>Long press</i>: %1 <i>Pressionar e segurar</i>: %1 Open menu Abrir menu <i>Middle-click</i>: %1 <i>Botão do meio</i>: %1 KeypadWidget Memory store Armazenamento de memória Memory clear Limpar memória Memory recall Recuperação da memória Memory add Adicionar memória Memory subtract Subtração de memória STO Standard calculator button. Do not use more than three characters. STO Store Armazenar New function Nova função sin sin cos cos tan tan Exponentiation Exponenciação Percent or remainder Por cento ou resto Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Interval Intervalo Move cursor left Mover cursor para esquerda Move cursor to start Mover cursor para o início Move cursor right Mover cursor para direita Move cursor to end Mover cursor para fim Logical AND Lógico AND Logical OR Lógico OR Bitwise Exclusive OR OR exclusivo bit-a-bit Logical NOT Lógico NOT Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit cmp cmp rot rot a→1 a→1 Expand partial fractions Expandir frações parciais Enable units in physical constants Ativar unidades em constantes físicas All constants Todas as constantes Percentage Calculation Tool Ferramenta de cálculo de percentagem more mais All units Todas as unidades All variables Todas as variáveis Action Ação Interval Display Exibição de intervalo Adaptive Adaptativa Significant digits Dígitos significativos Plus/minus Mais/menos Relative Relativo Concise Conciso Interval Calculation Cálculo de intervalo Variance formula Fórmula de desvio Interval arithmetic Aritmética de intervalos Allow concise uncertainty input Permitir a introdução concisa de incertezas Complex number form Forma de número complexo Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Type Assumptions type Tipo Sign Assumptions sign Sinal Default assumptions Suposições padrão Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Factorize Fatorar Expand Expandir Add column Adicionar coluna Add row Adicionar linha Remove column Remover coluna Remove row Remover linha Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Decimal point Ponto decimal Previous result (static) Resultado anterior (estático) Multiplication Multiplicação Button Action Ação do botão Label: Etiqueta: Action: Ação: None Nenhum Value: Valor: Bitwise AND Bitwise AND Bitwise Shift Bitwise Shift Delete Eliminar Backspace Backspace Addition Adição Plus Mais Subtraction Subtração Minus Menos Division Divisão Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear expression Limpar expressão Calculate expression Calcular expressão NamesEditDialog Name Nome Abbreviation Abreviação Plural Plural Reference Referência Avoid input Evitar entrada Unicode Unicode Suffix Sufixo Case sensitive Maiúsc. e Minúsculas Completion only Apenas preenchimento Add Adicionar Edit Editar Remove Remover Warning Aviso Illegal name Nome ilegal A function with the same name already exists. Uma função com o mesmo nome já existe. A unit or variable with the same name already exists. Uma unidade ou variável com o mesmo nome já existe. PercentageCalculationDialog Percentage Percentagem Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Alterar de 1 para 2 Change from 2 to 1 Alterar de 2 para 1 2 compared to 1 2 comparado a 1 1 compared to 2 1 comparado a 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Introduza dois valores, dos quais no máximo um é uma percentagem, e os outros serão calculados para si. Clear Limpar PeriodicTableDialog Periodic Table Tabela periódica Element Data Dados do elemento Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatómico Diatomic Non-Metal Não-metal diatómico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas Unknown Desconhecido %1: %1: PlotDialog Plot Plotagem Data Dados Title: Título: Expression: Expressão: Function Função Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada Rows Linhas X variable: Variável X: Style: Estilo: Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontos Polar Polar Smoothing: Suavização: None Nenhum Monotonic Monotónica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotónica) Y-axis: Eixo Y: Primary Primário Secondary Secundário Add Adicionar Apply Aplicar Remove Remover Title Título Expression Expressão Function Range Faixa de Funções Minimum x value: Valor mínimo x: Maximum x value: Valor máximo x: Sampling rate: Taxa de amostragem: Step size: Tamanho do passo: Show real and imaginary parts Mostrar partes reais e imaginárias Appearance Aparência Display grid Exibir grade Display full border Exibir borda completa Minimum y value: Valor mínimo y: Maximum y value: Valor máximo y: Logarithmic x scale: Escala logarítmica x: Logarithmic y scale: Escala logarítmica y: X-axis label: Etiqueta do eixo X: Y-axis label: Etiqueta do eixo Y: Line width: Espessura da linha: Legend placement: Posição da legenda: Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Calculating… Calculando… Cancel Cancelar Processing… Processando… PreferencesDialog Look && Feel Aparência Numbers && Operators Números e operadores Units && Currencies Unidades e moedas Parsing && Calculation Análise e cálculo Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Allow multiple instances Permitir várias instâncias Clear history on exit Limpar histórico ao sair Close application with Escape key Fechar a aplicação com a tecla Esc Keep above other windows Manter acima das outras janelas Window title: Título da janela: Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Workspace Área de trabalho Application name + workspace Nome da aplicação + área de trabalho Style: Estilo: Default (requires restart) Default style Padrão (requer reinício) Dark mode Modo escuro Colorize result Colorir resultado Custom result font Fonte do resultado personalizada Custom expression font Fonte da expressão personalizada Custom keypad font Fonte do teclado personalizada Custom application font Fonte do programa personalizada Custom result font: Fonte do resultado personalizada: Custom expression font: Fonte da expressão personalizada: Custom keypad font: Fonte do teclado personalizada: Custom application font: Fonte do programa personalizada: Display expression status Exibir estado da expressão Delay: Atraso: Expression after calculation: Expressão após cálculo: Keep expression Manter expressão Clear expression Limpar expressão Replace with result Substituir pelo resultado Replace with result if shorter Substituir pelo resultado se for mais curto Use keyboard keys for RPN Usar teclado para RPN Parsing mode: Modo de análise: Adaptive Adaptativa Conventional Convencional Implicit multiplication first Primeiro multiplicação implícita Chain Cadeia RPN RPN Read precision Ler precisão Limit implicit multiplication Limitar multiplicação implícita Interval calculation: Cálculo de intervalo: Variance formula Interval arithmetic Factorize result Fatorar resultado Binary two's complement representation Representação binária do complemento para dois Hexadecimal two's complement representation Representação hexadecimal do complemento para dois Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais Use special duodecimal symbols Usar símbolos duodecimais especiais Spell out logical operators Soletrar operadores lógicos Use E-notation instead of 10^x Usar notação E em vez de 10^x Preferences Preferências ms milliseconds ms Use dot as multiplication sign Usar o ponto como sinal de multiplicação Use Unicode division slash in output Usar a barra de divisão Unicode na saída Use E-notation instead of 10^n Usar notação E em vez de 10^n Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use comma as decimal separator Usar vírgula como separador decimal Ignore comma in numbers Ignorar vírgula em números Ignore dots in numbers Ignorar pontos em números Copy unformatted ASCII by default Copiar ASCII não formatado por padrão Round halfway numbers away from zero Arredondar números intermediários de zero Round halfway numbers to even Arredondar números até a metade Indicate repeating decimals Indicar decimais repetidos Language: Idioma: Max history lines saved: Máx. de linhas de histórico guardadas: Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Preserve history height Preservar a altura do histórico Do not change the height of history list when keypad or number bases are show or hidden. Não altere a altura da lista de histórico quando o teclado ou as bases numéricas estiverem à vista ou ocultas. Tooltips: Dicas: Show all Mostrar tudo Hide in keypad Ocultar no teclado Hide all Ocultar tudo Disable cursor blinking Format result Resultado do formato Expression status: Estado da expressão: Off Desligado In history list Na lista do histórico In expression field No campo de expressão Status tooltip delay: Atraso da dica do estado: Calculate as you type delay: Calcular à medida que digita o atraso: Automatically calculate selection Expression in history: Expressão no histórico: Parsed Analisado Entered Introduzido Entered + parsed Introduzido + analisado Automatically copy result Copiar automaticamente o resultado Simplified percentage calculation Cálculo simplificado da percentagem Allow concise uncertainty input Permitir a introdução concisa de incertezas Interpret unrecognized symbols as variables Interpretar símbolos não reconhecidos como variáveis Two's complement output: Saída de complemento de dois: Two's complement input: Entrada de complemento de dois: Binary Binário Hexadecimal Hexadecimal Binary bits: Bits binários: Automatic Automática Digit grouping: Agrupamento de dígitos: None Nenhum Standard Padrão Local Local Automatically group digits in input (experimental) Interval display: Exibição de intervalo: Significant digits Dígitos Significativos Interval Intervalo Plus/minus Mais/menos Concise Conciso Midpoint Ponto médio Lower Inferior Upper Superior Rounding: Arredondamento: Complex number form: Forma de nùmero complexo: Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Enable units Ativar unidades Abbreviate names Abreviar nomes Use binary prefixes for information units Usar prefixos binários para unidades de informações Automatic unit conversion: Conversão automática de unidades: No conversion Sem conversão Base units Unidades base Optimal units Unidades ideais Optimal SI units Unidades ideais SI Convert to mixed units Converter para unidades mistas Automatic unit prefixes: Prefixos automáticos de unidades: Copy unformatted ASCII without units Copiar ASCII não formatado sem unidades Restart required Reinício necessário Please restart the program for the language change to take effect. Reinicie a aplicação para que a alteração de idioma tenha efeito. Default Padrão Round halfway numbers to odd Arredondar números intermediários para ímpares Round halfway numbers toward zero Arredondar números intermediários para zero Round halfway numbers to random Arredondar números intermediários para aleatórios Round halfway numbers up Arredondar os números intermediários para cima Round halfway numbers down Arredondar números intermediários para baixo Round toward zero Arredondar para zero Round away from zero Arredondar do zero Round up Arredondar para cima Round down Arredondar para baixo No prefixes Sem prefixos Prefixes for some units Prefixos para algumas unidades Prefixes also for currencies Prefixos também para moedas Prefixes for all units Prefixos para todas as unidades Enable all SI-prefixes Ativar todos os prefixos SI Enable denominator prefixes Ativar prefixos de denominador Enable units in physical constants Activar unidades em constantes físicas Temperature calculation: Cálculo da temperatura: Absolute Absoluta Relative Relativa Hybrid Híbrido Exchange rates updates: Atualizações das taxas de câmbio: %n day(s) %n dia %n dias days dia dias QApplication Execute expressions and commands from a file Executar expressões e comandos a partir de um ficheiro FILE FICHEIRO Start a new instance of the application Iniciar uma nova instância do programa Specify the window title Especifica o título da janela TITLE TÍTULO Display the application version Exibir a versão do programa Open workspace Abrir área de trabalho Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %1 é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão guardadas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? Allow multiple instances? %1 is already running. %1 já está em execução. Failed to load global definitions! Falha ao carregar definições globais! answer resposta History Answer Value Valor da resposta do histórico History Index(es) Índice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. Last Answer Última resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Memória Error Erro Couldn't write preferences to %1 Não foi possível gravar preferências em %1 Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. Unsupported base. Base não suportada. Unsupported value. Valor não suportado. QalculateQtSettings Update exchange rates? Atualizações das taxas de câmbio? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Faz %n dia desde a última atualização das taxas de câmbio. Pretende atualizar as taxas de câmbio agora? Faz %n dias desde a última atualização das taxas de câmbio. Pretende atualizar as taxas de câmbio agora? Fetching exchange rates. Buscando taxas de câmbio. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… A obter taxas de câmbio… Error Erro Warning Aviso Information Informação Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %1 Falha ao executar o script de atualização. %1 Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %1 is available at %2. Do you wish to update to version %3? Uma nova versão do %1 está disponível em %2. Pretende atualizar para a versão %3? A new version of %1 is available. You can get version %3 at %2. Uma nova versão do %1 está disponível. Você pode obter a versão %3 em %2. Download Transferir %1: %2 %1: %2 Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Approximate result Resultado aproximado Negate Negar Invert Inverter Insert unit Inserir unidade Insert text Inserir texto Insert operator Inserir operador Insert date Inserir data Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert Converter Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: eliminar registo RPN: clear stack RPN: limpar pilha Set expression base Definir base de expressão Set result base Definir base de resultados Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Active normal display mode Modo de exibição normal ativo Activate scientific display mode Ativar o modo de exibição científica Activate engineering display mode Ativar o modo de exibição de engenharia Activate simple display mode Ativar o modo de exibição simples Toggle precision Alternar precisão Toggle max decimals Alternar decimais máximos Toggle min decimals Alternar decimais mínimos Toggle max/min decimals Alternar decimais máx/mín Toggle RPN mode Alternar modo RPN Show general keypad Mostrar teclado geral Toggle programming keypad Alternar teclado de programação Toggle algebra keypad Alternar teclado de álgebra Toggle custom keypad Alternar teclado personalizado Show/hide keypad Mostrar/ocultar teclado Search history Pesquisar no histórico Clear history Limpar histórico Show variables Mostrar variáveis Show functions Mostrar funções Show units Mostrar unidades Show data sets Mostrar conjuntos de dados Store result Armazenar resultado MC (memory clear) MC (limpar memória) MR (memory recall) MR (recordar memória) MS (memory store) MS (memória de armazenamento) M+ (memory plus) M+ (memória mais) M− (memory minus) M- (memória menos) New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de percentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Insert result Inserir resultado Open mode menu Abrir menu de modo Open menu Abrir menu Help Ajuda Quit Sair Toggle chain mode Alternar modo de cadeia Toggle keep above Alternar manter acima Show completion (activate first item) Mostrar preenchimento (ativar o primeiro item) Clear expression Limpar expressão Delete Eliminar Backspace Backspace Home Home End End Right Direita Left Esquerda Up Acima Down Abaixo Undo Desfazer Redo Refazer Calculate expression Calcular expressão Expression history next Histórico de expressões seguinte Expression history previous Histórico de expressões anterior Open functions menu Abrir menu de funções Open units menu Abrir menu de unidades Open variables menu Toggle fraction format in current result Default Padrão Formatted result Resultado formatado Unformatted ASCII result Resultado ASCII não formatado Unformatted ASCII result without units Resultado ASCII não formatado sem unidades Formatted expression Expressão formatada Unformatted ASCII expression Expressão ASCII não formatada Formatted expression + result Expressão formatada + resultado Unformatted ASCII expression + result Expressão ASCII não formatada + resultado QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Cancelar Close Only used when Qt translation is missing Fechar &Yes Only used when Qt translation is missing &Sim &No Only used when Qt translation is missing &Não &Open Only used when Qt translation is missing &Abrir &Save Only used when Qt translation is missing &Guardar &Select All Only used when Qt translation is missing &Selecionar tudo Look in: Only used when Qt translation is missing Ver em: File &name: Only used when Qt translation is missing &Nome do ficheiro: Files of type: Only used when Qt translation is missing Ficheiros do tipo: QalculateWindow Menu Menu New Novo Function… Função… Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Workspaces Áreass de trabalho Open… Abrir… Open default Abrir padrão Save Guardar Save As… Guardar como… Import CSV File… Importar ficheiro CSV… Export CSV File… Exportar ficheiro CSV… Functions Funções Variables and Constants Variáveis e constantes Units Unidades Plot Functions/Data Funções/dados de plotagem Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Calendar Conversion Conversão de calendário Update Exchange Rates Atualizar taxas de câmbio Normal Mode Modo normal RPN Mode Modo RPN Chain Mode Modo de cadeia Keyboard Shortcuts Teclas de atalho Preferences Preferências Help Ajuda Report a Bug Reportar um erro Check for Updates Verificar atualizações About %1 Acerca do %1 Quit Sair Mode Modo Mode (%1) Modo (%1) General Display Mode Modo de exibição geral Normal Normal Scientific Científica Engineering Engenharia Simple Simples Angle Unit Unidade de ângulo Radians Radianos Degrees Graus Gradians Grados Approximation Aproximação Automatic Automatic approximation Automática Dual Dual approximation Dupla Exact Exact approximation Exato Approximate Aproximado Assumptions Suposições Type Assumptions type Tipo Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Sign Assumptions sign Sinal Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Result Base Base de resultados Binary Binário Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Outro Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Formato de hora Roman numerals Números romanos Unicode Unicode Bijective base-26 Base bijetiva-26 Binary-encoded decimal (BCD) Codificação binária decimal (BCD) Custom: Number base Personalizada: Expression Base Base de expressão Other: Number base Outra: Precision: Precisão: Min decimals: Decimais mínimos: Max decimals: Decimais máximos: off Max decimals desligado Convert Converter Convert (%1) Converter (%1) Store Armazenar Store (%1) Guardar (%1) Functions (%1) Funções (%1) Keypad Teclado Keypad (%1) Teclado (%1) Number bases Bases numéricas Unit… Unidade… Data Sets Conjuntos de dados Percentage Calculation Tool Ferramenta de cálculo de percentagem Periodic Table Tabela periódica Units (%1) Unidades (%1) Plot Functions/Data (%1) Funções/dados de plotagem (%1) Number Bases (%1) Bases numéricas (%1) Binary: Binário: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pilha RPN Rotate the stack or move the selected register up (%1) Gire a pilha ou mova o registo selecionado para cima (%1) Rotate the stack or move the selected register down (%1) Gire a pilha ou mova o registo selecionado para baixo (%1) Swap the top two values or move the selected value to the top of the stack (%1) Troque os valores superiores ou mova o valor selecionado para o topo da pilha (%1) Copy the selected or top value to the top of the stack (%1) Copie o valor selecionado ou superior para o topo da pilha (%1) Enter the top value from before the last numeric operation (%1) Digite o valor superior antes da última operação numérica (%1) Delete the top or selected value (%1) Eliminar o valor selecionado ou superior (%1) Clear the RPN stack (%1) Limpar a pilha RPN (%1) New Function… Nova função… Favorites Favoritos Recent Recentes User functions Funções de utilizador Open dialog Abrir diálogo Show all functions Mostrar todas as funções User units Unidades de utilizador more mais Prefixes Prefixos Show all units Mostrar todas as unidades User variables Variáveis de utilizador Show all variables Mostrar todas as variáveis Powerful and easy to use calculator Calculadora potente e fácil de usar License: GNU General Public License version 2 or later Licença: GNU General Public License versão 2 ou posterior Error Erro Couldn't write definitions Não foi possível gravar definições hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal latitude latitude longitude longitude time hora Time zone parsing failed. Falha na análise do fuso horário. bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar phasor fasor angle ângulo optimal ideal base base mixed mesclado fraction fração factors fatores Show toolbar Mostrar barra de ferrementas Open Settings Folder(s) Number Pad Teclado numérico Always Show Number Pad Mostrar sempre o teclado numérico Copy Copiar prefix prefixo partial fraction fração parcial decimals decimais factorize fatorar expand expandir Calculating… Calculando… Cancel Cancelar RPN Operation Operação RPN Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Converting… Convertendo… RPN Register Moved Registro RPN Movido Processing… Processando… Matrix Matriz Temperature Calculation Mode Modo de cálculo da temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). A expressão é ambígua. Selecione o modo de cálculo da temperatura (o modo pode ser alterado mais tarde nas preferências). Absolute Absoluto Relative Relativo Hybrid Híbrido Please select desired variant of the sinc function. Seleccione a variante desejada da função sinc. Unnormalized Não normalizado Normalized Normalizado Interpretation of dots Interpretação dos pontos Please select interpretation of dots (".") (this can later be changed in preferences). Selecione a interpretação dos pontos (".") (isto pode ser alterado mais tarde nas preferências). Both dot and comma as decimal separators Ponto e vírgula como separadores decimais Dot as thousands separator Ponto como separador de milhares Only dot as decimal separator Apenas o ponto como separador decimal Parsing Mode Modo de análise The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). A expressão é ambígua. Selecione a interpretação de expressões com multiplicação implícita (isto pode ser alterado mais tarde nas preferências). Implicit multiplication first Primeiro multiplicação implícita Conventional Convencional Adaptive Adaptativa Percentage Interpretation Interpretação das percentagens Please select interpretation of percentage addition Selecionar a interpretação da percentagem de adição Add percentage of original value Adicionar percentagem do valor original Add percentage multiplied by 1/100 Adicionar percentagem multiplicada por 1/100 Add Action (%1) Adicionar ação (%1) Edit Keyboard Shortcut Editar tecla de atalho New Keyboard Shortcut Nova tecla de atalho Action: Ação: Value: Valor: Set key combination Definir combinação de teclas Press the key combination you wish to use for the action. Pressione a combinação de teclas que deseja usar para a ação. Reserved key combination Combinação de teclas reservada The key combination is already in use. Do you wish to replace the current action (%1)? A combinação de teclas já está em uso. Deseja substituir a ação atual (%1)? Question Questão Add… Adicionar… Edit… Editar… Remove Remover Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. Example: Example of function usage Exemplo: Enter RPN Enter Enter Calculate Calcular Apply to Stack Aplicar à pilha Insert Inserir Failed to open workspace Falha ao abrir área de trabalho Couldn't save workspace Não foi possível guardar a área de trabalho Save file? Guardar ficheiro? Do you want to save the current workspace? Pretende guardar a área de trabalho atual? Do not ask again Não perguntar novamente Keep open Manter aberto Value Valor Argument Argumento %1: %1: Plot Plotagem General Geral Programming Programação Algebra Álgebra Custom Personalizado None Nenhum Hide Number Pad Ocultar teclado numérico Separate Menu Buttons Botões de menu separados Reset Keypad Position Repor a posição do teclado Icons only Apenas ícones Text only Apenas texto Text beside icons Texto ao lado dos ícones Text under icons Texto por baixo dos ícones <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar</i>: %1 Open menu Abrir menu Number Bases Bases numéricas Rotate the stack or move the selected register up Rode a pilha ou mova o registo selecionado para cima Rotate the stack or move the selected register down Rode a pilha ou mova o registo selecionado para baixo Swap the top two values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Delete the top or selected value Eliminar o valor selecionado ou superior Enter the top value from before the last numeric operation Introduza o valor superior antes da última operação numérica Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Clear the RPN stack Limpar a pilha RPN Action Ação Key combination Combinação de teclas True Verdadeiro False Falso Info Informação optional optional argument opcional Failed to open %1. %2 Falha ao abrir %1. %2 UnitEditDialog General Geral Relation Relação Name: Nome: Category: Categoria: Descriptive name: Nome descritivo: System: Sistema: Imperial Imperial US Survey US Survey Hide unit Ocultar unidade Description: Descrição: Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. A classe a que esta unidade pertence. As unidades derivadas nomeadas são definidas em relação a uma única outra unidade, com um expoente opcional, enquanto as unidades derivadas (não nomeadas) são definidas por uma expressão de unidade com uma ou várias unidades. Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s): Unidade(s) base: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to A classe a que esta unidade pertence. As unidades derivadas nomeadas são definidas em relação a uma única outra unidade, com um expoente opcional, enquanto as unidades derivadas (não nomeadas) são definidas por uma expressão de unidade com uma ou mais unidades Exponent: Expoente: Relation: Relação: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número.<br><br>Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273,15" para a relação entre graus Celsius e Kelvin). Inverse relation: Relação inversa: Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base Priority: Prioridade: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Número mínimo da unidade base: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Use com prefixos por padrão Error Erro Base unit does not exist. A unidade base não existe. Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Pretendes substituí-la? A variable or unit with the same name already exists. Do you want to overwrite it? Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unit Editar unidade New Unit Nova unidade UnitsDialog Units Unidades Category Categoria Unit Unidade New… Novo… Edit… Editar… Deactivate Desativar Delete Eliminar Convert Converter Insert Inserir Favorite Favorito Show hidden units Mostrar unidades ocultas Activate Ativar All All units Todas Uncategorized Sem categoria User units Unidades de utilizador Favorites Favoritos Inactive Inativo UnknownEditDialog Name: Nome: Custom assumptions Suposições personalizadas Type: Tipo: Sign: Sinal: Temporary Temporária Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unknown Variable Editar Variável Desconhecida New Unknown Variable Nova variável desconhecida VariableEditDialog Name: Nome: Temporary Temporária Value: Valor: Required Obrigatório Description Descrição current result resultado atual Category: Categoria: Descriptive name: Nome descritivo: Hide variable Ocultar variável Description: Descrição: Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable Editar Variável New Variable Nova Variável VariablesDialog Variables Variáveis Category Categoria Variable Variável New Novo Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Edit… Editar… Export… Exportar… Deactivate Desativar Delete Eliminar Insert Inserir Favorite Favorito a matrix uma matriz a vector um vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero integer inteiro boolean boleano rational racional real real complex complexo number número not matrix não matriz unknown desconhecido Default assumptions Suposições padrão Activate Ativar All All variables Todas Uncategorized Sem categoria User variables Variáveis de utilizador Favorites Favoritos Inactive Inativo qalculate-qt-5.5.1/translations/qalculate-qt_ru.ts000066400000000000000000005451501475705355700223470ustar00rootroot00000000000000 ArgumentEditDialog Name: Имя: Type: Тип: Free Произвольное значение Number Число Integer Целое Symbol Символ Text Текст Date Дата Vector Вектор Matrix Матрица Boolean Логическое Angle Угол Object Объект Function Функция Unit Единица измерения Variable Переменная File Файл Enable rules and type test Включить правила и проверку типа Custom condition: Условие: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Например, если аргумент - это матрица, которая должна иметь равное количество строк и столбцов: строки(\\x) = столбцы(\\x) Allow matrix Разрешить матрицы Forbid zero Запретить ноль Handle vector Обращаться с вектором Calculate function for each separate element in vector. Вычислить функцию для каждого отдельного элемента вектора. Min Мин Include equals Включая равенства Max Макс CSVDialog Import CSV File Загрузить файл формата CSV Export CSV File Экспорт в файл типа CSV Current result Текущий результат Matrix/vector variable: Матричная/векторная переменная: File: Файл: Import as Импортировать как matrix матрица vectors векторы Name: Имя: First row: Первая строка: Includes headings Включает заголовки Delimiter: Разделитель: Comma Запятая Tabulator Табуляция Semicolon Точка с запятой Space Пробел Other Другой A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерения или переменная с таким именем уже существует. Вы хотите её перезаписать? Could not import from file %1 Не удалось импортировать из файла %1 Could not export to file %1 Не удалось экспортировать в файл %1 Question Вопрос Error Ошибка No matrix or vector variable with the entered name was found. Матричная или векторная переменная с указанным именем не найдена. CalendarConversionDialog Calendar Conversion Преобразование календаря Gregorian Григорианский Hebrew Еврейский Islamic (Hijri) Исламский (от Хиджры) Persian (Solar Hijri) Иранский (Солнечная хиджра) Indian (National) Индийский (национальный) Chinese Китайский Julian Юлианский Revised Julian (Milanković) Пересмотренный юлианский (Миланковича) Coptic Коптский Ethiopian Эфиопский The selected Chinese year does not exist. Выбранный китайский год не существует. Conversion to Gregorian calendar failed. Преобразование в григорианский календарь не удалось. Calendar conversion failed for: %1. Ошибка преобразования календаря для: %1. Error Ошибка DataObjectEditDialog %1: %1: Default По умолчанию Approximate Приблизительное Exact Точное Edit Data Object Изменить объект данных New Data Object Новый объект данных DataPropertyEditDialog Name: Имя: Descriptive name: Краткое описание: Description: Расширенное описание: Value type: Тип значения: Expression Выражение Number Число Text Текст Unit expression: Выражение единицы измерения: Use as key Использовать как ключ Case sensitive value Значение с учётом регистра Approximate value Приближённое значение Value uses brackets Значение использует скобки Hide Скрыть Edit Data Property Изменить свойство данных DataSetEditDialog General Основное Properties Свойства Function Функция Descriptive name: Краткое описание: Data file: Файл данных: Description: Расширенное описание: Copyright: Авторские права: Title Заголовок Name Имя Type Тип Add Добавить Edit Правка Remove Удалить Name: Имя: Object argument name: Имя аргумента объекта: Property argument name: Имя аргумента свойства: Default property: Свойство по умолчанию: text текст approximate приблизительно number число expression выражение key ключ Question Вопрос A function with the same name already exists. Do you want to overwrite the function? Функция с таким именем уже существует. Хотите перезаписать функцию? Data Sets Наборы данных Object Объект Property Свойство Edit Data Set Изменить набор данных New Data Set Новый набор данных DataSetsDialog Data Sets Наборы данных Data sets: Наборы данных: New… Новая… Edit… Правка… Delete Удалить Objects: Объекты: Data set description: Описание набора данных: Object attributes: Атрибуты объекта: Properties Свойства key ключ Data Retrieval Function Функция поиска данных argument аргумент ExpressionEdit matrix матрица vector вектор positive положительное non-positive не положительное negative отрицательное non-negative неотрицательное non-zero ненулевое boolean логическое integer целое rational рациональное real вещественное complex комплексное number число (not matrix) (не матрица) unknown неизвестное default assumptions предположения по умолчанию Prefix: Префикс: Base units Основные единицы измерения Calendars Календари Factors Множители Fraction Дробь Latitude Широта Longitude Долгота Unicode Юникод UTC time zone Часовой пояс UTC Undo Отменить Complex Angle/Phasor Notation Обозначение угла/вектора комплексных чисел Number Base Основание системы счисления Binary-Coded Decimal Двоично-десятичный код Bijective Base-26 Биективное основание-26 Binary Number Двоичное число Complex cis Form Сисоидная форма комплексных чисел Decimal Number Десятичное число Duodecimal Number Двенадцатеричное число Complex Exponential Form Экспоненциальная форма комплексных чисел 16-bit Floating Point Binary Format 16-битное в двоичном формате с плавающей запятой 32-bit Floating Point Binary Format 32-битное в двоичном формате с плавающей запятой 64-bit Floating Point Binary Format 64-битное в двоичном формате с плавающей запятой 80-bit (x86) Floating Point Binary Format 80-битное (x86) в двоичном формате с плавающей запятой 128-bit Floating Point Binary Format 128-битное в двоичном формате с плавающей запятой Hexadecimal Number Шестнадцатеричное число Mixed Units Смешанные единицы измерения Octal Number Восьмеричное число Optimal Unit Оптимальная единица измерения Expanded Partial Fractions Расширенные частичные дроби Complex Polar Form Полярная форма комплексных чисел Complex Rectangular Form Прямоугольная форма комплексных чисел Roman Numerals Римские цифры Sexagesimal Number Шестидесятеричное число Time Format Формат времени UTC Time Zone Часовой пояс UTC Redo Повторить Cut Вырезать Copy Копировать Paste Вставить Delete Удалить Insert Date… Вставить дату… Insert Matrix… Вставить матрицу… Select All Выделите всё Clear Очистить Clear History Очищать историю Completion Завершение No completion Без завершения Limited strict completion Ограниченное строгое завершение Strict completion Строгое завершение Limited full completion Ограниченное полное завершение Full completion Полное завершение Delayed completion Отложенное завершение Expression Status Статус выражения Off Выкл With delay С задержкой Without delay Без задержки Matrix Матрица Too many arguments for %1(). Слишком много аргументов для %1(). argument аргумент %1: %1: MC (memory clear) MC (отчистить память) MS (memory store) MS (сохранить в памяти) M+ (memory plus) M+ (прибавить к значению в памяти) M− (memory minus) M− (отнять от значения в памяти) factorize разложить на множители expand раскрывать hexadecimal шестнадцатеричное hexadecimal number шестнадцатеричное число octal восьмеричное octal number восьмеричное число decimal десятеричное decimal number десятичное число duodecimal двенадцатеричное duodecimal number двенадцатеричное число binary двоичное binary number двоичное число roman римское число roman numerals римские цифры bijective биективное bijective base-26 биективное основание-26 binary-coded decimal двоично-десятичный код sexagesimal шестидесятеричное sexagesimal number шестидесятеричное число latitude широта longitude долгота 32-bit floating point 32-битное с плавающей запятой 64-bit floating point 64-битное с плавающей запятой 16-bit floating point 16-битное с плавающей запятой 80-bit (x86) floating point 80-битное (x86) с плавающей запятой 128-bit floating point 128-битное с плавающей запятой time время time format формат времени bases основания number bases основания систем счисления calendars календари optimal оптимально optimal unit оптимальная единица измерения base основание base units основные единицы измерения mixed смешано mixed units смешанные единицы fraction дробь factors множители partial fraction частичная дробь expanded partial fractions расширенные дробные числа rectangular прямоугоная cartesian декартова complex rectangular form прямоугольная форма комплексных чисел exponential экспоненциальная complex exponential form экспоненциальная форма комплексных чисел polar полярная complex polar form полярная форма комплексных чисел complex cis form сисоидная форма комплексных чисел angle угловая complex angle notation комплексные числа в обозначении угла phasor фазовая complex phasor notation Комплексные числа в обозначении вектора number base %1 основание системы счисления %1 Data object Объект данных Use input method Использовать метод ввода Decimal Fraction Десятичная дробь Optimal Prefix Оптимальный префикс prefix префикс optimal prefix оптимальный префикс decimals десятичные decimal fraction десятичная дробь In history list В списке истории In expression field В поле выражения comment комментарий Calculate Selection Вычислить выделение Automatically calculate selection FPConversionDialog Floating Point Conversion (IEEE 754) Преобразование чисел с плавающей запятой (IEEE 754) Format Формат 16-bit (half precision) 128-битное (половинная точность) 32-bit (single precision) 32-битное (одинарная точность) 64-bit (double precision) 64-битное (двойная точность) 80-bit (x86 extended format) 80-битное (x86 расширенный формат) 128-bit (quadruple precision) 128 -битное (четырехкратная точность) Decimal value Десятичное значение Binary representation Двоичное представление Hexadecimal representation Шестнадцатеричное представление Floating point value Значение числа с плавающей запятой Conversion error Ошибка преобразования Microchip 24-bit Формат числа с плавающей точкой Microship (PIC16/17) Микрочип 24-битный Microchip 32-bit Формат числа с плавающей точкой Microship (PIC16/17) Микрочип 32-битный Value Значение FunctionEditDialog Name: Имя: Expression: Выражение: Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Используйте x, y и z (например, «(x+y)/2»), или \x, \y, \z, \a, \b, … (например, «(\x+\y)/2») Category: Категория: Descriptive name: Краткое описание: Hide function Скрыть функцию Example: Пример: Description: Расширенное описание: Condition: Условие: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Условие, которое должно выполняться для функции (например, если второй аргумент должен быть больше первого: «\\y > \\x») Sub-functions: Подфункции: Expression Выражение Precalculate Предварительно рассчитать Reference Ссылка Add Добавить Edit Правка Remove Удалить Arguments: Аргументы: Name Имя Type Тип A function with the same name already exists. Do you want to overwrite the function? Функция с таким именем уже существует. Хотите перезаписать функцию? Edit Function Изменить функцию New Function Новая функция Required Обязательно Details Детали Description Расширенное описание Question Вопрос FunctionsDialog Functions Функции Category Категория Function Функция New… Новая… Edit… Правка… Deactivate Деактивировать Delete Удалить Calculate… Рассчитать… Apply Применить Insert Вставить Favorite Избранный argument аргумент Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Извлекает данные из набора данных %1 для заданного объекта и свойства. Если «инфо» введено как свойство, появится диалоговое окно со всеми свойствами объекта. Example: Пример: Arguments Аргументы optional optional argument необязательный default: argument default по умолчанию: Requirement: Required condition for function Требование: Properties Свойства %1: %1: key indicating that the property is a data set key ключ Activate Активировать All All functions Все Uncategorized Без категорий User functions Пользовательские функции Favorites Избранное Inactive Неактивные HistoryView Copy Копировать Select All Выделите всё Insert Value Вставить значение Insert Text Вставить текст Copy unformatted ASCII Копировать неформатированный ASCII Search… Поиск… Protect Защитить Move to Top Передвинуть наверх Remove Удалить Clear Очистить Text: Текст: Search Поиск Exchange rate source(s): Источник курсов валют: Источники курсов валют: Источники курсов валют: updated %1 обновлён %1 обновлены %1 обновлены %1 Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Введите математическое выражение выше, например «5 + 2 / 3», и нажмите клавишу ВВОД (Enter). Search by Date… Comment Комментарий Add Comment… Добавить комментарий… Edit Comment… Изменить комментарий… KeypadButton <i>Right-click/long press</i>: %1 <i>Щелчок правой кнопкой/долгое нажатие</i>: %1 <i>Right-click</i>: %1 <i>Щелчок правой кнопкой</i>: %1 <i>Middle-click</i>: %1 <i>Щелчок средней кнопкой</i>: %1 <i>Long press</i>: %1 <i>Долгое нажатие</i>: %1 Open menu Открыть меню KeypadWidget Memory store Сохранить в памяти Memory clear Отчистить память Memory recall Вызвать из памяти Memory add Прибавить к значению в памяти Memory subtract Отнять от значения в памяти sin sin cos cos tan tg Uncertainty/interval Неопределённость/интервал Relative error Относительная ошибка Interval Интервал Move cursor left Перемещать курсор влево Move cursor to start Переместить курсор в начало Move cursor right Перемещать курсор вправо Move cursor to end Переместить курсор в конец Logical AND Логическое И Logical OR Логическое ИЛИ Bitwise Exclusive OR Побитовое исключающее ИЛИ Logical NOT Логическое НЕ Bitwise Left Shift Побитовый сдвиг влево Bitwise Right Shift Побитовый сдвиг вправо cmp доп rot рот a→1 А→1 Default assumptions Предположения по умолчанию Number Число Real Вещественное Rational Рациональное Integer Целое Boolean Логическое Unknown Unknown assumptions sign Неизвестное Non-zero Ненулевое Positive Положительное Non-negative Неотрицательное Negative Отрицательное Non-positive Не положительное Factorize Разложить на множители Expand Раскрывать Add column Добавить столбец Add row Добавить строку Remove column Удалить столбец Remove row Удалить строку Left parenthesis Левая скобка Left vector bracket Левая векторная скобка Right parenthesis Правая скобка Right vector bracket Правая векторная скобка Smart parentheses Умные скобки Vector brackets Векторные скобки Argument separator Разделитель аргументов Blank space Пустой пробел New line Новая строка Decimal point Десятичная точка Previous result (static) Предыдущий результат (статический) Button Action Действие клавиши Label: Метка: Action: Действие: None Ничего Value: Значение: Bitwise AND Побитовое И Delete Удалить Backspace Обратное перемещение Bitwise OR Побитовое ИЛИ Bitwise NOT Побитовое НЕ Clear expression Отчистить выражение Calculate expression Вычислить выражение Exponentiation Возведение в степень Percent or remainder Процент или остаток Multiplication Умножение Bitwise Shift Побитовый сдвиг Addition Сложение Plus Плюс Subtraction Вычитание Minus Минус Division Деление Store Сохранить New function Новая функция Expand partial fractions Развернуть частичные дроби Enable units in physical constants Включить единицы измерения в физических константах All constants Все константы Percentage Calculation Tool Инструмент расчёта процентов more ещё All units Все единицы All variables Все переменные Interval Display Отображение интервалов Adaptive Адаптивный Significant digits Значимые цифры Plus/minus Плюс/минус Relative Относительный Concise Краткая Interval Calculation Расчёт интервала Variance formula Формула дисперсии Interval arithmetic Арифметика интервалов Allow concise uncertainty input Разрешить ввод краткой неопределенности Complex number form Комплексная форма Rectangular Прямоугольная Exponential Экспоненциальная Polar Полярная Angle/phasor Угловая/векторная Type Assumptions type Тип предположений Тип Sign Assumptions sign Знак предположений Знак STO Standard calculator button. Do not use more than three characters. Стандартная кнопка калькулятора. Не используйте более трёх символов. СХР Action Действие NamesEditDialog Name Имя Abbreviation Сокращение Plural Множественная форма Reference Ссылка Avoid input Избегать ввода Unicode Юникод Suffix Суффикс Case sensitive С учётом регистра Completion only Только завершение Add Добавить Edit Правка Remove Удалить Warning Предупреждение Illegal name Недопустимое имя A function with the same name already exists. Функция с таким именем уже существует. A unit or variable with the same name already exists. Единица измерения или переменная с таким именем уже существует. PercentageCalculationDialog Percentage Проценты Value 1 Значение 1 Value 2 Значение 2 Change from 1 to 2 Изменение от 1 к 2 Change from 2 to 1 Изменение от 2 к 1 2 compared to 1 2 по сравнению к 1 1 compared to 2 1 по сравнению к 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Введите два значения, максимум одно из которых является процентом, а остальные будут рассчитаны за вас. Clear Очистить PeriodicTableDialog Periodic Table Периодическая таблица Element Data Данные элемента Alkali Metal Щелочной металл Alkaline-Earth Metal Щелочноземельный металл Lanthanide Лантаноид Actinide Актиноид Transition Metal Переходный металл Metal Металл Metalloid Металлоид Polyatomic Non-Metal Многоатомный неметалл Diatomic Non-Metal Двухатомный неметалл Noble Gas Благородный газ Unknown chemical properties Неизвестные химические свойства Unknown Неизвестное %1: %1: PlotDialog Plot График Data Данные Title: Заголовок: Expression: Выражение: Function Функция Vector/matrix Вектор/матрица Paired matrix Парная матрица Rows Строки X variable: Переменная X: Style: Стиль: Line Линия Points Символы Line with points Линия с символами Boxes/bars Прямоугольники/планки погрешностей Histogram Гистограмма Steps Ступенчатый Candlesticks Японские свечи Dots Точки Polar Полярная Smoothing: Сглаживание: None Нет Monotonic Монотонное Natural cubic splines Естественные кубические сплайны Bezier Безье Bezier (monotonic) Безье (монотонное) Y-axis: Ось Y: Primary Основная Secondary Вторичная Add Добавить Apply Применить Remove Удалить Title Заголовок Expression Выражение Function Range Диапазон функции Minimum x value: Минимальное значение x: Maximum x value: Максимальное значение x: Sampling rate: Частота дискретизации: Step size: Размер шага: Show real and imaginary parts Показать действительную и мнимую части Appearance Внешний вид Display grid Показать сетку Display full border Показать полную рамку Minimum y value: Минимальное значение y: Maximum y value: Максимальное значение y: Logarithmic x scale: Логарифмическая шкала абсцисс x: Logarithmic y scale: Логарифмическая шкала ординат y: X-axis label: Подпись для оси абсцисс X: Y-axis label: Подпись для оси ординат Y: Line width: Толщина линии: Legend placement: Размещение легенды: Top-left Сверху слева Top-right Сверху справа Bottom-left Снизу слева Bottom-right Снизу справа Below Ниже Outside Извне Calculating… Расчёт… Cancel Отмена Processing… Обработка… PreferencesDialog Look && Feel Внешний вид Numbers && Operators Числа и операторы Units && Currencies Единицы измерения и валюты Parsing && Calculation Разбор и вычисление Ignore system language (requires restart) Игнорировать системный язык (требуется перезапуск) Allow multiple instances Разрешить несколько экземпляров Clear history on exit Очищать историю при выходе Keep above other windows Поддерживать поверх других окон Window title: Заголовок окна: Application name Имя приложения Result Результат Application name + result Имя приложения + результат Workspace Рабочее пространство Application name + workspace Имя приложения + рабочее пространство Style: Стиль: Default (requires restart) Default style По умолчанию (требуется перезапуск) Dark mode Тёмный режим Colorize result Раскрасить результат Custom result font: Шрифт результатов: Custom expression font: Шрифт выражения: Custom keypad font: Шрифт клавиатуры: Custom application font: Шрифт приложения: Display expression status Показывать статус выражения Delay: Задержка: Expression after calculation: Выражение после расчёта: Keep expression Сохранить выражение Clear expression Отчистить выражение Replace with result Заменить на результат Replace with result if shorter Заменить на результат, если он короче Use keyboard keys for RPN Использовать клавиатуру для ПОЛИЗ Parsing mode: Режим анализа: Adaptive Адаптивный Conventional Общепринятый Implicit multiplication first Неявный первый Chain Цепь RPN ПОЛИЗ Truncate all numbers Обрезать все числа Read precision Точность чтения Limit implicit multiplication Ограничить неявное умножение Interval calculation: Расчёт интервала: Variance formula Формула дисперсии Interval arithmetic Арифметика интервалов Factorize result Разложить результат на множители Binary two's complement representation Представление двоичных чисел с дополнительным кодом Hexadecimal two's complement representation Представление шестнадцатеричных чисел с дополнительным кодом Use lower case letters in non-decimal numbers Использовать строчные буквы в недесятичных числах Spell out logical operators Изложить логично логические операции Preferences Параметры ms milliseconds мс Use dot as multiplication sign Использовать точку как знак умножения Use Unicode division slash in output Использовать косую черту деления Юнокода в выводе Use E-notation instead of 10^n Использовать E-нотацию вместо 10^n Use 'j' as imaginary unit Использовать «j» для мнимой единицы Use comma as decimal separator Использовать запятую в качестве десятичного разделителя Ignore comma in numbers Игнорировать запятую в числах Ignore dots in numbers Игнорировать точки в числах Copy unformatted ASCII by default Копировать неформатированный ASCII по умолчанию Round halfway numbers away from zero Округлять половинные числа от нуля Round halfway numbers to even Округлять половинные числа до ближайшего чётного целого числа Indicate repeating decimals Указывать повторяющиеся десятичные дроби Use caret for bitwise XOR Использовать карет для побитового исключающего ИЛИ Expression in history: Выражение в истории: Parsed Проанализированое Entered Введное Entered + parsed Введное + проанализированое Simplified percentage calculation Упрощённый процентный расчёт Digit grouping: Группировка цифр: None Никакой Standard Стандарт Local Локаль Interval display: Режим отображения интервалов: Significant digits Значимые цифры Interval Интервал Plus/minus Плюс/минус Midpoint Середина Lower Ниже Upper Выше Rounding: Округление: Complex number form: Комплексная форма: Rectangular Прямоугольная Exponential Экспоненциальная Polar Полярная Angle/phasor Угловая/векторная Abbreviate names Сокращённые имена Use binary prefixes for information units Использовать двоичные префиксы для информационных единиц Automatic unit conversion: Автоматическое преобразование единиц: No conversion Без преобразования Base units Основные единицы измерения Optimal units Оптимальные единицы измерения Optimal SI units Оптимальные единицы СИ Convert to mixed units Преобразовать в смешанные единицы Automatic unit prefixes: Автоматические префиксы единиц: Default По умолчанию No prefixes Без префиксов Prefixes for some units Префиксы для выбранных единиц Prefixes also for currencies Префиксы также для валют Prefixes for all units Префиксы для всех единиц Enable all SI-prefixes Включить все префиксы СИ Enable denominator prefixes Включить префиксы знаменателя Enable units in physical constants Включить единицы измерения в физических константах Temperature calculation: Режим расчёта температуры: Absolute Абсолютный Relative Относительный Hybrid Гибридный Exchange rates updates: Обновления курсов валют: %n day(s) %n день %n дня %n дней Format result Форматировать результат Use special duodecimal symbols Использовать специальные двенадцатеричные символы Language: Язык: Restart required Требуется перезапуск Please restart the program for the language change to take effect. Пожалуйста, перезапустите приложение, чтобы изменение языка вступили в силу. Automatically copy result Автоматически копировать результат Copy unformatted ASCII without units Копировать неформатированный ASCII без единиц измерения Tooltips: Подсказки: Show all Показывать всё Hide in keypad Скрывать на клавиатуре Hide all Скрывать всё Interpret unrecognized symbols as variables Интерпретировать нераспознанные символы как переменные Concise Краткая Enable units Включить единицы измерений Allow concise uncertainty input Разрешить ввод краткой неопределенности Close application with Escape key Закрыть приложение клавишей Esc Round halfway numbers to odd Округлять половинные числа до ближайшего нечётного целого числа Round halfway numbers toward zero Округлять половинные числа к нулю Round halfway numbers to random Округлять половинные числа случайно Round halfway numbers up Округлять половинные числа вверх Round halfway numbers down Округлять половинные числа вниз Round toward zero Округлять к нулю Round away from zero Округлять от нуля Round up Округлять вверх Round down Округлять вниз Two's complement output: Дополнительный код для вывода Two's complement input: Дополнительный код для ввода Binary Двоичное Hexadecimal Шестнадцатеричное Binary bits: Двоичные биты: Automatic Автоматически Max history lines saved: Максимальное количество сохраненных строк истории: Preserve history height Сохранять высоту списка истории Do not change the height of history list when keypad or number bases are show or hidden. Не изменять высоту списка истории, когда клавиатура или числовые базы показаны или скрыты. Expression status: Статус выражения: Off Выкл In history list В списке истории In expression field В поле выражения Status tooltip delay: Задержка подсказки о статусе: Calculate as you type delay: Задержка расчёта по мере ввода: Automatically group digits in input (experimental) Disable cursor blinking Automatically calculate selection QApplication Execute expressions and commands from a file Выполнить выражения и команды из файла FILE ФАЙЛ Start a new instance of the application Запустить новый экземпляр приложения Specify the window title Укажите заголовок окна TITLE НАЗВАНИЕ Display the application version Показать версию приложения Open workspace Открыть рабочее пространство Expression to calculate Выражение для вычисления [EXPRESSION] [ВЫРАЖЕНИЕ] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? По умолчанию разрешён только один экземпляр (одно главное окно) %1. Если несколько экземпляров открыты одновременно, будут сохранены только определения (переменные, функции и т. д.), режим, настройки и история последнего закрытого окна. Вы, несмотря на это, хотите изменить поведение по умолчанию и разрешить одновременную работу нескольких экземпляров? %1 is already running. %1 уже исполняется. Failed to load global definitions! Не удалось загрузить глобальные определения! answer ответ History Answer Value Значение ответа в истории History Index(es) Индекс(ы) истории History index %s does not exist. Индекс истории %s не существует. Last Answer Последний ответ Answer 2 Ответ 2 Answer 3 Ответ 3 Answer 4 Ответ 4 Answer 5 Ответ 5 Memory Память Couldn't write preferences to %1 Не удалось записать настройки в %1 Error Ошибка Function not found. Функция не найдена. Variable not found. Переменная не найдена. Unit not found. Единица измерения не найдена. Unsupported base. Неподдерживаемое основание. Unsupported value. Неподдерживаемое значение. Allow multiple instances? QalculateQtSettings Update exchange rates? Обновить курсы валют? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Прошёл %n день с момента последнего обновления курсов обмена. Вы хотите обновить курсы обмена сейчас? Прошло %n дня с момента последнего обновления курсов обмена. Вы хотите обновить курсы обмена сейчас? Прошло %n дней с момента последнего обновления курсов обмена. Вы хотите обновить курсы обмена сейчас? Fetching exchange rates… Получение курсов валют… Path of executable not found. Путь к исполняемому файлу не найден. curl not found. Программа curl не найдена. Failed to run update script. %1 Не удалось запустить скрипт обновления. %1 Failed to check for updates. Не удалось проверить наличие обновлений. No updates found. Обновлений не найдено. A new version of %1 is available at %2. Do you wish to update to version %3? Новая версия %1 доступна: %2. Вы хотите обновиться до версии %3? A new version of %1 is available. You can get version %3 at %2. Доступна новая версия %1. Вы можете получить версию %3: %2. %1: %2 %1: %2 Insert function Вставить функцию Insert function (dialog) Вставить функцию (на выбор) Insert variable Вставить переменную Approximate result Приблезительный результат Negate Отрицание Invert Обратить Insert unit Вставить единицу измерения Insert text Вставить текст Insert operator Вставить оператор Insert date Вставить дату Insert matrix Вставить матрицу Insert smart parentheses Вставить умные скобки Convert to unit Преобразовать в единицу измерения Convert Преобразовать Convert to optimal unit Преобразовать в оптимальную единицу измерения Convert to base units Преобразовать в базовые единицы измерения Convert to optimal prefix Преобразовать в оптимальный префикс Convert to number base Преобразовать к основанию систем счисления Factorize result Разложить результат на множители Expand result Развернуть результат Expand partial fractions Развернуть частичные дроби RPN: down ПОЛИЗ: вниз RPN: up ПОЛИЗ: вверх RPN: swap ПОЛИЗ: обменять RPN: copy ПОЛИЗ: копировать RPN: lastx ПОЛИЗ: последний x RPN: delete register ПОЛИЗ: удалить RPN: clear stack ПОЛИЗ: очистить стек Set expression base Установить основание для выражения Set result base Установить основание для результата Set angle unit to degrees Установить угловую единицу измерения в градусы Set angle unit to radians Установить угловую единицу измерения в радианы Set angle unit to gradians Установить угловую единицу измерения в грады Active normal display mode Активировать простой режим отображения Activate scientific display mode Активировать научный режим отображения Activate engineering display mode Активировать инженерный режим отображения Activate simple display mode Активировать упрощённый режим отображения Toggle RPN mode В(ы)ключить режим ПОЛИЗ Show general keypad Показать основную клавиатуру Toggle programming keypad В(ы)ключить клавиатуру программирования Toggle algebra keypad В(ы)ключить алгебраическую клавиатуру Toggle custom keypad В(ы)ключить пользовательскую клавиатуру Show/hide keypad Показать/скрыть клавиатуру Search history Искать в истории Show variables Показать переменные Show functions Показать функции Show units Показать единицы измерения Show data sets Показать наборы данных Store result Сохранить результат MC (memory clear) MC (отчистить память) MR (memory recall) MR (вызвать из памяти) MS (memory store) MS (сохранить в памяти) M+ (memory plus) M+ (прибавить к значению в памяти) M− (memory minus) M− (отнять от значения в памяти) New variable Новая переменная New function Новая функция Open plot functions/data Открыть график функций/данных Open convert number bases Открыть преобразование между основаниями систем счисления Open floating point conversion Открыть окно преобразования чисел с плавающей запятой Open calender conversion Открыть окно преобразования календарей Open percentage calculation tool Открыть окно инструмента расчёта процентов Open periodic table Открыть окно с периодической таблицей Update exchange rates Обновить курсы валют Copy result Копировать результат Insert result Вставить результат Open mode menu Открыть меню режимов Open menu Открыть меню Help Справка Quit Выход Toggle chain mode В(ы)ключить режим цепочки Toggle keep above Поддерживать поверх других Show completion (activate first item) Показать завершение (активировать первый элемент) Clear expression Отчистить выражение Delete Удалить Backspace Обратное перемещение Home Начало End Конец Right Вправо Left Влево Up Вверх Down Вниз Undo Отменить Redo Повторить Calculate expression Вычислить выражение Expression history next Следующее выражение в истории Expression history previous Предыдущее выражение в истории Error Ошибка Warning Предупреждение Information Информирование Clear history Очистить историю Toggle precision Переключить точность Toggle max decimals Переключить максимальное количество десятичных знаков Toggle min decimals Переключить минимальное количество десятичных знаков Toggle max/min decimals Переключить максимальное/минимальное количество десятичных знаков Default По умолчанию Formatted result Форматированный результат Unformatted ASCII result Неформатированный ASCII результат Unformatted ASCII result without units Неформатированное ASCII выражение без единиц измерения Formatted expression Форматированное выражение Unformatted ASCII expression Неформатированное ASCII выражение Formatted expression + result Форматированное выражение + результат Unformatted ASCII expression + result Неформатированные ASCII выражение + результат Open functions menu Открыть меню функций Open units menu Открыть меню единиц измерения Open variables menu Открыть меню переменных Download Скачать Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Toggle fraction format in current result QalculateTranslator Cancel Only used when Qt translation is missing Отменить Close Only used when Qt translation is missing Закрыть OK Only used when Qt translation is missing ОК &Yes Only used when Qt translation is missing &Да &No Only used when Qt translation is missing &Нет &Open Only used when Qt translation is missing &Открыть &Save Only used when Qt translation is missing &Сохранить &Select All Only used when Qt translation is missing &Выбрать все Look in: Only used when Qt translation is missing Смотреть в: File &name: Only used when Qt translation is missing Имя &файла: Files of type: Only used when Qt translation is missing Тип файлов: QalculateWindow Menu Меню New Новая Function… Функция… Variable/Constant… Переменная/константа… Unknown Variable… Переменная неизвестного… Matrix… Матрица… Workspaces Рабочие пространства Open… Открыть… Open default Открыть по умолчанию Save Сохранить Save As… Сохранить как… Import CSV File… Загрузить CSV файл… Export CSV File… Экспорт в CSV файл… Functions Функции Variables and Constants Переменные и константы Units Единицы измерения Plot Functions/Data Графики функций/данных Floating Point Conversion (IEEE 754) Преобразование чисел с плавающей запятой (IEEE 754) Calendar Conversion Преобразование календаря Update Exchange Rates Обновить курсы валют Normal Mode Режим нормальный RPN Mode Режим ПОЛИЗ Chain Mode Режим «цепь» Keyboard Shortcuts Клавиатурные комбинации Preferences Параметры Help Справка Report a Bug Сообщить об ошибке Check for Updates Проверить обновления About %1 О %1 Quit Выход Mode Режим General Display Mode Режим общего отображения Normal Обычный Scientific Научный Engineering Инженерный Simple Простой Angle Unit Единица измерения углов Radians Радианы Degrees Градусы Gradians Грады Approximation Приближение Automatic Automatic approximation Автоматическое Dual Dual approximation Двойное Exact Exact approximation Точное Approximate Приблизительное Assumptions Предположения Type Assumptions type Тип Number Число Real Вещественное Rational Рациональное Integer Целое Boolean Логическое Sign Assumptions sign Знак Unknown Unknown assumptions sign Неизвестное Non-zero Ненулевое Positive Положительное Non-negative Неотрицательное Negative Отрицательное Non-positive Не положительное Result Base Основание для результата Binary Двоичное Octal Восьмеричное Decimal Десятичное Hexadecimal Шестнадцатеричное Other Другое Duodecimal Двенадцатеричное Sexagesimal Шестидесятеричное Time format Формат времени Roman numerals Римские цифры Unicode Юникод Bijective base-26 Биективное основание-26 Binary-encoded decimal (BCD) Двоично-десятичный код Custom: Number base Пользовательское: Expression Base Основание для выражения Other: Number base Другое: Precision: Точность: Min decimals: Минимум цифр: Max decimals: Максимум цифр: off Max decimals выкл Convert Перевести Store Сохранить Keypad Клавиатура Number bases Основания систем счисления Unit… Единица измерения… Data Sets Наборы данных Percentage Calculation Tool Инструмент расчёта процентов Periodic Table Периодическая таблица Binary: Двоичное: Octal: Восьмеричное: Decimal: Десятичное: Hexadecimal: Шестнадцатеричное: RPN Stack Стек ПОЛИЗ New Function… Новая функция… Powerful and easy to use calculator Мощный и простой в использовании калькулятор Couldn't write definitions Не удалось записать определения hexadecimal шестнадцатеричное octal восьмеричное decimal десятеричное duodecimal двенадцатеричное binary двоичное roman римское число bijective биективное sexagesimal шестидесятеричное latitude широта longitude долгота time время Time zone parsing failed. Не удалось выполнить синтаксический анализ часового пояса. bases основания calendars календари rectangular прямоугоная cartesian декартова exponential экспоненциальная polar полярная phasor фазовая angle угловая optimal оптимально base основание mixed смешано fraction дробь factors множители partial fraction частичная дробь factorize разложить на множители expand раскрывать Calculating… Расчёт… Cancel Отмена RPN Operation ПОЛИЗ операция Factorizing… Факторизация… Expanding partial fractions… Расширение дробных чисел… Expanding… Расширение… Converting… Преобразование… RPN Register Moved Регистр ПОЛИЗ перемещён Processing… Обработка… Matrix Матрица Temperature Calculation Mode Режим расчёта температуры The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Выражение неоднозначное. Выберите режим расчёта температуры (режим позже можно изменить в настройках). Absolute Абсолютный Relative Относительный Hybrid Гибридный Please select desired variant of the sinc function. Выберите нужный вариант функции sinc. Unnormalized Ненормированный Normalized Нормированный Interpretation of dots Использование точки Please select interpretation of dots (".") (this can later be changed in preferences). Выберите использование точки («.») (позже это можно изменить в настройках). Both dot and comma as decimal separators Точка и запятая в качестве десятичных разделителей Dot as thousands separator Точка как разделитель тысяч Only dot as decimal separator Только точка в качестве десятичного разделителя Parsing Mode Режим анализа The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Выражение неоднозначное. Выберите интерпретацию выражений с неявным умножением (позже это можно изменить в настройках). Implicit multiplication first Сначала анализировать неявное умножение Conventional Общепринятый синтаксический анализ Adaptive Адаптивный Edit Keyboard Shortcut Править клавиатурную комбинацию New Keyboard Shortcut Новая клавиатурная комбинация Action: Действие: Value: Значение: Set key combination Назначить комбинацию клавиш Press the key combination you wish to use for the action. Нажмите комбинацию клавиш, которую хотите использовать для действия. Reserved key combination Зарезервированная комбинация клавиш The key combination is already in use. Do you wish to replace the current action (%1)? Комбинация клавиш уже используется. Вы хотите заменить текущее действие (%1)? Question Вопрос Add… Добавить… Edit… Правка… Remove Удалить Gnuplot was not found Программа Gnuplot не найдена %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. Для построения графиков %1 (%2) должен быть установлен дополнительно и находиться по переменной окружения PATH. Example: Example of function usage Пример: Enter RPN Enter Ввод Calculate Рассчитать Apply to Stack Применить к стеку Insert Вставить Failed to open workspace удалось открыть рабочее пространство Couldn't save workspace Не удалось сохранить рабочее пространство Save file? Сохранить файл? Do you want to save the current workspace? Вы хотите сохранить текущую рабочее пространство? Do not ask again Не спрашивать снова Keep open Держать открытым Value Значение Argument Аргумент %1: %1: General Основная Programming Программирование Algebra Алгебра Custom Пользовательская None Ничего Hide Number Pad Скрыть цифровую клавиатуру Reset Keypad Position Сбросить положение цифровой клавиатуры Number Bases Основания систем счисления Rotate the stack or move the selected register up Повернуть стек или переместить выбранный регистр вверх Rotate the stack or move the selected register down Повернуть стек или переместить выбранный регистр вниз Swap the top two values or move the selected value to the top of the stack Поменять местами два верхних значения или переместить выбранное значение в вершину стека Delete the top or selected value Удалить верхнее или выбранное значение Enter the top value from before the last numeric operation Введите верхнее значение перед последней числовой операцией Copy the selected or top value to the top of the stack Скопировать выбранное или верхнее значение в вершину стека Clear the RPN stack Очистить стек ПОЛИЗ True Истина False Ложь Info Инфо optional optional argument необязательный Failed to open %1. %2 Не удалось открыть %1. %2 License: GNU General Public License version 2 or later Лицензия: GNU General Public License, версия 2 или новее Error Ошибка Add Action (%1) Добавить действие (%1) Plot График Separate Menu Buttons Отделить меню клавиш Icons only Только значки Text only Только текст Text beside icons Текст рядом со значками Text under icons Текст под значками <i>Right-click/long press</i>: %1 <i>Щелчок правой кнопкой/долгое нажатие</i>: %1 Favorites Избранное Recent Недавние User functions Пользовательские функции Open dialog Открыть диалоговое окно Show all functions Показать все функции User units Пользовательские единицы more ещё Prefixes Префиксы Show all units Показать все единицы измерения User variables Пользовательские переменные Show all variables Показать все переменные Open menu Открыть меню Copy Копировать prefix префикс decimals десятичные дроби Percentage Interpretation Процентная интерпретация Please select interpretation of percentage addition Пожалуйста, выберите интерпретацию процентного сложения Add percentage of original value Добавить процент от первоначального значения Add percentage multiplied by 1/100 Добавить процент, умноженный на 1/100 Show toolbar Показать панель инструментов Action Действие Key combination Комбинация клавиш Number Pad Always Show Number Pad Open Settings Folder(s) UnitEditDialog General Основное Relation Отношение Name: Имя: Category: Категория: Descriptive name: Краткое описание: System: Система: Imperial Имперская/Британская US Survey Американская геодезическая Hide unit Скрыть единицу измерения Description: Расширенное описание: Class: Класс: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Класс, к которому принадлежит эта единица измерения. Именованные производные единицы измерения определяются по отношению к другой единице измерения с необязательным показателем, в то время как безымянные производные единицы измерения определяются выражением через одну или несколько единиц измерения. Base unit Основная единица измерения Named derived unit Именованная производная единица измерения Derived unit Производная единица измерения Base unit(s): Основная(ые) единица(ы) измерения: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Единица измерения (для именованной производной единицы измерения) или выражение единицы измерения (для безымянной производной единицы измерения), в отношении которой определена редактируемая единица измерения Exponent: Показатель: Relation: Отношение: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Отношение к основной единице измерения. Для линейных отношений это должно быть просто число.<br><br>Для нелинейных отношений используйте \\ x для множителя и \\ y для показателя степени (например, «\\x + 273,15» для отношения между градусами Цельсия и Кельвина). Inverse relation: Обратное отношение: Specify for non-linear relation, for conversion back to the base unit. Указать для нелинейного отношения, чтобы обратно преобразовать в базовую единицу измерения. Mix with base unit Смешивать с базовой единицей измерения Priority: Приоритет: Minimum base unit number: Минимальное количество базовой единицы измерения: Use with prefixes by default По умолчанию использовать с префиксами Error Ошибка Base unit does not exist. Основная единица измерения не существует. Question Вопрос A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерения или переменная с таким именем уже существует. Вы хотите её перезаписать? Edit Unit Изменить единицу измерения New Unit Новая единица измерения Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". UnitsDialog Units Единицы измерения Category Категория Unit Единица измерения New… Новая… Edit… Правка… Deactivate Деактивировать Delete Удалить Convert Перевести Insert Вставить Favorite Избранный Activate Активировать All All units Все Uncategorized Без категорий User units Пользовательские единицы Favorites Избранное Inactive Неактивные Show hidden units Показать скрытые единицы измерения UnknownEditDialog Name: Имя: Custom assumptions Собственные предположения Type: Тип: Sign: Знак: A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерения или переменная с таким именем уже существует. Вы хотите её перезаписать? Edit Unknown Variable Изменить переменную неизвестного New Unknown Variable Новая переменная неизвестного Question Вопрос Temporary Временная VariableEditDialog Name: Имя: Temporary Временная Value: Значение: Required Обязательно Description Расширенное описание current result текущий результат Category: Категория: Descriptive name: Краткое описание: Hide variable Скрыть переменную Description: Расширенное описание: A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерения или переменная с таким именем уже существует. Вы хотите её перезаписать? Edit Variable Изменить переменную New Variable Новая переменная Question Вопрос VariablesDialog Variables Переменные Category Категория Variable Переменная New Новая переменная/константа/матрица Новая Variable/Constant… Переменная/константа… Unknown Variable… Переменная неизвестного… Matrix… Матрица… Edit… Правка… Export… Экспортировать… Deactivate Деактивировать Delete Удалить Insert Вставить Favorite Избранный a matrix матрица a vector вектор positive положительное non-positive не положительное negative отрицательное non-negative неотрицательное non-zero ненулевое integer целое boolean логическое rational рациональное real вещественное complex комплексное number число not matrix не матрица unknown неизвестное Default assumptions Предположения по умолчанию Activate Активировать All All variables Все Uncategorized Без категорий User variables Пользовательские переменные Favorites Избранное Inactive Неактивные qalculate-qt-5.5.1/translations/qalculate-qt_sl.ts000066400000000000000000016302201475705355700223310ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Računalo Powerful and easy to use calculator Zmogljivo računalo, preprosto za uporabo calculation;arithmetic;scientific;financial; izračun;aritmetika;znanstveno;finančno;računalo;kalkulator; Qalculate! (Qt UI) Qalculate! (vmesnik Qt) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! je večnamensko namizno računalo, ki deluje na več platformah. Je preprosto za uporabo, prinaša pa tako napredna orodja, ponavadi značilna le za kompleksno matematično programje, kot tudi uporabna orodja za vsakodnevne potrebe (npr. pretvorbe valut ali izračun odstotkov). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Program vsebuje obsežno knjižnjico prilagodljivih funkcij, enot, izračunov in pretvorb, fizikalnih konstant, simbolnih izračunov (tudi integrale in enačbe), poljubno natančnost, statistično negotovost, intervalno aritmetiko, grafe in uporabniku prijazen vmesnik. Argument Rules Pravila za argumente _Cancel _Prekliči Do not save modifications Ne shrani sprememb _OK _Vredu Accept the modification of argument rules Sprejmi spremembe pravil za argumente Enable rules and type test Omogoči pravila in piši hitro Custom condition Pogoj po meri For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Če je na primer argument matrika, ki mora imeti isto število vrstic in stolpcev: rows(\x) = columns(\x) Allow matrix Dovoli matriko Forbid zero Prepovej ničlo Handle vector Obravnavaj vektor Calculate function for each separate element in vector. Izračunaj funkcijo za posamezni element vektorja. Min Min Include equals Vključi enačaje Max Max Keyboard Shortcuts Tipkovne bližnjice _Close _Zapri Label Oznaka Left-click Levi klik Right-click Desni klik Middle-click Srednji klik Reset Ponastaviti Value Vrednost Argument name Ime argumenta Calendar Conversion Pretvorba koledarjev Export CSV File Izvozi datoteko CSV Current result Trenutni rezultat Matrix/vector variable Matrika/vektorska spremenljivka File Datoteka Delimiter Ločilnik Comma Vejica Tabulator Tabulator Semicolon Podpičje Space Presledek Other Drugo Import CSV File Uvozi datoteko CSV Do not import the file Ne uvozi datoteke Import the file Uvozi datoteko Name of the data file to import Ime datoteke za uvoz Select a file Izberite datoteko Import as Uvozi kot Matrix Matrika If a matrix shall be generated from the contents of the file Naj se matrike ali vektorji ustvarijo iz vsebine datoteke Vectors Vektorji If vectors shall be generated from the contents of the file Naj se matrike ali vektorji ustvarijo iz vsebine datoteke Name Ime Name (or name prefix) used to reference generated variable(s) in expressions Ime (ali njegova predpona), uporabljeno za sklice ustvarjenih spremenljivk v izrazih Descriptive name Opis Title displayed in menus and in variable manager Naslov, prikazan v menijih in upravljalniku spremenljivk Category Kategorija First row Prva vrstica The first row with data to import in the file Prva vrstica s podatki za uvoz v datoteko Includes headings Dodaj naslove If the first row contains column headings Naj prva vrstica vsebuje naslove stolpcev Delimiter used to separate columns in the file Ločilnik za stolpce v datoteki Custom delimiter Ločilnik po meri Edit Data Property Uredi lastnost podatka Do not create/modify this data set Ne ustvari/uredi tega podatkovnega nabora Accept the creation/modification of this data set Sprejmi izdelavo/urejevanje tega podatkovnega nabora Name used for reference Ime, uporabljeno za sklic Properties Lastnosti Title displayed in menus and in data set manager Naslov, prikazan v menijih in upravljalniku podatkovnih naborov Description Opis Description of this data property Opis lastnosti podatka Value Type Vrsta vrednosti Text Besedilo Number Številka Expression Izraz Hide Skrij Use as key Uporabi kot ključ Approximate value Približna vrednost Case sensitive value Vrednost, občutljiva na velikost črk Value uses brackets Vrednost uporablja oklepaje Unit expression Izraz enote Edit Data Set Uredi podatkovni nabor Title Naslov Data file Podatkovna datoteka Description of this data set Opis podatkovnega nabora Copyright Copyright General Splošno Properties: Lastnosti: Definition of the properties of this data set Definicija lastnosti podatkovnega nabora _New _Novo _Edit _Uredi _Delete _Izbriši Name used to invoke the function in expressions Ime za klic funkcije v izrazih Object argument name Ime objekta argumenta Property argument name Ime lastnosti argumenta Default property Privzeta lastnost Function Funkcija Edit Data Object Uredi podatkovni objekt Do not create/modify this data object Ne ustvari/uredi tega podatkovnega objekta Accept the creation/modification of this data object Sprejmi izdelavo/urejevanje tega podatkovnega objekta Data Sets new dataset Podatkovni nabori Data Set Podatkovni nabor Create a new data set Ustvari nov podatkovni nabor Edit the selected data set Uredi izbran podatkovni nabor Delete the selected data set Izbriši izbran podatkovni nabor Objects Objekti Create a new data object Ustvari nov podatkovni objekt Edit the selected data object Uredi izbran podatkovni objekt Remove the selected data object Odstrani izbran podatkovni objekt Data Set Description Opis podatkovnega nabora Object Attributes Atributi objekta Decimals Decimalke Close this window Zapri okno Min decimals Min. decimalke Max decimals Maks. decimalke Minimal number of displayed decimals Najmanjše število prikazanih decimalk Maximal number of decimals to display (and round to) Največje število decimalk za prikaz (in zaokrožitev) Floating Point Conversion Pretvorba plavajoče vejice Decimal value Desetiška vrednost Binary value Binarna vrednost Octal value Osmiška vrednost Hexadecimal representation Šestnajstiška predstavitev Conversion error Napaka pri pretvorbi Binary representation Binarna predstavitev Floating point value Vrednost s plavajočo vejico Format Oblika 16-bit (half precision) 16-bitno (polovična natančnost) 32-bit (single precision) 32-bitno (enojna natančnost) 64-bit (double precision) 64-bitno (dvojna natančnost) 80-bit (x86 extended format) 80-bitno (razširjena oblika x86) 128-bit (quadruple precision) 128-bitno (četvorna natančnost) Hexadecimal value Šestnajstiška vrednost Edit Function Uredi funkcijo _Help _Pomoč Do not create/modify this function Ne ustvari/uredi te funkcije Accept the creation/modification of this function Sprejmi izdelavo/urejevanje te funkcije Name used to invoke this function in expressions Ime za klic funkcije v izrazih Title displayed in menus and in function manager Naslov, prikazan v menijih in upravljalniku funkcij Hide function Skrij funkcijo If this function shall be hidden in menus Naj bo ta funkcija skrita v menijih Description of this function Opis funkcije Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Uporabi \x za prvi, \y za drugi in \z za tretji argument. Za več informacij kliknite gumb za pomoč. Condition Pogoj Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Pogoj, ki mora biti pravilen za funkcijo (npr. če mora biti drugi argument večji od prvega: "\y > \x") Sub-Functions Podfunkcije Arguments: Argumenti: Definition of this function's arguments Definicija funkcijskega argumenta Free Prosto Integer Celo število Symbol Simbol Date Datum Vector Vektor Positive number Pozitivno število Non-zero number Neničelno število Non-negative number Nenegativno število Positive integer Pozitivno celo število Non-zero integer Neničelno celo število Non-negative integer Nenegativno celo število Boolean Logična vrednost Object Objekt Unit Enota Variable Spremenljivka Angle Kot Data object Podatkovni objekt Data property Podatkovna lastnost _Add _Dodaj Add entered argument definition Dodaj vnešeno definicijo argumenta _Apply _Uporabi Modify selected argument Uredi izbran argument Remove selected argument Odstrani izbran argument Rules Pravila Edit conditions for selected argument Uredi pogoje za izbran argument Close this dialog Zapri to okno Precalculate Izračunaj vnaprej Calculate the subfunction only once, before the parent function Izračunaj podfunkcijo le enkrat, pred glavno Add entered subfunction Dodaj vnešeno podfunkcijo Apply changes to the selected subfunction Uporabi spremembe izbrane podfunkcije Remove the selected subfunction Odstrani izbrano funkcijo Functions Funkcije Create a new function Ustvari novo funkcijo Edit the selected function Uredi izbrano funkcijo _Insert _Vnesi Insert (or execute) the selected function into the expression entry Vnesi (ali izvrši) izbrano funkcijo v polje za izraz Delete the selected function Izbriši izbrano funkcijo (De)activate the selected function O(ne)mogoči izbrano funkcijo Deacti_vate O_nemogoči Apply the selected function to the current expression Uporabi izbrano funkcijo v trenutnem izrazu Categor_y Kategor_ija _Function _Funkcija Descri_ption O_pis Degrees Stopinje Radians Radiani Gradians Gradiani Default assumptions Privzete predpostavke Unknown Neznano Not Matrix Ni matrika Complex Kompleksno Real Realno Rational Racionalno Non-Zero Neničelno Positive Pozitivno Non-Negative Nenegativno Negative Negativno Non-Positive Nepozitivno _File _Datoteka Unknown Variable Neznana spremenljivka Function (simplified) Funkcija (poenostavljena) Import CSV File… Uvozi datoteko CSV... Export CSV File… Izvozi datoteko CSV... _Store Result… _Shrani rezultat... Save Result Image… Shrani sliko rezultata... Save local functions, variables and units Shrani lokalne funkcije, spremenljivke in enote Save Definitions Shrani definicije Import Definitions File… Uvozi datoteko z definicijami... Fetch current exchange rates from the Internet Pridobi trenutna menjalna razmerja iz Interneta Update Exchange Rates Posodobi menjalna razmerja Plot Functions/Data Izriši funkcije/podatke Convert Number Bases Pretvori številske osnove Floating Point Conversion (IEEE 754) Pretvorba plavajoče vejice (IEEE 754) Percentage Calculation Tool Orodje za izračun odstotkov Periodic Table Periodni sistem Minimal Window Majhno okno _Quit _Izhod Manage Variables Upravljaj spremenljivke Manage Functions Upravljaj funkcije Manage Units Upravljaj enote Manage Data Sets Upravljaj podatkovne nabore Factorize Faktoriziraj Expand Razširi Apply partial fraction decomposition to the current result. Uporabi parcialno dekompozicijo ulomkov v trenutnem rezultatu Expand Partial Fractions Razširi parcialne ulomke Set Unknowns… Nastavi neznanke... Convert to Unit Pretvori v enoto Set Prefix Nastavi predpono Convert to Unit Expression… Pretvori v enoto izraza... Convert to Base Units Pretvori v osnovne enote Convert to Optimal Unit Pretvori v najustreznejšo enoto Insert Date… Vnesi datum... Insert Matrix… Vnesi matriko... Insert Vector… Vnesi vektor... _Copy Result _Kopiraj rezultat Customize Keypad Buttons Prilagodite gumbe na tipkovnici _Preferences _Nastavitve _Mode N_ačin Number Base Številska osnova Select Result and Expression Base… Nastavi rezultat in osnovo izraza... Binary Binarno Octal Osmiško Decimal Desetiško Duodecimal Dvanajstiško Hexadecimal Šestnajstiško Other… Drugo... Sexagesimal Šestdesetiško Time Format Časovna oblika Roman Numerals Rimske številke Numerical Display Številski prikaz Normal Običajen Engineering Inženirski Scientific Znanstveni Purely Scientific Le znanstveni Simple Preprost Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Izklopljeno: 1/7 ≈ 0.14285714 Vklopljeno: 1/7 = 0.142857 142857... Indicate Repeating Decimals Navedi ponavljajoče se decimalke Show Ending Zeroes Prikaži končne ničle Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Izklopljeno: 2.5 ≈ 3, 1.5 ≈ 2 Vklopljeno: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Zaokroži polovična števila na soda Off: -x + y On: y - x Izklopljeno: -x + y Vklopljeno: y - x Sort Minus Last Minuse razvrsti na koncu Complex Rectangular Form Kompleksna pravokotna oblika Complex Exponential Form Kompleksna eksponentna oblika Complex Polar Form Kompleksna polarna oblika Complex Angle/Phasor Notation Kompleksna kazalčna/fazorska notacija Rational Number Form Racionalna številska oblika 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Desetiški ulomki 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Točni desetiški ulomki 6/4 = 3/2 6/4 = 3/2 Simple Fractions Preprosti ulomki 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Mešani ulomki Interval Display Intervalni prikaz Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Izklopljeno: 1/2*pi ≈ 1.5707963 Vklopljeno: 1/2*pi = 0.5 pi Adaptive Prilagodljivo Calculates an interval of possible values and keeps track of precision changes. Izračuna interval možnih vrednosti in si zapomni spremembe natančnosti vmesnih korakov. Significant Digits Pomembne števke Interval Interval Plus/Minus Plus/minus Midpoint Sredina Unit Display Prikaz enot Do not use any prefixes in result V rezultatu ne uporabi predpon Show prefixes for primarily SI and CGS units. Prikaži predpone za enote sistemov SI in CGS. Use prefixes for selected units Uporabi predpone za izbrane enote Use prefixes also for currencies Uporabi predpone tudi za valute Use prefixs for all units Uporabi predpone za vse enote Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Omogoči samodejno uporabo besed hekta, deka, deci in centi, ko so predpone vklopljene. Enable All SI Prefixes Omogoči vse predpone SI Enables automatic setting of prefix for denominator in addition to the numerator Omogoči samodejno dodajanje predpon tudi imenovalcu, ne le števcu Enable Denominator Prefixes Omogoči predpone imenovalca Off: J / K On: J * K^-1 Izklopljeno: J / K Vklopljeno: J * K^-1 Negative Exponents Negativni eksponenti Off: (2 m)/s On: 2 (m/s) Izklopljeno: (2 m)/s Vklopljeno: 2 (m/s) Place Units Separately Enote zapiši ločeno No Additional Conversion Brez dodatne pretvorbe Convert to Optimal SI Unit Pretvori v najboljšo enoto SI If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Če omogočeno: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Pretvori v mešane enote Abbreviate Names Skrajšaj imena Enabled Objects Omogočeni objekti Variables Spremenljivke Units Enote Unknowns Neznanke Units in Physical Constants Enote v fizikalnih konstantah If not enabled, treats all variables as unknown Obravnavaj vse spremenljivke kot neznane, če onemogočeno Calculate Variables Izračunaj spremenljivke Disables/enables complex numbers in result Onemogoči/omogoči kompleksna števila v rezultatu Allow Complex Result Dovoli kompleksen rezultat Disables/enables infinite numbers in result Onemogoči/omogoči neskončna števila v rezultatu Allow Infinite Result Dovoli neskončen rezultat Approximation Približek Always Exact Vselej točno Try Exact Poskusi točno Approximate Izračunaj približek Interval Arithmetic Intervalna aritmetika Interval Calculation Izračun intervala Variance Formula Enačba za varianco Change angle unit used in trigonometric functions Spremeni kotne enote v trigonometričnih funkcijah Angle Unit Kotne enote None Brez Assumptions Predpostavke Algebraic Mode Algebraičen način Assume that unknown denominators are non-zero Predpostavi, da so neznani imenovalci neničelni Non-Zero Denominators Neničelni imenovalci Warn when unknown denominators are assumed non-zero Opozori, ko so neznani imenovalci lahko ničelni Warn About Denominators Assumed Non-Zero Opozori o neničelnih imenovalcih Parsing Mode Način obdelave Adaptive Parsing Prilagodljiva obdelava Parse Implicit Multiplication First Sprva obdelaj implicitno množenje Conventional Parsing Običajna obdelava RPN Syntax Sintaksa RPN Off: xy = x*y On: xy != x*y Izklopljeno: xy = x*y Vklopljeno: xy != x*y Limit Implicit Multiplication Omejitev implicitnega množenja Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Obdelaj decimalna števila kot približke z natančnostjo, enako številu števk. Izklopljeno: 1.1 * 1.1 = 1.21 Vklopljeno: 1.1 * 1.1 ≈ 1.2 Read Precision Točnost branja _Precision _Točnost _Decimals _Decimalke Calculate As You Type Računaj med vnašanjem Activate the RPN stack. Vklopi sklad RPN. RPN Mode Način RPN Meta Modes Metanačini Save Mode… Shrani način... Delete Mode… Izbriši način... Save Default _Mode Shrani privzet _način Fu_nctions F_unkcije _Variables _Spremenljivke _Units _Enote _Contents _Vsebina Report a Bug Poročaj o hrošču Check for Updates Preveri za posodobitve _About _O programu Toggle minimal window Prikaži/skrij majhno okno Calculation result Rezultat izračuna _Keypad _Tipkovnica Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Prikaže/skrije stalno tipkovnico (omogoči hkraten prikaz tipkovnice in zgodovine) _History _Zgodovina C_onversion Pretv_orbe RPN Stack Sklad RPN Insert the selected value Vnesi izbrano vrednost Insert the selected text Vnesi izbrano besedilo Copy the selected text Kopiraj izbrano besedilo Add the selected value(s) Prištej izbrane vrednosti Subtract the selected value(s) Odštej izbrane vrednosti Multiply the selected value(s) Zmnoži izbrane vrednosti Divide the the selected value(s) Zdeli izbrane vrednosti Raise to the power of the selected value Potenciraj na potenco izbrane vrednosti Calculate the square root of the selected value Izračunaj kvadratni koren izbranih vrednosti History Zgodovina Subtract the top value from the second value Odštej vrhnjo vrednost od druge Multiply the top two values Zmnoži vrhnji dve vrednosti Divide the second value by the top value Zdeli drugo vrednost od vrhnje Raise the second value to the power of the top value Potenciraj drugo vrednost na potenco vrhnje Negate the top value (Ctrl+-) Negiraj vrhnjo vrednost (Ctrl+-) Invert the top value Inverz vrhnje vrednosti Calculate the square root of the top value Izračunaj kvadratni koren vrhnje vrednosti Calculate the sum of all values Izračunaj seštevek vseh vrednosti Rotate the stack or move selected register up Zavrti sklad ali premakni izbran register gor Rotate the stack or move selected register down Zavrti sklad ali premakni izbran register dol Swap the two top values or move the selected value to the top of the stack Izmenjaj vrhnji dve vrednosti ali premakni izbrano vrednost na vrh sklada Copy the selected or top value to the top of the stack Kopiraj izbrano ali vrhnjo vrednost na vrh sklada Enter the top value from before the last numeric operation Vnesi vrhnjo vrednost na mesto pred zadnjo številsko operacijo Delete the top or selected value Izbriši vrhnjo ali izbrano vrednost Edit the selected value Uredi izbrano vrednost Clear the RPN stack Počisti sklad RPN Unit(s) and prefix to convert result to Enote in predpone za pretvorbo rezultata v Convert Pretvori Continuous conversion Nenehna pretvorba Automatically convert result to the current unit expression as long as the conversion box is visible. Samodejno pretvori rezultat v trenutno enoto izraza, doker je viden obrazec za pretvorbo. Add prefix Dodaj predpono If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Če enota izraza ne vsebuje predpon, dodaj najustreznejšo. To operacijo lahko prekličete s predponama "?" ali "0" pred izrazom. Conversion Pretvorba Show/hide programming keypad Prikaži/skrij programirno tipkovnico Exact Točno Fraction Ulomek Numerical display Številski prikaz Pure Čisto Number base Številska osnova Time format Časovna oblika Roman Rimsko sin sin cos cos tan tan ln ln Equals Enačaji sqrt sqrt sum sum Unknown variable Neznana spremenljivka mod mod mean srednja vrednost Store result as a variable Shrani rezultat kot spremenljivko STO Standard calculator button. Do not use more than three characters. STO Convert number bases Pretvori številske osnove Imaginary unit i (√-1) Imaginarna enota i (√-1) Manage units Upravljaj enote Conversion operator Operator za pretvorbo Kilogram Kilogram Two's complement input Vhod dvojiškega komplementa Two's complement output Izhod dvojiškega komplementa Bitwise Exclusive OR Logični ekskluzivni OR Bitwise Left Shift Logični pomik v levo Bitwise Right Shift Logični pomik v desno Floating point conversion Pretvorba plavajoče vejice Show/hide left keypad Prikaži/skrij levo tipkovnico Show/hide right keypad Prikaži/skrij desno tipkovnico DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Prejšnji rezultat ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Dodaj v izraz Persistent Keypad Stalna tipkovnica Edit Uredi Delete Izbriši Update Posodobi Insert Value Vnesi vrednost Insert Text Vnesi besedilo Insert Parsed Text Vnesi obdelano besedilo Copy Kopiraj Copy Full Text Kopiraj celotno besedilo Search… Išči... Add Bookmark… Dodaj zaznamek... Bookmarks Zaznamki Protect Zaščiti Move To Top Premakni na vrh Remove Odstrani Clear All Počisti vse _Copy _Kopiraj _Store… _Shrani... Save Image… Shrani sliko... _Factorize _Faktoriziraj _Expand _Razširi _Normal _Običajno Sc_ientific _Znanstveno Purel_y Scientific _Le znanstveno Simp_le Pr_eprosto _Binary D_vojiško _Octal _Osmiško _Decimal _Desetiško _Hexadecimal _Šestnajstiško Decimal Fraction Desetiški ulomek Exact Decimal Fraction Točen desetiški ulomek Simple Fraction Preprost ulomek Mixed Fraction Mešan ulomek _Abbreviate Names Skr_ajšaj imena C_onvert… Pretv_ori... Convert to Base _Units Pretvori v osnovne _enote Convert _to Optimal Unit Pretvori v na_justreznejšo enoto Use Optimal Prefix Uporabi najustreznejšo predpono Convert to Pretvori v Convert to UTC Pretvori v UTC Convert to Calendars Pretvori v koledarje Use prefixes for all units Uporabi predpone za vse enote Enable All SI Prefi_xes Omogoči vse pre_dpone SI View/Edit Matrix Poglej/uredi matriko View/Edit Vector Poglej/uredi vektor Copy Text Kopiraj besedilo To Top Na vrh Swap Zamenjaj Up Gor Down Dol Negate Negiraj Invert Inverz Square Kvadrat Square Root Kvadratni koren Clear Stack Počisti sklad Select Number Base… Izberi številsko osnovo... Store result Shrani rezultat Insert the matrix/vector into the expression Vstavi matriko/vektor v izraz Rows Vrste Number of rows in this matrix (rows displayed for vectors) Število vrst v matriki (za vektorje) Columns Stolpci Number of columns in this matrix (columns displayed for vectors) Število stolpcev v matriki (prikazane za vektorje) If this is a matrix or vector Če je to matrika ali vektor Elements Elementi Current element: Trenutni element: Edit Matrix Uredi matriko Do not create/modify this matrix/vector Ne ustvari/uredi te matrike/vektorja Create/modify the matrix/vector Ustvari/uredi to matriko/vektor Accept the creation/modification of this matrix/vector Sprejmi izdelavo/urejevanje te matrike/vektorja Name used to reference this variable in expressions Ime za klic te spremenljivke v izrazih Names Imena Add new name Dodaj novo ime Apply changes to the selected name Uporabi spremembe izbranega imena Remove the selected name Odstrani izbrano ime Abbreviation Okrajšava Unicode Unicode Plural Množina Suffix Pripona Reference Sklic Avoid input Izogni se vhodu Case sensitive Razlikuj velikosti črk Completion only Le dopolnjevanje Number Bases Številske osnove Roman numerals Rimske številke BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Odštej Multiply Zmnoži Divide Zdeli Bitwise AND Bitni AND Bitwise OR Bitni OR Bitwise NOT Bitni NOT Clear Počisti Enter two values, of which at most one is a percentage, and the others will be calculated for you. Vnesite dve vrednosti, kjer je vsaj ena v odstotkih. Druge bodo izračunane samodejno. Percentage Odstotek Calculate Izračunaj Value 1 Vrednost 1 2 compared to 1 2 v primerjavi z 1 Change from 1 to 2 Spremeni iz 1 v 2 Value 2 Vrednost 2 1 compared to 2 1 v primerjavi z 2 Change from 2 to 1 Spremeni iz 2 v 1 Plot Izriši _Save S_hrani Save as png, svg, postscript, eps, latex or fig Shrani kot png, svg, postscript, eps, latex ali fig Vector/matrix Vektor/matrika Paired matrix Parna matrika if you want to split matrix in rows instead of columns Če želite razdeliti matriko po vrsticah namesto po stolpcih X variable Spremenljivka X The variable name used in expression Ime spremenljivke, uporabljene v izrazu Style Slog Line Črta Points Točke Line with points Črta s točkami Boxes/bars Zaboji/stolpci Histogram Histogram Steps Koraki Candlesticks Sveče Dots Pike Smoothing Glajenje Monotonic Monotonsko Natural cubic splines Naravni kubični zlepek Bezier Bezier Bezier (monotonic) Bezier (monotonsko) Y-axis Os Y Primary Primarno Secondary Sekundarno _Remove Odst_rani Data Podatki Minimum x value Najmanjša vrednost x Maximum x value Največja vrednost x Sampling rate Hitrost vzorčenja Step size Velikost koraka Function Range Funkcijsko območje Display grid Prikaži mrežo Display full border Prikaži cel rob Minimum y value Najmanjša vrednost y Maximum y value Največja vrednost y Logarithmic x scale Logaritemska skala x Logarithmic y scale Logaritemska skala y X-axis label Oznaka osi X Y-axis label Oznaka osi Y Line width Širina črt Color display Barvni prikaz Color Barva Monochrome Enobarvno Legend placement Postavitev legende Top-left Zgoraj levo Top-right Zgoraj desno Bottom-left Spodaj levo Bottom-right Spodaj desno Below Spodaj Outside Izven Appearance Videz Precision Točnost _Recalculate Znova iz_računaj Recalculate expression Znova izračunaj izraz The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Prikazano število pomembnih števk (preprosti aritmetični izračuni so vedno točni) Preferences Nastavitve Save mode on exit Način shranjevanja ob izhodu If the mode of the calculator shall be restored Naj se način računala ohrani Save definitions on exit Shrani definicije ob izhodu If changes to functions, units and variables shall be saved automatically Naj se spremembe funkcij, enot in spremenljivk shranijo samodejno Clear history on exit Počisti zgodovino ob izhodu Allow multiple instances Dovoli več oken naenkrat Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Dovoli, da je več oken računala odprtih naenkrat. Vedite, da se bodo shranili le način, zgodovina in definicije zadnjega zaprtega računala. Notify when a new version is available Obvesti, ko je na voljo nova različica Use keyboard keys for RPN Uporabi tipkovnične tipke za RPN Use keyboard operator keys for RPN operations (+-*/^). Uporabi tipkovnične tipke za operacije RPN (+-*/^). Use caret for bitwise XOR Uporabi strešico za bitni XOR Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Vnesite operacijo XOR (⊻) s strešico (^) na tipkovnici (AltGr+3). Eksponentni operator (^) je lahko vnešen kot Ctrl+*. Time limit for plot: Časovna omejitev za izris: Behavior Vedenje Enable Unicode symbols Omogoči simbole Unicode Disable this if you have problems with some fancy characters Onemogočite, če imate težave z nestandardnimi znaki Ignore system language (requires restart) Prezri sistemski jezik (zahteva vnovičen zagon) Application name Ime programa Result Rezultat Application name + result Ime programa + rezultat Mode Način Application name + mode Ime programa + način Window title Naslov okna Default Privzeto Number of expression lines Število vrstic izraza Display expression status Prikaži stanje izraza If as-you-type expression status shall be displayed below the expression entry Naj se med vpisovanjem pod izrazom prikazuje njegovo stanje Persistent keypad Stalna tipkovnica Look & Feel Videz in občutek Binary two's complement representation Upodobitev binarnega dvojiškega komplementa If two's complement representation shall be used for negative binary numbers. Naj se dvojiški komplement uporabi za negativna dvojiška števila. Hexadecimal two's complement representation Upodobitev šestnajstiškega dvojiškega komplementa If two's complement representation shall be used for negative hexadecimal numbers. Naj se dvojiški komplement uporabi za negativna šestnajstiška števila. Use lower case letters in non-decimal numbers Uporabi male črke v nedesetiških številih If lower case letters should be used in numbers with non-decimal base Naj se male črke uporabljajo v številih z nedesetiško osnovo Alternative base prefixes Alternativne predpone osnov If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Naj se šestnajstiška števila prikazujejo s predpono "0x0" in dvojiška s "0b00" Spell out logical operators Črkuj logične operatorje If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Naj se logična in/ali prikažeta kot "&&"/"||" ali "and"/"or" If "e" shall be used instead of "E" in numbers Naj se v številih namesto "E" uporabi "e" Use E-notation instead of 10<sup><i>n</i></sup> Uporabi E-notacijo namesto 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Uporabi mali "e" (kot v 1e10) Use 'j' as imaginary unit Uporabi 'j' za imaginarno enoto Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Uporabi 'j' namesto 'i' za privzet simbol imaginarne enote, ki bo postavljen pred imaginarni del števila. Use comma as decimal separator Uporabi vejico kot desetiški ločilnik Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Dovoli, da se pika uporabi za ločilnik tisočic namesto za alternativni decimalni znak. Ignore comma in numbers Prezri vejice v številih Allow commas, ',', to be used as thousands separator instead of as an function argument separator Dovoli, da se vejica uporabi za ločilnik tisočic namesto za ločilnik funkcijskih argumentov Ignore dots in numbers Prezri pike v številih Digit grouping Števke v skupinah off izklopljeno standard običajno local lokalno Multiplication sign Znak za množenje Division sign Znak za deljenje Copy digit separator Kopiraj desetiški ločilnik Deactivate to remove digit separator when copying result Onemogočite za odstranitev ločilnika števk med kopiranjem rezultata Numbers & Operators Številke & operatorji Use binary prefixes for information units Uporabi binarne predpone za informacijske enote Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Za informacijske enote uporabi dvojiške predpone namesto desetiških (npr. bajti) Conversion to local currency Pretvorba v krajevno valuto Automatically convert to the local currency when optimal unit conversion is activated. Samodejno pretvori v krajevno valuto, če je omogočena izbira najustreznejše enote za pretvrobo. Update exchange rates on start Posodobi menjalna razmerja ob zagonu If current exchange rates shall be downloaded from the internet at program start Naj se trenutna menjalna razmerja prenesejo iz Interneta ob zagonu programa Exchange rates updates Posodobitve menjalnih razmerij Units & Currencies Enote & valute Show expression completion suggestions Prikaži predloge za dopolnitev izraza Search titles and countries Išči naslove in države Minimum characters Najmanj znakov Popup delay (ms) Zamik prikaza pojavnega okna (ms) Completion Dopolnjevanje Status warning color Barva opozorila o stanju Status error color Barva opozorila o napaki Custom status font Pisava opozorila If you want to use a font other than the default in the status display below the expression entry Če želite uporabiti neprivzeto pisavo v prikazu stanja pod obrazcem za vnos izraza Custom expression font Pisava izraza If you want to use a font other than the default in the expression entry Če želite uporabiti neprivzeto pisavo v obrazcu za vnos izraza Custom result font Pisava rezultata If you want to use a font other than the default in the result display Če želite uporabiti neprivzeto pisavo v prikazu rezultata Custom keypad font Pisava tipkovnice If you want to use a font other than the default in the keypad Če želite uporabiti neprivzeto pisavo na tipkovnici Custom application font Pisava programa If you want to use a font other than the default for the whole application Če želite uporabiti neprivzeto pisavo v celotnem programu Text color Barva besedila Fonts & Colors Pisave in barve Other: Drugo: Bijective base-26 Bijektivna osnova 26 <b>Result Base</b> <b>Osnova rezultata</b> <b>Expression Base</b> <b>Osnova izraza</b> New Keyboard Shortcut Nova tipkovna bližnjica Edit Variable Uredi spremenljivko Advanced Napredno Accept the creation/modification of this variable Sprejmi izdelavo/urejevanje te spremenljivke x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Uporabi x, y in z po vrsti za prvi, drugi in tretji funkcijski argument. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Uporabi \x, \y in \z po vrsti za prvi, drugi in tretji funkcijski argument.S tem se izognete morebitnim sporom s spremenljivkami, funkcijami in enotami. Edit Unit Uredi enoto Do not create/modify this unit Ne ustvari/uredi te enote Accept the creation/modification of this unit Sprejmi izdelavo/urejevanje te enote Singular form of this unit's name Edninska oblika imena enote Title displayed in menus and in unit manager Naslov, prikazan v menijih in upravljalniku enot System Sistem Imperial imperialni US Survey ameriški Hide unit Skrij enoto If this unit shall be hidden in menus Naj enota ne bo prikazana v menijih Class Razred Base unit Osnovna enota Named derived unit Imenovana izpeljana enota Derived unit Izpeljana enota Base unit(s) Osnovne enote Exponent Eksponent Exponent of the base unit Eksponent osnovne enote Relation Razmerje Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Razmerje z osnovno enoto. Za linearno odvisnost je to le število. Za nelinearna razmerja uporabite \x kot faktor in \y kot eksponent (npr. "\x + 273.15" za razmerje med stopinjami Celzija in Kelvina). Relation is exact Razmerje je točno If the relation is precise Če je razmerje točno Inverse relation Inverzno razmerje Specify for non-linear relation, for conversion back to the base unit. Določite za nelinearna razmerja, za pretvorbo nazaj v osnono enoto. Mix with base unit Mešaj z osnovno enoto - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Se odliči, s katerimi enotami je mešana osnovna, če obstaja več možnosti. - Izvirna enota ne bo bila mešana z enotami nižje prioritete. - Nižja vrednost pomeni višjo prioriteto. Priority Prioriteta Minimum base unit number Število najmanjše osnovne enote Use with prefixes by default Privzeto uporabi s predponami Create a new unit Ustvari novo enoto Edit the selected unit Uredi izbrano enoto Insert the selected unit into the expression entry Vstavi izbrano funkcijo v obrazec za izraz C_onvert Pretv_ori Convert the result to the selected unit Pretvori rezultat v izbrano enoto Delete the selected unit Izbriši izbrano enoto (De)activate the selected unit O(ne)mogoči izbrano enoto _Unit _Enota Convert between units Pretvarjaj med enotami = = Conver_sion Pretvor_ba Converted value Pretvorjena vrednost Value to convert from Vrednost, iz katere se pretvarja Type anywhere Pišite kamorkoli Edit Unknown Variable Uredi neznano spremenljivko Do not create/modify this unknown variable Ne ustvari/uredi te neznane spremenljivke Accept the creation/modification of this unknown variable Sprejmi izdelavo/urejevanje te neznane spremenljivke Name used to reference this unknown variable in expressions Ime za klic te neznane spremenljivke v izrazih Use custom assumptions Uporabi predpostavke po meri Type Vrsta Real Number Realno število Rational Number Racionalno število Sign Znak The category this unknown variable belongs to Kategorija, kateri neznana spremenljivka pripada Value of this variable (expression) Vrednost te spremenljivke (izraz) value is exact vrednost je točna If the value is precise Če je vrednost točna The category this variable belongs to Kategorija, kateri spremenljivka pripada Create a new variable Ustvari novo spremenljivko Edit the selected variable Uredi izbrano spremenljivko Insert the selected variable into the expression entry Vstavi izbrano spremenljivko v obrazec za izraz Delete the selected variable Izbriši izbrano spremenljivko (De)activate the selected variable O(ne)mogoči izbrano spremenljivko E_xport I_zvozi _Variable Spremenlji_vka Start a new instance of the application Zaženi nov primerek programa Display the application version Prikaži različico programa Specify the window title Določi ime okna TITLE TITLE Expression to calculate Izraz za izračun [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Zgoraj vpišite matematičen izraz, npr. "5 + 2 / 3", in pritisnite Enter. ans ans Last Answer Zadnji odgovor answer odgovor Answer 2 Odgovor 2 Answer 3 Odgovor 3 Answer 4 Odgovor 4 Answer 5 Odgovor 5 Failed to load global definitions! Napaka pri nalaganju globalnih definicij! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Vse By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Privzeto je dovoljen le en primerek (eno glavno okno) %s. Če je odprtih več primerkov, se bodo shranile definicije, spremenljivke, funkcije, zgodovina ... le zadnjega okna. Želite vseeno dovoliti več primerkov programa? c-format Right-click/long press: %s Desni klik/dolg klik: %s c-format Right-click: %s Desni klik: %s c-format Middle-click: %s Srednji klik: %s c-format Cycle through previous expression Kroži med prejšnjimi izrazi Move cursor left or right Premakni kazalko levo ali desno Move cursor to beginning or end Premakni kazalko na začetek ali konec Uncertainty/interval Negotovost/interval Relative error Relativna napaka Argument separator Ločilnik argumentov Blank space Prazen prostor New line Nova vrstica Smart parentheses Pametni oklepaji Vector brackets Oklepaji za vektorje Left parenthesis Levi oklepaj Left vector bracket Levi vektorski oklepaj Right parenthesis Desni oklepaj Right vector bracket Desni vektorski oklepaj Decimal point Decimalno mesto Raise (Ctrl+*) Dvigni (Ctrl+*) Add Dodaj Backspace Backspace Previous result (static) Prejšnji statični rezultat Calculate expression Izračunaj izraz Set unknowns Nastavi neznanke more Show further items in a submenu več Logical AND Logični AND Logical OR Logični OR Logical NOT Logični NOT Toggle Result Base Preklopi osnovo rezultata Open menu with stored variables Odpri meni s shranjenimi spremenljivkami Index Indeks Calculate expression and add to stack Izračunaj izraz in dodaj na sklad Flag Zastavica Matrices Matrike Gregorian gregorijansko Revised Julian (Milanković) popravljeno julijansko (Milanković) Julian julijansko Islamic (Hijri) islamsko (Hijri) Hebrew hebrejsko Chinese kitajsko Persian (Solar Hijri) perzijsko (Solar Hijri) Coptic koptsko Ethiopian etiopsko Indian (National) indijsko (nacionalno) Action Dejanje Key combination Tipkovno zaporedje Raise Dvigni History Answer Value Zgodovinska vrednost odgovora History Index(es) Zgodovinski indeks(i) History index %s does not exist. Zgodovinski indeks %s ne obstaja. c-format expression izraz History Parsed Expression Zgodovinsko obdelan izraz Set Window Title Nastavi ime okna Failed to open %s. %s Napaka pri odpiranju datoteke %s. %s c-format Could not display help for Qalculate!. Napaka pri prikazu pomoči za Qalculate!. Could not display help for Qalculate!. %s Napaka pri prikazu pomoči za Qalculate!. %s c-format approx. približno Stop process Ustavi operacijo Clear expression Počisti izraz EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Želite posodobiti menjalna razmerja zdaj? It has been %s day since the exchange rates last were updated. Od posodobitve menjalnih razmerij je minil %s dan. Od posodobitve menjalnih razmerij sta minila %s dni. Od posodobitve menjalnih razmerij so minili %s dnevi. Od posodobitve menjalnih razmerij je minilo %s dni. c-format It has been %s days since the exchange rates last were updated. Do not ask again Ne vprašaj znova It took too long to generate the plot data. Izdelava grafa je trajala predolgo. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Izdelava grafa je trajala predolgo. Prosimo, zmanjšajte hitrost vzorčenja ali povišajte časovno omejitev v nastavitvah. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Ko se med izračunom pojavijo napake, opozorila in druge informacije, se spremeni ikono desno od izraza. Če miškin kazalec pridržite nad njem ali ga kliknete, se bo prikazalo sporočilo. Path of executable not found. Pot do zagonske datoteke ni bila najdena. curl not found. Orodje curl ni bilo najdeno. Failed to run update script. %s Napaka pri zagonu posodobitvenega skripta. %s c-format Failed to check for updates. Napaka pri preverjanju posodobitev. No updates found. Ni novih posodobitev. A new version of %s is available at %s. Do you wish to update to version %s. Nova različica %s je na voljo na %s. Želite nadgraditi na različico %s? c-format A new version of %s is available. You can get version %s at %s. Nova različica %s je na voljo. Različico %s lahko pridobite na %s. c-format Too many arguments for %s(). Preveč argumentov za %s(). c-format argument argument Uncategorized nekategorizirano hexadecimal šestnajstiško octal osmiško decimal desetiško duodecimal dvanajstiško binary binarno roman rimsko bijective bijektivno sexagesimal šestdesetiško time čas bases osnove calendars koledarji rectangular pravokotno cartesian kartezično exponential eksponentno polar polarno angle kot phasor fazor optimal najustreznejše base osnova mixed mešano fraction ulomek factors deleži partial fraction parcialni ulomek factorize faktoriziraj expand razširi hexadecimal number šestnajstiško število octal number osmiško število decimal number desetiško število duodecimal number dvanajstiško število binary number binarno število roman numerals rimske številke bijective base-26 bijektivna osnova 26 sexagesimal number šestdesetiško število 32-bit floating point 32-bitna plavajoča vejica 64-bit floating point 64-bitna plavajoča vejica 16-bit floating point 16-bitna plavajoča vejica 80-bit (x86) floating point 80-bitna (x86) plavajoča vejica 128-bit floating point 128-bitna plavajoča vejica time format časovna oblika number bases številske osnove optimal unit najustreznejša enota base units osnovne enote mixed units mešane enote expanded partial fractions razširjeni parcialni ulomki complex rectangular form kompleksna pravokotna oblika complex exponential form kompleksna eksponentna oblika complex polar form kompleksna polarna oblika complex cis form kompleksna oblika cis complex angle notation kompleksna kazalčna notacija complex phasor notation kompleksna fazorska notacija UTC time zone Časovni pas UTC number base %s številska osnova %s c-format Inactive Neaktivno Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Pridobi podatke iz nabora %s za dan objekt in lastnost. Če je "info" vnešen kot objekt, se bo odprlo pojavno okno z njegovimi lastnostmi. c-format Example: Primer: Arguments Argumenti optional optional argument neobvezno default: argument default, in description privzeto: Requirement Zahteva key indicating that the property is a data set key tipka Acti_vate Akti_viraj a previous result prejšnji rezultat matrix matrika vector vektor positive pozitivno non-positive nepozitivno negative negativno non-negative nenegativno non-zero neničelno boolean logična vrednost integer celo število rational racionalno real realno complex kompleksno number številka (not matrix) (ni matrika) unknown neznano default assumptions privzete predpostavke Variable does not exist anymore. Spremenljivka ne obstaja več. Data Retrieval Function Funkcija za pridobitev podatkov Insert function Vnesi funkcijo Insert function (dialog) Vnesi funkcijo (obrazec) Insert variable Vnesi spremenljivko Insert unit Vnesi enoto Insert text Vnesi besedilo Insert date Vnesi datum Insert vector Vnesi vektor Insert matrix Vnesi matriko Insert smart parentheses Vnesi pametne oklepaje Convert to unit Pretvori v enoto Convert to unit (entry) Pretvori v enoto (vnos) Convert to optimal unit Pretvori v najustreznejšo enoto Convert to base units Pretvori v osnovne enote Convert to optimal prefix Pretvori v najustreznejšo predpono Convert to number base Pretvori v številsko osnovo Factorize result Faktoriziraj rezultat Expand result Razširi rezultat Expand partial fractions Razširi parcialne ulomke RPN: down RPN: dol RPN: up RPN: gor RPN: swap RPN: izmenjaj RPN: copy RPN: kopiraj RPN: lastx RPN: lastx RPN: delete register RPN: izbriši register RPN: clear stack RPN: počisti sklad Load meta mode Naloži metanačin Set expression base Nastavi osnovo izraza Set result base Nastavi osnovo rezultata Toggle exact mode Prikaži/skrij točen način Set angle unit to degrees Nastavi kotne enote v stopinje Set angle unit to radians Nastavi kotne enote v radiane Set angle unit to gradians Nastavi kotne enote v gradiane Toggle simple fractions Prikaži/skrij preproste ulomke Toggle mixed fractions Prikaži/skrij mešane ulomke Toggle scientific notation Prikaži/skrij znanstveno notacijo Toggle simple notation Prikaži/skrij preprosto notacijo Toggle RPN mode Prikaži/skrij način RPN Toggle calculate as you type Prikaži/skrij izračun med pisanjem Toggle programming keypad Prikaži/skrij tipkovnico Show keypad Prikaži tipkovnico Show history Prikaži zgodovino Search history Zgodovina iskanj Show conversion Prikaži pretvorbo Show RPN stack Prikaži sklad RPN Manage variables Upravljaj spremenljivke Manage functions Upravljaj funkcije Manage data sets Upravljaj nabore podatkov New variable Nova spremenljivka New function Nova funkcija Open plot functions/data Odpri orodje za izris funkcij/podatkov Open convert number bases Odpri orodje za pretvorbo številskih osnov Open floating point conversion Odpri orodje za pretvorbo plavajoče vejice Open calender conversion Odpri orodje za pretvorbo koledarjev Open percentage calculation tool Odpri orodje za izračun odstotkov Open periodic table Odpri periodni sistem Update exchange rates Posodobi menjalna razmerja Copy result Kopiraj rezultat Save result image Shrani sliko rezultata Help Pomoč Quit Izhod Prefixes Predpone No Prefix Ni predpone Optimal Prefix Najustreznejša predpona Prefix Predpona Complex angle/phasor notation Kompleksna kazalčna/fazorska notacija Number bases Številske osnove Base units Osnovne enote Binary number Binarno število Calendars Koledarji Complex cis form Kompleksna oblika cis Decimal number Desetiško število Duodecimal number Dvanajstiško število Complex exponential form Kompleksna eksponentna oblika Factors Deleži 16-bit floating point binary format 16-bitna binarna oblika s plavajočo vejico 32-bit floating point binary format 32-bitna binarna oblika s plavajočo vejico 64-bit floating point binary format 64-bitna binarna oblika s plavajočo vejico 80-bit (x86) floating point binary format 80-bitna (x86) binarna oblika s plavajočo vejico 128-bit floating point binary format 128-bitna binarna oblika s plavajočo vejico Hexadecimal number Šestnajstiško število Mixed units Mešane enote Octal number Osmiško število Optimal units Najustreznejše enote Expanded partial fractions Razširjeni parcialni ulomki Complex polar form Kompleksna polarna oblika Complex rectangular form Kompleksna pravokotna oblika Sexagesimal number Šestdesetiško število and in or ali undefined nedefinirano result is too long see history rezultat je predolg poglej zgodovino calculation was aborted izračun prekinjen RPN Register Moved Register RPN premaknjen RPN Operation Operacija RPN Processing… Obdelujem... result processing was aborted obdelava rezultata je bila prekinjena Factorizing… Faktoriziram... Expanding partial fractions… Razširjam parcialne ulomke... Expanding… Razširjam... Calculating… Računam... Converting… Pretvarjam... Fetching exchange rates. Pridobivam menjalna razmerja. Time zone parsing failed. Obdelava časovnega pasu spodletela. Keep open Obdrži odprto C_alculate Izr_ačunaj Apply to Stack Premakni na sklad Argument Argument True Pravilno False Napačno Info Info Edit Unit (global) Uredi enoto (globalno) New Unit Nova enota Empty name field. Prazno polje za ime. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Base unit does not exist. Osnovna enota ne obstaja. Edit Function (global) Uredi funkcijo (globalno) New Function Nova funkcija Yes Da No Ne Empty expression field. Prazno polje za izraz. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Funkcija s tem imenom že obstaja. Jo želite prepisati? Unit does not exist Enota ne obstaja Edit Unknown Variable (global) Uredi neznano spremenljivko (globalno) New Unknown Variable Nova neznana spremenljivka An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Variable (global) Uredi spremenljivko (globalno) New Variable Nova spremenljivka Empty value field. Prazno polje za vrednost. Edit Vector Uredi vektor Edit Vector (global) Uredi vektor (globalno) New Vector Nov vektor Edit Matrix (global) Uredi matriko (globalno) New Matrix Nova matrika Vector Result Vektorski rezultat Matrix Result Matrični rezultat New Data Object Nov podatkovni objekt text besedilo approximate približno Edit Data Set (global) Uredi podatkovni nabor (globalni) New Data Set Nov podatkovni nabor info info Property Lastnost No file name entered. Ime datoteke ni vnešeno. No delimiter selected. Ločilnik ni izbran. Could not import from file %s Uvoz iz datoteke %s spodletel c-format No variable name entered. Ime spremenljivke ni vnešeno. No known variable with entered name found. Spremenljivke s takim imenom ne obstajajo. Could not export to file %s Izvoz v datoteko %s spodletel c-format My Variables Moje spremenljivke Couldn't write definitions Pisanje definicij neuspešno Preset Predloga Abort Prekliči Undo Razveljavi Redo Uveljavi Completion Mode Način dopolnjevanja Limited strict completion Omejeno strogo dopolnjevanje Strict completion Strogo dopolnjevanje Limited full completion Omejeno polno dopolnjevanje Full completion Polno dopolnjevanje No completion Brez dopolnjevanja Save Mode Shranjevalni način Preset mode cannot be overwritten. Predložen način ne more biti prepisan. Delete Mode Brisalni način Couldn't write preferences to %s Pisanje nastavitev v %s neuspešno c-format never nikoli ask vprašaj %i day %i dan %i dni %i dnevi %i dni c-format %i days log10 function not found. Funkcija log10 ni bila najdena. Search Iskanje _Search I_skanje Remove Bookmark Odstrani zaznamek Add Bookmark Dodaj zaznamek A bookmark with the selected name already exists. Do you want to overwrite it? Zaznamek s tem imenom že obstaja. Ga želite prepisati? No items found Ni najdenih elementov Select date Izberi datum Rectangular form Pravokotna oblika Exponential form Eksponentna oblika Polar form Polarna oblika Angle/phasor notation Kazalčna/fazorska notacija Optimal unit Najustreznejša enota Optimal prefix Najustreznejša predpona All functions Vse funkcije All variables Vse spremenljivke Select definitions file Izberite definicijsko datoteko _Import _Uvozi Could not copy %s to %s. Kopiranje %s v %s ni mogoče. c-format Could not read %s. Branje %s spodletelo. c-format Could not copy file to %s. Kopiranje v %s ni mogoče. c-format Unsupported base. Nepodprta osnova. The selected Chinese year does not exist. Izbrano kitajsko leto ne obstaja. Conversion to Gregorian calendar failed. Pretvorba v gregorijanski koledar spodletela. Calendar conversion failed for: %s. Pretvorba koledarja spodletela: %s c-format Select file to save PNG image to Izberite datoteko za izvoz slike PNG Allowed File Types Dovoljene datotečne vrste All Files Vse datoteke Cannot delete unit as it is needed by other units. do not delete units that are used by other units Brisanje enote neuspešno, saj je potrebovana pri drugih enotah none nič result is too long rezultat je predolg translator-credits Nejc Bertoncelj <nejc@bertoncelj.eu.org> bertronika <nejc@bertoncelj.eu.org> Mode not found. Način ni bil najden. Elements (in horizontal order) Elementi (v vodoravnem zaporedju) Select file to import Izberite datoteko za uvoz _Open _Odpri Select file to export to Izberite datoteko za izvoz A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Nastal je spor z objetkom z istim imenom. Če nadaljujete in shranite spremembe, bo obstoječi objekt prepisan ali deaktiviran. Ali želite nadaljevati? Set key combination Nastavi zaporedje tipk Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Pritisnite zaporedje tipk, ki ga želite uporabiti za to dejanje (pritisnite Esc za preklic) No keys Ni tipk Empty value. Prazna vrednost. Function not found. Funkcija ni bila najdena. Variable not found. Spremenljivka ni bila najdena. Unit not found. Enota ni bila najdena. The key combination is already in use. Do you wish to replace the current action? To zaporedje tipk je že v uporabi. Ali ga želite prepisati s tem dejanjem? Select file to export Izberite datoteko za izvoz Empty expression. Prazen izraz. Empty x variable. Prazna spremenljivka x. Element Data Podatki o elementu Classification Klasifikacija Alkali Metal Alkalijska kovina Alkaline-Earth Metal Zemljoalkalijska kovina Lanthanide Lantanoid Actinide Aktinoid Transition Metal Prehodni element Metal Kovina Metalloid Polkovina Polyatomic Non-Metal Poliatomske nekovine Diatomic Non-Metal Dvoatomske nekovine Noble Gas Žlahtni plin Unknown chemical properties Neznane kemijske lastnosti No unknowns in result. V rezultatu ni neznank. Set Unknowns Nastavi neznanke Copy result to clipboard Kopiraj rezultat x x If a matrix or vectors shall be generated from the contents of the file Naj se matrike ali vektorji ustvarijo iz vsebine datoteke Use dark theme Uporabi temno temo Add the two top values Keypad Prištej vrhnji dve vrednosti u Manage units button u to Button for convert to operator v Add Keypad Prištej Base Unit Osnovna enota Alias Vzdevek Composite Unit Kompozitum enot Fonts Pisave Chain Calculation Izračun intervala <b>Name</b> <b>Ime</b> <b>Type</b> <b>Vrsta</b> <b>Relation</b> <b>Razmerje</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i sekund c-format Ent Ent Defaults Privzete Customize Buttons Pisava opozorila Names details Podrobnosti imen Rational number form Racionalna številska oblika Decimal fractions Desetiški ulomki Exact decimal fractions Točni desetiški ulomki Simple fractions Preprosti ulomki Mixed fractions Mešani ulomki settitle settitle ArgumentEditDialog Name: Ime: Type: Vrsta: Free Prosto Number Številka Integer Celo število Symbol Simbol Text Besedilo Date Datum Vector Vektor Matrix Matrika Boolean Logična vrednost Angle Kot Object Objekt Function Funkcija Unit Enota Variable Spremenljivka File Datoteka Enable rules and type test Omogoči pravila in piši hitro Custom condition: Pogoj po meri: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Če je na primer argument matrika, ki mora imeti isto število vrstic in stolpcev: rows(\x) = columns(\x) Allow matrix Dovoli matriko Forbid zero Prepovej ničlo Handle vector Obravnavaj vektor Calculate function for each separate element in vector. Izračunaj funkcijo za posamezni element vektorja. Min Min Include equals Vključi enačaje Max Max CSVDialog Import CSV File Uvozi datoteko CSV Export CSV File Izvozi datoteko CSV Current result Trenutni rezultat Matrix/vector variable: Matrika/vektorska spremenljivka: File: Datoteka: Import as Uvozi kot matrix matrika vectors vektorji Name: Ime: First row: Prva vrstica: Includes headings Dodaj naslove Delimiter: Ločilnik: Comma Vejica Tabulator Tabulator Semicolon Podpičje Space Presledek Other Drugo Question A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Error Could not import from file %1 Uvoz iz datoteke %1 spodletel No matrix or vector variable with the entered name was found. Could not export to file %1 Izvoz v datoteko %1 spodletel CalendarConversionDialog Calendar Conversion Pretvorba koledarjev Gregorian gregorijansko Hebrew hebrejsko Islamic (Hijri) islamsko (Hijri) Persian (Solar Hijri) perzijsko (Solar Hijri) Indian (National) indijsko (nacionalno) Chinese kitajsko Julian julijansko Revised Julian (Milanković) popravljeno julijansko (Milanković) Coptic koptsko Ethiopian etiopsko Error The selected Chinese year does not exist. Izbrano kitajsko leto ne obstaja. Conversion to Gregorian calendar failed. Pretvorba v gregorijanski koledar spodletela. Calendar conversion failed for: %1. Pretvorba koledarja spodletela: %1. DataObjectEditDialog %1: %1: Default Privzeto Approximate Izračunaj približek Exact Točno Edit Data Object Uredi podatkovni objekt New Data Object Nov podatkovni objekt DataPropertyEditDialog Name: Ime: Title: Naslov: Descriptive name: Opisno ime: Description: Opis: Value type: Vrsta vrednosti: Expression Izraz Number Številka Text Besedilo Unit expression: Izraz enote: Use as key Uporabi kot ključ Case sensitive value Vrednost, občutljiva na velikost črk Approximate value Približna vrednost Value uses brackets Vrednost uporablja oklepaje Hide Skrij Edit Data Property Uredi lastnost podatka DataSetEditDialog General Splošno Properties Lastnosti Function Funkcija Title: Naslov: Descriptive name: Opisno ime: Data file: Podatkovna datoteka: Description: Opis: Copyright: Copyright: Title Naslov Name Ime Type Vrsta Add Dodaj Edit Uredi Remove Odstrani Name: Ime: Object argument name: Ime objekta argumenta: Property argument name: Ime lastnosti argumenta: Default property: Privzeta lastnost: text besedilo approximate približno number številka expression izraz key tipka Question A function with the same name already exists. Do you want to overwrite the function? Funkcija s tem imenom že obstaja. Jo želite prepisati? Data Sets Podatkovni nabori Object Objekt Property Lastnost Edit Data Set Uredi podatkovni nabor New Data Set Nov podatkovni nabor DataSetsDialog Data Sets Podatkovni nabori Data sets: Podatkovni nabori: New… Novo… Edit… Uredi… Delete Izbriši Objects: Objekti: Data set description: Opis podatkovnega nabora: Object attributes: Atributi objekta: Properties Lastnosti key tipka Data Retrieval Function Funkcija za pridobitev podatkov argument argument ExpressionEdit matrix matrika vector vektor positive pozitivno non-positive nepozitivno negative negativno non-negative nenegativno non-zero neničelno boolean logična vrednost integer celo število rational racionalno real realno complex kompleksno number številka (not matrix) (ni matrika) unknown neznano default assumptions privzete predpostavke Prefix: Predpona: Complex Angle/Phasor Notation Kompleksna kazalčna/fazorska notacija Base units Osnovne enote Number Base Številska osnova Binary-Coded Decimal Bijective Base-26 Bijektivna osnova 26 Binary Number Binarno število Calendars Koledarji Complex cis Form Kompleksna oblika cis Decimal Number Desetiško število Duodecimal Number Dvanajstiško število Complex Exponential Form Kompleksna eksponentna oblika Factors Deleži 16-bit Floating Point Binary Format 16-bitna binarna oblika s plavajočo vejico 32-bit Floating Point Binary Format 32-bitna binarna oblika s plavajočo vejico 64-bit Floating Point Binary Format 64-bitna binarna oblika s plavajočo vejico 80-bit (x86) Floating Point Binary Format 80-bitna (x86) binarna oblika s plavajočo vejico 128-bit Floating Point Binary Format 128-bitna binarna oblika s plavajočo vejico Fraction Ulomek Decimal Fraction Desetiški ulomek Hexadecimal Number Šestnajstiško število Latitude Zemljepisna širina Longitude Zemljepisne dolžine Mixed Units Mešane enote Octal Number Osmiško število Optimal Unit Najustreznejša enota Optimal Prefix Najustreznejša predpona Expanded Partial Fractions Razširjeni parcialni ulomki Complex Polar Form Kompleksna polarna oblika Complex Rectangular Form Kompleksna pravokotna oblika Roman Numerals Rimske številke Sexagesimal Number Šestdesetiško število Time Format Časovna oblika Unicode Unicode UTC Time Zone Časovna oblika Undo Razveljavi Redo Uveljavi Cut Copy Kopiraj Paste Delete Izbriši Calculate Selection Insert Date… Vnesi datum... Insert Matrix… Vnesi matriko... Select All Clear Počisti Clear History Počisti zgodovino Completion Dopolnjevanje No completion Brez dopolnjevanja Limited strict completion Omejeno strogo dopolnjevanje Strict completion Strogo dopolnjevanje Limited full completion Omejeno polno dopolnjevanje Full completion Polno dopolnjevanje Delayed completion Expression Status Stanje izraza Off Izklopljeno In history list In expression field With delay Z zamudo Without delay Brez zamude Automatically calculate selection Use input method Matrix Matrika Too many arguments for %1(). Preveč argumentov za %1(). argument argument %1: %1: comment komentar MC (memory clear) MS (memory store) M+ (memory plus) M− (memory minus) factorize faktoriziraj expand razširi hexadecimal šestnajstiško hexadecimal number šestnajstiško število octal osmiško octal number osmiško število decimal desetiško decimal number desetiško število duodecimal dvanajstiško duodecimal number dvanajstiško število binary binarno binary number binarno število roman rimsko roman numerals rimske številke bijective bijektivno bijective base-26 bijektivna osnova 26 binary-coded decimal BCD sexagesimal šestdesetiško sexagesimal number šestdesetiško število latitude longitude 32-bit floating point 32-bitna plavajoča vejica 64-bit floating point 64-bitna plavajoča vejica 16-bit floating point 16-bitna plavajoča vejica 80-bit (x86) floating point 80-bitna (x86) plavajoča vejica 128-bit floating point 128-bitna plavajoča vejica time čas time format časovna oblika bases osnove number bases številske osnove calendars koledarji optimal najustreznejše optimal unit najustreznejša enota prefix predpona optimal prefix base osnova base units osnovne enote mixed mešano mixed units mešane enote decimals decimal fraction fraction ulomek factors deleži partial fraction parcialni ulomek expanded partial fractions razširjeni parcialni ulomki rectangular pravokotno cartesian kartezično complex rectangular form kompleksna pravokotna oblika exponential eksponentno complex exponential form kompleksna eksponentna oblika polar polarno complex polar form kompleksna polarna oblika complex cis form kompleksna oblika cis angle kot complex angle notation kompleksna kazalčna notacija phasor fazor complex phasor notation kompleksna fazorska notacija UTC time zone Časovni pas UTC number base %1 številska osnova %1 Data object Podatkovni objekt FPConversionDialog Floating Point Conversion (IEEE 754) Pretvorba plavajoče vejice (IEEE 754) Format Oblika 16-bit (half precision) 16-bitno (polovična natančnost) 32-bit (single precision) 32-bitno (enojna natančnost) 64-bit (double precision) 64-bitno (dvojna natančnost) 80-bit (x86 extended format) 80-bitno (razširjena oblika x86) 128-bit (quadruple precision) 128-bitno (četvorna natančnost) Microchip 24-bit Microchip 32-bit Value Vrednost Decimal value Desetiška vrednost Binary representation Binarna predstavitev Hexadecimal representation Šestnajstiška predstavitev Floating point value Vrednost s plavajočo vejico Conversion error Napaka pri pretvorbi FunctionEditDialog Required Zahtevano Details Podrobnosti Description Opis Name: Ime: Expression: Izraz: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y oz z (npr. "(x+y)/2") oz \x, \y, \z, \a, \b, … (npr. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Uporabite x, y oz z (npr. "(x+y)/2") oz \x, \y, \z, \a, \b, … (npr. "(\x+\y)/2") Category: Kategorija: Descriptive name: Opisno ime: Hide function Skrij funkcijo Example: Primer: Description: Opis: Condition: Pogoj: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Pogoj, ki mora biti pravilen za funkcijo (npr. če mora biti drugi argument večji od prvega: "\y > \x") Sub-functions: Podfunkcije: Expression Izraz Precalculate Izračunaj vnaprej Reference Sklic Add Dodaj Edit Uredi Remove Odstrani Arguments: Argumenti: Name Ime Type Vrsta Question A function with the same name already exists. Do you want to overwrite the function? Funkcija s tem imenom že obstaja. Jo želite prepisati? Edit Function Uredi funkcijo New Function Nova funkcija FunctionsDialog Functions Funkcije Category Kategorija Function Funkcija New… Novo… Edit… Uredi… Deactivate Onemogoči Delete Izbriši Calculate… Izračunaj… Apply Uporabi Insert Vnesi Favorite Priljubljeni argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Pridobi podatke iz nabora %1 za dan objekt in lastnost. Če je "info" vnešen kot objekt, se bo odprlo pojavno okno z njegovimi lastnostmi. Example: Primer: Arguments Argumenti optional optional argument neobvezno default: argument default privzeto: Requirement: Required condition for function Zahteva: Properties Lastnosti %1: %1: key indicating that the property is a data set key tipka Activate Aktiviraj All All functions Vse Uncategorized nekategorizirano User functions Uporabniške funkcije Favorites Priljubljene Inactive Neaktivno HistoryView Insert Value Vnesi vrednost Insert Text Vnesi besedilo Copy Kopiraj Copy unformatted ASCII Kopiraj neoblikovano ASCII Select All Search… Išči... Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Zgoraj vpišite matematičen izraz, npr. "5 + 2 / 3", in pritisnite Enter. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Zgoraj vpišite matematičen izraz, npr. "5 + 2 / 3", in pritisnite Enter. Exchange rate source(s): updated %1 Comment Komentar Protect Zaščiti Add Comment… Dodaj komentar… Move to Top Premakni na vrh Remove Odstrani Clear Počisti Edit Comment… Uredi komentar… Text: Besedilo: Search Iskanje KeypadButton <i>Right-click/long press</i>: %1 <i>Desni klik/dolg klik</i>: %1 <i>Right-click</i>: %1 <i>Desni klik</i>: %1 <i>Long press</i>: %1 <i>Dolg klik</i>: %1 Open menu <i>Middle-click</i>: %1 <i>Srednji klik</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. STO Store Shrani New function Nova funkcija sin sin cos cos tan tan Exponentiation Percent or remainder Uncertainty/interval Negotovost/interval Relative error Relativna napaka Interval Interval Move cursor left Premakni kazalko levo Move cursor to start Premakni kazalko na začetek Move cursor right Premakni kazalko desno Move cursor to end Premakni kazalko na konec Logical AND Logični AND Logical OR Logični OR Bitwise Exclusive OR Logični ekskluzivni OR Logical NOT Logični NOT Bitwise Left Shift Logični pomik v levo Bitwise Right Shift Logični pomik v desno cmp rot a→1 Expand partial fractions Razširi parcialne ulomke Enable units in physical constants All constants Percentage Calculation Tool Orodje za izračun odstotkov more več All units Vse enote All variables Vse spremenljivke Action Dejanje Interval Display Intervalni prikaz Adaptive Prilagodljivo Significant digits Pomembne števke Plus/minus Plus/minus Relative Concise Interval Calculation Izračun intervala Variance formula Enačba za varianco Interval arithmetic Intervalna aritmetika Allow concise uncertainty input Complex number form Rectangular Exponential Polar Angle/phasor Type Assumptions type Vrsta Sign Assumptions sign Znak Default assumptions Privzete predpostavke Number Številka Real Realno Rational Racionalno Integer Celo število Boolean Logična vrednost Unknown Unknown assumptions sign Neznano Non-zero Neničelno Positive Pozitivno Non-negative Nenegativno Negative Negativno Non-positive Nepozitivno Factorize Faktoriziraj Expand Razširi Add column Add row Remove column Remove row Left parenthesis Levi oklepaj Left vector bracket Levi vektorski oklepaj Right parenthesis Desni oklepaj Right vector bracket Desni vektorski oklepaj Smart parentheses Pametni oklepaji Vector brackets Oklepaji za vektorje Argument separator Ločilnik argumentov Blank space Prazen prostor New line Nova vrstica Decimal point Decimalno mesto Previous result (static) Prejšnji statični rezultat Multiplication Button Action Label: Oznaka: Action: Dejanje: None Brez Value: Vrednost: Bitwise AND Bitni AND Bitwise Shift Delete Izbriši Backspace Backspace Addition Plus Subtraction Minus Division Bitwise OR Bitni OR Bitwise NOT Bitni NOT Clear expression Počisti izraz Calculate expression Izračunaj izraz NamesEditDialog Name Ime Abbreviation Okrajšava Plural Množina Reference Sklic Avoid input Izogni se vhodu Unicode Unicode Suffix Pripona Case sensitive Razlikuj velikosti črk Completion only Le dopolnjevanje Add Edit Uredi Remove Odstrani Warning Illegal name A function with the same name already exists. Funkcija s tem imenom že obstaja. A unit or variable with the same name already exists. Enota ali spremenljivka s tem imenom že obstaja. PercentageCalculationDialog Percentage Odstotek Value 1 Vrednost 1 Value 2 Vrednost 2 Change from 1 to 2 Spremeni iz 1 v 2 Change from 2 to 1 Spremeni iz 2 v 1 2 compared to 1 2 v primerjavi z 1 1 compared to 2 1 v primerjavi z 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Vnesite dve vrednosti, kjer je vsaj ena v odstotkih. Druge bodo izračunane samodejno. Clear Počisti PeriodicTableDialog Periodic Table Periodni sistem Element Data Podatki o elementu Alkali Metal Alkalijska kovina Alkaline-Earth Metal Zemljoalkalijska kovina Lanthanide Lantanoid Actinide Aktinoid Transition Metal Prehodni element Metal Kovina Metalloid Polkovina Polyatomic Non-Metal Poliatomske nekovine Diatomic Non-Metal Dvoatomske nekovine Noble Gas Žlahtni plin Unknown chemical properties Neznane kemijske lastnosti Unknown Neznano %1: %1: PlotDialog Plot Izriši Data Podatki Title: Naslov: Expression: Izraz: Function Funkcija Vector/matrix Vektor/matrika Paired matrix Parna matrika Rows Vrste X variable: Spremenljivka X: Style: Slog: Line Črta Points Točke Line with points Črta s točkami Boxes/bars Zaboji/stolpci Histogram Histogram Steps Koraki Candlesticks Sveče Dots Pike Polar Smoothing: Glajenje: None Brez Monotonic Monotonsko Natural cubic splines Naravni kubični zlepek Bezier Bezier Bezier (monotonic) Bezier (monotonsko) Y-axis: Os Y: Primary Primarno Secondary Sekundarno Add Dodaj Apply Uporabi Remove Odstrani Title Naslov Expression Izraz Function Range Funkcijsko območje Minimum x value: Najmanjša vrednost x: Maximum x value: Največja vrednost x: Sampling rate: Hitrost vzorčenja: Step size: Velikost koraka: Show real and imaginary parts Appearance Videz Display grid Prikaži mrežo Display full border Prikaži cel rob Minimum y value: Najmanjša vrednost y: Maximum y value: Največja vrednost y: Logarithmic x scale: Logaritemska skala x: Logarithmic y scale: Logaritemska skala y: X-axis label: Oznaka osi X: Y-axis label: Oznaka osi Y: Line width: Širina črt: Legend placement: Postavitev legende: Top-left Zgoraj levo Top-right Zgoraj desno Bottom-left Spodaj levo Bottom-right Spodaj desno Below Spodaj Outside Izven Calculating… Računam... Cancel Prekliči Processing… Obdelujem... PreferencesDialog Look && Feel Videz in občutek Numbers && Operators Številke & operatorji Units && Currencies Enote & valute Parsing && Calculation Ignore system language (requires restart) Prezri sistemski jezik (zahteva vnovičen zagon) Allow multiple instances Dovoli več oken naenkrat Clear history on exit Počisti zgodovino ob izhodu Close application with Escape key Keep above other windows Window title: Nastavi ime okna: Application name Ime programa Result Rezultat Application name + result Ime programa + rezultat Workspace Application name + workspace Style: Slog: Default (requires restart) Default style Dark mode Temni način Colorize result Custom result font Pisava rezultata Custom expression font Pisava izraza Custom keypad font Pisava tipkovnice Custom application font Pisava programa Custom result font: Pisava rezultata: Custom expression font: Pisava izraza: Custom keypad font: Pisava tipkovnice: Custom application font: Pisava programa: Display expression status Prikaži stanje izraza Expression after calculation: Keep expression Clear expression Počisti izraz Replace with result Replace with result if shorter Use keyboard keys for RPN Uporabi tipkovnične tipke za RPN Parsing mode: Način obdelave: Adaptive Prilagodljivo Conventional Običajna Implicit multiplication first Sprva implicitno množenje Chain RPN RPN Read precision Točnost branja Limit implicit multiplication Omejitev implicitnega množenja Interval calculation: Izračun intervala: Variance formula Enačba za varianco Interval arithmetic Intervalna aritmetika Factorize result Faktoriziraj rezultat Binary two's complement representation Upodobitev binarnega dvojiškega komplementa Hexadecimal two's complement representation Upodobitev šestnajstiškega dvojiškega komplementa Use lower case letters in non-decimal numbers Uporabi male črke v nedesetiških številih Spell out logical operators Črkuj logične operatorje Use E-notation instead of 10^x Uporabi E-notacijo namesto 10^x Preferences Nastavitve ms milliseconds ms Use E-notation instead of 10^n Uporabi E-notacijo namesto 10^n Use 'j' as imaginary unit Uporabi 'j' za imaginarno enoto Use comma as decimal separator Uporabi vejico kot desetiški ločilnik Ignore comma in numbers Prezri vejice v številih Ignore dots in numbers Prezri pike v številih Round halfway numbers away from zero Round halfway numbers to even Zaokroži polovična števila na soda Indicate repeating decimals Navedi ponavljajoče se decimalke Language: Jezik: Max history lines saved: Use caret for bitwise XOR Uporabi strešico za bitni XOR Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Expression status: Stanje izraza: Off Izklopljeno In history list In expression field Status tooltip delay: Automatically calculate selection Expression in history: Parsed Entered Entered + parsed Automatically copy result Simplified percentage calculation Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binarno Hexadecimal Šestnajstiško Binary bits: Automatic Samodejno Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Copy unformatted ASCII by default Digit grouping: Števke v skupinah: None Brez Standard Običajno Local Lokalno Automatically group digits in input (experimental) Interval display: Intervalni prikaz: Significant digits Pomembne števke Interval Interval Plus/minus Plus/minus Concise Midpoint Sredina Lower Upper Rounding: Complex number form: Rectangular Exponential Polar Angle/phasor Enable units Abbreviate names Skrajšaj imena Use binary prefixes for information units Uporabi binarne predpone za informacijske enote Automatic unit conversion: No conversion Base units Osnovne enote Optimal units Najustreznejše enote Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Restart required Please restart the program for the language change to take effect. Default Privzeto Calculate as you type delay: Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Enable units in physical constants Temperature calculation: Absolute Relative Hybrid Exchange rates updates: Posodobitve menjalnih razmerij: %n day(s) %n dan %n dni %n dnevi %n dni days dan dni dnevi dni QApplication Execute expressions and commands from a file FILE DATOTEKA Start a new instance of the application Zaženi nov primerek programa Specify the window title Določi ime okna TITLE TITLE Display the application version Prikaži različico programa Open workspace Expression to calculate Izraz za izračun [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Privzeto je dovoljen le en primerek (eno glavno okno) %1. Če je odprtih več primerkov, se bodo shranile definicije, spremenljivke, funkcije, zgodovina ... le zadnjega okna. Želite vseeno dovoliti več primerkov programa? Allow multiple instances? %1 is already running. Failed to load global definitions! Napaka pri nalaganju globalnih definicij! answer odgovor History Answer Value Zgodovinska vrednost odgovora History Index(es) Zgodovinski indeks(i) History index %s does not exist. Zgodovinski indeks %s ne obstaja. Last Answer Zadnji odgovor Answer 2 Odgovor 2 Answer 3 Odgovor 3 Answer 4 Odgovor 4 Answer 5 Odgovor 5 Memory Error Couldn't write preferences to %1 Pisanje nastavitev v %1 neuspešno Function not found. Funkcija ni bila najdena. Variable not found. Spremenljivka ni bila najdena. Unit not found. Enota ni bila najdena. Unsupported base. Nepodprta osnova. Unsupported value. QalculateQtSettings Update exchange rates? Posodobi menjalna razmerja? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Od posodobitve menjalnih razmerij je minil %n dan. Želite posodobiti menjalna razmerja zdaj? Od posodobitve menjalnih razmerij sta minila %n dni. Želite posodobiti menjalna razmerja zdaj? Od posodobitve menjalnih razmerij so minili %n dnevi. Želite posodobiti menjalna razmerja zdaj? Od posodobitve menjalnih razmerij je minilo %n dni. Želite posodobiti menjalna razmerja zdaj? Fetching exchange rates. Pridobivam menjalna razmerja. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Pridobivam menjalna razmerja… Error Warning Information Path of executable not found. Pot do zagonske datoteke ni bila najdena. curl not found. Orodje curl ni bilo najdeno. Failed to run update script. %1 Napaka pri zagonu posodobitvenega skripta. %1 Failed to check for updates. Napaka pri preverjanju posodobitev. No updates found. Ni novih posodobitev. A new version of %1 is available at %2. Do you wish to update to version %3? Nova različica %1 je na voljo na %2. Želite nadgraditi na različico %3? A new version of %1 is available. You can get version %3 at %2. Nova različica %1 je na voljo. Različico %3 lahko pridobite na %2. Download %1: %2 Insert function Vnesi funkcijo Insert function (dialog) Vnesi funkcijo (obrazec) Insert variable Vnesi spremenljivko Approximate result Negate Negiraj Invert Inverz Insert unit Vnesi enoto Insert text Vnesi besedilo Insert operator Insert date Vnesi datum Insert matrix Vnesi matriko Insert smart parentheses Vnesi pametne oklepaje Convert to unit Pretvori v enoto Convert Pretvori Convert to optimal unit Pretvori v najustreznejšo enoto Convert to base units Pretvori v osnovne enote Convert to optimal prefix Pretvori v najustreznejšo predpono Convert to number base Pretvori v številsko osnovo Factorize result Faktoriziraj rezultat Expand result Razširi rezultat Expand partial fractions Razširi parcialne ulomke RPN: down RPN: dol RPN: up RPN: gor RPN: swap RPN: izmenjaj RPN: copy RPN: kopiraj RPN: lastx RPN: lastx RPN: delete register RPN: izbriši register RPN: clear stack RPN: počisti sklad Set expression base Nastavi osnovo izraza Set result base Nastavi osnovo rezultata Set angle unit to degrees Nastavi kotne enote v stopinje Set angle unit to radians Nastavi kotne enote v radiane Set angle unit to gradians Nastavi kotne enote v gradiane Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Prikaži/skrij način RPN Show general keypad Toggle programming keypad Prikaži/skrij tipkovnico Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Zgodovina iskanj Clear history Počisti zgodovino Show variables Show functions Show units Show data sets Store result Shrani rezultat MC (memory clear) MR (memory recall) MS (memory store) M+ (memory plus) M− (memory minus) New variable Nova spremenljivka New function Nova funkcija Open plot functions/data Odpri orodje za izris funkcij/podatkov Open convert number bases Odpri orodje za pretvorbo številskih osnov Open floating point conversion Odpri orodje za pretvorbo plavajoče vejice Open calender conversion Odpri orodje za pretvorbo koledarjev Open percentage calculation tool Odpri orodje za izračun odstotkov Open periodic table Odpri periodni sistem Update exchange rates Posodobi menjalna razmerja Copy result Kopiraj rezultat Insert result Open mode menu Open menu Help Pomoč Quit Izhod Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Počisti izraz Delete Izbriši Backspace Backspace Home End Right Left Up Gor Down Dol Undo Razveljavi Redo Uveljavi Calculate expression Izračunaj izraz Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Privzeto Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Vredu Cancel Only used when Qt translation is missing Prekliči Close Only used when Qt translation is missing Zapri &Yes Only used when Qt translation is missing &Da &No Only used when Qt translation is missing &Ne &Open Only used when Qt translation is missing &Odpri &Save Only used when Qt translation is missing &Shrani &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Meni Menu (%1) Meni (%1) New Novo Function… Funkcije… Variable/Constant… Spremenljivka/konstanta… Unknown Variable… Neznana spremenljivka… Matrix… Matrika… Workspaces Open… Odpri… Open default Odpri privzeto Save Shrani Save As… Shrani kot… Import CSV File… Uvozi datoteko CSV... Export CSV File… Izvozi datoteko CSV... Functions Funkcije Variables and Constants Spremenljivke in konstante Units Enote Plot Functions/Data Izriši funkcije/podatke Floating Point Conversion (IEEE 754) Pretvorba plavajoče vejice (IEEE 754) Calendar Conversion Pretvorba koledarjev Update Exchange Rates Posodobi menjalna razmerja Normal Mode Običajen način RPN Mode Način RPN Chain Mode Keyboard Shortcuts Tipkovne bližnjice Preferences Nastavitve Help Pomoč Report a Bug Poročaj o hrošču Check for Updates Preveri za posodobitve About %1 O %1 Quit Izhod Mode Način Mode (%1) Način (%1) General Display Mode Splošni način prikaza Normal Običajen Scientific Znanstveni Engineering Inženirski Simple Preprost Angle Unit Kotne enote Radians Radiani Degrees Stopinje Gradians Gradiani Approximation Približek Automatic Automatic approximation Samodejno Dual Dual approximation Dvojno Exact Exact approximation Točno Approximate Izračunaj približek Assumptions Predpostavke Type Assumptions type Vrsta Number Številka Real Realno Rational Racionalno Integer Celo število Boolean Logična vrednost Sign Assumptions sign Znak Unknown Unknown assumptions sign Neznano Non-zero Neničelno Positive Pozitivno Non-negative Nenegativno Negative Negativno Non-positive Nepozitivno Result Base Osnovo rezultata Binary Binarno Octal Osmiško Decimal Desetiško Hexadecimal Šestnajstiško Other Drugo Duodecimal Dvanajstiško Sexagesimal Šestdesetiško Time format Časovna oblika Roman numerals Rimske številke Unicode Unicode Bijective base-26 Bijektivna osnova 26 Binary-encoded decimal (BCD) Custom: Number base Expression Base Osnovo izraza Other: Number base Drugo: Precision: Točnost: Min decimals: Min. decimalke: Max decimals: Maks. decimalke: off Max decimals izklopljeno Convert Pretvori Convert (%1) Pretvori (%1) Store Shrani Store (%1) Shrani (%1) Functions (%1) Funkcije (%1) Keypad Tipkovnica Keypad (%1) Tipkovnica (%1) Number bases Številske osnove Unit… Enote… Data Sets Podatkovni nabori Percentage Calculation Tool Orodje za izračun odstotkov Periodic Table Periodni sistem Units (%1) Enote (%1) Plot Functions/Data (%1) Izriši funkcije/podatke (%1) Number Bases (%1) Številske osnove (%1) Binary: Binarno: Octal: Osmiško: Decimal: Desetiško: Hexadecimal: Šestnajstiško: RPN Stack Sklad RPN Rotate the stack or move the selected register up (%1) Zavrti sklad ali premakni izbran register gor (%1) Rotate the stack or move the selected register down (%1) Zavrti sklad ali premakni izbran register dol (%1) Swap the top two values or move the selected value to the top of the stack (%1) Izmenjaj vrhnji dve vrednosti ali premakni izbrano vrednost na vrh sklada (%1) Copy the selected or top value to the top of the stack (%1) Kopiraj izbrano ali vrhnjo vrednost na vrh sklada (%1) Enter the top value from before the last numeric operation (%1) Vnesi vrhnjo vrednost na mesto pred zadnjo številsko operacijo (%1) Delete the top or selected value (%1) Izbriši vrhnjo ali izbrano vrednost (%1) Clear the RPN stack (%1) Počisti sklad RPN (%1) New Function… Nova funkcija… Favorites Priljubljene Recent User functions Uporabniške funkcije Open dialog Show all functions User units Uporabniške enote more več Prefixes Predpone Show all units User variables Uporabniške spremenljivke Show all variables Powerful and easy to use calculator Zmogljivo računalo, preprosto za uporabo License: GNU General Public License version 2 or later Error Couldn't write definitions Pisanje definicij neuspešno hexadecimal šestnajstiško octal osmiško decimal desetiško duodecimal dvanajstiško binary binarno roman rimsko bijective bijektivno sexagesimal šestdesetiško latitude longitude time čas Time zone parsing failed. Obdelava časovnega pasu spodletela. bases osnove calendars koledarji rectangular pravokotno cartesian kartezično exponential eksponentno polar polarno phasor fazor angle kot optimal najustreznejše base osnova mixed mešano fraction ulomek factors deleži Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad Copy Kopiraj prefix predpona partial fraction parcialni ulomek decimals factorize faktoriziraj expand razširi Calculating… Računam... Cancel Prekliči RPN Operation Operacija RPN Factorizing… Faktoriziram... Expanding partial fractions… Razširjam parcialne ulomke... Expanding… Razširjam... Converting… Pretvarjam... RPN Register Moved Register RPN premaknjen Processing… Obdelujem... Matrix Matrika Temperature Calculation Mode The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Absolute Relative Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Only dot as decimal separator Parsing Mode Način obdelave The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first Sprva implicitno množenje Conventional Običajna Adaptive Prilagodljivo Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Dodaj dejanje (%1) Edit Keyboard Shortcut New Keyboard Shortcut Nova tipkovna bližnjica Action: Dejanje: Value: Vrednost: Set key combination Nastavi zaporedje tipk Press the key combination you wish to use for the action. Pritisnite zaporedje tipk, ki ga želite uporabiti za to dejanje. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? To zaporedje tipk je že v uporabi. Ali ga želite prepisati s tem dejanjem (%1)? Question Add… Dodaj… Edit… Uredi… Remove Odstrani Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. Example: Example of function usage Primer: Enter RPN Enter Calculate Izračunaj Apply to Stack Premakni na sklad Insert Vnesi Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Ne vprašaj znova Keep open Obdrži odprto Value Vrednost Argument Argument %1: %1: Plot Izriši General Splošno Programming Programirno Algebra Custom Po meri None Brez Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Desni klik/dolg klik</i>: %1 Open menu Number Bases Številske osnove Rotate the stack or move the selected register up Zavrti sklad ali premakni izbran register gor Rotate the stack or move the selected register down Zavrti sklad ali premakni izbran register dol Swap the top two values or move the selected value to the top of the stack Izmenjaj vrhnji dve vrednosti ali premakni izbrano vrednost na vrh sklada Delete the top or selected value Izbriši vrhnjo ali izbrano vrednost Enter the top value from before the last numeric operation Vnesi vrhnjo vrednost na mesto pred zadnjo številsko operacijo Copy the selected or top value to the top of the stack Kopiraj izbrano ali vrhnjo vrednost na vrh sklada Clear the RPN stack Počisti sklad RPN Action Dejanje Key combination Tipkovno zaporedje True Pravilno False Napačno Info Info optional optional argument neobvezno Failed to open %1. %2 Napaka pri odpiranju datoteke %1. %2 UnitEditDialog General Splošno Relation Razmerje Name: Ime: Category: Kategorija: Descriptive name: Opisno ime: System: Sistem: Imperial imperialni US Survey ameriški Hide unit Skrij enoto Description: Opis: Class: Razred: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Base unit Osnovna enota Named derived unit Imenovana izpeljana enota Derived unit Izpeljana enota Base unit(s): Osnovne enote: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Exponent: Eksponent: Relation: Razmerje: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Razmerje z osnovno enoto. Za linearno odvisnost je to le število.<br><br>Za nelinearna razmerja uporabite \x kot faktor in \y kot eksponent (npr. "\x + 273.15" za razmerje med stopinjami Celzija in Kelvina). Inverse relation: Inverzno razmerje: Specify for non-linear relation, for conversion back to the base unit. Določite za nelinearna razmerja, za pretvorbo nazaj v osnono enoto. Mix with base unit Mešaj z osnovno enoto Priority: Prioriteta: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Število najmanjše osnovne enote: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Privzeto uporabi s predponami Base unit does not exist. Osnovna enota ne obstaja. Error A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Question A variable or unit with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Unit Uredi enoto New Unit Nova enota UnitsDialog Units Enote Category Kategorija Unit Enota New… Novo… Edit… Uredi… Deactivate Onemogoči Delete Izbriši Convert Pretvori Insert Vnesi Favorite Priljubljeni Show hidden units Prikaži skrite enote Activate Aktiviraj All All units Vse Uncategorized nekategorizirano User units Uporabniške enote Favorites Priljubljene Inactive Neaktivno UnknownEditDialog Name: Ime: Custom assumptions Predpostavke po meri Type: Vrsta: Sign: Znak: Temporary Začasno Question A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Unknown Variable Uredi neznano spremenljivko New Unknown Variable Nova neznana spremenljivka VariableEditDialog Name: Ime: Temporary Začasno Value: Vrednost: Required Zahtevano Description Opis current result trenutni rezultat Category: Kategorija: Descriptive name: Opisno ime: Hide variable Skrij spremenljivko Description: Opis: Question A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Variable Uredi spremenljivko New Variable Nova spremenljivka VariablesDialog Variables Spremenljivke Category Kategorija Variable Spremenljivka New Novo Variable/Constant… Spremenljivka/konstanta… Unknown Variable… Neznana spremenljivka… Matrix… Matrika… Edit… Uredi… Export… Izvozi… Deactivate Onemogoči Delete Izbriši Insert Vnesi Favorite Priljubljeni a matrix matrika a vector vektor positive pozitivno non-positive nepozitivno negative negativno non-negative nenegativno non-zero neničelno integer celo število boolean logična vrednost rational racionalno real realno complex kompleksno number številka not matrix ni matrika unknown neznano Default assumptions Privzete predpostavke Activate Aktiviraj All All variables Vse Uncategorized nekategorizirano User variables Uporabniške spremenljivke Favorites Priljubljene Inactive Neaktivno qalculate-qt-5.5.1/translations/qalculate-qt_sv.ts000066400000000000000000017265011475705355700223530ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Kalkylator Powerful and easy to use calculator Kraftfull och användarvänlig miniräknare Qalculate! (Qt UI) Qalculate! (Qt UI) Argument Rules Parameterregler _Cancel _Avbryt Do not save modifications Spara inte modifikationerna _OK _OK Accept the modification of argument rules Godkänn modifiering av parameterregler Enable rules and type test Aktivera villkor- och klass-test Custom condition Anpassat villkor For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Till exempel om parametern är en matris och måste ha lika antal rader och kolumner: rows(\x) = columns(\x) Allow matrix Tillåt matriser Forbid zero Förbjud noll Handle vector Hantera vektor Calculate function for each separate element in vector. Beräkna funktionen för varje separat element i vektor. Min Min Include equals Inkludera lika med Max Max Keyboard Shortcuts Kortkommandon _Close _Stäng Label Etikett Left-click Vänsterklick Right-click Högerklick Middle-click Mittenklick Reset Återställ Button Action Knappåtgärd Value Värde Argument name Parameternamn Calendar Conversion Kalenderomvandling Export CSV File Exportera CSV-fil Current result Nuvarande resultat Matrix/vector variable Matris/vektorvariabel File Fil Delimiter Avgränsare Comma Komma Tabulator Tabulator Semicolon Semikolon Space Mellanslag Other Annan Import CSV File Importera CSV-fil Do not import the file Avbryt filimport Import the file Importera filen Name of the data file to import Namn för filen som skall importeras Select a file Välj en fil Import as Importera som Matrix Matris If a matrix shall be generated from the contents of the file Om en matris ska genereras från filinnehållet Vectors Vektorer If vectors shall be generated from the contents of the file Om flera vektorer ska genereras från filinnehållet Name Namn Name (or name prefix) used to reference generated variable(s) in expressions Namn (eller namnprefix) för referenser till genererade variabler i uttryck Descriptive name Beskrivande namn Title displayed in menus and in variable manager Rubrik som skall visas i menyer och variabelhanteraren Category Kategori First row Första raden The first row with data to import in the file Första raden som innehåller data att importera Includes headings Inkludera kolumnnamn If the first row contains column headings Huruvida den första raden är kolumnrubriker Delimiter used to separate columns in the file Avgränsare använd för att separera kolumner i filen Custom delimiter Anpassad avgränsare Edit Data Property Redigera dataegenskap Do not create/modify this data set Avbryt skapande/modifiering av detta dataset Accept the creation/modification of this data set Godkänn skapande/modifiering av detta dataset Name used for reference Namn använt som referens Properties Egenskaper Title displayed in menus and in data set manager Rubrik som skall visas i menyer och datasetshanteraren Description Beskrivning Description of this data property Beskrivning av dataegenskapen Value Type Värdetyp Text Text Number Nummer Expression Uttryck Hide Göm Use as key Använd som nyckel Approximate value Approximerat värde Case sensitive value Storlekskänsligt värde Value uses brackets Värdet använder klammrar Unit expression Enhetsuttryck Edit Data Set Redigera dataset Title Titel Data file Datafil Description of this data set Beskrivning av detta dataset Copyright Upphovsrätt General Allmänt Properties: Egenskaper: Definition of the properties of this data set Definiering av detta datasets egenskaper _New _Ny _Edit _Redigera _Delete _Ta bort Name used to invoke the function in expressions Namn som används för att referera till funktionen i uttryck Object argument name Objektargumentets namn Property argument name Egenskapsargumentets namn Default property Förvald egenskap Function Funktion Edit Data Object Redigera dataobjekt Do not create/modify this data object Avbryt skapande/modifiering av dataobjektet Accept the creation/modification of this data object Godkänn skapande/modifiering av dataobjektet Data Sets new dataset Dataset Data Set Dataset Create a new data set Skapa ett nytt dataset Edit the selected data set Redigera valt dataset Delete the selected data set Ta bort valt dataset Objects Objekt Create a new data object Skapa ett nytt dataobjekt Edit the selected data object Redigera valt dataobjekt Remove the selected data object Ta bort valt dataobjekt Data Set Description Beskrivning av dataset Object Attributes Objektegenskaper Decimals Decimaler Close this window Stäng fönstret Min decimals Min decimaler Max decimals Max decimaler Minimal number of displayed decimals Minimalt antal visade decimaler Maximal number of decimals to display (and round to) Maximalt antal decimaler att visa (och avrunda till) Floating Point Conversion Flyttalsomvandling Decimal value Decimalt värde Binary value Binärt värde Octal value Oktalt värde Hexadecimal representation Hexadecimal representation Conversion error Förlorad precision Binary representation Binär representation Floating point value Flyttalsvärde Format Format Hexadecimal value Hexadecimalt värde Edit Function Redigera funktion _Help _Hjälp Do not create/modify this function Avbryt skapande/modifiering av funktionen Accept the creation/modification of this function Godta skapande/modifiering av funktionen Name used to invoke this function in expressions Namn som används för att referera till funktionen i uttryck Title displayed in menus and in function manager Rubrik som skall visas i menyer och funktionshanteraren Hide function Dölj funktionen If this function shall be hidden in menus Huruvida funktionen skall döljas i menyer Description of this function Beskrivning av funktionen Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Använd \x för den första, \y för den andra och \z för den tredje parametern. För mer information klicka på hjälpknappen. Condition Förutsättning Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Förutsättning som måste infrias för funktionen (t.ex. om den andra parametern måste var större än den första: "\y > \x") Sub-Functions Subfunktioner Arguments: Parametrar: Definition of this function's arguments Definiering av funktionens parametrar Free Valfri Integer Heltal Symbol Symbol Date Datum Vector Vektor Positive number Positivt nummer Non-zero number Icke-noll nummer Non-negative number Icke-negativt nummer Positive integer Positivt heltal Non-zero integer Icke-noll heltal Non-negative integer Icke-negativt nummer Boolean Booleskt värde Object Objekt Unit Enhet Variable Variabel Angle Vinkel Data object Dataobjekt Data property Dataegenskap _Add _Lägg till Add entered argument definition Lägg till parameterdefinitionen _Apply _Applicera Modify selected argument Modifiera vald parameter Remove selected argument Ta bort vald parameter Rules Villkor Edit conditions for selected argument Modifiera villkor vald parameter Close this dialog Stäng dialogfönstret Precalculate Förberäkna Calculate the subfunction only once, before the parent function Beräkna subfunktionen endast en gång, innan huvudfunktionen Add entered subfunction Lägg till subfunktionen Apply changes to the selected subfunction Verkställ ändringar av vald subfunktion Remove the selected subfunction Ta bort vald subfunktion Functions Funktioner Create a new function Skapa en ny funktion Edit the selected function Redigera vald funktion _Insert _Infoga Insert (or execute) the selected function into the expression entry Sätt in (eller exekvera) vald funktion i uttrycket Delete the selected function Ta bort vald funktion (De)activate the selected function (Av)aktivera vald funktion Deacti_vate Avakti_vera Apply the selected function to the current expression Applicera vald funktion på det nuvarande uttrycket Categor_y Kategor_i _Function _Funktion Descri_ption Beskri_vning Degrees Grader Radians Radianer Gradians Gradienter Default assumptions Förvalda antaganden Unknown Okänd Not Matrix Inte matris Complex Komplex Real Reell Rational Rationell Non-Zero Ej noll Positive Positiv Non-Negative Ej negativ Negative Negativ Non-Positive Ej positiv _File _Arkiv Unknown Variable Okänd variabel Function (simplified) Funktion (förenklad) Import CSV File… Importera CSV-fil… Export CSV File… Exportera CSV-fil… _Store Result… _Spara resultatet… Save Result Image… Spara resulatbild… Save local functions, variables and units Spara lokala funktioner, variabler och enheter Save Definitions Spara definitioner Import Definitions File… Importera definitionsfil… Fetch current exchange rates from the Internet Hämta nuvarande växelkurser från internet Update Exchange Rates Uppdatera växelkurser Plot Functions/Data Rita funktions-/datadiagram Convert Number Bases Omvandla mellan talbaser Floating Point Conversion (IEEE 754) Flyttalsomvandling (IEEE 754) Percentage Calculation Tool Procentberäkningsverktyg Periodic Table Periodiska systemet Minimal Window Minimalt fönster _Quit _Avsluta Manage Variables Hantera variabler Manage Functions Hantera funktioner Manage Units Hantera enheter Manage Data Sets Hantera dataset Factorize Faktorisera Expand Expandera Apply partial fraction decomposition to the current result. Tillämpa partialbråksuppdelning på nuvarande resultat. Expand Partial Fractions Expandera partialbråk Set Unknowns… Ange okända värden… Convert to Unit Omvandla till enhet Set Prefix Sätt prefix Convert to Unit Expression… Omvandla till enhetsuttryck… Convert to Base Units Omvandla till basenheter Convert to Optimal Unit Omvandla till optimal enhet Insert Date… Infoga datum… Insert Matrix… Infoga matris… Insert Vector… Infoga vektor… _Copy Result _Kopiera resultatet Customize Keypad Buttons Anpassa knappar i knappsatsen _Preferences _Inställningar _Mode _Läge Number Base Talbas Select Result and Expression Base… Välj bas i resultat och uttryck… Binary Binär Octal Oktal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Annan… Sexagesimal Sexagesimal Time Format Tidsformat Roman Numerals Romerska siffror Numerical Display Numerisk visning Normal Normal Engineering Teknisk Scientific Vetenskaplig Purely Scientific Fullt vetenskaplig Simple Enkel Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Av: 1/7 ≈ 0,14285714 På: 1/7 = 0,142857 142857... Indicate Repeating Decimals Indikera upprepande decimaler Show Ending Zeroes Visa avslutande nollor Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Av: 2,5 ≈ 3; 1,5 ≈ 2 På: 2,5 ≈ 2; 1,5 ≈ 2 Round Halfway Numbers to Even Avrunda mittemellan-tal till jämn siffra Off: -x + y On: y - x Av: -x + y På: y - x Sort Minus Last Sortera minus sist Complex Rectangular Form Komplex rektangulär form Complex Exponential Form Komplex exponentiell form Complex Polar Form Komplex polär form Complex Angle/Phasor Notation Komplex vinkelnotation Rational Number Form Form för rationella tal 1/3 ≈ 0.33333 1/3 ≈ 0,33333 Decimal Fractions Decimalform 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1,5 Exact Decimal Fractions Exakt decimalform 6/4 = 3/2 6/4 = 3/2 Simple Fractions Bråkform 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Blandad form Interval Display Intervallvisning Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Av: 1/2*pi ≈ 1,5707963 På: 1/2*pi = 0,5 pi Adaptive Adaptiv Calculates an interval of possible values and keeps track of precision changes. Beräknar ett intervall av möjliga värden och håller reda på förändringar i precision. Significant Digits Signifikanta siffror Interval Intervall Plus/Minus Plus/minus Midpoint Medelpunkt Unit Display Enehetsvisning Do not use any prefixes in result Använd inga prefix i resultatet Show prefixes for primarily SI and CGS units. Visa prefix för huvudsakligen SI och CGS enheter. Use prefixes for selected units Använd prefix för vissa enheter Use prefixes also for currencies Använd prefix även för valutor Use prefixs for all units Använd prefix med alla enheter Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Aktiverar automatisk användning av hekto, deka, deci och centi när prefix är aktiverade Enable All SI Prefixes Använd alla SI-prefix Enables automatic setting of prefix for denominator in addition to the numerator Aktiverar automatisk användande av prefix för nämnaren utöver i täljaren Enable Denominator Prefixes Aktivera prefix i nämnaren Off: J / K On: J * K^-1 Av: J / K På: J * K^-1 Negative Exponents Negativa exponenter Off: (2 m)/s On: 2 (m/s) Av: (2 m)/s På: 2 (m/s) Place Units Separately Placera enheter separat No Additional Conversion Ingen ytterligare omvandling Convert to Optimal SI Unit Omvandla till optimal SI-enhet If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Om aktiverat: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Omvandla till blandade enheter Abbreviate Names Förkorta namn Enabled Objects Aktiverade objekt Variables Variabler Units Enheter Unknowns Okända Units in Physical Constants Enheter i fysiska konstanter If not enabled, treats all variables as unknown Om avaktiverad behandlas alla variabler som okända Calculate Variables Beräkna variabler Disables/enables complex numbers in result (Av)aktiverar komplexa tal i resultat Allow Complex Result Tillåt complext resultat Disables/enables infinite numbers in result (Av)aktiverar oändliga tal i resultat Allow Infinite Result Tillåt oändligt resultat Approximation Approximering Always Exact Alltid exakt Try Exact Försök exakt Approximate Approximera Interval Arithmetic Intervallaritmetik Interval Calculation Intervallberäkning Variance Formula Variansformel Change angle unit used in trigonometric functions Ändra vinkelenhet för trigonometriska funktioner Angle Unit Vinkelenhet None Ingen Assumptions Antaganden Algebraic Mode Algebraiskt läge Assume that unknown denominators are non-zero Anta att nämnare ej är noll Non-Zero Denominators Nämnare ej noll Warn when unknown denominators are assumed non-zero Varna när okända nämnare är antagna som ej noll Warn About Denominators Assumed Non-Zero Varna om nämnare antagna som ej noll Parsing Mode Tolkningsläge Adaptive Parsing Adaptiv tolkning Parse Implicit Multiplication First Läs implicit multiplikation först Conventional Parsing Konventionell tolkning Chain Syntax Kedjesyntax RPN Syntax RPN-syntax Off: xy = x*y On: xy != x*y Av: xy = x*y På: xy != x*y Limit Implicit Multiplication Begränsa implicit multiplikation Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Behandla decimala tal som approximativa med en precision lika med antalet siffror. Av: 1,1 * 1,1 = 1,21 På: 1,1 * 1,1 ≈ 1,2 Read Precision Läs precision _Precision _Precision _Decimals _Decimaler Calculate As You Type Fortgående beräkningar Chain Mode Kedjeläge Activate the RPN stack. Aktivera RPN-stacken. RPN Mode RPN-läge Meta Modes Metalägen Save Mode… Spara läge… Delete Mode… Radera läge… Save Default _Mode Spara förvalt _programläge Fu_nctions Fu_nktioner _Variables _Variabler _Units _Enheter _Contents _Innehåll Report a Bug Rapportera ett problem Check for Updates Sök efter uppdateringar _About _Om Toggle minimal window (Av)aktivera minimalt fönster Calculation result Beräkningsresultat _Keypad _Knappsats Toggles persistent keypad (makes it possible to show keypad and history simultaneously) (Av)aktiverar beständig knappsats (gör det möjligt att visa knappsats och historik samtidigt) _History _Historik C_onversion _Omvandling RPN Stack RPN-stack Insert the selected value Infoga valt värde Insert the selected text Infoga valt värde som text Copy the selected text Kopiera vald text Add the selected value(s) Addera valda värden Subtract the selected value(s) Subtrahera valda värden Multiply the selected value(s) Multiplicera valda värden Divide the the selected value(s) Dela valda värden Raise to the power of the selected value Höj med det valda värdet Calculate the square root of the selected value Beräkna kvadratroten av det valda värdet History Historik Subtract the top value from the second value Subtrahera det översta värdet från det andra värdet Multiply the top two values Multiplicera de två översta värdena Divide the second value by the top value Dividera det andra med det översta värdet Raise the second value to the power of the top value Höj det andra värdet med det översta värdet Negate the top value (Ctrl+-) Negera det översta värdet (Ctrl+-) Invert the top value Invertera det översta värdet Calculate the square root of the top value Beräkna kvadratroten av det översta värdet Calculate the sum of all values Beräkna summa av alla värden Rotate the stack or move selected register up Rotera stacken eller flytta markerat register uppåt Rotate the stack or move selected register down Rotera stacken eller flytta markerat register nedåt Swap the two top values or move the selected value to the top of the stack Byt plats på de två översta värdena eller flytta markerat värdet till toppen av stacken Copy the selected or top value to the top of the stack Kopiera det valda eller det översta värdet till toppen av stacken Enter the top value from before the last numeric operation Lägg till det översta värdet från innan den senaste numeriska operationen Delete the top or selected value Ta bort det översta eller det markerade värdet Edit the selected value Redigera valt värde Clear the RPN stack Töm RPN-stacken. Unit(s) and prefix to convert result to Enhet(er) och prefix att omvandla resultatet till Convert Omvandla Continuous conversion Fortgående omvandling Automatically convert result to the current unit expression as long as the conversion box is visible. Omvandla automatiskt resultat till det nuvarande enhetsuttrycket så länge som omvandlingsrutan är synlig. Add prefix Lägg till prefix If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Om enhetsuttrycket saknar prefix, sätt optimalt prefix. Detta kan åsidosättas med "?" or "0" framför enhetsuttrycket. Conversion Omvandling Show/hide programming keypad Visa/dölj programmeringsknappsats Exact Exakt Fraction Bråktal Numerical display Numerisk visning Pure Strikt Number base Talbas Time format Tidsformat Roman Romersk sin sin cos cos tan tan ln ln Equals Lika med sqrt sqrt sum sum Unknown variable Okänd variabel mod mod mean medel Store result as a variable Spara resultatet som en variabel STO Standard calculator button. Do not use more than three characters. STO Convert number bases Omvandla mellan talbaser Imaginary unit i (√-1) Imaginär enhet i (√-1) Manage units Hantera enheter Conversion operator Omvandlingsoperand Kilogram Kilogram Two's complement input Tvåkomplementsform för indata Two's complement output Tvåkomplementsform för utdata Bitwise Exclusive OR Bitvist exklusivt OR Bitwise Left Shift Bitvist högerskift Bitwise Right Shift Bitvist vänsterskift Floating point conversion Flyttalsomvandling Show/hide left keypad Visa/dölj vänster knappsats Show/hide right keypad Visa/dölj höger knappsats DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Föregående resultat ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Lägg till i uttryck Persistent Keypad Beständig knappsats Edit Redigera Delete Ta bort Update Uppdatera Insert Value Infoga värde Insert Text Infoga text Insert Parsed Text Infoga tolkad text Copy Kopiera Copy Full Text Kopiera hel text Search… Sök… Add Bookmark… Lägg till bokmärke… Bookmarks Bokmärken Protect Skydda Move To Top Lägg överst Remove Ta bort Clear All Rensa allt _Copy _Kopiera _Store… _Spara… Save Image… Spara bild… _Factorize _Faktorisera _Expand _Expandera _Normal _Normal Sc_ientific Vetenskapl_ig Purel_y Scientific Fu_llt vetenskaplig Simp_le Enke_l _Binary _Binär _Octal _Oktal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Decimaltal Exact Decimal Fraction Exakt decimaltal Simple Fraction Bråkform Mixed Fraction Blandad form _Abbreviate Names F_örkorta namn C_onvert… _Omvandla… Convert to Base _Units Omvandla till bas_enheter Convert _to Optimal Unit Omvandla _till optimal enhet Use Optimal Prefix Använd optimalt prefix Convert to Omvandla till Convert to UTC Omvandla till UTC Convert to Calendars Omvandla till kalendrar Use prefixes for all units Använd prefix för alla enheter Enable All SI Prefi_xes Använd alla SI-prefi_x View/Edit Matrix Visa/redigera matris View/Edit Vector Visa/redigera vektor Copy Text Kopiera text To Top Till toppen Swap Byt plats Up Upp Down Ner Negate Negera Invert Invertera Square Kvadrat Square Root Kvadratrot Clear Stack Töm stacken Select Number Base… Välj talbas… Store result Spara resultatet Add result Add current result to variable value Addera resultatet Subtract result Subtruct current result from variable value Subtrahera resultatet Insert the matrix/vector into the expression Sätt in matrisen/vektorn i uttrycket Rows Rader Number of rows in this matrix (rows displayed for vectors) Antal rader i matrisen (visade rader för vektorer) Columns Kolumner Number of columns in this matrix (columns displayed for vectors) Antal kolumner i matrisen (visade kolumner för vektorer) If this is a matrix or vector Huruvida det är en matris eller vektor Elements Element Current element: Nuvarande element: Edit Matrix Redigera matris Do not create/modify this matrix/vector Avbryt skapande/modifiering av matrisen/vektorn Create/modify the matrix/vector Skapa/modifiera matrisen/vektorn Accept the creation/modification of this matrix/vector Godkänn skapande/modifiering av matrisen/vektorn Name used to reference this variable in expressions Namn för att referera till variabeln i uttryck Names Namn Add new name Lägg till nytt namn Apply changes to the selected name Verkställ modifikationer av valt namn Remove the selected name Ta bort valt namn Abbreviation Förkortning Unicode Unicode Plural Pluralform Suffix Suffix Reference Referens Avoid input Undvik input Case sensitive Storlekskänslig Completion only Enbart komplettering Number Bases Talbaser Roman numerals Romerska siffror BIN BIN OCT OKT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Subtrahera Multiply Multiplicera Divide Dela Bitwise AND Bitvist AND Bitwise OR Bitvist OR Bitwise NOT Bitvist NOT Clear Rensa Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ange två värden, av vilka högst en får vara ett procenttal, och de övriga kommer att beräknas åt dig. Percentage Procent Calculate Beräkna Value 1 Värde 1 2 compared to 1 2 jämfört med 1 Change from 1 to 2 Förändring från 1 till 2 Value 2 Värde 2 1 compared to 2 1 jämfört med 2 Change from 2 to 1 Förändring från 2 till 1 Plot Diagram _Save _Spara Save as png, svg, postscript, eps, latex or fig Spara som png, svg, postscript, eps, latex eller fig Vector/matrix Vektor/matris Paired matrix Parvis matris if you want to split matrix in rows instead of columns huruvida du vill dela matriser i rader istället för kolumner X variable X-variabel The variable name used in expression Variabel namn använt i uttryck Style Stil Line Kurva Points Punkter Line with points Kurva med punkter Boxes/bars Boxar/staplar Histogram Histogram Steps Steg Candlesticks Ljusstakar Dots Små punkter Smoothing Utjämning Monotonic Monoton Natural cubic splines Naturliga kubiska splines Bezier Bezier Bezier (monotonic) Bezier (monoton) Y-axis Y-axel Primary Primär Secondary Sekundär _Remove _Ta bort Data Data Minimum x value Lägsta x-värde Maximum x value Högsta x-värde Sampling rate Frekvens Step size Stegstorlek Function Range Funktionsomfång Display grid Visa rutnät Display full border Visa alla kanter Minimum y value Lägsta y-värde Maximum y value Högst y-värde Logarithmic x scale Logaritmisk x-skala Logarithmic y scale Logaritmisk y-skala X-axis label Namn på x-axeln Y-axis label Namn på y-axeln Line width Linjetjocklek Color display Färgvisning Color Färg Monochrome Monokrom Legend placement Textplacering Top-left Uppe till vänster Top-right Uppe till höger Bottom-left Nere till vänster Bottom-right Nere till höger Below Under Outside Utanför Appearance Utseende Precision Precision _Recalculate _Omräkna Recalculate expression Räkna om uttrycket The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Antal signifikanta enheter som skall visas/beräknas (enkel aritmetik beräknas alltid exakt) Preferences Inställningar Save mode on exit Spara programläge vid avslut If the mode of the calculator shall be restored Huruvida kalkylatorns läge skall återskapas Save definitions on exit Spara definitioner vid programavslut If changes to functions, units and variables shall be saved automatically Huruvida modifieringar av funktioner, enheter och variabler skall sparas automatiskt Clear history on exit Töm historiken vid programavslut Allow multiple instances Tillåt flera instanser Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Tillåt flera instanser av Qalculate!:s huvudfönster att vara öppna samtidigt. Notera att läge, historik och definitioner enbart sparas för den sist stängda instansen. Notify when a new version is available Meddela när en ny version finns tillgänglig Use keyboard keys for RPN Använd tangentbordet för RPN Use keyboard operator keys for RPN operations (+-*/^). Använd tangenter med matematiska operatorer för RPN-operation (+-*/^) Use caret for bitwise XOR Använd insättningstecken för bitvis XOR Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Infoga XOR (⊻) med ^-tecknet på tangentbordet (annars använd Ctrl+^). Exponentieringstecknet (^) kan alltid infogas med Ctrl+*. Add calculate-as-you-type result to history Lägg till fortgående beräkningar i historiken Delay: Fördröjning: Time limit for plot: Tidsgräns for diagram: Behavior Beteende Enable Unicode symbols Använd Unicodetecken Disable this if you have problems with some fancy characters Avaktivera om du har problem med konstiga tecken Ignore system language (requires restart) Bortse från systemspråket (kräver omstart) Use system tray icon Använd systemfältsikon Hides the application in the system tray when the main window is closed Gömmer programmet i systemfältet när huvudfönstret stängs Hide on startup Göm vid uppstart Remember window position Kom ihåg fönsterposition Keep above other windows Placera över andra fönster Keep the main window above other windows (depending on platform and settings this might not work) Behåll huvudfönstret placerat över andra fönstret (beroende på plattform och inställningar är det möjligt att detta inte fungerar) Application name Programnamn Result Resultat Application name + result Programnamn + resultat Mode Läge Application name + mode Programnamn + läge Window title Fönstertitel Default Förval Light Ljus Dark Mörk High contrast Hög kontrast Dark high contrast Mörk med hög kontrast Theme Tema Button padding Knapputfyllnad / / Number of expression lines Antal rader för uttryck 3 3 Display expression status Visa uttrycksstatus If as-you-type expression status shall be displayed below the expression entry Om uttrycksstatus skall visas under uttrycksfältet medans text skrivs Persistent keypad Beständig knappsats Look & Feel Utseende och känsla Binary two's complement representation Binär tvåkomplementsform If two's complement representation shall be used for negative binary numbers. Om tvåkomplementsform ska användas för negativa binära tal. Hexadecimal two's complement representation Hexadecimal tvåkomplementsform If two's complement representation shall be used for negative hexadecimal numbers. Om tvåkomplementsform ska användas för negativa hexadecimala tal. Use lower case letters in non-decimal numbers Använd små bokstäver i icke-decimala nummer If lower case letters should be used in numbers with non-decimal base Huruvida små bokstäver skall användas i nummer med icke-decimal bas Alternative base prefixes Alternativa basprefix If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Om hexadecimala tal ska visas med "0x0" och binära tal med "0b00" som prefix Spell out logical operators Visa ord för logiska operatorer If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Om logiskt och/eller ska visas som "&&"/"||" eller "och"/"eller" If "e" shall be used instead of "E" in numbers Om "e" skall användas istället för "E" i nummer Use E-notation instead of 10<sup><i>n</i></sup> Använd E istället för 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Använd litet "e" (som i 1e10) Use 'j' as imaginary unit Använd 'j' som imaginär enhet Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Använd 'j' (istället för 'i') som förvald symbol för den imaginära enheten och placera den framför den imaginära delen av komplexa tal. Use comma as decimal separator Använd komma som decimaltecken Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Tillåt att punkter, '.', används som tusentalsavgränsare istället för som ett alternativt decimaltecken Ignore comma in numbers Bortse från komma i nummer Allow commas, ',', to be used as thousands separator instead of as an function argument separator Tillåt att kommatecken, ',', används som tusentalsavgränsare istället för som avskiljare för funktionsargument Ignore dots in numbers Bortse från punkter i nummer Digit grouping Siffergruppering off av standard standard local lokal Multiplication sign Multiplikationstecken Division sign Divisionstecken Copy digit separator Kopiera tusentalsavgränsare Deactivate to remove digit separator when copying result Avaktivera för att avlägsna tusentalsavgränsare vid kopiering av resultat Numbers & Operators Nummer och operatorer Use binary prefixes for information units Använd binära prefix för informationsenheter Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Använd binära, istället för decimala, prefix som förval för informationsenheter (t.ex. byte). Conversion to local currency Omvandling till lokal valuta Automatically convert to the local currency when optimal unit conversion is activated. Omvandla automatiskt till den lokala valutan när optimal enhetsomvandling är aktiverad. Update exchange rates on start Uppdatera växelkurser vid start If current exchange rates shall be downloaded from the internet at program start Huruvida uppdaterade växelkurser skall hämtas från internet vid programstart Exchange rates updates Växelkursuppdatering Temperature calculation mode: Läge för temperaturberäkningar: Absolute Absolut Relative Relativ Hybrid Hybrid Units & Currencies Enheter och valutor Show expression completion suggestions Visa uttryckskompletteringsförslag Search titles and countries Sök i titlar och länder Minimum characters Lägsta antal tecken Popup delay (ms) Popupfördröjning (ms) Completion Komplettering Status warning color Färg för statusvarning Status error color Färg för statusfel Custom status font Anpassat teckensnitt för status If you want to use a font other than the default in the status display below the expression entry Huruvida du vill använda ett annat teckensnitt än det som är standard i statusvisningen under uttrycksfältet Custom expression font Anpassat teckensnitt för uttryck If you want to use a font other than the default in the expression entry Huruvida du vill använda ett annat teckensnitt än det som är standard vid skrivning av uttryck Custom result font Anpassat teckensnitt för resultat If you want to use a font other than the default in the result display Huruvida du vill använda ett annat teckensnitt än det som är standard vid visning av resultat Custom keypad font Anpassat teckensnitt för knappsats If you want to use a font other than the default in the keypad Huruvida du vill använda ett annat teckensnitt än det som är standard på knappsatsen Custom application font Anpassat programteckensnitt If you want to use a font other than the default for the whole application Huruvida du vill använda ett annat teckensnitt än det som är standard på för hela programmet Text color Textfärg Fonts & Colors Teckensnitt och färger Other: Annan: Bijective base-26 Bijektiv talbas 26 <b>Result Base</b> <b>Resultatbas</b> <b>Expression Base</b> <b>Uttrycksbas</b> New Keyboard Shortcut Nytt kortkommando Edit Variable Redigera variabel Advanced Avancerad Accept the creation/modification of this variable Godkänn skapande/modifiering av variabeln x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Använd x, y och z för den 1:a, 2:a, respektive 3:e funktionsparametern. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Använd x, y och z för 1:a, 2:a, respektive 3:e funktionsparametern.Detta undviker potentiella konflikter med variabler, funktioner och enheter. Edit Unit Redigera enhet Do not create/modify this unit Avbryt skapande/modifiering av enheten Accept the creation/modification of this unit Godta skapande/modifiering av enheten Singular form of this unit's name Singularis av enhetens namn Title displayed in menus and in unit manager Rubrik som skall visas i menyer och enhetshanteraren System System Imperial Imperial US Survey US Survey Hide unit Dölj enheten If this unit shall be hidden in menus Huruvida enheten skall döljas i menyer Class Klass The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Klassificering av enheten. Namngivna härledda enheter är definierade i relation till en annan enhet, med en valfri exponent, medan (icke namngivna) härledda enheter definieras av ett enhetsuttryck med en eller flera enheter. Base unit Grundenhet Named derived unit Namngiven härledd enhet Derived unit Härledd enhet Base unit(s) Grundenhet(er) Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to Enhet (för alias-enheter) eller enheter (för sammansatta enheter) som enheten är definierad i förhållande till Exponent Exponent Exponent of the base unit Exponent för grundenhet Relation Relation Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Förhållande till baseenheten. Utgör för linjära förhållanden enbart ett nummer. För icke-linjära förhållanden, används \x för faktorn och \y för exponenten (t.ex. "\x + 273,15" för relationen mellan grader Celsius och Kelvin) Relation is exact Förhållandet är exakt If the relation is precise Huruvida relationen är exakt Inverse relation Omvänd relation Specify for non-linear relation, for conversion back to the base unit. Anges för icke-linjära förhållanden, för omvandling tillbaka till basenheten. Mix with base unit Blanda med basenhet - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Avgör vilka enheten en basenhet blandas med om flera alternativ finns. - Den ursprungliga enheten blandas inte med enheter med lägre prioritet. - Ett lägre värde innebär högre prioritet. Priority Prioritet Minimum base unit number Minsta antal av basenhet Use with prefixes by default Använd med prefix som förval Create a new unit Skapa en ny enhet Edit the selected unit Redigera vald enhet Insert the selected unit into the expression entry Sätt in vald enhet i uttrycket C_onvert _Omvandla... Convert the result to the selected unit Omvandla resultatet till vald enhet Delete the selected unit Ta bort vald enhet (De)activate the selected unit (Av)aktivera vald enhet _Unit _Enhet Convert between units Omvandla mellan enheter = = Conver_sion Omvan_dling Converted value Omvandla Value to convert from Värde att omvandla från Type anywhere Skriv varsomhelst Edit Unknown Variable Modifiera okänd variabel Do not create/modify this unknown variable Avbryt skapande/modifiering av den okända variabeln Accept the creation/modification of this unknown variable Godkänn skapande/modifiering av den okända variabeln Name used to reference this unknown variable in expressions Namn för att referera till den okända variabeln i uttryck Use custom assumptions Använd anpassade antaganden Type Typ Real Number Reellt tal Rational Number Rationellt tal Sign Tecken The category this unknown variable belongs to Kategorin som den okända variabeln tillhör Value of this variable (expression) Variabelns värde (uttryck) value is exact värdet är exakt If the value is precise Huruvida värdet är exakt The category this variable belongs to Kategorin som variabeln tillhör Create a new variable Skapa en ny variabel Edit the selected variable Redigera vald variabel Insert the selected variable into the expression entry Sätt in vald variabel i uttrycket Delete the selected variable Ta bort vald variabel (De)activate the selected variable (Av)aktivera vald variabel E_xport E_xportera _Variable _Variabel Execute expressions and commands from a file Beräkna uttryck och utför kommandon från en fil Start a new instance of the application Starta en ny instans av programmet Display the application version Visa programversion Specify the window title Ange fönstertitel TITLE TITEL Expression to calculate Uttryck att beräkna [EXPRESSION] [UTTRYCK] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Skriv in ett matematiskt uttryck ovan, t.ex. "5 + 2 / 3", och tryck på entertangenten. ans ans Last Answer Senaste svaret answer svar Answer 2 Svar 2 Answer 3 Svar 3 Answer 4 Svar 4 Answer 5 Svar 5 Memory Minne Failed to load global definitions! Fel vid inhämtande av systemvida definitioner! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Alla By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Enligt förinställningar tillåts enbart en instans av %s. Om flera instanser är öppna samtidigt, kommer enbart definitioner (variabler, funktioner, etc.) , läge, inställningar och historik för det sist stängda fönstret att sparas. Vill du trots det ändra förinställt beteende och tillåta flera samtidiga instanser? c-format Right-click/long press: %s Högerklick/långtryck: %s c-format Right-click: %s Högerklick: %s c-format Middle-click: %s Mittenklick: %s c-format Cycle through previous expression Bläddra genom tidigare uttryck Move cursor left or right Flytta markören åt vänster eller höger Move cursor to beginning or end Flytta markören till början eller slutet Uncertainty/interval Osäkerhet/intervall Relative error Relativt fel Argument separator Parameteravgränsare Blank space Blanksteg New line Ny rad Smart parentheses Smarta parenteser Vector brackets Hakparenteser för vektorer Left parenthesis Vänsterparentes Left vector bracket Vänster hakparentes för vektorer Right parenthesis Högerparentes Right vector bracket Höger hakparentes för vektorer Decimal point Decimalkomma Raise (Ctrl+*) Upphöj (Ctrl+*) Add Addera M+ (memory plus) M+ (minnesoperation) MC (memory clear) MC (töm minne) Backspace Backsteg M− (memory minus) M− (minnesoperation) Previous result (static) Föregående resultat (statiskt) Calculate expression Beräkna uttrycket MR (memory recall) MR (återkalla minne) MS (memory store) MS (spara i minne) Set unknowns Ange okända värden more Show further items in a submenu fler Logical AND Logiskt AND Logical OR Logiskt OR Logical NOT Logiskt NOT Toggle Result Base Växla resultatbas Open menu with stored variables Öppna meny med lagrade variabler Index Index ENTER RPN Enter (calculate and add to stack) ENTER Calculate expression and add to stack Beräkna uttrycket och lägg till i stacken Flag Flagga Matrices Matriser Gregorian Gregoriansk Revised Julian (Milanković) Reviderad juliansk Julian Juliansk Islamic (Hijri) Muslimsk Hebrew Hebreisk Chinese Kinesisk Persian (Solar Hijri) Persisk Coptic Koptisk Ethiopian Etiopisk Indian (National) Indisk (nationell) Action Åtgärd Key combination Tangentkombination Raise Upphöj History Answer Value Svarsvärde från historiken History Index(es) Index i historiken History index %s does not exist. Index %s finns inte i historiken. c-format expression uttryck History Parsed Expression Tolkat uttryck från historiken Set Window Title Angle fönstertitel Failed to open %s. %s Misslyckades med att öppna %s. %s c-format Could not display help for Qalculate!. Kunde inte visa hjälp för Qalculate!. Could not display help for Qalculate!. %s Kunde inte visa hjälp för Qalculate!. %s c-format approx. ca Stop process Stoppa förloppet Clear expression Töm uttrycket EXACT EXAKT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNK UNIT ENHET VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Vill du uppdatera växelkurserna nu? It has been %s day since the exchange rates last were updated. Det var %s dag sedan växelkurserna senast uppdaterades. Det var %s dagar sedan växelkurserna senast uppdaterades. c-format It has been %s days since the exchange rates last were updated. Do not ask again Fråga inte igen It took too long to generate the plot data. Det tog för lång tid att generera data till diagrammet. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Det tog för lång tid att generera data till diagrammet. Vänligen minska frekvensen eller höj tidsgränsen i inställningar. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. När fel, varningar eller annan information skapas under beräkningen ändras ikonen i övre högra hörnet i uttrycksfältet för att reflektera detta. Om du håller pekaren över eller klickar på ikonen, så kommer meddelandet att visas. Path of executable not found. Sökvägen till programmet hittades ej. curl not found. curl hittades ej. Failed to run update script. %s Misslyckades med att köra sriptet. %s c-format Failed to check for updates. Misslyckades med att söka efter uppdateringar. No updates found. Inga uppdatering hittades. A new version of %s is available at %s. Do you wish to update to version %s. En ny version av %s finns tillgänglig på %s. Vill du uppdatera till version %s. c-format A new version of %s is available. You can get version %s at %s. En ny version av %s finns tillgänglig. Du kan hämta version %s på %s. c-format Too many arguments for %s(). För många parametrar för %s(). c-format argument parameter Temperature Calculation Mode Läge för temperaturberäkningar The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Uttrycket är tvetydigt. Vänligen välj ett läge för temperaturberäkningar (läget kan senare ändras i inställningarna). Interpretation of dots Tolkning av punkter Please select interpretation of dots (".") (this can later be changed in preferences). Vänligen välj hur punkter ska tolkas (detta kan senare ändras i inställningarna). Both dot and comma as decimal separators Använd både punkt komma som decimaltecken Dot as thousands separator Punkt som tusentalsavgränsare Only dot as decimal separator Enbart punkt som decimaltecken Uncategorized Okategoriserad hexadecimal hexadecimal octal oktal decimal decimal duodecimal duodecimal binary binär roman romersk bijective bijektiv sexagesimal sexagesimal latitude latitud longitude longitud time tid bases baser calendars kalendrar rectangular rektangulär cartesian kartesisk exponential exponentiell polar polär angle vinkel phasor fasvektor optimal optimal base bas mixed blandade fraction bråktal factors faktorer partial fraction partialbråk factorize faktorisera expand expandera hexadecimal number hexadecimalt tal octal number oktalt tal decimal number decimalt tal duodecimal number duodecimalt tal binary number binärt tal roman numerals romerska siffror bijective base-26 bijektiv talbas 26 sexagesimal number sexagesimalt tal 32-bit floating point 32-bit flyttal 64-bit floating point 64-bit flyttal 16-bit floating point 16-bit flyttal 80-bit (x86) floating point 80-bit (x86) flyttal 128-bit floating point 128-bit flyttal time format tidsformat number bases talbaser optimal unit optimal enhet base units basenheter mixed units blandade enheter expanded partial fractions expanderade partialbråk complex rectangular form komplex rektangulär form complex exponential form komplex exponentiell form complex polar form komplex polär form complex cis form komplex cis-form complex angle notation komplex vinkelnotation complex phasor notation komplex fasvektornotation UTC time zone UTC-tidszon number base %s talbas %s c-format Inactive Inaktiva Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Hämtar data från dataset %s för ett givet objekt och egenskap. Om "info" är angivet som egenskap, ett dialogfönster öppnas med alla objektets egenskaper. c-format Example: Exempel: Arguments Parametrar optional optional argument frivillig default: argument default, in description förval: Requirement Krav key indicating that the property is a data set key nyckel Acti_vate Akti_vera a previous result ett föregående resultat matrix matris vector vektor positive positiv non-positive ej positiv negative negativ non-negative ej negativ non-zero ej noll boolean boolesk integer heltal rational rationell real reell complex komplex number nummer (not matrix) (inte matris) unknown okänd default assumptions förvalda antaganden Variable does not exist anymore. Variabel existerar inte längre. Data Retrieval Function Dataåtkomstfunktion Insert function Infoga funktion Insert function (dialog) Infoga funktion (dialog) Insert variable Infoga variabel Insert unit Infoga enhet Insert text Infoga text Insert date Infoga datum Insert vector Infoga vektor Insert matrix Infoga matris Insert smart parentheses Infoga smarta parenteser Convert to unit Omvandla till enhet Convert to unit (entry) Omvandla till enhet (inmatning) Convert to optimal unit Omvandla till optimal enhet Convert to base units Omvandla till basenheter Convert to optimal prefix Omvandla till optimalt prefix Convert to number base Omvandla till talbas Factorize result Faktorisera resultatet Expand result Expandera resultatet Expand partial fractions Expandera partialbråk RPN: down RPN: ner RPN: up RPN: upp RPN: swap RPN: byt plats RPN: copy RPN: kopiera RPN: lastx RPN: lastx RPN: delete register RPN: ta bort register RPN: clear stack RPN: töm stacken Load meta mode Aktivera metaläge Set expression base Ange talbas i uttryck Set result base Ange talbas i resultat Toggle exact mode (Av)aktivera exakt läge Set angle unit to degrees Ange vinkelenhet till grader Set angle unit to radians Ange vinkelenhet till radianer Set angle unit to gradians Ange vinkelenhet till gradienter Toggle simple fractions (Av)aktivera bråkform Toggle mixed fractions (Av)aktivera blandad form Toggle scientific notation (Av)aktivera vetenskaplig form Toggle simple notation (Av)aktivera enkel form Toggle RPN mode (Av)aktivera RPN-läge Toggle calculate as you type (Av)aktivera fortgående beräkningar Toggle programming keypad Visa/dölj programmeringsknappsatsen Show keypad Visa knappsatsen Show history Visa historik Search history Sök i historiken Show conversion Visa omvandling Show RPN stack Visa RPN-stack Manage variables Hantera variabler Manage functions Hantera funktioner Manage data sets Hantera dataset New variable Ny variabel New function Ny funktion Open plot functions/data Öppna rita funktions-/datadiagram Open convert number bases Öppna omvandla mellan talbaser Open floating point conversion Öppna flyttalsomvandling Open calender conversion Öppna kalenderomvandling Open percentage calculation tool Öppna procentberäkningsverktyg Open periodic table Öppna periodiska systemet Update exchange rates Uppdatera växelkurser Copy result Kopiera resultatet Insert result Infoga resultat Save result image Spara resulatbild Help Hjälp Quit Avsluta Toggle chain mode (Av)aktivera kedjeläge Toggle keep above (Av)aktivera placera överst Show/hide completion Visa/dölj komplettering Perform completion (activate first item) Utför komplettering (aktivera första posten) Prefixes Prefix No Prefix Inget prefix Optimal Prefix Optimalt prefix Prefix Prefix Complex angle/phasor notation Komplex vinkelnotation Number bases Talbaser Base units Grundenheter Binary number Binärt tal Calendars Kalendrar Complex cis form Komplex cis-form Decimal number Decimalt tal Duodecimal number Duodecimalt tal Complex exponential form Komplex exponentiell form Factors Faktorer 16-bit floating point binary format 16-bit binärt flyttal 32-bit floating point binary format 32-bit binärt flyttal 64-bit floating point binary format 64-bit binärt flyttal 80-bit (x86) floating point binary format 80-bit (x86) binärt flyttal 128-bit floating point binary format 128-bit binärt flyttal Hexadecimal number Hexadecimalt tal Latitude Latitud Longitude Longitud Mixed units Blandade enheter Octal number Oktalt tal Optimal units Optimala enheter Expanded partial fractions Expanderade partialbråk Complex polar form Komplex polär form Complex rectangular form Komplex rektangulär form Sexagesimal number Sexagesimalt tal and och or eller undefined odefinierad result is too long see history resultet är för långt se historiken calculation was aborted beräkningarna avbröts RPN Register Moved RPN-register flyttades RPN Operation RPN operation Processing… Behandlar… result processing was aborted resultatbehandlingen avbröts Factorizing… Faktoriserar… Expanding partial fractions… Expanderar partialbråk… Expanding… Expanderar… Calculating… Beräknar… Converting… Omvandlar… Fetching exchange rates. Hämtar växelkurser. Time zone parsing failed. Läsning av tidszon misslyckades. Keep open Håll öppen Enter RPN Enter (calculate and add to stack) Enter C_alculate _Beräkna Apply to Stack Applicera på stacken Argument Parameter True Sant False Falskt Info Info Edit Unit (global) Redigera enhet (systemvid) New Unit Ny enhet Empty name field. Tomt namnfält A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again En variabel eller enhet med samma namn finns redan. Vill du ersätta den? Base unit does not exist. Angiven grundenhet finns inte. Edit Function (global) Redigera funktion (systemvid) New Function Ny funktion Yes Ja No Nej Empty expression field. Tom uttrycksfält. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again En funktion med samma namn finns redan. Vill du ersätta den? Unit does not exist Enheten finns inte Edit Unknown Variable (global) Redigera okänd variabel (systemvid) New Unknown Variable Ny okänd variabel An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Edit Variable (global) Redigera variabel (systemvid) New Variable Ny variabel Empty value field. Tomt värdefält. Edit Vector Redigera vektor Edit Vector (global) Redigera vektor (systemvid) New Vector Ny vektor Edit Matrix (global) Redigera matris (systemvid) New Matrix Ny matris Vector Result Vektorresultat Matrix Result Matrisresultat New Data Object Nytt dataobjekt text text approximate approximerat Edit Data Set (global) Redigera dataset (systemvitt) New Data Set Nytt dataset info info Property Egenskap No file name entered. Filnamn måste anges No delimiter selected. En avgränsare måste anges Could not import from file %s Kunde inte importera fil: %s c-format No variable name entered. Inget variabelnamn angivet. No known variable with entered name found. Fann ingen känd variabel med angivet namn. Could not export to file %s Kunde inte exportera till fil: %s c-format My Variables Mina variabler Couldn't write definitions Kunde inte spara definitioner Preset Förinställt Abort Avbryt Undo Ångra Redo Gör om Completion Mode Kompletteringsläge Limited strict completion Begränsad strikt komplettering Strict completion Strikt komplettering Limited full completion Begränsad fullständig komplettering Full completion Fullständig komplettering No completion Ingen komplettering Delayed completion Fördröjd komplettering Customize completion… Anpassa komplettering… Save Mode Spara läge Preset mode cannot be overwritten. Förinställt läge kan inte skrivas över. Delete Mode Radera läge Couldn't write preferences to %s Kunde inte spara inställningar till %s c-format never aldrig ask fråga %i day %i dag %i dagar c-format %i days Copied Result was copied Kopierat log10 function not found. Kunde inte finna log10 funktionen. Search Sök _Search _Sök Remove Bookmark Ta bort bokmärkde Add Bookmark Lägg till bokmärke A bookmark with the selected name already exists. Do you want to overwrite it? Ett bokmärke med samma namn finns redan. Vill du ersätta den? No items found Inga objekt funna Select date Välj datum Rectangular form Rektangulär form Exponential form Exponentiell form Polar form Polär form Angle/phasor notation Vinkelnotation Optimal unit Optimal enhet Optimal prefix Optimalt prefix All functions Alla funktioner All variables Alla variabler Select definitions file Välj definitionsfil _Import _Importera Could not copy %s to %s. Kunde inte kopiera %s till %s. c-format Could not read %s. Kunde inte läsa %s. c-format Could not copy file to %s. Kunde inte kopiera fil till %s. c-format Unsupported base. Basen stöds ej. The selected Chinese year does not exist. Det valda kinesiska året finns inte. Conversion to Gregorian calendar failed. Omvandling to gregoriansk kalender misslyckades Calendar conversion failed for: %s. Kalenderomvandling misslyckades för: %s. c-format Gnuplot was not found. Gnuplot hittades ej. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) måste installeras separat, och hittas i sökvägen för binärer, för att för att diagram ska kunna visas. c-format Select file to save PNG image to Välj fil att att spara PNG bild till Allowed File Types Tillåtna filtyper All Files Alla filer Cannot delete unit as it is needed by other units. do not delete units that are used by other units Kan inte ta bort enheten eftersom den används av andra enheter. none ingen result is too long resultet är för långt translator-credits Hanna Knutsson <hanna.knutsson@protonmail.com> Mode not found. Läge hittades ej. Elements (in horizontal order) Element (radvis) Select file to import Välj fil att importera _Open _Öppna Select file to export to Välj fil att exportera till A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Ett konflikterande objekt med samma namn existerar. Om du fortsätter och sparar ändringar, kommer det konflikterande objektet att skrivas över eller deaktiveras. Vill du fortsätta? Set key combination Ange tangentkombination Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Tryck tangentkombinationen som du önskar använda för åtgärden (tryck Escape för att avbryta). No keys Inga tangenter Empty value. Tomt värde. Function not found. Funktionen hittades ej. Variable not found. Variabeln hittades ej. Unit not found. Enheten hittades ej. The key combination is already in use. Do you wish to replace the current action? Tangentkombinationen används redan. Vill du ersätta den nuvarande åtgärden? Select file to export Välj fil att exportera till Empty expression. Tomt uttryck. Empty x variable. Tom x-variabel Element Data Grundämnesdata Classification Klassificering Alkali Metal Alkalimetall Alkaline-Earth Metal Alkalisk jordartsmetall Lanthanide Lantanid Actinide Aktinid Transition Metal Övergångsmetall Metal Metall Metalloid Halvmetall Polyatomic Non-Metal Polyatomisk icke-metall Diatomic Non-Metal Diatomisk icke-metall Noble Gas Ädelgas Unknown chemical properties Okända kemiska egenskaper No unknowns in result. Inga okända värden i resultatet. Set Unknowns Ange okända värden Copy result to clipboard Kopiera resultat till urklipp x x If a matrix or vectors shall be generated from the contents of the file Huruvida en matris eller vektor skall genereras från filinnehållet Use dark theme Använd mörkt tema Add the two top values Keypad Addera de två översta värdena u Manage units button u to Button for convert to operator till Add Keypad Addera 1 1 Base Unit Grundenhet Alias Alias Composite Unit Sammansatt enhet Fonts Teckensnitt <b>Name</b> <b>Namn</b> <b>Type</b> <b>Typ</b> <b>Relation</b> <b>Relation</b> Chain Calculation Sekventiell beräkning to till Adaptive parsing Adaptiv tolkning 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i sekunder c-format Ent Ent Defaults Förval Customize Buttons Anpassat teckensnitt för status Names details Namnegenskaper Rational number form Form för rationella tal Decimal fractions Decimalform Exact decimal fractions Exakt decimalform Simple fractions Bråkform Mixed fractions Blandad form 0 0 10 10 7 7 General Keypad Allmän knappsats Programming Keypad Programmeringsknappsats 2 2 Floating point error Flyttalsfel float16 binary number float16 binärt tal float32 binary number float32 binärt tal float64 binary number float64 binärt tal float128 binary number float128 binärt tal Clear the RPN stack (Ctrl+Shift+Delete) Töm RPN-stacken (Ctrl+Shift+Delete) set shortcut ange genväg set key combination Ange tangentkombination Press shortcut keys Tryck på tangenter för kortkommando Keyboard shortcut Kortkommando Shortcut Tangenter ∠ (angle) ∠ (vinkel) complex angle form komplex vinkelnotation Copy Value Text Kopiera värdetext CUSTOM ANPASSAD number base %li talbas %li Base Units Grundenheter Show Programming Keypad Visa programmeringsknappsats Are you sure you want to delete the bookmark? Är du säker på att du vill ta bort bokmärket? Are you sure you want to delete the function? Är du säker på att du vill ta bort funktionen? Are you sure you want to delete the variable? Är du säker på att du vill ta bort variabeln? 10^x (Ctrl+Shift+E) 10^x (Ctrl+Shift+E) pi pi <i>e</i> <i>f(x)</i> x<sup>2</sup> x<sup>2</sup> 1/2 2 x<sup>3</sup> x<sup>2</sup> 1/3 1 x<sup>4</sup> x<sup>2</sup> 1/4 1 x<sup>5</sup> x<sup>2</sup> 1/5 1 x<sup>6</sup> x<sup>2</sup> 1/6 1 x<sup>7</sup> x<sup>2</sup> 1/7 1 x<sup>8</sup> x<sup>2</sup> 1/8 1 x<sup>9</sup> x<sup>2</sup> 1/9 1/x Percent Procent ALL ALL Close Programming Keypad Stäng programmeringsknappsatsen Simplify Förenkla _Simplify _Förenkla Simplifying… Förenklar… Sine Sinus Cosine Cosinus Tangent Tangens Natural logarithm Naturlig logaritm Summation function Summafunktion Modulus Modulus Factorial Fakultet Archimedes' constant Archimedes konstant Statistical mean Statistiskt medelvärde 4 4 5 5 6 6 8 8 9 9 11 1 * * ** * Interval Form Intervallvisning Forms of Fractions Visning av bråk Form of Fractions Visning av bråk Fractional Display Bråktalsvisning Decimal (Try Exact) Decimal (försök exakt) Combined Kombinerad Fractional display Bråktalsvisning Exact rationals Exakta rationella tal Fraction D_ecimal Bråkvisning d_ecimaler Fraction Decimal (Try Exact) Bråkvisning d_ecimaler (exakt) Fraction Co_mbined Bråkvisning ko_mbinerad Utilities Verktyg Always exact Alltid exakt Interval arithmetics Intervallaritmetik Try exact Försök exakt INTVL INTVL Relation to the base unit (usually just a number) Relation till grundenheten (vanligtvis enbart ett nummer) You probably do not need to define this Du behöver troligen inte ange detta _Execute _Exekvera Completion Level Kompletteringsnivå Egyptian Egyptisk Unit to convert to Enhet att omvandla till The number of decimals shown will always be limited by the precision and the min decimal setting is therefor only useful for exact numbers. Antalet decimaler som vissa begränsas alltid av precisionen och inställningen för minimalt antal decimaler är därför enbart användbar för exakta nummer. Indicate Infinite Series Indikera oändliga talserier Activate infix notation and disable the RPN stack. Aktiverar infix notation och avaktiverar RPN-stacken. Activate both the RPN stack and RPN syntax. Aktiverar både RPN-stacken och RPN-syntax. RPN Stack Only Enbart RPN-stack Use only keypad keys for RPN operations (+-*/^) and use the rest of the keyboard for expression entry Använd enbart knappsatstangenter för RPN operationer (+-*/^) och använd resten av tangentbordet för att skriva uttryck Complex Number Komplext nummer Errors, warnings and other information generated during the last calculation is shown when holding the pointer over the icon that appears to the right of the expression entry. Felmeddelanden, varningar och annan information från den senaste beräkningen visas när du håller pekaren över eller klickar knappen till höger om uttrycksfältet. + + - - x<sup><small>y</small></sup> x<sup>y</sup> . . % % Old value Gammalt värde Percent change Procent förändring New total percent Ny total procent No default angle unit Ingen förvald vinkelenhet Create new function Skapa en ny funktion <i>x<sup>y</sup></i> x<sup>y</sup> <i>x</i>! <i>f(x)</i> <i>f(x)</i> <i>f(x)</i> <b>=</b> <b>=</b> <b>7</b> <b>Namn</b> <b>8</b> <b>Namn</b> <b>9</b> <b>Namn</b> <b>4</b> <b>4</b> <b>5</b> <b>5</b> <b>6</b> <b>6</b> <b>*</b> <b>*</b> <b>/</b> <b>Namn</b> <b>1</b> <b>Namn</b> <b>2</b> <b>Namn</b> <b>3</b> <b>Namn</b> <b>+</b> <b>Namn</b> <b>-</b> <b>Namn</b> <b>0</b> <b>Namn</b> <b>.</b> <b>Namn</b> <i>x</i> <i>f(x)</i> <i>y</i> <i>f(x)</i> <i>z</i> <i>f(x)</i> Use default assumptions förvalda antaganden Toggle fractional number display (Av)aktivera bråktalsvisning Raise by two Upphöj med två Base-10 logarithm Bas-10-logaritm log log Reciprocal Invertera Toggle hyperbolic functions (Av)aktivera hyperbola funktioner hyp hyp Toggle inverse functions (Av)aktivera inversa funktioner inv inv Deg Deg Rad Rad Gra Gra Wget arguments Wget parameter Arguments (in addition to timeout and output file) passed to wget when fetching exchange rates Parametrar (utöver timeout och output-fil) som används för wget när växelkurser hämtas You need to download exchange rates to be able to convert between different currencies. You can later get current exchange rates by selecting “Update Exchange Rates” under the File menu. Do you want to fetch exchange rates now from the Internet? Du behöver ladda ner växelkurser för att kunna omvandla mellan olika valutor. Du kan senare hämta nuvarande växelkurser genom att välja "Uppdatera växelkurser" under filmenyn. Vill du hämta växelkurser från Internet? Could not display help. %s Kunde inte visa hjälp. %s RPN Register Operation RPN-registeroperation _Clear _Rensa (De)activate use of Reverse Polish Notation syntax in expressions (Av)aktivera RPN-notation i uttryck (De)activate the Reverse Polish Notation mode (Av)aktivera RPN-läget x! x! Edit value of selected register Redigera värdet för valt register Convert to Mixed Units (default units) Omvandla till blandade enheter (förvalda enheter) Convert to Mixed Units (all units) Omvandla till blandade enheter (alla enheter) Keypad Knappsats Enables separate placement of units Aktiverar separat plaering av enheter Ignore Whitespace Ignorera mellanslag No Special Implicit Multiplication Ingen speciell implicit multiplikation xy != x*y xy != x*y (De)activate limits to implicit multiplication (Av)aktivera begränsningar av implicit multiplikation Convert result to entered unit expression Omvandla resultatet till enhetsuttrycket Do the conversion and close this window Utför omvandling och stäng fönstret _Selector _Väljare H_istory H_istorik _RPN Stack _RPN-stack Temporary Temporära SI SI CGS CGS Import CSV File... Importera CSV-fil... Export CSV File... Exportera CSV-fil... Set Unknowns... Ange okända värden... Other... Annan... Save Mode... Spara läge... Delete Mode... Radera läge... C_onvert... _Omvandla... Transactinide Transaktinid <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- a multifuntional calculator</span> <i>http://qalculate.sourceforge.net/</i> <i>License:</i> GNU General Public Licence <i>Author:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- en multifuntionell calculator</span> <i>http://qalculate.sourceforge.net/</i> <i>License:</i> GNU General Public Licence <i>Author:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson About Qalculate! Om Qalculate! Category that the generated variable(s) shall belong to Kategorin som de genererade variablerna skall tillhöra Argument type Parameterklass Modify selected subfunction Modifiera vald subfunktion The category this function belongs to Kategorin som funktionen tillhör a function, unit or variable en funktion, enhet eller variabel Abort operation Avbryt operationen Ans Ans Binary Octal Decimal Hexadecimal Sexagesimal Time format Roman Other... Binä Oktal Decimal Hexadecimal Sexagesimal Tidsformat Romerska Other... Enable Prefixes Använd prefix Enable _Prefixes Använd _prefix Normal Engineering Scientific Pure Simple Normal Teknisk Vetenskaplig Strikt Enkel Progress... Framåtskridande... Category that this variable belongs to Kategorin variabeln tillhör Font Teckensnitt Select custom font Välj ett teckensnitt The category this unit belongs to Kategorin som enheten tillhör C_onvert Result _Omvandla resultat Select result font Välj teckensnitt Select status font Välj teckensnitt 10^x 10^x ArgumentEditDialog Name: Namn: Type: Typ: Free Valfri Number Nummer Integer Heltal Symbol Symbol Text Text Date Datum Vector Vektor Matrix Matris Boolean Boolesk Angle Vinkel Object Objekt Function Funktion Unit Enhet Variable Variabel File Fil Enable rules and type test Aktivera villkor- och klass-test Custom condition: Anpassat villkor: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Till exempel om parametern är en matris och måste ha lika antal rader och kolumner: rows(\x) = columns(\x) Allow matrix Tillåt matriser Forbid zero Förbjud noll Handle vector Hantera vektor Calculate function for each separate element in vector. Beräkna funktionen för varje separat element i vektor. Min Min Include equals Inkludera lika med Max Max CSVDialog Import CSV File Importera CSV-fil Export CSV File Exportera CSV-fil Current result Nuvarande resultat Matrix/vector variable: Matris/vektorvariabel: File: Fil: Import as Importera som matrix matris vectors vektorer Name: Namn: First row: Första raden: Includes headings Inkluderar kolumnnamn Delimiter: Avgränsare: Comma Komma Tabulator Tabulator Semicolon Semikolon Space Mellanslag Other Annan Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? An unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Error Fel Could not import from file %1 Kunde inte importera fil: %1 No matrix or vector variable with the entered name was found. Fann ingen matris- eller vektorvariabel med angivet namn. Could not export to file %1 Kunde inte exportera till fil: %1 CalendarConversionDialog Calendar Conversion Kalenderomvandling Gregorian Gregoriansk Hebrew Hebreisk Islamic (Hijri) Muslimsk Persian (Solar Hijri) Persisk Indian (National) Indisk (nationell) Chinese Kinesisk Julian Juliansk Revised Julian (Milanković) Reviderad juliansk Coptic Koptisk Ethiopian Etiopisk Error Fel The selected Chinese year does not exist. Det valda kinesiska året finns inte. Conversion to Gregorian calendar failed. Omvandling to gregoriansk kalender misslyckades. Calendar conversion failed for: %1. Kalenderomvandling misslyckades för: %1. DataObjectEditDialog %1: %1: Default Förval Approximate Approximerad Exact Exakt Edit Data Object Redigera dataobjekt New Data Object Nytt dataobjekt DataPropertyEditDialog Name: Namn: Title: Titel: Descriptive name: Beskrivande namn: Description: Beskrivning: Value type: Värdetyp: Expression Uttryck Number Nummer Text Text Unit expression: Enhetsuttryck: Use as key Använd som nyckel Case sensitive value Storlekskänsligt värde Approximate value Approximerat värde Value uses brackets Värdet använder klammrar Hide Göm Edit Data Property Redigera dataegenskap DataSetEditDialog General Allmänt Properties Egenskaper Function Funktion Title: Titel: Descriptive name: Beskrivande namn: Data file: Datafil: Description: Beskrivning: Copyright: Upphovsrätt: Title Titel Name Namn Type Typ Add Lägg till Edit Redigera Remove Ta bort Name: Namn: Object argument name: Objektargumentets namn: Property argument name: Egenskapsargumentets namn: Default property: Förvald egenskap: text text approximate approximerat number nummer expression uttryck key nyckel Question Fråga A function with the same name already exists. Do you want to overwrite the function? En funktion med samma namn finns redan. Vill du ersätta den? Data Sets Dataset Object Objekt Property Egenskap Edit Data Set Redigera dataset New Data Set Nytt dataset DataSetsDialog Data Sets Dataset Data sets: Dataset: New… Ny… Edit… Redigera… Delete Ta bort Objects: Objekt: Data set description: Beskrivning av dataset: Object attributes: Objektegenskaper: Properties Egenskaper key nyckel Data Retrieval Function Dataåtkomstfunktion argument parameter ExpressionEdit matrix matris vector vektor positive positiv non-positive ej positiv negative negativ non-negative ej negativ non-zero ej noll boolean boolesk integer heltal rational rationell real reell complex komplex number nummer (not matrix) (inte matris) unknown okänd default assumptions förvalda antaganden Prefix Prefix Prefix: Prefix: Complex angle/phasor notation Komplex vinkelnotation Base units Grundenheter Number base Talbas Bijective base-26 Bijektiv talbas 26 Binary number Binärt tal Calendars Kalendrar Complex cis form Komplex cis-form Decimal number Decimalt tal Duodecimal number Duodecimalt tal Complex exponential form Komplex exponentiell form Factors Faktorer 16-bit floating point binary format 16-bit binärt flyttal 32-bit floating point binary format 32-bit binärt flyttal 64-bit floating point binary format 64-bit binärt flyttal 80-bit (x86) floating point binary format 80-bit (x86) binärt flyttal 128-bit floating point binary format 128-bit binärt flyttal Fraction Bråktal Hexadecimal number Hexadecimalt tal Latitude Latitud Longitude Longitud Mixed units Blandade enheter Octal number Oktalt tal Optimal units Optimala enheter Expanded partial fractions Expanderade partialbråk Complex polar form Komplex polär form Complex rectangular form Komplex rektangulär form Roman numerals Romerska siffror Sexagesimal number Sexagesimalt tal Time format Tidsformat Unicode Unicode Expression Status Uttrycksstatus Off Av With delay Med fördröjning Without delay Utan fördröjning Use input method Använd inmatningsmetod UTC time zone UTC-tidszon Undo Ångra Complex Angle/Phasor Notation Komplex vinkelnotation Number Base Talbas Binary-Coded Decimal Binärkodat decimalt tal (BCD) Bijective Base-26 Bijektiv talbas 26 Binary Bumber Binärt tal Complex Cis Form Komplex cis-form Binary Number Binärt tal Complex cis Form Komplex cis-form Decimal Number Decimalt tal Duodecimal Number Duodecimalt tal Complex Exponential Form Komplex exponentiell form 16-bit Floating Point Binary Format 16-bit binärt flyttal 32-bit Floating Point Binary Format 32-bit binärt flyttal 64-bit Floating Point Binary Format 64-bit binärt flyttal 80-bit (x86) Floating Point Binary Format 80-bit (x86) binärt flyttal 128-bit Floating Point Binary Format 128-bit binärt flyttal Hexadecimal Number Hexadecimalt tal Mixed Units Blandade enheter Octal Number Oktalt tal Optimal Units Optimala enheter Optimal Unit Optimal enhet Optimal Prefix Optimalt prefix Expanded Partial Fractions Expanderade partialbråk Complex Polar Form Komplex polär form Complex Rectangular Form Komplex rektangulär form Roman Numerals Romerska siffror Sexagesimal Number Sexagesimalt tal Time Format Tidsformat UTC Time Zone UTC-tidszon Redo Gör om Cut Klipp ut Copy Kopiera Paste Klistra in Delete Ta bort Calculate Selection Beräkna markering Insert Date… Infoga datum… Insert Matrix… Infoga matris… Select All Markera allt Clear Rensa Clear History Töm historiken Completion Komplettering No completion Ingen komplettering Limited strict completion Begränsad strikt komplettering Strict completion Strikt komplettering Limited full completion Begränsad fullständig komplettering Full completion Fullständig komplettering Delayed completion Fördröjd komplettering Enable input method Aktivera inmatningsmetod Matrix Matris Too many arguments for %1(). För många parametrar för %1(). argument parameter %1: %1: comment kommentar MC (memory clear) MC (töm minne) MS (memory store) MS (spara i minne) M+ (memory plus) M+ (minnesoperation) M− (memory minus) M− (minnesoperation) factorize faktorisera expand expandera hexadecimal hexadecimal hexadecimal number hexadecimalt tal octal oktal octal number oktalt tal decimal decimal decimal number decimalt tal duodecimal duodecimal duodecimal number duodecimalt tal binary binär binary number binärt tal roman romersk roman numerals romerska siffror bijective bijektiv bijective base-26 bijektiv talbas 26 binary-coded decimal BCD sexagesimal sexagesimal sexagesimal number sexagesimalt tal latitude latitud longitude longitud 32-bit floating point 32-bit flyttal 64-bit floating point 64-bit flyttal 16-bit floating point 16-bit flyttal 80-bit (x86) floating point 80-bit (x86) flyttal 128-bit floating point 128-bit flyttal time tid time format tidsformat bases baser number bases talbaser calendars kalendrar optimal optimal optimal unit optimal enhet prefix prefix optimal prefix optimalt prefix base bas base units basenheter mixed blandade mixed units blandade enheter decimals decimaler decimal fraction decimalform fraction bråktal factors faktorer Decimal Fraction Decimalform In history list I historiken In expression field I uttrycksfältet Automatically calculate selection Beräkna markering automatiskt partial fraction partialbråk expanded partial fractions expanderade partialbråk rectangular rektangulär cartesian kartesisk complex rectangular form komplex rektangulär form exponential exponentiell complex exponential form komplex exponentiell form polar polär complex polar form komplex polär form complex cis form komplex cis-form angle vinkel complex angle notation komplex vinkelnotation phasor fasvektor complex phasor notation komplex fasvektornotation number base %1 talbas %1 Data object Dataobjekt FPConversionDialog Floating Point Conversion (IEEE 754) Flyttalsomvandling (IEEE 754) Format Format 16-bit (half precision) 32-bit (single precision) 64-bit (double precision) 80-bit (x86 extended format) 128-bit (quadruple precision) Microchip 24-bit Microchip 32-bit Value Värde Decimal value Decimalt värde Binary representation Binär representation Hexadecimal representation Hexadecimal representation Floating point value Flyttalsvärde Conversion error Förlorad precision FunctionEditDialog Name: Namn: Expression: Uttryck: Parameter references: Parameterreferenser: Required Nödvändigt Details Detaljer Description Beskrivning Argument references: Parameterreferenser: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y och z (t.ex. "(x+y)/2"), eller \x, \y, \z, \a, \b, … (t.ex. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Använd x, y och z (t.ex. "(x+y)/2"), eller \x, \y, \z, \a, \b, … (t.ex. "(\x+\y)/2") Category: Kategori: Descriptive name: Beskrivande namn: Hide function Dölj funktionen Example: Exempel: Description: Beskrivning: Condition: Förutsättning: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Förutsättning som måste infrias för funktionen (t.ex. om den andra parametern måste var större än den första: "\y > \x") Sub-functions: Subfunktioner: Expression Uttryck Precalculate Förberäkna Reference Referens Add Lägg till Edit Redigera Remove Ta bort Arguments: Parametrar: Name Namn Type Typ Question Fråga A function with the same name already exists. Do you want to overwrite the function? En funktion med samma namn finns redan. Vill du ersätta den? Edit Function Redigera funktion New Function Ny funktion FunctionsDialog Functions Funktioner Category Kategori Function Funktion New… Ny… Edit… Redigera… Deactivate Avaktivera Delete Ta bort Calculate… Beräkna… Apply Applicera Insert Infoga Favorite Favorit argument parameter Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Hämtar data från dataset %1 för ett givet objekt och egenskap. Om "info" är angivet som egenskap, ett dialogfönster öppnas med alla objektets egenskaper. Example: Exempel: Arguments Parametrar optional optional argument frivillig default: argument default förval: Requirement: Required condition for function Krav: Favorites Favoriter default: argument default förval: Requirement Krav Properties Egenskaper %1: %1: key indicating that the property is a data set key nyckel Activate Aktivera All All functions Alla Uncategorized Okategoriserade User functions Användarfunktioner Inactive Inaktiva HistoryView Copy Kopiera Copy (formatted) Kopiera med format Insert Value Infoga värde Insert Text Infoga text Copy Formatted Text Kopiera formaterad text Copy unformatted ASCII Kopiera oformaterad ASCII Select All Markera allt Search… Sök… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Skriv in ett matematiskt uttryck ovan, t.ex. "5 + 2 / 3", och tryck på entertangenten. Search by Date… Sök efter datum… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Skriv in ett matematiskt uttryck ovan, t.ex. "5 + 2 / 3", och tryck på entertangenten. Exchange rate source(s): Växelkurskälla: Växelkurskällor: updated %1 uppdaterad %1 uppdaterade %1 Comment Kommentar Protect Skydda Add Comment… Lägg till kommenar… Move to Top Lägg överst Remove Ta bort Clear Rensa Edit Comment… Redigera kommentar… Text: Text: Search Sök KeypadButton <i>Right-click/long press</i>: %1 <i>Högerklick/långtryck</i>: %1 <i>Right-click</i>: %1 <i>Högerklick</i>: %1 <i>Long press</i>: %1 <i>Långtryck</i>: %1 Open menu Öppna menyn <i>Middle-click</i>: %1 <i>Mittenklick</i>: %1 KeypadWidget Memory store Spara i minne Memory clear Töm minne Memory recall Återkalla minne Memory add Addera till minnet Memory subtract Subtrahera från minnet STO Standard calculator button. Do not use more than three characters. STO Store Spara New function Ny funktion sin sin cos cos tan tan Exponentiation Exponentiering Percent or remainder Procent eller rest Uncertainty/interval Osäkerhet/intervall Relative error Relativt fel Interval Intervall Move cursor left Flytta markören åt vänster Move cursor to start Flytta markören till början Move cursor right Flytta markören åt höger Move cursor to end Flytta markören till slutet Logical AND Logiskt AND Logical OR Logiskt OR Bitwise Exclusive OR Bitvist exklusivt OR Logical NOT Logiskt NOT Bitwise Left Shift Bitvist högerskift Bitwise Right Shift Bitvist vänsterskift cmp cmp rot rot a→1 a→1 Expand partial fractions Expandera partialbråk Enable units in physical constants Aktivera enheter i fysiska konstanter All constants Alla konstanter Percentage Calculation Tool Procentberäkningsverktyg more fler All units Alla enheter All variables Alla variabler Action Åtgärd Interval Display Intervallvisning Adaptive Adaptiv Significant digits Signifikanta siffror Plus/minus Plus/minus Relative Relativ Concise Koncis Interval Calculation Intervallberäkning Variance formula Variansformel Interval arithmetic Intervallaritmetik Allow concise uncertainty input Tillåt koncis notation för inmatning av osäkerhet Complex number form Form för komplexa tal Rectangular Rektangulär Exponential Exponentiell Polar Polär Angle/phasor Vinkel Type Assumptions type Typ Sign Assumptions sign Tecken Default assumptions Förvalda antaganden Number Nummer Real Reell Rational Rationell Integer Heltal Boolean Boolesk Unknown Unknown assumptions sign Okänd Non-zero Ej noll Positive Positiv Non-negative Ej negativ Negative Negativ Non-positive Ej positiv Factorize Faktorisera Expand Expandera Add column Lägg till kolumn Add row Lägg till rad Remove column Ta bort kolumn Remove row Ta bort rad Left parenthesis Vänsterparentes Left vector bracket Vänster hakparentes för vektorer Right parenthesis Högerparentes Right vector bracket Höger hakparentes för vektorer Smart parentheses Smarta parenteser Vector brackets Hakparenteser för vektorer Argument separator Parameteravgränsare Blank space Blanksteg New line Ny rad Decimal point Decimalkomma Previous result (static) Föregående resultat (statiskt) Button Action Knappåtgärd Label: Etikett: Action: Åtgärd: None Ingen Value: Värde: Previous answer (static) Föregående resultat (statiskt) Multiplication Multiplikation Bitwise AND Bitvist AND Bitwise Shift Bitvist skift Delete Ta bort Backspace Backsteg Addition Addition Plus Plus Subtraction Subraktion Minus Minus Division Division Bitwise OR Bitvist OR Bitwise NOT Bitvist NOT Clear expression Töm uttrycket Calculate expression Beräkna uttrycket NamesEditDialog Name Namn Abbreviation Förkortning Plural Pluralform Reference Referens Avoid input Undvik input Unicode Unicode Suffix Suffix Case sensitive Storlekskänslig Completion only Enbart komplettering Add Lägg till Edit Redigera Remove Ta bort Warning Varning Illegal name Otillåtet namn A function with the same name already exists. En funktion med samma namn finns redan. A unit or variable with the same name already exists. En enhet eller variabel med samma namn finns redan. PercentageCalculationDialog Percentage Procent Value 1 Värde 1 Value 2 Värde 2 Change from 1 to 2 Förändring från 1 till 2 Change from 2 to 1 Förändring från 2 till 1 2 compared to 1 2 jämfört med 1 1 compared to 2 1 jämfört med 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ange två värden, av vilka högst en får vara ett procenttal, och de övriga kommer att beräknas åt dig. Clear Rensa PeriodicTableDialog Periodic Table Periodiska systemet Element Data Grundämnesdata Alkali Metal Alkalimetall Alkaline-Earth Metal Alkalisk jordartsmetall Lanthanide Lantanid Actinide Aktinid Transition Metal Övergångsmetall Metal Metall Metalloid Halvmetall Polyatomic Non-Metal Polyatomisk icke-metall Diatomic Non-Metal Diatomisk icke-metall Noble Gas Ädelgas Unknown chemical properties Okända kemiska egenskaper Unknown Okänd %1: %1: PlotDialog Plot Diagram Data Data Title: Rubrik: Expression: Uttryck: Function Funktion Vector/matrix Vektor/matris Paired matrix Parvis matris Rows Rader X variable: X-variabel: Style: Stil: Line Kurva Points Punkter Line with points Kurva med punkter Boxes/bars Boxar/staplar Histogram Histogram Steps Steg Candlesticks Ljusstakar Dots Små punkter Polar Polär Smoothing: Utjämning: None Ingen Monotonic Monoton Natural cubic splines Naturliga kubiska splines Bezier Bezier Bezier (monotonic) Bezier (monoton) Y-axis: Y-axel: Primary Primär Secondary Sekundär Add Lägg till Apply Applicera Remove Ta bort Category Kategori Title Rubrik Expression Uttryck Function Range Funktionsomfång Minimum x value: Lägsta x-värde: Maximum x value: Högsta x-värde: Sampling rate: Frekvens: Step size: Stegstorlek: Show real and imaginary parts Visa real- och imaginärdel Appearance Utseende Display grid Visa rutnät Display full border Visa alla kanter Minimum y value: Lägsta y-värde: Maximum y value: Högst y-värde: Logarithmic x scale: Logaritmisk x-skala: Logarithmic y scale: Logaritmisk y-skala: Calculating… Beräknar… Cancel Avbryt Processing… Behandlar… Minimum y value Lägsta y-värde Maximum y value Högst y-värde Logarithmic x scale Logaritmisk x-skala Logarithmic y scale Logaritmisk y-skala X-axis label: Namn på x-axeln: Y-axis label: Namn på y-axeln: Line width: Linjetjocklek: Legend placement: Textplacering: Top-left Uppe till vänster Top-right Uppe till höger Bottom-left Nere till vänster Bottom-right Nere till höger Below Under Outside Utanför Error Fel It took too long to generate the plot data. Det tog för lång tid att generera data till diagrammet. PreferencesDialog Look && Feel Utseende och känsla Numbers && Operators Nummer och operatorer Units && Currencies Enheter och valutor Parsing && Calculation Tolkning och beräkning Ignore system language (requires restart) Bortse från systemspråket (kräver omstart) Language: Språk: Allow multiple instances Tillåt flera instanser Clear history on exit Töm historiken vid programavslut Use caret for bitwise XOR Använd insättningstecken för bitvis XOR Close application with Esc key Stäng programmet med Escape Keep above other windows Placera över andra fönster Preserve history height Bevara höjden på historiken Do not change the height of history list when keypad or number bases are show or hidden. Ändra inte höjden på historiklistan när knappsats eller talbaser visas eller döljs. Window title: Fönstertitel: Application name Programnamn Result Resultat Application name + result Programnamn + resultat Workspace Arbetsyta Application name + workspace Programnamn + arbetsyta Tooltips: Verktygstips: Show all Visa alla Hide in keypad Dölj i knappsats Hide all Dölj alla Style: Stil: Default (requires restart) Default style Förval (kräver omstart) Dark mode Mörkt läge Disable cursor blinking Inaktivera blinkande markör Colorize result Färglägg resultat Expression status: Uttrycksstatus: Off Av In history list I historiken In expression field I uttrycksfältet Status tooltip delay: Fördröjning för statusverktygsstips: Calculate-as-you-type delay: Fördröjning för fortgående beräkningar: Automatically copy result Kopiera resultat automatiskt Allow concise uncertainty input Tillåt koncis notation för inmatning av osäkerhet Interpret unrecognized symbols as variables Tolka okända symboler som variabler Two's complement output: Tvåkomplementsform för utdata: Two's complement input: Tvåkomplementsform för indata: Binary Binär Hexadecimal Hexadecimal Binary bits: Binära bitar: Automatic Automatiskt Automatically group digits in input (experimental) Gruppera siffor automatiskt i indata (experimentellt) Concise Koncis Round halfway numbers to odd Avrunda mittemellan-tal till udda siffra Round halfway numbers toward zero Avrunda mittemellan-mot noll Round halfway numbers to random Avrunda mittemellan-tal slumpmässigt Round halfway numbers up Avrunda mittemellan-tal uppåt Round halfway numbers down Avrunda mittemellan-tal nedåt Round toward zero Avrunda mot noll Round away from zero Avrunda bort från noll Round up Avrunda uppåt Round down Avrunda nedåt Enable units Aktivera enheter Copy unformatted ASCII without units Kopiera oformaterad ASCII utan enheter Restart required Omstart krävs Please restart the program for the language change to take effect. Vängligen starta om programmet för att språkändringen skall ha effekt. Custom result font Anpassat teckensnitt för resultat Custom expression font Anpassat teckensnitt för uttryck Custom keypad font Anpassat teckensnitt för knappsats Custom application font Anpassat programteckensnitt Custom result font: Anpassat teckensnitt för resultat: Custom expression font: Anpassat teckensnitt för uttryck: Custom keypad font: Anpassat teckensnitt för knappsats: Custom application font: Anpassat programteckensnitt: Display expression status Visa uttrycksstatus Delay: Fördröjning: Expression after calculation: Uttryck efter beräkning: Keep expression Behåll uttrycket Clear expression Töm uttrycket Replace with result Ersätt med resultatet Replace with result if shorter Ersätt med resultatet om kortare Use keyboard keys for RPN Använd tangentbordet för RPN Parsing mode: Tolkningsläge: Adaptive Adaptiv Conventional Konventionell Implicit multiplication first Implicit multiplikation först Chain Kedjeläge RPN RPN Simplified percentage Förenklad procentberäkning Read precision Läs precision Limit implicit multiplication Begränsa implicit multiplikation Interval calculation: Intervallberäkning: Variance formula Variansformel Interval arithmetic Intervallaritmetik Factorize result Faktorisera resultatet Binary two's complement representation Binär tvåkomplementsform Hexadecimal two's complement representation Hexadecimal tvåkomplementsform Use lower case letters in non-decimal numbers Använd små bokstäver i icke-decimala nummer Use special duodecimal symbols Använd särskilda duodecimala symboler Spell out logical operators Visa ord för logiska operatorer Use E-notation instead of 10^x Använd E istället för 10^x Preferences Inställningar Format result Formattera resultat ms milliseconds ms Use special symbols in duodecimal numbers Använd särkilda symboler i duodecimala tal Use dot as multiplication sign Använd punkt som multiplikationstecken Use Unicode division slash in output Använd Unicode-snedstreck som divisionstecken Use E-notation instead of 10^n Använd E istället för 10^n Use 'j' as imaginary unit Använd 'j' som imaginär enhet Use comma as decimal separator Använd komma som decimaltecken Ignore comma in numbers Bortse från komma i nummer Ignore dots in numbers Bortse från punkter i nummer Copy unformatted ASCII by default Kopiera oformaterad ASCII som förval Round halfway numbers away from zero Avrunda mittemellan-tal bort från noll Round halfway numbers to even Avrunda mittemellan-tal till jämn siffra Indicate repeating decimals Indikera upprepande decimaler Expression in history: Uttryck i historiken: Parsed Tolkat uttryck Entered Inknappat uttryck Entered + parsed Inknappat + tolkat uttryck Simplified percentage calculation Förenklad procentberäkning Copy result as unformatted ASCII by default Kopiera resultat som oformatterad ASCII som förval Digit grouping: Siffergruppering: None Ingen Standard Standard Local Lokal Interval display: Intervallvisning: Significant digits Signifikanta siffror Interval Intervall Plus/minus Plus/minus Midpoint Medelpunkt Lower Undre Upper Övre Rounding: Avrundning: Round halfway upwards Avrunda mittemellan-uppåt Round halfway away from zero Avrunda mittemellan bort från noll Round halfway to even Avrunda mittemellan till jämn Truncate Trunkera Truncate all numbers Avrunda all tal mot noll Complex number form: Form för komplexa tal: Rectangular Rektangulär Exponential Exponentiell Polar Polär Angle/phasor Vinkel Abbreviate names Förkorta namn Use binary prefixes for information units Använd binära prefix för informationsenheter Automatic unit conversion: Automatisk enhetsomvandling: No conversion Ingen omvandling Base units Grundenheter Optimal units Optimala enheter Optimal SI units Optimala SI-enheter Convert to mixed units Omvandla till blandade enheter Automatic unit prefixes: Automatiska enhetsprefix: Default Förval Max history lines saved: Högst antal historikrader sparade: Close application with Escape key Stäng programmet med Escape Calculate as you type delay: Fördröjning för fortgående beräkningar: Automatically calculate selection Beräkna markering automatiskt No prefixes Inga prefix Prefixes for some units Prefix för vissa enheter Prefixes also for currencies Prefix även för valutor Prefixes for all units Prefix för alla enheter Enable all SI-prefixes Använd alla SI-prefix Enable denominator prefixes Aktivera prefix i nämnaren Enable units in physical constants Aktivera enheter i fysiska konstanter Temperature calculation: Temperaturberäkning: Absolute Absolut Relative Relativ Hybrid Hybrid Exchange rates updates: Växelkursuppdateringer: %n day(s) %n dag %n dagar days dag dagar QApplication Execute expressions and commands from a file Beräkna uttryck och utför kommandon från en fil FILE FIL Start a new instance of the application Starta en ny instans av programmet Specify the window title Ange fönstertitel TITLE TITEL Display the application version Visa programversion Open workspace Öppna arbetsyta Expression to calculate Uttryck att beräkna [EXPRESSION] [UTTRYCK] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Enligt förinställningar tillåts enbart en instans av %1. Om flera instanser är öppna samtidigt, kommer enbart definitioner (variabler, funktioner, etc.) , läge, inställningar och historik för det sist stängda fönstret att sparas. Vill du trots det ändra förinställt beteende och tillåta flera samtidiga instanser? Allow multiple instances? Tillåt flera instanser? %1 is already running. %1 körs redan. Failed to load global definitions! Fel vid inhämtande av systemvida definitioner! answer svar History Answer Value Svarsvärde från historiken History Index(es) Index i historiken History index %s does not exist. Index %s finns inte i historiken. Last Answer Senaste svaret Answer 2 Svar 2 Answer 3 Svar 3 Answer 4 Svar 4 Answer 5 Svar 5 Memory Minne Error Fel Couldn't write preferences to %1 Kunde inte spara inställningar till %1 Function not found. Funktionen hittades ej. Variable not found. Variabeln hittades ej. Unit not found. Enheten hittades ej. Unsupported base. Basen stöds ej. Unsupported value. Värdet stöds ej. QalculateQtSettings Update exchange rates? Uppdatera växelkurser? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Det var %n dag sedan växelkurserna senast uppdaterades. Vill du uppdatera växelkurserna nu? Det var %n dagar sedan växelkurserna senast uppdaterades. Vill du uppdatera växelkurserna nu? Fetching exchange rates. Hämtar växelkurser. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). msgstr "" Håller värdet av den senaste beräkningen. Multipla resultat av en ekvation representeras av en vektor. För åtkomst till separata lösningar använd ans(n) (t.ex. ans(1) för den först lösningen). Fetching exchange rates… Hämtar växelkurser… Error Fel Warning Varning Information Information Path of executable not found. Sökvägen till programmet hittades ej. curl not found. curl hittades ej. Failed to run update script. %1 Misslyckades med att köra sriptet. %1 Download Ladda ner %1: %2 %1: %2 Insert function Infoga funktion Insert function (dialog) Infoga funktion (dialog) Insert variable Infoga variabel Approximate result Approximera resultat Negate Negera Invert Invertera Insert unit Infoga enhet Insert text Infoga text Insert operator Infoga operator Insert date Infoga datum Insert matrix Infoga matris Insert smart parentheses Infoga smarta parenteser Convert to unit Omvandla till enhet Convert Omvandla Convert to optimal unit Omvandla till optimal enhet Convert to base units Omvandla till basenheter Convert to optimal prefix Omvandla till optimalt prefix Convert to number base Omvandla till talbas Factorize result Faktorisera resultatet Expand result Expandera resultatet Expand partial fractions Expandera partialbråk RPN: down RPN: ner RPN: up RPN: upp RPN: swap RPN: byt plats RPN: copy RPN: kopiera RPN: lastx RPN: lastx RPN: delete register RPN: ta bort register RPN: clear stack RPN: töm stacken Set expression base Ange talbas i uttryck Set result base Ange talbas i resultat Set angle unit to degrees Ange vinkelenhet till grader Set angle unit to radians Ange vinkelenhet till radianer Set angle unit to gradians Ange vinkelenhet till gradienter Active normal display mode Aktivera normalt visningsläge Activate scientific display mode Aktivera vetenskapligt visningsläge Activate engineering display mode Aktivera tekniskt visningsläge Activate simple display mode Aktivera enkelt visningsläge Toggle precision Växla precision Toggle max decimals (Av)aktivera max decmaler Toggle min decimals (Av)aktivera min decmaler Toggle max/min decimals (Av)aktivera min/max decmaler Toggle RPN mode (Av)aktivera RPN-läge Show general keypad Visa/dölj generell knappsats Toggle programming keypad Visa/dölj programmeringsknappsatsen Toggle algebra keypad Visa/dölj alegbraknappsatsen Toggle custom keypad Visa/dölj anpassad knappsats Show/hide keypad Visa/göm knappsatsen Search history Sök i historiken Clear history Töm historiken Show variables Visa variabler Show functions Visa funktioner Show units Visa enheter Show data sets Visa dataset Store result Spara resultatet MC (memory clear) MC (töm minne) MR (memory recall) MR (återkalla minne) MS (memory store) MS (spara i minne) M+ (memory plus) M+ (minnesoperation) M− (memory minus) M− (minnesoperation) New variable Ny variabel New function Ny funktion Open plot functions/data Öppna rita funktions-/datadiagram Open convert number bases Öppna omvandla mellan talbaser Open floating point conversion Öppna flyttalsomvandling Open calender conversion Öppna kalenderomvandling Open percentage calculation tool Öppna procentberäkningsverktyg Open periodic table Öppna periodiska systemet Update exchange rates Uppdatera växelkurser Copy result Kopiera resultatet Insert result Infoga resultat Open mode menu Öppna lägesmenyn Open menu Öppna menyn Help Hjälp Quit Avsluta Toggle chain mode (Av)aktivera kedjeläge Toggle keep above (Av)aktivera placera överst Show completion (activate first item) Visa komplettering (aktivera första posten) Clear expression Töm uttrycket Delete Ta bort Backspace Backsteg Home Till början End Till slutet Right Höger Left Vänster Up Upp Down Ner Undo Ångra Redo Gör om Calculate expression Beräkna uttrycket Expression history next Nästa uttryck i historiken Expression history previous Föregående uttryck i historiken Open functions menu Öppna functionsmenyn Open units menu Öppna enhetsmenyn Open variables menu Öppna variabelmenyn Toggle fraction format in current result Växla bråktal i nuvarande resultat Default Förval Formatted result Formaterat resultat Unformatted ASCII result Oformaterat ASCII-resultat Unformatted ASCII result without units Oformaterat ASCII-resultat utan enheter Formatted expression Formaterat uttryck Unformatted ASCII expression Oformaterat ASCII-uttryck Formatted expression + result Formaterat uttryck + resultat Unformatted ASCII expression + result Oformaterat ASCII-uttryck + resultat Unformatted ASCII expression + result without units Oformaterat ASCII-uttryck + resultat utan enheter Failed to run update script. %s Misslyckades med att köra sriptet. %s Failed to check for updates. Misslyckades med att söka efter uppdateringar. No updates found. Inga uppdatering hittades. A new version of %1 is available at %2. Do you wish to update to version %3? En ny version av %1 finns tillgänglig på %2. Vill du uppdatera till version %3? A new version of %1 is available. You can get version %3 at %2. En ny version av %1 finns tillgänglig. Du kan hämta version %3 på %2. QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Avbryt Close Only used when Qt translation is missing Stäng &Yes Only used when Qt translation is missing &Ja &No Only used when Qt translation is missing &Nej &Open Only used when Qt translation is missing &Öppna &Save Only used when Qt translation is missing &Spara &Select All Only used when Qt translation is missing &Markera allt Look in: Only used when Qt translation is missing Sök i: File &name: Only used when Qt translation is missing Fil&namn: Files of type: Only used when Qt translation is missing Filer av typen: QalculateWindow Menu Meny New Ny Function… Funktion… Variable/Constant… Variabel/konstant… Unknown Variable… Okänd variabel… Matrix… Matris… Import CSV File… Importera CSV-fil… Export CSV File… Exportera CSV-fil… Variables and Constants List Variabler och konstanter Plot Functions/Data Rita funktions-/datadiagram Floating Point Conversion (IEEE 754) Flyttalsomvandling (IEEE 754) Calendar Conversion Kalenderomvandling Update Exchange Rates Uppdatera växelkurser Normal Mode Normalt läge RPN Mode RPN-läge Chain Mode Kedjeläge Preferences Inställningar Report a Bug Rapportera ett problem Check for Updates Sök efter uppdateringar About %1 Om %1 Quit Avsluta Mode Läge General display mode Generellt visningsläge Normal Normalt Scientific Vetenskapligt Engineering Tekniskt Simple Enkelt Angle unit Vinkelenhet Radians Radianer Degrees Grader Gradians Gradienter Approximation Approximering Automatic Automatic approximation Automatisk Dual Dual approximation Dubbel Exact Exact approximation Exakt Approximate Approximerad Assumptions Antaganden Type Assumptions type Typ Number Nummer Real Reell Rational Rationell Integer Heltal Boolean Boolesk Sign Assumptions sign Tecken Unknown Unknown assumptions sign Okänd Non-zero Ej noll Positive Positiv Non-negative Ej negativ Negative Negativ Non-positive Ej positiv Binary Binär Octal Oktal Decimal Decimal Hexadecimal Hexadecimal Other Annan Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Tidsformat Roman numerals Romerska siffror Unicode Unicode Bijective base-26 Bijektiv talbas 26 Binary-encoded decimal (BCD) Binärkodat decimalt tal (BCD) Custom: Number base Anpassad: Precision: Precision: Min decimals: Min decimaler: Max decimals: Max decimaler: off Max decimals av Convert Omvandla Store Spara Functions Funktioner Menu (%1) Meny (%1) Variables and Constants Variabler och konstanter Units Enheter Help Hjälp Mode (%1) Läge (%1) General Display Mode Generellt visningsläge Angle Unit Vinkelenhet Result Base Talbas i resultat Other: Number base Annan: Expression Base Talbas i uttryck Convert (%1) Omvandla (%1) Store (%1) Spara (%1) Functions (%1) Funktioner (%1) Keypad Knappsats Keypad (%1) Knappsats (%1) Number bases Talbaser Unit… Enhet… Data Sets Dataset Percentage Calculation Tool Procentberäkningsverktyg Periodic Table Periodiska systemet Units (%1) Enheter (%1) Plot Functions/Data (%1) Rita funktions-/datadiagram (%1) Number Bases (%1) Talbaser (%1) Binary: Binär: Octal: Oktal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack RPN-stack Rotate the stack or move the selected register up (%1) Rotera stacken eller flytta markerat register uppåt (%1) Rotate the stack or move the selected register down (%1) Rotera stacken eller flytta markerat register nedåt (%1) Swap the top two values or move the selected value to the top of the stack (%1) Byt plats på de två översta värdena eller flytta markerat värdet till toppen av stacken (%1) Copy the selected or top value to the top of the stack (%1) Kopiera det valda eller det översta värdet till toppen av stacken (%1) Enter the top value from before the last numeric operation (%1) Lägg till det översta värdet från innan den senaste numeriska operationen (%1) Delete the top or selected value (%1) Ta bort det översta eller det markerade värdet (%1) Clear the RPN stack (%1) Töm RPN-stacken (%1) New Function… Ny funktion… Favorites Favoriter Recent Tidigare User functions Användarfunktioner Open dialog Öppna dialogruta Show all functions Visa alla funktioner User units Användarenheter more fler Prefixes Prefix Show all units Visa alla enheter User variables Användarvariabler Show all variables Visa alla variabler Powerful and easy to use calculator Kraftfull och användarvänlig miniräknare License: GNU General Public License version 2 or later Licens: GNU General Public License version 2 eller senare Error Fel Couldn't write definitions Kunde inte spara definitioner hexadecimal hexadecimal octal oktal decimal decimal duodecimal duodecimal binary binär roman romersk bijective bijektiv sexagesimal sexagesimal latitude latitud longitude longitud time tid Time zone parsing failed. Läsning av tidszon misslyckades. bases baser calendars kalendrar rectangular rektangulär cartesian kartesisk exponential exponentiell polar polär phasor fasvektor angle vinkel optimal optimal base bas mixed blandade fraction bråktal factors faktorer Open Settings Folder(s) Öppna inställningsmappen Öppna inställningsmappar Number Pad Numerisk knappsats Always Show Number Pad Visa alltid numerisk knappsats partial fraction partialbråk factorize faktorisera expand expandera Calculating… Beräknar… Cancel Avbryt RPN Operation RPN operation Factorizing… Faktoriserar… Expanding partial fractions… Expanderar partialbråk… Expanding… Expanderar… Converting… Omvandlar… Temperature Calculation Mode Läge för temperaturberäkningar Please select desired variant of the sinc function. Vänligen välj önskad variant av sinc-funktionen. Unnormalized Onormaliserad Normalized Normaliserad Parsing Mode Tolkningsläge The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Uttrycket är tvetydigt. Vänligen välj tolkning av uttryck med implicit multiplikation (detta kan senare ändras i inställningarna). Implicit multiplication first Implicit multiplikation först Conventional Konventionell Adaptive Adaptiv Add Action (%1) Lägg till åtgärd (%1) Edit Keyboard Shortcut Redigera kortkommando New Keyboard Shortcut Nytt kortkommando Action: Åtgärd: Value: Värde: Set key combination Ange tangentkombination Press the key combination you wish to use for the action. Tryck tangentkombinationen som du önskar använda för åtgärden. Reserved key combination Reserverad tangentkombination The key combination is already in use. Do you wish to replace the current action (%1)? Tangentkombinationen används redan. Vill du ersätta den nuvarande åtgärden (%1)? Question Fråga Add… Lägg till… Edit… Redigera… Remove Ta bort Example: Example of function usage Exempel: Failed to open workspace Misslyckades med att öppna arbetsyta Couldn't save workspace Misslyckades med att spara arbetsyta Save file? Spara fil? Do you want to save the current workspace? Vill du spara den öppna arbetsytan? Do not ask again Fråga inte igen %1: %1: optional optional argument frivillig Failed to open %1. %2 Misslyckades med att öppna %1. %2 RPN Register Moved RPN-register flyttades Show toolbar Visa vertkygsfält Workspaces Arbetsytor Open… Öppna… Open default Öppna förvald Save Spara Save As… Spara som… Keyboard Shortcuts Kortkommandon Plot Diagram General Allmän Programming Programmering Algebra Algebra Custom Anpassad None Ingen Hide Number Pad Dölj numerisk knappsats Separate Menu Buttons Separata menyknappar Reset Keypad Position Återställ knappsatsposition Icons only Enbart ikoner Text only Enbart text Text beside icons Text bredvid ikoner Text under icons Text under ikoner Copy Kopiera <i>Right-click/long press</i>: %1 <i>Högerklick/långtryck</i>: %1 Open menu Öppna menyn Number Bases Talbaser Rotate the stack or move the selected register up Rotera stacken eller flytta markerat register uppåt Rotate the stack or move the selected register down Rotera stacken eller flytta markerat register nedåt Swap the top two values or move the selected value to the top of the stack Byt plats på de två översta värdena eller flytta markerat värdet till toppen av stacken Delete the top or selected value Ta bort det översta eller det markerade värdet Enter the top value from before the last numeric operation Lägg till det översta värdet från innan den senaste numeriska operationen Copy the selected or top value to the top of the stack Kopiera det valda eller det översta värdet till toppen av stacken Clear the RPN stack Töm RPN-stacken prefix prefix decimals decimaler Processing… Behandlar… Matrix Matris The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Uttrycket är tvetydigt. Vänligen välj ett läge för temperaturberäkningar (läget kan senare ändras i inställningarna). Absolute Absolut Relative Relativ Hybrid Hybrid Interpretation of dots Tolkning av punkter Please select interpretation of dots (".") (this can later be changed in preferences). Vänligen välj hur punkter ska tolkas (detta kan senare ändras i inställningarna). Both dot and comma as decimal separators Använd både punkt komma som decimaltecken Dot as thousands separator Punkt som tusentalsavgränsare Only dot as decimal separator Enbart punkt som decimaltecken Percentage Interpretation Procenttolkning Please select interpretation of percentage addition Vänligen välj tolkning av procentaddition Add percentage of original value Addera procent av ursprungligt värde Add percentage multiplied by 1/100 Addera procentenheter multiplicerade med 1/100 Action Åtgärd Key combination Tangentkombination Gnuplot was not found Gnuplot hittades ej %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) måste installeras separat, och hittas i sökvägen för binärer, för att för att diagram ska kunna visas. Example: Exempel: Enter RPN Enter Enter Calculate Beräkna Insert Infoga Apply to Stack Applicera på stacken Keep open Håll öppen Value Värde Argument Parameter True Sant False Falskt Info Info optional optional parameter frivillig UnitEditDialog General Allmänt Relation Relation Name: Namn: Category: Kategori: Descriptive name: Beskrivande namn: System: System: Imperial Imperial US Survey US Survey Hide unit Dölj enheten Description: Beskrivning: Class: Klass: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Klassificering av enheten. Namngivna härledda enheter är definierade i relation till en annan enhet, med en valfri exponent, medan (icke namngivna) härledda enheter definieras av ett enhetsuttryck med en eller flera enheter. Base unit Grundenhet Named derived unit Namngiven härledd enhet Derived unit Härledd enhet Base unit(s): Grundenhet(er): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Enhet (för namngivna härledda enheter) eller enheter (för icke namngivna härledda enheter) som enheten är definierad i förhållande till Exponent: Exponent: Relation: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Förhållande till baseenheten. Utgör för linjära förhållanden enbart ett nummer.<br><br>För icke-linjära förhållanden, används \x för faktorn och \y för exponenten (t.ex. "\x + 273,15" för relationen mellan grader Celsius och Kelvin). Inverse relation: Omvänd relation: Specify for non-linear relation, for conversion back to the base unit. Anges för icke-linjära förhållanden, för omvandling tillbaka till basenheten. Mix with base unit Blanda med basenhet Priority: Prioritet: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Exempel: prioritet för enheten hand är 2, medan prioritet för ft (fot) och in (tum) är 1, vilket resulterar i "17 in = 1 ft + 5 in", istället för "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Minsta antal av basenhet: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Exempel: minsta antal av basenhet för yd (yard) är 12, vilket resulterar i "3 × 3 ft = 9 ft" (istället for "3 yd") och "4 × 3 ft = 4 yd". Use with prefixes by default Använd med prefix som förval Error Fel Base unit does not exist. Angiven grundenhet finns inte. Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? A variable or unit with the same name already exists. Do you want to overwrite it? En variabel eller enhet med samma namn finns redan. Vill du ersätta den? Edit Unit Redigera enhet New Unit Ny enhet UnitsDialog Units Enheter Category Kategori Unit Enhet New… Ny… Edit… Redigera… Deactivate Avaktivera Delete Ta bort Convert Omvandla Insert Infoga Favorite Favorit Show hidden units Visa dolda enheter Activate Aktivera All All units Alla Uncategorized Okategoriserade User units Användarenheter Favorites Favoriter Inactive Inaktiva UnknownEditDialog Name: Namn: Custom assumptions Anpassade antaganden Type: Typ: Sign: Tecken: Temporary Temporär Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? An unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Edit Unknown Variable Modifiera okänd variabel New Unknown Variable Ny okänd variabel VariableEditDialog Name: Namn: Temporary Temporär Value: Värde: Required Nödvändigt Description Beskrivning current result nuvarande resultat Category: Kategori: Descriptive name: Beskrivande namn: Hide variable Dölj variabeln Description: Beskrivning: Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? An unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Edit Variable Redigera variabel New Variable Ny variabel VariablesDialog Variables Variabler Category Kategori Variable Variabel New Ny Variable/Constant… Variabel/konstant… Unknown Variable… Okänd variabel… Matrix… Matris… Edit… Redigera… Export… Exportera… Deactivate Avaktivera Delete Ta bort Insert Infoga Favorite Favorit a matrix en matris a vector en vektor positive positiv non-positive ej positiv negative negativ non-negative ej negativ non-zero ej noll integer heltal boolean boolesk rational rationell real reell complex komplex number nummer not matrix ej matris Favorites Favoriter non-matrix ej matris unknown okänd Default assumptions Förvalda antaganden Activate Aktivera All All variables Alla Uncategorized Okategoriserade User variables Användarvariabler Inactive Inaktiva qalculate-qt-5.5.1/translations/qalculate-qt_zh_CN.ts000066400000000000000000016153021475705355700227200ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator 计算器 Powerful and easy to use calculator 强大而易用的计算器 calculation;arithmetic;scientific;financial; 计算;算术;科学;金融; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate!是一款多功能的跨平台桌面计算器。它简单易用,但却具有通常复杂的数学软件包所需的强大功能和多样性,以及满足日常所需的实用工具(如货币换算和百分比计算)。 Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. 功能包括大量可定制函数库、单位计算与换算、物理常数、符号计算(包括积分和方程)、高精度计算、误差传递、区间运算、绘图和用户友好的界面。 Argument Rules 参数规则 _Cancel 取消(_C) Do not save modifications 不保存修改 _OK 确定(_O) Accept the modification of argument rules 接受参数规则的修改 Enable rules and type test 启用规则和类型测试 Custom condition 自定义条件 For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) 例如,若参数必须是一个有相同数量行和列的矩阵:rows(\x) = columns(\x) Allow matrix 允许矩阵 Forbid zero 禁用零 Handle vector 处理向量 Calculate function for each separate element in vector. 对向量中每个单独元素计算函数。 Min 最小 Include equals 包含等于 Max 最大 Keyboard Shortcuts 键盘快捷键 _Close 关闭(_C) Label 标签 Left-click 左键 Right-click 右键 Middle-click 中键 Reset 重置 Button Action 按钮动作 Value Argument name 参数名 Calendar Conversion 日历换算 Export CSV File 导出CSV文件 Current result 当前结果 Matrix/vector variable 矩阵/向量变量 File 文件 Delimiter 分隔符 Comma 逗号 Tabulator 制表符 Semicolon 分号 Space 空格 Other 其他 Import CSV File 导入CSV文件 Do not import the file 不导入文件 Import the file 导入文件 Name of the data file to import 要导入的数据文件的名称 Select a file 选择文件 Import as 导入为 Matrix 矩阵 If a matrix shall be generated from the contents of the file 若要从文件内容生成矩阵或向量 Vectors 向量 If vectors shall be generated from the contents of the file 若要从文件内容生成矩阵或向量 Name 名称 Name (or name prefix) used to reference generated variable(s) in expressions 用于引用表达式中生成的变量名(或名称前缀) Descriptive name 描述性名称 Title displayed in menus and in variable manager 菜单和变量管理器中显示的名称 Category 类别 First row 第一行 The first row with data to import in the file 文件中要导入数据的第一行 Includes headings 包括标题 If the first row contains column headings 若第一行包含列标题 Delimiter used to separate columns in the file 文件中用于分隔列的分隔符 Custom delimiter 自定义分隔符 Edit Data Property 编辑数据属性 Do not create/modify this data set 不创建/修改此数据集 Accept the creation/modification of this data set 接受此数据集的创建/修改 Name used for reference 引用名称 Properties 属性 Title displayed in menus and in data set manager 菜单和数据集管理器中显示的标题 Description 描述 Description of this data property 此数据属性的说明 Value Type 值类型 Text 文本 Number 数字 Expression 表达式 Hide 隐藏 Use as key 用作键 Approximate value 近似值 Case sensitive value 区分大小写的值 Value uses brackets 值使用括号 Unit expression 单位表达式 Edit Data Set 编辑数据集 Title 标题 Data file 数据文件 Description of this data set 此数据集的说明 Copyright 版权 General 通用 Properties: 属性: Definition of the properties of this data set 此数据集的属性定义 _New 新建(_N) _Edit 编辑(_E) _Delete 删除(_D) Name used to invoke the function in expressions 用于在表达式中调用的函数名 Object argument name 对象参数名称 Property argument name 属性参数名称 Default property 默认属性 Function 函数 Edit Data Object 编辑数据对象 Do not create/modify this data object 不创建/修改此数据对象 Accept the creation/modification of this data object 接受此数据对象的创建/修改 Data Sets new dataset 数据集 Data Set 数据集 Create a new data set 创建新数据集 Edit the selected data set 编辑所选数据集 Delete the selected data set 删除所选数据集 Objects 对象 Create a new data object 创建新的数据对象 Edit the selected data object 编辑所选数据对象 Remove the selected data object 删除所选数据对象 Data Set Description 数据集描述 Object Attributes 对象属性 Decimals 小数 Close this window 关闭此窗口 Min decimals 最小小数 Max decimals 最大小数 Minimal number of displayed decimals 显示小数的最小数目 Maximal number of decimals to display (and round to) 所显示的最大小数(并舍入) Floating Point Conversion 浮点换算 Decimal value 十进制值 Binary value 二进制值 Octal value 八进制值 Hexadecimal representation 十六进制表示 Conversion error 换算误差 Binary representation 二进制表示 Floating point value 浮点值 Format 格式 16-bit (half precision) 16位(半精度) 32-bit (single precision) 32位(单精度) 64-bit (double precision) 64位(双精度) 80-bit (x86 extended format) 80位 (x86扩展格式) 128-bit (quadruple precision) 128位(四倍精度) Hexadecimal value 十六进制值 Edit Function 编辑函数 _Help 帮助(_H) Do not create/modify this function 不创建/修改此函数 Accept the creation/modification of this function 接受此函数的创建/修改 Name used to invoke this function in expressions 用于在表达式中调用的函数名 Title displayed in menus and in function manager 菜单和函数管理器中显示的标题 Hide function 隐藏函数 If this function shall be hidden in menus 若要在菜单中隐藏此函数 Description of this function 此函数的说明 Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. 第一个参数使用\x,第二个参数使用\y,第三个参数使用\z。 更多信息请点击帮助按钮。。 Condition 条件 Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") 函数必须为真的条件。例如,若第二个参数必须大于第一个参数: “\y > \x” Sub-Functions 子函数 Arguments: 参数: Definition of this function's arguments 此函数的参数定义 Free 任意 Integer 整数 Symbol 符号 Date 日期 Vector 向量 Positive number 正数 Non-zero number 非零数 Non-negative number 非负数 Positive integer 正整数 Non-zero integer 非零整数 Non-negative integer 非负整数 Boolean 布尔值 Object 对象 Unit 单位 Variable 变量 Angle 角度 Data object 数据对象 Data property 数据属性 _Add 添加(_A) Add entered argument definition 添加输入参数的定义 _Apply 应用(_A) Modify selected argument 修改所选参数 Remove selected argument 删除所选参数 Rules 规则 Edit conditions for selected argument 编辑所选参数的条件 Close this dialog 关闭此对话框 Precalculate 预计算 Calculate the subfunction only once, before the parent function 在父函数之前只计算一次子函数 Add entered subfunction 增加输入的子函数 Apply changes to the selected subfunction 将更改应用于所选子函数 Remove the selected subfunction 删除选定的子函数 Functions 函数 Create a new function 创建新函数 Edit the selected function 编辑所选函数 _Insert 插入(_I) Insert (or execute) the selected function into the expression entry 在表达式框中插入(或执行)所选函数 Delete the selected function 删除所选函数 (De)activate the selected function (取消)激活所选函数 Deacti_vate 停用(_v) Apply the selected function to the current expression 将所选函数应用于当前表达式 Categor_y 类别(_y) _Function 函数(_F) Descri_ption 描述(_P) Degrees Radians 弧度 Gradians 梯度 Default assumptions 默认假设 Unknown 未知数 Not Matrix 非矩阵 Complex 复数 Real 实数 Rational 有理数 Non-Zero 非零数 Positive 正数 Non-Negative 非负数 Negative 负数 Non-Positive 非正数 _File 文件(_F) Unknown Variable 未知变量 Function (simplified) 函数(简化) Import CSV File… 导入CSV文件… Export CSV File… 导出CSV文件… _Store Result… 存储结果(_S)… Save Result Image… 保存结果图像… Save local functions, variables and units 保存局部函数,变量和单位 Save Definitions 保存定义 Import Definitions File… 导入定义文件… Fetch current exchange rates from the Internet 从网络上获取当前汇率 Update Exchange Rates 更新汇率 Plot Functions/Data 函数/数据绘图 Convert Number Bases 数字进制换算 Floating Point Conversion (IEEE 754) 浮点换算(IEEE 754) Percentage Calculation Tool 百分比计算 Periodic Table 元素周期表 Minimal Window 最小窗口 _Quit 退出(_Q) Manage Variables 管理变量 Manage Functions 管理函数 Manage Units 管理单位 Manage Data Sets 管理数据集 Factorize 分解 Expand 展开 Apply partial fraction decomposition to the current result. 部分分式分解当前结果。 Expand Partial Fractions 展开部分分式 Set Unknowns… 设置未知数… Convert to Unit 换算单位 Set Prefix 设置前缀 Convert to Unit Expression… 换算为单位表达式… Convert to Base Units 换算为基本单位 Convert to Optimal Unit 换算为最优单位 Insert Date… 插入日期… Insert Matrix… 插入矩阵… Insert Vector… 插入向量… _Copy Result 复制结果(_C) Customize Keypad Buttons 自定义键盘按钮 _Preferences 首选项(_P) _Mode 模式(_M) Number Base 数字进制 Select Result and Expression Base… 选择结果和表达式进制… Binary 二进制 Octal 八进制 Decimal 十进制 Duodecimal 十二进制 Hexadecimal 十六进制 Other… 其他… Sexagesimal 六十进制 Time Format 时间格式 Roman Numerals 罗马数字 Numerical Display 数值显示 Normal 常规 Engineering 工程 Scientific 科学 Purely Scientific 纯科学 Simple 简单 Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... 关: 1/7 ≈ 0.14285714 开: 1/7 = 0.142857 142857... Indicate Repeating Decimals 指示循环小数 Show Ending Zeroes 显示结尾的零 Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 关: 2.5 ≈ 3, 1.5 ≈ 2 开: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even 中数约至偶数 Off: -x + y On: y - x 关: -x + y 开: y - x Sort Minus Last 减号排至末尾 Complex Rectangular Form 复矩形形式 Complex Exponential Form 复指数形式 Complex Polar Form 复极坐标形式 Complex Angle/Phasor Notation 复角/相量记号 Rational Number Form 有理数形式 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions 小数 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions 精确小数 6/4 = 3/2 6/4 = 3/2 Simple Fractions 简单分数 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions 混合分数 Interval Display 区间显示 Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi 关: 1/2*pi ≈ 1.5707963 开: 1/2*pi = 0.5 pi Adaptive 自适应 Calculates an interval of possible values and keeps track of precision changes. 计算可能值的区间,并跟踪精度变化。 Significant Digits 有效数字 Interval 区间 Plus/Minus 加/减 Midpoint 中点 Unit Display 单位显示 Do not use any prefixes in result 结果不使用任何前缀 Show prefixes for primarily SI and CGS units. 显示主要的SI和CGS单位前缀。 Use prefixes for selected units 为所选单位使用前缀 Use prefixes also for currencies 对货币也使用前缀 Use prefixs for all units 对所有单位使用前缀 Enables automatic use of hekto, deka, deci and centi when prefixes is enabled 启用前缀时,自动使用百、十、分和厘 Enable All SI Prefixes 启用所有SI前缀 Enables automatic setting of prefix for denominator in addition to the numerator 除分子外,还可自动设置分母的前缀 Enable Denominator Prefixes 启用分母前缀 Off: J / K On: J * K^-1 关: J / K 开: J * K^-1 Negative Exponents 负指数 Off: (2 m)/s On: 2 (m/s) 关: (2 m)/s 开: 2 (m/s) Place Units Separately 单独放置单位 No Additional Conversion 无额外换算 Convert to Optimal SI Unit 换算为最优SI单位 If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min 若启用: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Convert to Mixed Units 换算为混合单位 Abbreviate Names 缩写名称 Enabled Objects 启用对象 Variables 变量 Units 单位 Unknowns 未知数 Units in Physical Constants 物理常数单位 If not enabled, treats all variables as unknown 若未启用,则将所有变量视为未知 Calculate Variables 计算变量 Disables/enables complex numbers in result 禁用/启用结果中的复数 Allow Complex Result 允许复数结果 Disables/enables infinite numbers in result 禁用/启用结果中的无穷数 Allow Infinite Result 允许无限结果 Approximation 近似估算 Always Exact 总是精确 Try Exact 尝试精确 Approximate 近似值 Interval Arithmetic 区间运算 Interval Calculation 区间计算 Variance Formula 方差公式 Change angle unit used in trigonometric functions 改变三角函数中的角度单位 Angle Unit 角度单位 None Assumptions 前提假设 Algebraic Mode 代数模式 Assume that unknown denominators are non-zero 假设未知分母非零 Non-Zero Denominators 非零分母 Warn when unknown denominators are assumed non-zero 假设未知分母为非零时发出警告 Warn About Denominators Assumed Non-Zero 警告分母假定非零 Parsing Mode 解析模式 Adaptive Parsing 自适应解析 Parse Implicit Multiplication First 隐式乘法优先解析 Conventional Parsing 常规解析 Chain Syntax 链式语法 RPN Syntax 逆波兰式语法 Off: xy = x*y On: xy != x*y 关: xy = x*y 开: xy != x*y Limit Implicit Multiplication 限制隐式乘法 Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 将十进制数解析为近似数,其精度等于位数。 关: 1.1 * 1.1 = 1.21 开: 1.1 * 1.1 ≈ 1.2 Read Precision 读取精度 _Precision 精度(_P) _Decimals 小数(_D) Calculate As You Type 输入时计算 Chain Mode 链式模式 Activate the RPN stack. 激活RPN栈。 RPN Mode 逆波兰模式 Meta Modes 元模式 Save Mode… 保存模式… Delete Mode… 删除模式… Save Default _Mode 保存默认模式(_M) Fu_nctions 函数(_n) _Variables 变量(_V) _Units 单位(_U) _Contents 内容(_C) Report a Bug 报告错误 Check for Updates 检查更新 _About 关于(_A) Toggle minimal window 切换最小窗口 Calculation result 计算结果 _Keypad 键盘(_K) Toggles persistent keypad (makes it possible to show keypad and history simultaneously) 切换常驻键盘(可同时显示键盘和历史) _History 历史(_H) C_onversion 换算(_o) RPN Stack RPN栈 Insert the selected value 插入所选值 Insert the selected text 插入所选文本 Copy the selected text 复制所选文本 Add the selected value(s) 加上所选值 Subtract the selected value(s) 减去所选值 Multiply the selected value(s) 乘以所选值 Divide the the selected value(s) 除以所选值 Raise to the power of the selected value 幂乘所选值 Calculate the square root of the selected value 计算所选值的平方根 History 历史 Subtract the top value from the second value 从第二值减去顶部值 Multiply the top two values 将顶部两个值相乘 Divide the second value by the top value 将第二个值除以顶部值 Raise the second value to the power of the top value 将第二个值幂乘顶部值 Negate the top value (Ctrl+-) 取反顶部值(Ctrl+-) Invert the top value 取倒顶部值 Calculate the square root of the top value 计算顶部值的平方根 Calculate the sum of all values 计算所有值的和 Rotate the stack or move selected register up 循环栈或上移选定寄存器 Rotate the stack or move selected register down 循环栈或下移选定寄存器 Swap the two top values or move the selected value to the top of the stack 交换顶部两个值或将所选值移到栈顶 Copy the selected or top value to the top of the stack 将选定的或顶部值复制到栈顶 Enter the top value from before the last numeric operation 输入上次数值操作前的顶部值 Delete the top or selected value 删除顶部值或所选值 Edit the selected value 编辑所选值 Clear the RPN stack 清空RPN栈 Unit(s) and prefix to convert result to 换算结果的单位和前缀 Convert 换算 Continuous conversion 连续换算 Automatically convert result to the current unit expression as long as the conversion box is visible. 只要换算框可见,就自动将结果换算为当前单位表达式。 Add prefix 添加前缀 If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". 若单位表达式不包含任何前缀,则使用最优前缀。 这可以通过在单位表达式前加上 ? 或 0 来覆盖。 Conversion 换算 Show/hide programming keypad 显示/隐藏编程键盘 Exact 精确 Fraction 分数 Numerical display 数值显示 Pure 纯净 Number base 数字进制 Time format 时间格式 Roman 罗马 sin sin cos cos tan tan ln ln Equals 等于 sqrt sqrt sum sum Unknown variable 未知变量 mod mod mean mean Store result as a variable 将结果储存为变量 STO Standard calculator button. Do not use more than three characters. STO Convert number bases 换算数字进制 Imaginary unit i (√-1) 虚数单位 i (√-1) Manage units 管理单位 Conversion operator 换算运算符 Kilogram 千克 Two's complement input 二的补码输入 Two's complement output 二的补码输出 Bitwise Exclusive OR 按位异或 Bitwise Left Shift 按位左移 Bitwise Right Shift 按位右移 Floating point conversion 浮点换算 Show/hide left keypad 显示/隐藏左侧键盘 Show/hide right keypad 显示/隐藏右侧键盘 DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result 前一结果 ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression 添加到表达式 Persistent Keypad 常驻键盘 Edit 编辑 Delete 删除 Update 更新 Insert Value 插入值 Insert Text 插入文本 Insert Parsed Text 插入已解析文本 Copy 复制 Copy Full Text 复制全文 Search… 搜索… Add Bookmark… 添加书签… Bookmarks 书签 Protect 保护 Move To Top 移动到顶部 Remove 移除 Clear All 全部清除 _Copy 复制(_C) _Store… 存储(_S)… Save Image… 保存图像… _Factorize 因子分解(_F) _Expand 展开(_E) _Normal 常规(_N) Sc_ientific 科学(_i) Purel_y Scientific 纯科学(_y) Simp_le 简单(_l) _Binary 二进制(_B) _Octal 八进制(_O) _Decimal 十进制(_D) _Hexadecimal 十六进制(_H) Decimal Fraction 十进分数 Exact Decimal Fraction 精确十进分数 Simple Fraction 简单分数 Mixed Fraction 混合分数 _Abbreviate Names 缩写名称(_A) C_onvert… 换算…(_o) Convert to Base _Units 换算为基本单位(_U) Convert _to Optimal Unit 换算为最优单位(_t) Use Optimal Prefix 使用最优前缀 Convert to 换算为 Convert to UTC 换算为UTC Convert to Calendars 换算为日历 Use prefixes for all units 对所有单位使用前缀 Enable All SI Prefi_xes 启用所有SI前缀(_x) View/Edit Matrix 查看/编辑矩阵 View/Edit Vector 查看/编辑矢量 Copy Text 复制文本 To Top 到顶部 Swap 交换 Up 向上 Down 向下 Negate 取反 Invert 取倒 Square 平方 Square Root 平方根 Clear Stack 清空栈 Select Number Base… 选择数字进制… Store result 存储结果 Add result Add current result to variable value 加上结果 Subtract result Subtruct current result from variable value 减去结果 Insert the matrix/vector into the expression 将矩阵/向量插入表达式 Rows Number of rows in this matrix (rows displayed for vectors) 此矩阵的行数(向量显示的行) Columns Number of columns in this matrix (columns displayed for vectors) 此矩阵的列数(向量显示的列) If this is a matrix or vector 若这是矩阵或向量 Elements 元素 Current element: 当前元素: Edit Matrix 编辑矩阵 Do not create/modify this matrix/vector 不创建/修改此矩阵/向量 Create/modify the matrix/vector 创建/修改矩阵/向量 Accept the creation/modification of this matrix/vector 接受此矩阵/向量的创建/修改 Name used to reference this variable in expressions 用于在表达式中引用的变量名 Names 名称 Add new name 添加新名称 Apply changes to the selected name 将更改应用于所选名称 Remove the selected name 删除所选名称 Abbreviation 缩写 Unicode Unicode Plural 复数 Suffix 后缀 Reference 参考 Avoid input 避免输入 Case sensitive 区分大小写 Completion only 仅补全 Number Bases 数字进制 Roman numerals 罗马数字 BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Multiply Divide Bitwise AND 按位与 Bitwise OR 按位或 Bitwise NOT 按位非 Clear 清除 Enter two values, of which at most one is a percentage, and the others will be calculated for you. 输入两个值,其中最多一个是百分比,其他值会帮你计算。 Percentage 百分比 Calculate 计算 Value 1 甲值 2 compared to 1 乙相比于甲 Change from 1 to 2 甲转变为乙 Value 2 乙值 1 compared to 2 甲相比于乙 Change from 2 to 1 乙转变为甲 Plot 作图 _Save 保存(_S) Save as png, svg, postscript, eps, latex or fig 另存为png,svg,postscript,eps,latex或fig Vector/matrix 向量/矩阵 Paired matrix 成对矩阵 if you want to split matrix in rows instead of columns 若要按行而不是按列拆分矩阵 X variable X变量 The variable name used in expression 表达式中使用的变量名 Style 风格 Line 线 Points Line with points 点+线 Boxes/bars 框/条 Histogram 直方图 Steps 步骤 Candlesticks K线图 Dots Smoothing 平滑 Monotonic 单调 Natural cubic splines 自然三次样条 Bezier 贝塞尔 Bezier (monotonic) 贝塞尔(单调) Y-axis Y轴 Primary 主坐标轴 Secondary 次坐标轴 _Remove 移除(_R) Data 数据 Minimum x value 最小x值 Maximum x value 最大x值 Sampling rate 采样率 Step size 步长 Function Range 函数范围 Display grid 显示网格 Display full border 显示完整边框 Minimum y value 最小y值 Maximum y value 最大y值 Logarithmic x scale 对数x刻度 Logarithmic y scale 对数y刻度 X-axis label X轴标签 Y-axis label Y轴标签 Line width 线宽 Color display 彩色显示 Color 颜色 Monochrome 单色 Legend placement 图例位置 Top-left 左上 Top-right 右上 Bottom-left 左下 Bottom-right 右下 Below 下面 Outside 外面 Appearance 外观 Precision 精确度 _Recalculate 重新计算(_R) Recalculate expression 重新计算表达式 The number of significant digits to display/calculate (simple arithmetics are always calculated exact) 要显示/计算的有效位数(简单运算总是精确计算) Preferences 首选项 Save mode on exit 退出时保存模式 If the mode of the calculator shall be restored 若要恢复计算器模式 Save definitions on exit 退出时保存定义 If changes to functions, units and variables shall be saved automatically 若要函数、单位和变量在发生变化时自动保存 Clear history on exit 退出时清除历史记录 Allow multiple instances 允许多个实例 Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. 允许同时打开 Qalculate! 主窗口的多个实例。 请注意,只有最后关闭的实例模式、历史和定义会被保存。 Notify when a new version is available 当有新版本时通知我 Use keyboard keys for RPN 用键盘键操作RPN Use keyboard operator keys for RPN operations (+-*/^). 使用键盘操作键进行RPN操作(+-*/^)。 Use caret for bitwise XOR 插入符号(^)作为按位异或 Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. 使用键盘上的插入符(^)输入XOR (⊻)(否则使用Ctrl+^)。指数运算符(^)总是可以用Ctrl+*输入。 Add calculate-as-you-type result to history 向历史记录中添加“输入时计算”的结果。 Delay: 延时: Time limit for plot: 作图时间限制: Behavior 行为 Enable Unicode symbols 启用Unicode符号 Disable this if you have problems with some fancy characters 若您觉得某些花哨的字符有问题,请禁用此功能 Ignore system language (requires restart) 忽略系统语言(需要重启) Use system tray icon 使用系统托盘图标 Hides the application in the system tray when the main window is closed 当主窗口关闭时,将应用程序隐藏在系统托盘中 Hide on startup 启动时隐藏 Remember window position 记住窗口位置 Application name 应用程序名称 Result 结果 Application name + result 应用程序名称+结果 Mode 模式 Application name + mode 应用程序名称+模式 Window title 窗口标题 Default 默认值 Number of expression lines 表达式行数 3 3 Display expression status 显示表达式状态 If as-you-type expression status shall be displayed below the expression entry 若要在表达式框下方显示表达式键入状态 Persistent keypad 常驻键盘 Look & Feel 外观 Binary two's complement representation 二进制二的补码表示 If two's complement representation shall be used for negative binary numbers. 若要对负二进制数应用二的补码表示法。 Hexadecimal two's complement representation 十六进制二进制补码表示 If two's complement representation shall be used for negative hexadecimal numbers. 若要对负十六进制数应用二的补码表示法。 Use lower case letters in non-decimal numbers 非十进制数使用小写 If lower case letters should be used in numbers with non-decimal base 若要在非十进制数字中使用小写字母 Alternative base prefixes 可选进制前缀 If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes 若要十六进制数以“0x0”为前缀,二进制数以“0b00”为前缀 Spell out logical operators 拼出逻辑运算符 If logical and/or shall be displayed as "&&"/"||" or "and"/"or" 若要逻辑与/或应显示为 &&/|| 或 and/or If "e" shall be used instead of "E" in numbers 若要在数字中以e代替E Use E-notation instead of 10<sup><i>n</i></sup> 使用E符号代替10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) 使用小写e(如1e10) Use 'j' as imaginary unit 用 j 作虚数单位 Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. 将j(而非i)作为虚部默认符号并放在虚部前面。 Use comma as decimal separator 将逗号作为小数分隔符 Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign 允许使用点“.”作为千位分隔符而非小数点符号。 Ignore comma in numbers 忽略数字中的逗号 Allow commas, ',', to be used as thousands separator instead of as an function argument separator 允许将逗号“,”作为千位分隔符而非函数参数分隔符 Ignore dots in numbers 忽略数字中的点 Digit grouping 数字分节 off standard 标准 local 本地 Multiplication sign 乘号 Division sign 除号 Copy digit separator 复制数字分隔符 Deactivate to remove digit separator when copying result 复制结果时停用以去除数字分隔符 Numbers & Operators 数字和运算符 Use binary prefixes for information units 信息单位使用二进制前缀 Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). 对于信息单位(例如字节),默认情况下使用二进制而非十进制前缀。 Conversion to local currency 换算为本地货币 Automatically convert to the local currency when optimal unit conversion is activated. 激活最优单位换算时,自动换算为本地货币。 Update exchange rates on start 启动时更新汇率 If current exchange rates shall be downloaded from the internet at program start 若要在程序启动时从网上下载最新汇率 Exchange rates updates 汇率更新 Temperature calculation mode: 温度计算模式: Absolute 绝对 Relative 相对 Hybrid 混合 Units & Currencies 单位和货币 Show expression completion suggestions 显示表达式补全建议 Search titles and countries 搜索标题和国家/地区 Minimum characters 最少字符 Popup delay (ms) 弹出延迟(ms) Completion 补全 Status warning color 警告状态颜色 Status error color 错误状态颜色 Custom status font 自定义状态字体 If you want to use a font other than the default in the status display below the expression entry 若要在表达式框下方的状态显示中使用默认字体以外的字体 Custom expression font 自定义表达式字体 If you want to use a font other than the default in the expression entry 若要在表达式框中使用默认字体以外的字体 Custom result font 自定义结果字体 If you want to use a font other than the default in the result display 若要在结果显示中使用默认字体以外的字体 Custom keypad font 自定义键盘字体 If you want to use a font other than the default in the keypad 若要在键盘中使用默认字体以外的字体 Custom application font 自定义应用程序字体 If you want to use a font other than the default for the whole application 若要整个应用程序使用默认字体以外的字体 Text color 文字颜色 Fonts & Colors 字体与颜色 Other: 其他: Bijective base-26 Bijective base-26 <b>Result Base</b> <b>结果进制</b> <b>Expression Base</b> <b>表达式进制</b> New Keyboard Shortcut 新建键盘快捷键 Edit Variable 编辑变量 Advanced 高级 Accept the creation/modification of this variable 接受此变量的创建/修改 x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. 分别使用x,y和z作为第一个,第二个和第三个函数参数。 \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. 分别使用\x,\y和\z作为第一,二和三个函数参数。这能避免和变量,函数和单位的潜在冲突。 Edit Unit 编辑单位 Do not create/modify this unit 不创建/修改此单位 Accept the creation/modification of this unit 接受此单位的创建/修改 Singular form of this unit's name 该单位名称的单数形式 Title displayed in menus and in unit manager 菜单和单位管理器中显示的标题 System 系统 Imperial 英制 US Survey 美制 Hide unit 隐藏单位 If this unit shall be hidden in menus 若要该单位在菜单中隐藏 Class The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. 此单位所属的类。命名派生单位是相对于一个单一的其他单位而定义的,可以带有指数,而(未命名)派生单位是由含一个或多个单位的单位表达式定义的。 Base unit 基本单位 Named derived unit 命名派生单位 Derived unit 派生单位 Base unit(s) 基本单位 Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to 该单位(对于命名派生单位)或单位表达式(对于未命名派生单位)的定义所关联(基于)的单位 Exponent 指数 Exponent of the base unit 基本单位的指数 Relation 关系 Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). 与基本单位的关系。 对于线性关系,这应该只是一个数字。 对于非线性关系,用\x表示因子,用\y表示指数(例如,“\x + 273.15”表示摄氏度和开尔文之间的关系)。 Relation is exact 精确关系 If the relation is precise 若关系是精确的 Inverse relation 逆关系 Specify for non-linear relation, for conversion back to the base unit. 指定非线性关系,以便换算回基本单位。 Mix with base unit 与基本单位混合 - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - 若存在多个选项,决定基本单位与哪些单位混合。 - 原单位不会与优先级较低的单位混合。 - 数值越低表示优先级越高。 Priority 优先级 Minimum base unit number 最小基本单位数 Use with prefixes by default 默认使用前缀 Create a new unit 创建新单位 Edit the selected unit 编辑所选单位 Insert the selected unit into the expression entry 将所选单位插入表达式框 C_onvert 换算(_o) Convert the result to the selected unit 将结果换算到所选单位 Delete the selected unit 删除所选单位 (De)activate the selected unit (取消)激活所选单位 _Unit 单位(_U) Convert between units 在单位间换算 = = Conver_sion 换算(_s) Converted value 换算后的值 Value to convert from 换算前的值 Type anywhere 在任何地方输入 Edit Unknown Variable 编辑未知变量 Do not create/modify this unknown variable 不创建/修改此未知变量 Accept the creation/modification of this unknown variable 接受此未知变量的创建/修改 Name used to reference this unknown variable in expressions 用于在表达式中引用此未知变量的名称 Use custom assumptions 使用自定义假设 Type 类型 Real Number 实数 Rational Number 有理数 Sign 符号 The category this unknown variable belongs to 此未知变量所属的类别 Value of this variable (expression) 此变量的值(表达式) value is exact 精确值 If the value is precise 若该值是精确的 The category this variable belongs to 此变量所属的类别 Create a new variable 创建新变量 Edit the selected variable 编辑所选变量 Insert the selected variable into the expression entry 将所选变量插入表达式项 Delete the selected variable 删除所选变量 (De)activate the selected variable (取消)激活所选变量 E_xport 导出(_x) _Variable 变量(_V) Execute expressions and commands from a file 执行文件中的表达式和命令 Start a new instance of the application 启动一个新的程序实例 Display the application version 显示应用程序版本 Specify the window title 指定窗口标题 TITLE TITLE Expression to calculate 要计算的表达式 [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. <span font="10">在上面键入一个数学表达式,例如“5+2/3”, 然后按Enter键。</span> ans ans Last Answer 上一答案 answer 答案 Answer 2 答案二 Answer 3 答案三 Answer 4 答案四 Answer 5 答案五 Memory 存值 Failed to load global definitions! 加载全局定义失败! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" 全部 By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? 默认情况下,只允许打开%s的一个实例(一个主窗口)。 若同时打开多个实例,只有最后一个关闭窗口的定义(变量、函数等)、模式、偏好和历史记录会被保存。 尽管这样,你是否想改变默认的行为,允许同时打开多个实例? c-format Right-click/long press: %s 右键/长按: %s c-format Right-click: %s 右键: %s c-format Middle-click: %s 中键: %s c-format Cycle through previous expression 在前面的表达式中循环 Move cursor left or right 向左或向右移动光标 Move cursor to beginning or end 将光标移动到开头或末尾 Uncertainty/interval 不确定度/区间 Relative error 相对误差 Argument separator 参数分隔符 Blank space 空白处 New line 新建行 Smart parentheses 智能括号 Vector brackets 向量括号 Left parenthesis 左括号 Left vector bracket 左向量括号 Right parenthesis 右括号 Right vector bracket 右向量括号 Decimal point 小数点 Raise (Ctrl+*) 幂(Ctrl+*) Add M+ (memory plus) M+(存值加上) MC (memory clear) MC(存值清除) Backspace 退格键 M− (memory minus) M−(存值减去) Previous result (static) 前一个结果(静态) Calculate expression 计算表达式 MR (memory recall) MR(存值读取) MS (memory store) MS(存值存入) Set unknowns 设置未知数 more Show further items in a submenu 更多 Logical AND 逻辑与 Logical OR 逻辑或 Logical NOT 逻辑非 Toggle Result Base 切换结果进制 Open menu with stored variables 打开存储变量的菜单 Index 索引 ENTER RPN Enter (calculate and add to stack) ENTER Calculate expression and add to stack 计算表达式并添加到栈 Flag 标志 Matrices 矩阵 Gregorian 格里高利历(公历/阳历) Revised Julian (Milanković) 修订儒略历(Milanković) Julian 儒略历 Islamic (Hijri) 伊斯兰历(回历/Hijri) Hebrew 希伯来历(犹太历) Chinese 中国历(农历/阴历) Persian (Solar Hijri) 波斯历(Solar Hijri) Coptic 科普特历(Coptic) Ethiopian 埃塞俄比亚历(Ethiopian) Indian (National) 印度历(国立) Action 动作 Key combination 组合键 Raise History Answer Value 历史答案 History Index(es) 历史索引 History index %s does not exist. 历史索引 %s 不存在。 c-format expression expression History Parsed Expression 已解析表达式 Set Window Title 设置窗口标题 Failed to open %s. %s 无法打开 %s 。 %s c-format Could not display help for Qalculate!. 无法显示 Qalculate! 的帮助。 Could not display help for Qalculate!. %s 无法显示 Qalculate! 的帮助。 %s c-format approx. Stop process 停止进程 Clear expression 清除表达式 EXACT EXACT APPROX APPROX RPN RPN CHN Chain mode CHN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? 您想现在更新汇率吗? It has been %s day since the exchange rates last were updated. 距上次更新汇率已过了%s天。 c-format It has been %s days since the exchange rates last were updated. Do not ask again 不再询问 It took too long to generate the plot data. 生成绘图数据的时间太长。 It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. 生成绘图数据的时间太长。 请降低采样率或增加首选项中的时间限制。 When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. 当计算过程中产生错误、警告和其他信息时,表达式框右上角的图标会发生变化以反映。此时可以长按鼠标或点击图标来显示信息。 Path of executable not found. 未找到可执行文件的路径。 curl not found. 未找到 curl。 Failed to run update script. %s 运行更新脚本失败。 %s c-format Failed to check for updates. 无法检查更新。 No updates found. 无更新。 A new version of %s is available at %s. Do you wish to update to version %s. %s 的新版本可在 %s 获得。 是否要更新到版本 %s 。 c-format A new version of %s is available. You can get version %s at %s. %s 有可用的新版本 %s。 您可以在 %s 获取。 c-format Too many arguments for %s(). %s()的参数太多。 c-format argument 参数 Temperature Calculation Mode 温度计算模式 The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). 表达方式有歧义。 请选择温度计算模式 (以后可以在偏好设置中更改)。 Uncategorized 未分类 hexadecimal 十六进制 octal 八进制 decimal 十进制 duodecimal 十二进制 binary 二进制 roman 罗马 bijective 双射 sexagesimal 六十进制 latitude 纬度 longitude 经度 time 时间 bases 进制 calendars 日历 rectangular 矩形 cartesian 笛卡尔 exponential 指数型 polar 极坐标 angle 角度 phasor 相量 optimal 最优 base 基本 mixed 混合 fraction 分数 factors 因子 partial fraction 部分分式 factorize 分解 expand 展开 hexadecimal number 十六进制数 octal number 八进制数 decimal number 十进制数 duodecimal number 十二进制数 binary number 二进制数 roman numerals 罗马数字 bijective base-26 双射基-26 sexagesimal number 六进制数 32-bit floating point 32位浮点 64-bit floating point 64位浮点 16-bit floating point 16位浮点 80-bit (x86) floating point 80位(x86)浮点 128-bit floating point 128位浮点 time format 时间格式 number bases 数字进制 optimal unit 最优单位 base units 基本单位 mixed units 混合单位 expanded partial fractions 已展开部分分式 complex rectangular form 复矩形形式 complex exponential form 复指数形式 complex polar form 复极坐标形式 complex cis form 复纯虚数指数(cis)形式 complex angle notation 复角记号 complex phasor notation 复相量记号 UTC time zone UTC时区 number base %s 数字进制 %s c-format Inactive 不常用 Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. 从 %s 数据集中检索与所给对象和属性相关的数据。若将“info”键入为属性,则会弹出一个包含该对象的所有属性的对话框窗口。 c-format Example: 示例: Arguments 参数 optional optional argument 可选 default: argument default, in description 默认值: Requirement 要求 key indicating that the property is a data set key Acti_vate 激活(_v) a previous result 一个先前的结果 matrix 矩阵 vector 向量 positive 正数 non-positive 非正数 negative 负数 non-negative 非负数 non-zero 非零 boolean 布尔值 integer 整数 rational 有理数 real 实数 complex 复数 number (not matrix) (非矩阵) unknown 未知 default assumptions 默认假设 Variable does not exist anymore. 变量不再存在。 Data Retrieval Function 数据检索函数 Insert function 插入函数 Insert function (dialog) 插入函数(对话框) Insert variable 插入变量 Insert unit 插入单位 Insert text 插入文本 Insert date 插入日期 Insert vector 插入向量 Insert matrix 插入矩阵 Insert smart parentheses 插入智能括号 Convert to unit 换算为单位 Convert to unit (entry) 换算为单位(输入框) Convert to optimal unit 换算为最优单位 Convert to base units 换算为基本单位 Convert to optimal prefix 换算为最优前缀 Convert to number base 换算为数字进制 Factorize result 分解结果 Expand result 展开结果 Expand partial fractions 展开部分分式 RPN: down RPN: 向下 RPN: up RPN: 向上 RPN: swap RPN: 交换 RPN: copy RPN: 复制 RPN: lastx RPN: lastx RPN: delete register RPN: 删除寄存器 RPN: clear stack RPN: 清空栈 Load meta mode 加载元模式 Set expression base 设置表达式进制 Set result base 设置结果进制 Toggle exact mode 切换精确模式 Set angle unit to degrees 将角度单位设为度 Set angle unit to radians 将角度单位设为弧度 Set angle unit to gradians 将角度单位设为梯度 Toggle simple fractions 切换简单分数 Toggle mixed fractions 切换混合分数 Toggle scientific notation 切换科学记数 Toggle simple notation 切换简单记数 Toggle RPN mode 切换RPN模式 Toggle calculate as you type 切换键入时计算 Toggle programming keypad 切换编程键盘 Show keypad 显示键盘 Show history 显示历史记录 Search history 搜索历史记录 Show conversion 显示换算 Show RPN stack 显示RPN栈 Manage variables 管理变量 Manage functions 管理函数 Manage data sets 管理数据集 New variable 新建变量 New function 新建函数 Open plot functions/data 打开函数/数据作图 Open convert number bases 打开进制换算 Open floating point conversion 打开浮点换算 Open calender conversion 打开日历换算 Open percentage calculation tool 打开百分比计算 Open periodic table 打开元素周期表 Update exchange rates 更新汇率 Copy result 复制结果 Save result image 保存结果图像 Help 帮助 Quit 退出 Toggle chain mode 切换链式模式 Prefixes 前缀 No Prefix 无前缀 Optimal Prefix 最优前缀 Prefix 前缀 Complex angle/phasor notation 复角/相量记号 Number bases 数字进制 Base units 基本单位 Binary number 二进制数 Calendars 日历 Complex cis form 复纯虚数指数形式 Decimal number 十进制数 Duodecimal number 十二进制数 Complex exponential form 复指数形式 Factors 因子 16-bit floating point binary format 16位浮点二进制格式 32-bit floating point binary format 32位浮点二进制格式 64-bit floating point binary format 64位浮点二进制格式 80-bit (x86) floating point binary format 80位(x86)浮点二进制格式 128-bit floating point binary format 128位浮点二进制格式 Hexadecimal number 十六进制数 Latitude 纬度 Longitude 经度 Mixed units 混合单位 Octal number 八进制数 Optimal units 最优单位 Expanded partial fractions 展开部分分式 Complex polar form 复极坐标形式 Complex rectangular form 复矩形形式 Sexagesimal number 六十进制数 and or undefined 未定义 result is too long see history 结果太长 查看历史记录 calculation was aborted 计算已中止 RPN Register Moved RPN寄存器已移动 RPN Operation RPN操作 Processing… 处理中… result processing was aborted 结果处理已中止 Factorizing… 分解中… Expanding partial fractions… 展开部分分式… Expanding… 展开中… Calculating… 计算中… Converting… 换算中… Fetching exchange rates. 获取汇率。 Time zone parsing failed. 时区分析失败。 Keep open 保持打开状态 Enter RPN Enter (calculate and add to stack) 开始 C_alculate 计算(_a) Apply to Stack 应用于栈 Argument 参数 True False Info 信息 Edit Unit (global) 编辑单位(全局) New Unit 新建单位 Empty name field. 名称字段为空。 A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again 已存在同名的变量或单位。 是否要覆盖它? Base unit does not exist. 基本单位不存在。 Edit Function (global) 编辑函数(全局) New Function 新建函数 Yes No Empty expression field. 表达式字段为空。 A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again 已存在同名函数。 是否要覆盖函数? Unit does not exist 单位不存在 Edit Unknown Variable (global) 编辑未知变量(全局) New Unknown Variable 新建未知变量 An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again 已存在同名的单位或变量。 是否要覆盖它? Edit Variable (global) 编辑变量(全局) New Variable 新建变量 Empty value field. 值字段为空。 Edit Vector 编辑向量 Edit Vector (global) 编辑向量(全局) New Vector 新建向量 Edit Matrix (global) 编辑矩阵(全局) New Matrix 新建矩阵 Vector Result 向量结果 Matrix Result 矩阵结果 New Data Object 新建数据对象 text 文本 approximate 近似 Edit Data Set (global) 编辑数据集(全局) New Data Set 新建数据集 info 信息 Property 属性 No file name entered. 未输入文件名。 No delimiter selected. 未选择分隔符。 Could not import from file %s 无法从文件导入 %s c-format No variable name entered. 未输入变量名。 No known variable with entered name found. 未找到所输入名称的已知变量。 Could not export to file %s 无法导出到文件 %s c-format My Variables 我的变量 Couldn't write definitions 无法写入定义 Preset 预置 Abort 中止 Undo 撤消 Redo 重做 Completion Mode 补全模式 Limited strict completion 有限严格补全 Strict completion 严格补全 Limited full completion 有限全面补全 Full completion 全面补全 No completion 无补全 Delayed completion 延迟补全 Customize completion… 自定义补全… Save Mode 保存模式 Preset mode cannot be overwritten. 无法覆盖预设模式。 Delete Mode 删除模式 Couldn't write preferences to %s 无法将首选项写入 %s c-format never 从不 ask 询问 %i day %i天 c-format %i days Copied Result was copied 已复制 log10 function not found. 未找到函数log10。 Search 搜索 _Search 搜索(_S) Remove Bookmark 删除书签 Add Bookmark 添加书签 A bookmark with the selected name already exists. Do you want to overwrite it? 已存在同名的书签。 是否要覆盖它? No items found 未找到条目 Select date 选择日期 Rectangular form 矩形形式 Exponential form 指数形式 Polar form 极坐标形式 Angle/phasor notation 角/相量记号 Optimal unit 最优单位 Optimal prefix 最优前缀 All functions 所有函数 All variables 所有变量 Select definitions file 选择定义文件 _Import 导入(_I) Could not copy %s to %s. 无法将%s复制到%s。 c-format Could not read %s. 无法读取 %s 。 c-format Could not copy file to %s. 无法将文件复制到 %s 。 c-format Unsupported base. 不支持该进制。 The selected Chinese year does not exist. 所选的农历年份不存在。 Conversion to Gregorian calendar failed. 换算为公历失败。 Calendar conversion failed for: %s. 日历换算失败: %s。 c-format Gnuplot was not found. 未找到gnuplot。 %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) 需要单独安装,并在可执行的搜索路径中找到,才能进行绘图。 c-format Select file to save PNG image to 将PNG图像保存为 Allowed File Types 允许的文件类型 All Files 所有文件 Cannot delete unit as it is needed by other units. do not delete units that are used by other units 无法删除单位,因为它被其他单位依赖。 none result is too long 结果过长 translator-credits tuberry <orzun@foxmail.com> Mode not found. 未找到模式。 Elements (in horizontal order) 元素(按水平顺序) Select file to import 选择要导入的文件 _Open 打开(_O) Select file to export to 选择导出到文件 A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? 存在同名的冲突对象。 若继续并保存更改,冲突对象将被覆盖或停用。 你想继续吗? Set key combination 设置组合键 Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) 按要用于操作的组合键 (按Escape取消)。 No keys 未按键 Empty value. 值为空。 Function not found. 未找到函数。 Variable not found. 未找到变量。 Unit not found. 未找到单位。 The key combination is already in use. Do you wish to replace the current action? 组合键已被占用。 是否要替换当前操作? Select file to export 选择要导出的文件 Empty expression. 表达式为空。 Empty x variable. x变量为空。 Element Data 元素数据 Classification 分类 Alkali Metal 碱金属 Alkaline-Earth Metal 碱土金属 Lanthanide 镧系元素 Actinide 锕系 Transition Metal 过渡金属 Metal 金属 Metalloid 类金属 Polyatomic Non-Metal 多原子非金属 Diatomic Non-Metal 双原子非金属 Noble Gas 惰性气体 Unknown chemical properties 未知化学性质 No unknowns in result. 结果中没有未知数。 Set Unknowns 设置未知数 Copy result to clipboard 将结果复制到剪贴板 x x If a matrix or vectors shall be generated from the contents of the file 若要从文件内容生成矩阵或向量 Use dark theme 使用深色主题 Add the two top values Keypad 将顶部两个值相加 u Manage units button u to Button for convert to operator to Add Keypad ArgumentEditDialog Name: 名称: Type: 类型: Free 任意 Number 数字 Integer 整数 Symbol 符号 Text 文本 Date 日期 Vector 向量 Matrix 矩阵 Boolean 布尔值 Angle 角度 Object 对象 Function 函数 Unit 单位 Variable 变量 File 文件 Enable rules and type test 启用规则和类型测试 Custom condition: 自定义条件: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) 例如,若参数必须是一个有相同数量行和列的矩阵:rows(\x) = columns(\x) Allow matrix 允许矩阵 Forbid zero 禁用零 Handle vector 处理向量 Calculate function for each separate element in vector. 对向量中每个单独元素计算函数。 Min 最小 Include equals 包含等于 Max 最大 CSVDialog Import CSV File 导入CSV文件 Export CSV File 导出CSV文件 Current result 当前结果 Matrix/vector variable: 矩阵/向量变量: File: 文件: Import as 导入为 matrix 矩阵 vectors 向量 Name: 名称: First row: 第一行: Includes headings 包括标题 Delimiter: 分隔符: Comma 逗号 Tabulator 制表符 Semicolon 分号 Space 空格 Other 其他 Question A unit or variable with the same name already exists. Do you want to overwrite it? 已存在同名的单位或变量。 是否要覆盖它? Error Could not import from file %1 无法从文件导入 %1 No matrix or vector variable with the entered name was found. Could not export to file %1 无法导出到文件 %1 CalendarConversionDialog Calendar Conversion 日历换算 Gregorian 格里高利历(公历/阳历) Hebrew 希伯来历(犹太历) Islamic (Hijri) 伊斯兰历(回历/Hijri) Persian (Solar Hijri) 波斯历(Solar Hijri) Indian (National) 印度历(国立) Chinese 中国历(农历/阴历) Julian 儒略历 Revised Julian (Milanković) 修订儒略历(Milanković) Coptic 科普特历(Coptic) Ethiopian 埃塞俄比亚历(Ethiopian) Error The selected Chinese year does not exist. 所选的农历年份不存在。 Conversion to Gregorian calendar failed. 换算为公历失败。 Calendar conversion failed for: %1. 日历换算失败: %1。 DataObjectEditDialog %1: %1: Default 默认值 Approximate 近似值 Exact 精确 Edit Data Object 编辑数据对象 New Data Object 新建数据对象 DataPropertyEditDialog Name: 名称: Title: 标题: Descriptive name: 描述性名称: Description: 描述: Value type: 值类型: Expression 表达式 Number 数字 Text 文本 Unit expression: 单位表达式: Use as key 用作键 Case sensitive value 区分大小写的值 Approximate value 近似值 Value uses brackets 值使用括号 Hide 隐藏 Edit Data Property 编辑数据属性 DataSetEditDialog General 通用 Properties 属性 Function 函数 Title: 标题: Descriptive name: 描述性名称: Data file: 数据文件: Description: 描述: Copyright: 版权: Title 标题 Name 名称 Type 类型 Add Edit 编辑 Remove 移除 Name: 名称: Object argument name: 对象参数名称: Property argument name: 属性参数名称: Default property: 默认属性: text 文本 approximate 近似 number expression expression key Question A function with the same name already exists. Do you want to overwrite the function? 已存在同名函数。 是否要覆盖函数? Data Sets 数据集 Object 对象 Property 属性 Edit Data Set 编辑数据集 New Data Set 新建数据集 DataSetsDialog Data Sets 数据集 Data sets: 数据集: New… 新建… Edit… 编辑… Delete 删除 Objects: 对象: Data set description: 数据集描述: Object attributes: 对象属性: Properties 属性 key Data Retrieval Function 数据检索函数 argument 参数 ExpressionEdit matrix 矩阵 vector 向量 positive 正数 non-positive 非正数 negative 负数 non-negative 非负数 non-zero 非零 boolean 布尔值 integer 整数 rational 有理数 real 实数 complex 复数 number (not matrix) (非矩阵) unknown 未知 default assumptions 默认假设 Prefix: 前缀: Complex Angle/Phasor Notation 复角/相量记号 Base units 基本单位 Number Base 数字进制 Binary-Coded Decimal 二進碼十進數 Bijective Base-26 双射基-26 Binary Number 二进制数 Calendars 日历 Complex cis Form 复纯虚数指数形式 Decimal Number 十进制数 Duodecimal Number 十二进制数 Complex Exponential Form 复指数形式 Factors 因子 16-bit Floating Point Binary Format 16位浮点二进制格式 32-bit Floating Point Binary Format 32位浮点二进制格式 64-bit Floating Point Binary Format 64位浮点二进制格式 80-bit (x86) Floating Point Binary Format 80位(x86)浮点二进制格式 128-bit Floating Point Binary Format 128位浮点二进制格式 Fraction 分数 Decimal Fraction 十进分数 Hexadecimal Number 十六进制数 Latitude 纬度 Longitude 经度 Mixed Units 混合单位 Octal Number 八进制数 Optimal Unit 最优单位 Optimal Prefix 最优前缀 Expanded Partial Fractions 展开部分分式 Complex Polar Form 复极坐标形式 Complex Rectangular Form 复矩形形式 Roman Numerals 罗马数字 Sexagesimal Number 六十进制数 Time Format 时间格式 Unicode Unicode UTC Time Zone UTC时区 Undo 撤消 Redo 重做 Cut 剪切 Copy 复制 Paste 粘贴 Delete 删除 Calculate Selection 计算选择 Insert Date… 插入日期… Insert Matrix… 插入矩阵… Select All 全选 Clear 清除 Clear History 清除历史记录 Completion 补全 No completion 无补全 Limited strict completion 有限严格补全 Strict completion 严格补全 Limited full completion 有限全面补全 Full completion 全面补全 Delayed completion 延迟补全 Expression Status 表达式状态 Off In history list In expression field With delay 有延迟 Without delay 不延误 Automatically calculate selection Use input method 使用输入法 Matrix 矩阵 Too many arguments for %1(). %1()的参数太多。 argument 参数 %1: %1: comment MC (memory clear) MC(存值清除) MS (memory store) MS(存值存入) M+ (memory plus) M+(存值加上) M− (memory minus) M−(存值减去) factorize 分解 expand 展开 hexadecimal 十六进制 hexadecimal number 十六进制数 octal 八进制 octal number 八进制数 decimal 十进制 decimal number 十进制数 duodecimal 十二进制 duodecimal number 十二进制数 binary 二进制 binary number 二进制数 roman 罗马 roman numerals 罗马数字 bijective 双射 bijective base-26 双射基-26 binary-coded decimal 二進碼十進數 sexagesimal 六十进制 sexagesimal number 六进制数 latitude 纬度 longitude 经度 32-bit floating point 32位浮点 64-bit floating point 64位浮点 16-bit floating point 16位浮点 80-bit (x86) floating point 80位(x86)浮点 128-bit floating point 128位浮点 time 时间 time format 时间格式 bases 进制 number bases 数字进制 calendars 日历 optimal 最优 optimal unit 最优单位 prefix 前缀 optimal prefix base 基本 base units 基本单位 mixed 混合 mixed units 混合单位 decimals decimal fraction fraction 分数 factors 因子 partial fraction 部分分式 expanded partial fractions 已展开部分分式 rectangular 矩形 cartesian 笛卡尔 complex rectangular form 复矩形形式 exponential 指数型 complex exponential form 复指数形式 polar 极坐标 complex polar form 复极坐标形式 complex cis form 复纯虚数指数(cis)形式 angle 角度 complex angle notation 复角记号 phasor 相量 complex phasor notation 复相量记号 UTC time zone UTC时区 number base %1 数字进制 %1 Data object 数据对象 FPConversionDialog Floating Point Conversion (IEEE 754) 浮点换算(IEEE 754) Format 格式 16-bit (half precision) 16位(半精度) 32-bit (single precision) 32位(单精度) 64-bit (double precision) 64位(双精度) 80-bit (x86 extended format) 80位 (x86扩展格式) 128-bit (quadruple precision) 128位(四倍精度) Microchip 24-bit Microchip 32-bit Value Decimal value 十进制值 Binary representation 二进制表示 Hexadecimal representation 十六进制表示 Floating point value 浮点值 Conversion error 换算误差 FunctionEditDialog Required 必需的 Details 细节 Description 描述 Name: 名称: Expression: 表达式: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x、y 和 z(例如“(x+y)/2”)或 \x、\y、\z、\a、\b、…(例如“(\x+\y)/2”) Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") 使用x、y 和 z(例如“(x+y)/2”)或 \x、\y、\z、\a、\b、…(例如“(\x+\y)/2”) Category: 类别: Descriptive name: 描述性名称: Hide function 隐藏函数 Example: 示例: Description: 描述: Condition: 条件: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") 函数必须为真的条件。例如,若第二个参数必须大于第一个参数: “\y > \x” Sub-functions: 子函数: Expression 表达式 Precalculate 预计算 Reference 参考 Add Edit 编辑 Remove 移除 Arguments: 参数: Name 名称 Type 类型 Question A function with the same name already exists. Do you want to overwrite the function? 已存在同名函数。 是否要覆盖函数? Edit Function 编辑函数 New Function 新建函数 FunctionsDialog Functions 函数 Category 类别 Function 函数 New… 新建… Edit… 编辑… Deactivate 停用 Delete 删除 Calculate… 计算… Apply 应用 Insert 插入 Favorite 收藏夹 argument 参数 Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. 从 %1 数据集中检索与所给对象和属性相关的数据。若将“info”键入为属性,则会弹出一个包含该对象的所有属性的对话框窗口。 Example: 示例: Arguments 参数 optional optional argument 可选 default: argument default 默认值: Requirement: Required condition for function 要求: Properties 属性 %1: %1: key indicating that the property is a data set key Activate 激活 All All functions 全部 Uncategorized 未分类 User functions 用户功能 Favorites 收藏夹 Inactive 不常用 HistoryView Insert Value 插入值 Insert Text 插入文本 Copy 复制 Copy Formatted Text 复制格式化文本 Copy unformatted ASCII 复制未格式化的 ASCII Select All 全选 Search… 搜索… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. <span font="10">在上面键入一个数学表达式,例如“5+2/3”, 然后按Enter键。</span> Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. 在上面键入一个数学表达式,例如“5+2/3”,然后按Enter键。 Exchange rate source(s): updated %1 Comment Protect 保护 Add Comment… Move to Top 移动到顶部 Remove 移除 Clear 清除 Edit Comment… Text: 文本: Search 搜索 KeypadButton <i>Right-click/long press</i>: %1 <i>右键/长按</i>: %1 <i>Right-click</i>: %1 <i>右键</i>: %1 <i>Long press</i>: %1 <i>长按</i>: %1 Open menu <i>Middle-click</i>: %1 <i>中键</i>: %1 KeypadWidget Memory store 存值存入 Memory clear 存值清除 Memory recall 存值读取 Memory add 存值加上 Memory subtract 存值减去 STO Standard calculator button. Do not use more than three characters. STO Store 存储 New function 新建函数 sin sin cos cos tan tan Exponentiation Percent or remainder Uncertainty/interval 不确定度/区间 Relative error 相对误差 Interval 区间 Move cursor left Move cursor to start Move cursor right Move cursor to end Logical AND 逻辑与 Logical OR 逻辑或 Bitwise Exclusive OR 按位异或 Logical NOT 逻辑非 Bitwise Left Shift 按位左移 Bitwise Right Shift 按位右移 cmp rot a→1 Expand partial fractions 展开部分分式 Enable units in physical constants 物理常数单位 All constants Toutes les constantes Percentage Calculation Tool 百分比计算 more 更多 All units 所有单位 All variables 所有变量 Action 动作 Interval Display 区间显示 Adaptive 自适应 Significant digits 有效数字 Plus/minus 加/减 Relative 相对 Concise Interval Calculation 区间计算 Variance formula 方差公式 Interval arithmetic 区间运算 Allow concise uncertainty input Complex number form 复数形式 Rectangular 矩形 Exponential 指数型 Polar 极坐标 Angle/phasor 角/相量 Type Assumptions type 类型 Sign Assumptions sign 符号 Default assumptions 默认假设 Number 数字 Real 实数 Rational 有理数 Integer 整数 Boolean 布尔值 Unknown Unknown assumptions sign 未知数 Non-zero 非零数 Positive 正数 Non-negative 非负数 Negative 负数 Non-positive 非正数 Factorize 分解 Expand 展开 Add column Add row Remove column Remove row Left parenthesis 左括号 Left vector bracket 左向量括号 Right parenthesis 右括号 Right vector bracket 右向量括号 Smart parentheses 智能括号 Vector brackets 向量括号 Argument separator 参数分隔符 Blank space 空白处 New line 新建行 Decimal point 小数点 Previous result (static) 前一个结果(静态) Multiplication Button Action 按钮动作 Label: 标签: Action: 动作: None Value: 值: Bitwise AND 按位与 Bitwise Shift 按位移位 Delete 删除 Backspace 退格键 Addition Plus Subtraction Minus Division Bitwise OR 按位或 Bitwise NOT 按位非 Clear expression 清除表达式 Calculate expression 计算表达式 NamesEditDialog Name 名称 Abbreviation 缩写 Plural 复数 Reference 参考 Avoid input 避免输入 Unicode Unicode Suffix 后缀 Case sensitive 区分大小写 Completion only 仅补全 Add Edit 编辑 Remove 移除 Warning Illegal name 非法名称 A function with the same name already exists. 已存在同名函数。 A unit or variable with the same name already exists. 已存在同名的单位或变量。 PercentageCalculationDialog Percentage 百分比 Value 1 甲值 Value 2 乙值 Change from 1 to 2 甲转变为乙 Change from 2 to 1 乙转变为甲 2 compared to 1 乙相比于甲 1 compared to 2 甲相比于乙 Enter two values, of which at most one is a percentage, and the others will be calculated for you. 输入两个值,其中最多一个是百分比,其他值会帮你计算。 Clear 清除 PeriodicTableDialog Periodic Table 元素周期表 Element Data 元素数据 Alkali Metal 碱金属 Alkaline-Earth Metal 碱土金属 Lanthanide 镧系元素 Actinide 锕系 Transition Metal 过渡金属 Metal 金属 Metalloid 类金属 Polyatomic Non-Metal 多原子非金属 Diatomic Non-Metal 双原子非金属 Noble Gas 惰性气体 Unknown chemical properties 未知化学性质 Unknown 未知数 %1: %1: PlotDialog Plot 作图 Data 数据 Title: 标题: Expression: 表达式: Function 函数 Vector/matrix 向量/矩阵 Paired matrix 成对矩阵 Rows X variable: X变量: Style: 风格: Line 线 Points Line with points 点+线 Boxes/bars 框/条 Histogram 直方图 Steps 步骤 Candlesticks K线图 Dots 小点 Polar 极坐标 Smoothing: 平滑: None Monotonic 单调 Natural cubic splines 自然三次样条 Bezier 贝塞尔 Bezier (monotonic) 贝塞尔(单调) Y-axis: Y轴: Primary 主坐标轴 Secondary 次坐标轴 Add Apply 应用 Remove 移除 Title 标题 Expression 表达式 Function Range 函数范围 Minimum x value: 最小x值: Maximum x value: 最大x值: Sampling rate: 采样率: Step size: 步长: Show real and imaginary parts Appearance 外观 Display grid 显示网格 Display full border 显示完整边框 Minimum y value: 最小y值: Maximum y value: 最大y值: Logarithmic x scale: 对数x刻度: Logarithmic y scale: 对数y刻度: X-axis label: X轴标签: Y-axis label: Y轴标签: Line width: 线宽: Legend placement: 图例位置: Top-left 左上 Top-right 右上 Bottom-left 左下 Bottom-right 右下 Below 下面 Outside 外面 Calculating… 计算中… Cancel 取消 Processing… 处理中… PreferencesDialog Look && Feel 外观 Numbers && Operators 数字和运算符 Units && Currencies 单位和货币 Parsing && Calculation 解析计算 Ignore system language (requires restart) 忽略系统语言(需要重启) Allow multiple instances 允许多个实例 Clear history on exit 退出时清除历史记录 Keep above other windows Window title: 窗口标题: Application name 应用程序名称 Result 结果 Application name + result 应用程序名称+结果 Style: 风格: Default (requires restart) Default style 默认值(需要重启) Dark mode 黑暗模式 Colorize result Custom result font 自定义结果字体 Custom expression font 自定义表达式字体 Custom keypad font 自定义键盘字体 Custom application font 自定义应用程序字体 Preferences 首选项 Workspace 工作区 Application name + workspace 应用程序名称+工作区 Custom result font: 自定义结果字体: Custom expression font: 自定义表达式字体: Custom keypad font: 自定义键盘字体: Custom application font: 自定义应用程序字体: Display expression status 显示表达式状态 Delay: 延时: ms milliseconds ms Expression after calculation: Keep expression Clear expression 清除表达式 Replace with result Replace with result if shorter Use keyboard keys for RPN 用键盘键操作RPN Close application with Escape key Parsing mode: 解析模式: Adaptive 自适应 Conventional 常规 Implicit multiplication first 隐式优先 Chain 链式 RPN RPN Read precision 读取精度 Limit implicit multiplication 限制隐式乘法 Interval calculation: 区间计算: Variance formula 方差公式 Interval arithmetic 区间运算 Factorize result 分解结果 Binary two's complement representation 二进制二的补码表示 Hexadecimal two's complement representation 十六进制二进制补码表示 Use lower case letters in non-decimal numbers 非十进制数使用小写 Spell out logical operators 拼出逻辑运算符 Use E-notation instead of 10^n 使用E符号代替10^n Use 'j' as imaginary unit 用 j 作虚数单位 Use comma as decimal separator 将逗号作为小数分隔符 Ignore comma in numbers 忽略数字中的逗号 Ignore dots in numbers 忽略数字中的点 Round halfway numbers to even 中数约至偶数 Indicate repeating decimals 指示循环小数 Language: 语言: Max history lines saved: Use caret for bitwise XOR 插入符号(^)作为按位异或 Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Expression status: 表达式状态: Off In history list In expression field Status tooltip delay: Automatically calculate selection Expression in history: Parsed Entered Entered + parsed Automatically copy result Simplified percentage calculation Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary 二进制 Hexadecimal 十六进制 Binary bits: Automatic 自动的 Use special duodecimal symbols Use dot as multiplication sign Use Unicode division slash in output Copy unformatted ASCII by default Digit grouping: 数字分节: None Standard 标准 Local 本地 Automatically group digits in input (experimental) Interval display: 区间显示: Significant digits 有效数字 Interval 区间 Plus/minus 加/减 Concise Midpoint 中点 Lower Upper Rounding: Round halfway numbers away from zero Complex number form: 复数形式: Rectangular 矩形 Exponential 指数型 Polar 极坐标 Angle/phasor 角/相量 Enable units Abbreviate names 缩写名称 Use binary prefixes for information units 信息单位使用二进制前缀 Automatic unit conversion: No conversion Base units 基本单位 Optimal units 最优单位 Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Restart required Please restart the program for the language change to take effect. Default 默认值 Calculate as you type delay: Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes 无前缀 Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes 启用所有SI前缀 Enable denominator prefixes 启用分母前缀 Enable units in physical constants 物理常数单位 Temperature calculation: 温度计算模式: Absolute 绝对 Relative 相对 Hybrid 混合 Exchange rates updates: 汇率更新: %n day(s) %n天 days QApplication Execute expressions and commands from a file 执行文件中的表达式和命令 FILE 文件 Start a new instance of the application 启动一个新的程序实例 Specify the window title 指定窗口标题 TITLE TITLE Display the application version 显示应用程序版本 Open workspace Expression to calculate 要计算的表达式 [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? 默认情况下,只允许打开%1的一个实例(一个主窗口)。 若同时打开多个实例,只有最后一个关闭窗口的定义(变量、函数等)、模式、偏好和历史记录会被保存。 尽管这样,你是否想改变默认的行为,允许同时打开多个实例? Allow multiple instances? %1 is already running. Failed to load global definitions! 加载全局定义失败! answer 答案 History Answer Value 历史答案 History Index(es) 历史索引 History index %s does not exist. 历史索引 %s 不存在。 Last Answer 上一答案 Answer 2 答案二 Answer 3 答案三 Answer 4 答案四 Answer 5 答案五 Memory 存值 Error Couldn't write preferences to %1 无法将首选项写入 %1 Function not found. 未找到函数。 Variable not found. 未找到变量。 Unit not found. 未找到单位。 Unsupported base. 不支持该进制。 Unsupported value. QalculateQtSettings Update exchange rates? 更新汇率? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? 距上次更新汇率已过了%n天。 您想现在更新汇率吗? Fetching exchange rates. 获取汇率。 Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… 获取汇率… Error Warning Information Path of executable not found. 未找到可执行文件的路径。 curl not found. 未找到 curl。 Failed to run update script. %1 运行更新脚本失败。 %1 Failed to check for updates. 无法检查更新。 No updates found. 无更新。 A new version of %1 is available at %2. Do you wish to update to version %3? %1 的新版本可在 %2 获得。 是否要更新到版本 %3? A new version of %1 is available. You can get version %3 at %2. %1 有可用的新版本 %3。 您可以在 %2 获取。 Download %1: %2 Insert function 插入函数 Insert function (dialog) 插入函数(对话框) Insert variable 插入变量 Approximate result Negate 取反 Invert 取倒 Insert unit 插入单位 Insert text 插入文本 Insert operator Insert date 插入日期 Insert matrix 插入矩阵 Insert smart parentheses 插入智能括号 Convert to unit 换算为单位 Convert 换算 Convert to optimal unit 换算为最优单位 Convert to base units 换算为基本单位 Convert to optimal prefix 换算为最优前缀 Convert to number base 换算为数字进制 Factorize result 分解结果 Expand result 展开结果 Expand partial fractions 展开部分分式 RPN: down RPN: 向下 RPN: up RPN: 向上 RPN: swap RPN: 交换 RPN: copy RPN: 复制 RPN: lastx RPN: lastx RPN: delete register RPN: 删除寄存器 RPN: clear stack RPN: 清空栈 Set expression base 设置表达式进制 Set result base 设置结果进制 Set angle unit to degrees 将角度单位设为度 Set angle unit to radians 将角度单位设为弧度 Set angle unit to gradians 将角度单位设为梯度 Active normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode 切换RPN模式 Show general keypad Toggle programming keypad 切换编程键盘 Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history 搜索历史记录 Clear history 清除历史记录 Show variables Show functions Show units Show data sets Store result 存储结果 MC (memory clear) MC(存值清除) MR (memory recall) MR(存值读取) MS (memory store) MS(存值存入) M+ (memory plus) M+(存值加上) M− (memory minus) M−(存值减去) New variable 新建变量 New function 新建函数 Open plot functions/data 打开函数/数据作图 Open convert number bases 打开进制换算 Open floating point conversion 打开浮点换算 Open calender conversion 打开日历换算 Open percentage calculation tool 打开百分比计算 Open periodic table 打开元素周期表 Update exchange rates 更新汇率 Copy result 复制结果 Insert result Open mode menu Open menu Help 帮助 Quit 退出 Toggle chain mode 切换链式模式 Toggle keep above Show completion (activate first item) Clear expression 清除表达式 Delete 删除 Backspace 退格键 Home End Right Left Up 向上 Down 向下 Undo 撤消 Redo 重做 Calculate expression 计算表达式 Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default 默认值 Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing 确定 Cancel Only used when Qt translation is missing 取消 Close Only used when Qt translation is missing 关闭 &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing 打开 &Save Only used when Qt translation is missing 保存 &Select All Only used when Qt translation is missing 全选 Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu New 新建 Function… 函数… Variable/Constant… 变量/常数… Unknown Variable… 未知变量… Matrix… 矩阵… Workspaces 工作区 Open… 打开… Open default 打开默认 Save 保存 Save As… 另存为… Import CSV File… 导入CSV文件… Export CSV File… 导出CSV文件… Functions 函数 Variables and Constants 变量和常数 Units 单位 Plot Functions/Data 函数/数据绘图 Floating Point Conversion (IEEE 754) 浮点换算(IEEE 754) Calendar Conversion 日历换算 Update Exchange Rates 更新汇率 Normal Mode 正常模式 RPN Mode 逆波兰模式 Chain Mode 链式模式 Keyboard Shortcuts 键盘快捷键 Preferences 首选项 Help 帮助 Report a Bug 报告错误 Check for Updates 检查更新 About %1 关于%1 Quit 退出 Mode 模式 Mode (%1) 模式(%1) General Display Mode 一般显示模式 Normal 常规 Scientific 科学 Engineering 工程 Simple 简单 Angle Unit 角度单位 Radians 弧度 Degrees Gradians 梯度 Approximation 近似估算 Automatic Automatic approximation 自动的 Dual Dual approximation Exact Exact approximation 精确 Approximate 近似值 Assumptions 前提假设 Type Assumptions type 类型 Number 数字 Real 实数 Rational 有理数 Integer 整数 Boolean 布尔值 Sign Assumptions sign 符号 Unknown Unknown assumptions sign 未知数 Non-zero 非零数 Positive 正数 Non-negative 非负数 Negative 负数 Non-positive 非正数 Result Base 设置结果进制 Binary 二进制 Octal 八进制 Decimal 十进制 Hexadecimal 十六进制 Other 其他 Duodecimal 十二进制 Sexagesimal 六十进制 Time format 时间格式 Roman numerals 罗马数字 Unicode Unicode Bijective base-26 Bijective base-26 Binary-encoded decimal (BCD) 二進碼十進數 Custom: Number base Expression Base 设置表达式进制 Other: Number base 其他: Precision: 精确度: Min decimals: 最小小数: Max decimals: 最大小数: off Max decimals Convert 换算 Convert (%1) 换算(%1) Store 存储 Store (%1) 存储(%1) Functions (%1) 函数(%1) Keypad 键盘 Keypad (%1) 键盘(%1) Number bases 数字进制 Unit… 单位… Data Sets 数据集 Percentage Calculation Tool 百分比计算 Periodic Table 元素周期表 Units (%1) 单位 (%1) Plot Functions/Data (%1) 函数/数据绘图 (%1) Number Bases (%1) 数字进制(%1) Binary: 二进制: Octal: 八进制: Decimal: 十进制: Hexadecimal: 十六进制: RPN Stack RPN栈 Rotate the stack or move the selected register up (%1) 循环栈或上移选定寄存器(%1) Rotate the stack or move the selected register down (%1) 循环栈或上移选定寄存器(%1) Swap the top two values or move the selected value to the top of the stack (%1) 交换顶部两个值或将所选值移到栈顶(%1) Copy the selected or top value to the top of the stack (%1) 将选定的或顶部值复制到栈顶(%1) Enter the top value from before the last numeric operation (%1) 输入上次数值操作前的顶部值(%1) Delete the top or selected value (%1) 删除顶部值或所选值(%1) Clear the RPN stack (%1) 清空RPN栈(%1) New Function… 新建函数… Favorites 收藏夹 Recent User functions 用户功能 Open dialog 打开对话框 Show all functions 显示所有功能 User units 用户单位 more 更多 Prefixes 前缀 Show all units 显示所有单位 User variables 用户变量 Show all variables 显示所有变量 Powerful and easy to use calculator 强大而易用的计算器 License: GNU General Public License version 2 or later Error Couldn't write definitions 无法写入定义 hexadecimal 十六进制 octal 八进制 decimal 十进制 duodecimal 十二进制 binary 二进制 roman 罗马 bijective 双射 sexagesimal 六十进制 latitude 纬度 longitude 经度 time 时间 Time zone parsing failed. 时区分析失败。 bases 进制 calendars 日历 rectangular 矩形 cartesian 笛卡尔 exponential 指数型 polar 极坐标 phasor 相量 angle 角度 optimal 最优 base 基本 mixed 混合 fraction 分数 factors 因子 Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad Copy 复制 prefix 前缀 partial fraction 部分分式 decimals factorize 分解 expand 展开 Calculating… 计算中… Cancel 取消 RPN Operation RPN操作 Factorizing… 分解中… Expanding partial fractions… 展开部分分式… Expanding… 展开中… Converting… 换算中… RPN Register Moved RPN寄存器已移动 Processing… 处理中… Matrix 矩阵 Temperature Calculation Mode 温度计算模式 The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). 表达方式有歧义。 请选择温度计算模式 (以后可以在偏好设置中更改)。 Absolute 绝对 Relative 相对 Hybrid 混合 Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Only dot as decimal separator Parsing Mode 解析模式 The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first 隐式优先 Conventional 常规 Adaptive 自适应 Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) 添加动作(%1) Edit Keyboard Shortcut New Keyboard Shortcut 新建键盘快捷键 Action: 动作: Value: 值: Set key combination 设置组合键 Press the key combination you wish to use for the action. 按要用于操作的组合键。 Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? 组合键已被占用。 是否要替换当前操作(%1)? Question Add… 加… Edit… 编辑… Remove 移除 Gnuplot was not found 未找到gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) 需要单独安装,并在可执行的搜索路径中找到,才能进行绘图。 Example: Example of function usage 示例: Enter RPN Enter 开始 Calculate 计算 Apply to Stack 应用于栈 Insert 插入 Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again 不再询问 Keep open 保持打开状态 Value Argument 参数 %1: %1: Plot 作图 General 通用 Programming 编程 Algebra 代数 Custom 定制 None Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>右键/长按</i>: %1 Open menu Number Bases 数字进制 Rotate the stack or move the selected register up 循环栈或上移选定寄存器 Rotate the stack or move the selected register down 循环栈或下移选定寄存器 Swap the top two values or move the selected value to the top of the stack 交换顶部两个值或将所选值移到栈顶 Delete the top or selected value 删除顶部值或所选值 Enter the top value from before the last numeric operation 输入上次数值操作前的顶部值 Copy the selected or top value to the top of the stack 将选定的或顶部值复制到栈顶 Clear the RPN stack 清空RPN栈 Action 动作 Key combination 组合键 True False Info 信息 optional optional argument 可选 Failed to open %1. %2 无法打开 %1 。 %2 UnitEditDialog General 通用 Relation 关系 Name: 名称: Category: 类别: Descriptive name: 描述性名称: System: 系统: Imperial 英制 US Survey 美制 Hide unit 隐藏单位 Description: 描述: Class: 类: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. 此单位所属的类。命名派生单位是相对于一个单一的其他单位而定义的,可以带有指数,而(未命名)派生单位是由含一个或多个单位的单位表达式定义的。 Base unit 基本单位 Named derived unit 命名派生单位 Derived unit 派生单位 Base unit(s): 基本单位: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to 该单位(对于命名派生单位)或单位表达式(对于未命名派生单位)的定义所关联(基于)的单位 Exponent: 指数: Relation: 关系: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). 与基本单位的关系。 对于线性关系,这应该只是一个数字。<br><br>对于非线性关系,用\x表示因子,用\y表示指数(例如,“\x + 273.15”表示摄氏度和开尔文之间的关系)。 Inverse relation: 逆关系: Specify for non-linear relation, for conversion back to the base unit. 指定非线性关系,以便换算回基本单位。 Mix with base unit 与基本单位混合 Priority: 优先级: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: 最小基本单位数: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default 默认使用前缀 Base unit does not exist. 基本单位不存在。 Error A unit or variable with the same name already exists. Do you want to overwrite it? 已存在同名的单位或变量。 是否要覆盖它? Question A variable or unit with the same name already exists. Do you want to overwrite it? 已存在同名的变量或单位。 是否要覆盖它? Edit Unit 编辑单位 New Unit 新建单位 UnitsDialog Units 单位 Category 类别 Unit 单位 New… 新建… Edit… 编辑… Deactivate 停用 Delete 删除 Convert 换算 Insert 插入 Favorite 收藏夹 Show hidden units 显示隐藏单位 Activate 激活 All All units 全部 Uncategorized 未分类 User units 用户单位 Favorites 收藏夹 Inactive 不常用 UnknownEditDialog Name: 名称: Custom assumptions 使用自定义假设 Type: 类型: Sign: 符号: Temporary 临时 Question A unit or variable with the same name already exists. Do you want to overwrite it? 已存在同名的单位或变量。 是否要覆盖它? Edit Unknown Variable 编辑未知变量 New Unknown Variable 新建未知变量 VariableEditDialog Name: 名称: Temporary 临时 Value: 值: Required 必需的 Description 描述 current result 当前结果 Category: 类别: Descriptive name: 描述性名称: Hide variable 隐藏变量 Description: 描述: Question A unit or variable with the same name already exists. Do you want to overwrite it? 已存在同名的单位或变量。 是否要覆盖它? Edit Variable 编辑变量 New Variable 新建变量 VariablesDialog Variables 变量 Category 类别 Variable 变量 New 新建 Variable/Constant… 变量/常数… Unknown Variable… 未知变量… Matrix… 矩阵… Edit… 编辑… Export… 导出… Deactivate 停用 Delete 删除 Insert 插入 Favorite 收藏夹 a matrix 矩阵 a vector 向量 positive 正数 non-positive 非正数 negative 负数 non-negative 非负数 non-zero 非零 integer 整数 boolean 布尔值 rational 有理数 real 实数 complex 复数 number not matrix 非矩阵 unknown 未知 Default assumptions 默认假设 Activate 激活 All All variables 全部 Uncategorized 未分类 User variables 用户变量 Favorites 收藏夹 Inactive 不常用 qalculate-qt-5.5.1/winicon.rc000066400000000000000000000001061475705355700161320ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "data/qalculate.ico"