commit 2ecdeb9296c91b18ad9a6db70846ff14f1534d68 Author: Sascha Peilicke Date: Tue Jul 22 18:14:46 2008 +0000 Added KGo to playground/games and integrated into build-system. svn path=/trunk/playground/games/kgo/; revision=836659 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..2543ecf --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Sascha Peilicke diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..00b01b0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,17 @@ +project(kgo) + +set(CMAKE_BUILD_TYPE Debug) +#set(CMAKE_BUILD_TYPE Release) + +find_package(KDE4 REQUIRED) +include_directories(${KDE4_INCLUDES}) +include(KDE4Defaults) +#include(GGZ) + +add_subdirectory(src) + +add_subdirectory(icons) +add_subdirectory(themes) +add_subdirectory(games) +add_subdirectory(sounds) +add_subdirectory(docs) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..10926e8 --- /dev/null +++ b/COPYING @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..fdc2242 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,3 @@ +0.1 : First release + + diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..0028305 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,1356 @@ +# Doxyfile 1.5.5 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, +# and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = Yes + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src/ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = Yes + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is enabled by default, which results in a transparent +# background. Warning: Depending on the platform used, enabling this option +# may lead to badly anti-aliased labels on the edges of a graph (i.e. they +# become hard to read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/TODO b/TODO new file mode 100644 index 0000000..636e595 --- /dev/null +++ b/TODO @@ -0,0 +1,8 @@ +* Ship further go board themes (two should be enough to show) + +* Add move controls to toolbar instead of Undo/Redo: + First Move | Previous Move | Next Move | Last Move + +* Add multiplayer support via GGZ and traditional Go servers + +* Implement the Demo mode diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt new file mode 100644 index 0000000..dd75aec --- /dev/null +++ b/docs/CMakeLists.txt @@ -0,0 +1 @@ +kde4_create_handbook(index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en) diff --git a/docs/index.docbook b/docs/index.docbook new file mode 100644 index 0000000..22a30db --- /dev/null +++ b/docs/index.docbook @@ -0,0 +1,489 @@ + + + + + + +]> + + + + +The &kgo; Handbook + + + + + Sascha Peilicke + +
sasch.pe@gmx.de
+
+
+ +
+ + + 2008-04-15 + Sascha Peilicke + + + + +2008-04-15 +0.1 + + + KGo is an open-source implementation of the popular Go game (also known as Weiqi). + + + KDE + &kgo; + +
+ + + + + Introduction + +&kgo; is a program that lets you do absolutely nothing. Please report +any problems or feature requests to the &kde; mailing lists. + + + + + +Using &kgo; + + + + + + + + +Here's a screenshot of &kgo; + + + + + + + + + Screenshot + + + + + + + +More &kgo; features + +It slices! It dices! and it comes with a free toaster! + +The Squiggle Tool + + + + + + + + Squiggle + + is used to draw squiggly lines all over +the &kgo; main window. It's not a bug, it's a feature! + + + + + + +Command Reference + + + + +The main &kgo; window + + +The File Menu + + + + + +&Ctrl;N + +File +New + +Creates a new document + + + + +&Ctrl;S + +File +Save + +Saves the document + + + + +&Ctrl;Q + +File +Quit + +Quits &kgo; + + + + + + + +The <guimenu>Help</guimenu> Menu + + + + + + +&help.menu.documentation; + + + + + + +Developer's Guide to &kgo; + + + + +Programming &kgo; plugins is a joy to behold. Just read through the next +66 pages of API's to learn how! + + + + + + +XtUnmanageChildren +Xt - Geometry Management + + +XtUnmanageChildren + +remove a list of children from a parent widget's managed +list. +widgetsremoving +XtUnmanageChildren + + + + + +4 March 1996 + + +void XtUnmanageChildren(children, num_children) + WidgetList children; + Cardinal num_children; + + + +Inputs + + +children + + +Specifies an array of child widgets. Each child must be of +class RectObj or any subclass thereof. + + + + +num_children + + +Specifies the number of elements in children. + + + + + + + +Description + +XtUnmanageChildren() unmaps the specified widgets +and removes them from their parent's geometry management. +The widgets will disappear from the screen, and (depending +on its parent) may no longer have screen space allocated for +them. + +Each of the widgets in the children array must have +the same parent. + +See the “Algorithm” section below for full details of the +widget unmanagement procedure. + + + + +Usage +Unmanaging widgets is the usual method for temporarily +making them invisible. They can be re-managed with +XtManageChildren(). + +You can unmap a widget, but leave it under geometry +management by calling XtUnmapWidget(). You can +destroy a widget's window without destroying the widget by +calling XtUnrealizeWidget(). You can destroy a +widget completely with XtDestroyWidget(). + +If you are only going to unmanage a single widget, it is +more convenient to call XtUnmanageChild(). It is +often more convenient to call XtUnmanageChild() +several times than it is to declare and initialize an array +of widgets to pass to XtUnmanageChildren(). Calling +XtUnmanageChildren() is more efficient, however, +because it only calls the parent's change_managed() +method once. + + + + +Algorithm + +XtUnmanageChildren() performs the following: + + + +- + + +Ignores the child if it already is unmanaged or is being +destroyed. + + + + +- + + +Otherwise, if the child is realized, it makes it nonvisible +by unmapping it. + + + + + + + + + +Structures +The WidgetList type is simply an array of widgets: + +typedef Widget *WidgetList; + + + + + + + +Questions and Answers + + + +&reporting.bugs; +&updating.documentation; + + + + +My Mouse doesn't work. How do I quit &kgo;? + + +You silly goose! Check out the Commands +Section for the answer. + + + + +Why can't I twiddle my documents? + + +You can only twiddle your documents if you have the foobar.lib +installed. + + + + + + + + + +Credits and License + + +&kgo; + + +Program copyright 2007 Sascha Peilicke sasch.pe@gmx.de + + +Contributors: + +Konqui the KDE Dragon konqui@kde.org + +Tux the Linux Penguin tux@linux.org + + + + + +Documentation Copyright © 2007 Sascha Peilicke sasch.pe@gmx.de + + + + +&underFDL; + + + +&underGPL; + + + + +Installation + + +How to obtain &kgo; + + + +&install.intro.documentation; + + + + +Requirements + + + + +In order to successfully use &kgo;, you need &kde; 1.1. Foobar.lib is +required in order to support the advanced &kgo; features. &kgo; uses +about 5 megs of memory to run, but this may vary depending on your +platform and configuration. + + + +All required libraries as well as kgo; itself can be found +on The &kgo; home page. + + + + +You can find a list of changes at http://apps.kde.org/kapp. + + + + +Compilation and Installation + + + + + +&install.compile.documentation; + + + + +Configuration + +Don't forget to tell your system to start the dtd +dicer-toaster daemon first, or &kgo; won't work ! + + + + + +&documentation.index; +
+ + diff --git a/games/CMakeLists.txt b/games/CMakeLists.txt new file mode 100644 index 0000000..a9718d1 --- /dev/null +++ b/games/CMakeLists.txt @@ -0,0 +1,3 @@ +install(FILES + kgo_default_games.zip +DESTINATION ${DATA_INSTALL_DIR}/kgo/games) diff --git a/games/kgo_default_games.zip b/games/kgo_default_games.zip new file mode 100644 index 0000000..a83e45a Binary files /dev/null and b/games/kgo_default_games.zip differ diff --git a/icons/CMakeLists.txt b/icons/CMakeLists.txt new file mode 100644 index 0000000..02e3c9e --- /dev/null +++ b/icons/CMakeLists.txt @@ -0,0 +1 @@ +kde4_install_icons(${ICON_INSTALL_DIR}) diff --git a/icons/hi128-app-kgo.png b/icons/hi128-app-kgo.png new file mode 100644 index 0000000..2fe70e9 Binary files /dev/null and b/icons/hi128-app-kgo.png differ diff --git a/icons/hi16-app-kgo.png b/icons/hi16-app-kgo.png new file mode 100644 index 0000000..4839fa2 Binary files /dev/null and b/icons/hi16-app-kgo.png differ diff --git a/icons/hi22-app-kgo.png b/icons/hi22-app-kgo.png new file mode 100644 index 0000000..271430e Binary files /dev/null and b/icons/hi22-app-kgo.png differ diff --git a/icons/hi32-app-kgo.png b/icons/hi32-app-kgo.png new file mode 100644 index 0000000..deb7f42 Binary files /dev/null and b/icons/hi32-app-kgo.png differ diff --git a/icons/hi48-app-kgo.png b/icons/hi48-app-kgo.png new file mode 100644 index 0000000..049aad4 Binary files /dev/null and b/icons/hi48-app-kgo.png differ diff --git a/icons/hi64-app-kgo.png b/icons/hi64-app-kgo.png new file mode 100644 index 0000000..2e00e92 Binary files /dev/null and b/icons/hi64-app-kgo.png differ diff --git a/sounds/CMakeLists.txt b/sounds/CMakeLists.txt new file mode 100644 index 0000000..3bc8014 --- /dev/null +++ b/sounds/CMakeLists.txt @@ -0,0 +1,2 @@ +install(FILES kgo.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kgo) +#install(FILES kgo-click.wav kgo-won.wav DESTINATION ${DATA_INSTALL_DIR}/kgo/sounds) diff --git a/sounds/kgo.notifyrc b/sounds/kgo.notifyrc new file mode 100644 index 0000000..e69de29 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..0334955 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,30 @@ +set(kgo_SRCS + game/gtp.cpp + gui/config.cpp + gui/themerenderer.cpp + gui/gamescene.cpp + gui/gameview.cpp + gui/gamescreen.cpp + gui/setupscreen.cpp + gui/mainwindow.cpp + main.cpp +) + +kde4_add_ui_files(kgo_SRCS + gui/config.ui + gui/gamescreen.ui + gui/setupscreen.ui +) +kde4_add_kcfg_files(kgo_SRCS preferences.kcfgc) +kde4_add_app_icon(kgo_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/../icons/hi*-app-kgo.png") +kde4_add_executable(kgo ${kgo_SRCS}) + +target_link_libraries(kgo ${KDE4_KDEUI_LIBS} kdegames ${KDE_KNEWSTUFF2_LIBS} ${KGGZGAMES_LIBS}) + +install(TARGETS kgo DESTINATION ${BIN_INSTALL_DIR}) +install(FILES gui/kgo.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) +install(FILES gui/kgoui.rc DESTINATION ${DATA_INSTALL_DIR}/kgo) +install(FILES kgo.kcfg DESTINATION ${KCFG_INSTALL_DIR}) +install(FILES kgo.knsrc DESTINATION ${CONFIG_INSTALL_DIR}) + +#register_ggz_module(module.dsc) diff --git a/src/Mainpage.dox b/src/Mainpage.dox new file mode 100644 index 0000000..29a1073 --- /dev/null +++ b/src/Mainpage.dox @@ -0,0 +1,12 @@ +/** @mainpage KGo API Reference + +KGo is an open-source implementation of the popular Go game written specifically for KDE. + +@authors +Sascha Peilicke + +Released under the terms of the GNU General Public license version 3 +*/ + +// DOXYGEN_NAME=kgo +// DOXYGEN_ENABLE=yes diff --git a/src/game/gtp.cpp b/src/game/gtp.cpp new file mode 100644 index 0000000..96ded71 --- /dev/null +++ b/src/game/gtp.cpp @@ -0,0 +1,921 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the classes Gtp, Gtp::Stone + * and Gtp::Score, which together implement a Go Text Protocol (GTP) + * interface to communicate with Go engines supporting GTP protocol + * version 2. + * + * @author Sascha Peilicke + */ +#include "gtp.h" + +#include +#include + +#include + +namespace KGo { + +Gtp::Stone::Stone(const QString &stone) + : m_x(stone[0].toLatin1()) + , m_y(stone.mid(1).toInt()) +{ +} + +bool Gtp::Stone::isValid() const +{ + if (m_y >= 1 && m_y <= 19 && ((m_x >= 'a' && m_x < 't') || (m_x >= 'A' && m_x <= 'T'))) + return true; + else + return false; +} + +QByteArray Gtp::Stone::toLatin1() const +{ + QByteArray msg; + msg.append(m_x); + msg.append(m_y); + return msg; +} + +QString Gtp::Stone::toString() const +{ + return QString("%1%2").arg(m_x).arg(m_y); +} + +Gtp::Score::Score(const QString &scoreString) +{ + if (scoreString[0] == 'W') + m_player = PlayerWhite; + else + m_player = PlayerBlack; + int i = scoreString.indexOf(' '); + m_score = scoreString.mid(2, i - 1).toInt(); + //m_upperBound = scoreString.mid( + //TODO: Implement Score class, the bounds should be considered optional and can + // be the same as the score if none given +} + +bool Gtp::Score::isValid() const +{ + return m_score >= 0 ? true : false; +} + +QString Gtp::Score::toString() const +{ + return QString("%1+%2 (upper bound: %3, lower: %4").arg(m_player == PlayerWhite ? "W" : "B").arg(m_score).arg(m_upperBound).arg(m_lowerBound); +} + +//////////////////////////////////////////////////////////////////// + +Gtp::Gtp() +{ + connect(&m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(readStandardOutput())); + connect(&m_process, SIGNAL(readyReadStandardError()), this, SLOT(readStandardError())); + connect(&m_process, SIGNAL(error(QProcess::ProcessError)), SIGNAL(error(QProcess::ProcessError))); +} + +Gtp::~Gtp() +{ + quit(); +} + +bool Gtp::openSession(const QString &command) +{ + quit(); // Close old session if there's one + m_process.start(command.toLatin1()); // Start new process with provided command + + if (!m_process.waitForStarted()) // NOTE: Blocking wait for process start + return false; + + if (protocolVersion()) { + clearBoard(); // Start with blank board + } else { + quit(); + m_response = "Protocol version error"; + return false; + } + return true; +} + +void Gtp::quit() +{ + if (m_process.isOpen()) { + m_process.write("quit\n"); + m_process.close(); + } +} + +bool Gtp::loadSgf(const QString &fileName, int moveNumber) +{ + Q_ASSERT(moveNumber >= 0); + if (fileName.isEmpty() || !QFile::exists(fileName)) + return false; + + QByteArray msg; + msg.append("loadsgf "); + msg.append(fileName.toLatin1()); + msg.append(" "); + msg.append(moveNumber); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::saveSgf(const QString &fileName) +{ + if (fileName.isEmpty()) + return false; + + QByteArray msg; + msg.append("printsgf "); + msg.append(fileName.toLatin1()); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +QString Gtp::name() +{ + QByteArray msg; + msg.append("name\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +int Gtp::protocolVersion() +{ + QByteArray msg; + msg.append("protocol_version\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +QString Gtp::version() +{ + QByteArray msg; + msg.append("version\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +bool Gtp::setBoardSize(int size) +{ + Q_ASSERT(size >= 1 && size <= 19); + + QByteArray msg; + msg.append("boardsize "); + msg.append(size); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +int Gtp::boardSize() +{ + QByteArray msg; + msg.append("query_boardsize\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +bool Gtp::clearBoard() +{ + QByteArray msg; + msg.append("clear_board\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::setKomi(float komi) +{ + Q_ASSERT(komi >= 0); + + QByteArray msg; + msg.append("komi "); + msg.append(komi); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::setLevel(int level) +{ + Q_ASSERT(level >= 1 && level <= 10); + + QByteArray msg; + msg.append("level "); + msg.append(level); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::setFixedHandicap(int handicap) +{ + Q_ASSERT(handicap >= 0 && handicap <= 9); + + QByteArray msg; + msg.append("fixed_handicap "); + msg.append(handicap); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::playMove(PlayerColor color, const Stone &field) +{ + if (!field.isValid()) + return false; + + QByteArray msg; + msg.append("play "); + if (color == PlayerWhite) + msg.append("white "); + else + msg.append("black "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::passMove(PlayerColor color) +{ + QByteArray msg; + msg.append("play "); + if (color == PlayerWhite) + msg.append("white "); + else + msg.append("black "); + msg.append("pass\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::generateMove(PlayerColor color) +{ + QByteArray msg; + msg.append("genmove "); + if(color == PlayerWhite) + msg.append("white\n"); + else + msg.append("black\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::undoMove(int i) +{ + Q_ASSERT(i >= 0); + QByteArray msg; + msg.append("undo "); + msg.append(i); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::tryMove(PlayerColor color, const Stone &field) +{ + if (!field.isValid()) + return false; + + QByteArray msg; + msg.append("trymove "); + if (color == PlayerWhite) + msg.append("white "); + else + msg.append("black "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::popGo() +{ + QByteArray msg; + msg.append("popgo\n"); + m_process.write(msg); + return waitResponse(); +} + +Gtp::FieldStatus Gtp::whatColor(const Stone &field) +{ + if (!field.isValid()) + return FieldInvalid; + + QByteArray msg; + msg.append("color "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) { + if (m_response == "white") return FieldWhite; + else if (m_response == "black") return FieldBlack; + else if (m_response == "empty") return FieldEmpty; + else return FieldInvalid; + } else + return FieldInvalid; +} + +int Gtp::countLiberties(const Stone &field) +{ + if (!field.isValid()) + return -1; + + QByteArray msg; + msg.append("countlib "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +QList Gtp::findLiberties(const Stone &field) +{ + QList list; + if (!field.isValid()) + return list; + + QByteArray msg; + msg.append("findlib "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + waitResponse(); + + foreach (QString entry, m_response.split(' ')) + list.append(Gtp::Stone(entry)); + return list; +} + +bool Gtp::isLegal(PlayerColor color, const Stone &field) +{ + if (!field.isValid()) + return false; + + QByteArray msg; + msg.append("is_legal "); + if (color == PlayerWhite) + msg.append("white "); + else + msg.append("black "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + waitResponse(); + if (m_response == "1") + return true; + else + return false; +} + +QString Gtp::topMoves(PlayerColor color) +{ + QByteArray msg; + msg.append("top_moves_"); + if (color == PlayerWhite) + msg.append("white\n"); + else + msg.append("black\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +QList Gtp::legalMoves(PlayerColor color) +{ + QByteArray msg; + msg.append("all_legal "); + if (color == PlayerWhite) + msg.append("white\n"); + else + msg.append("black\n"); + m_process.write(msg); + waitResponse(); + + QList list; + foreach (QString entry, m_response.split(' ')) + list.append(Gtp::Stone(entry)); + return list; +} + +int Gtp::captures(PlayerColor color) +{ + QByteArray msg; + msg.append("captures "); + if (color == PlayerWhite) + msg.append("white\n"); + else + msg.append("black\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return 0; +} + +QString Gtp::attack(const Stone &field) +{ + if (!field.isValid()) + return QString(); + + QByteArray msg; + msg.append("attack "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +QString Gtp::defend(const Stone &field) +{ + if (!field.isValid()) + return QString(); + + QByteArray msg; + msg.append("defend "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +bool Gtp::increaseDepths() +{ + QByteArray msg; + msg.append("increase_depths\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::decreaseDepths() +{ + QByteArray msg; + msg.append("decrease_depths\n"); + m_process.write(msg); + return waitResponse(); +} + +QString Gtp::owlAttack(const Stone &field) +{ + if (!field.isValid()) + return QString(); + + QByteArray msg; + msg.append("owl_attack "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +QString Gtp::owlDefense(const Stone &field) +{ + if (!field.isValid()) + return QString(); + + QByteArray msg; + msg.append("owl_defend "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +QString Gtp::evalEye(const Stone &field) +{ + if (!field.isValid()) + return QString(); + + QByteArray msg; + msg.append("eval_eye "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +Gtp::DragonStatus Gtp::dragonStatus(const Stone &field) +{ + if (!field.isValid()) + return DragonInvalid; + + QByteArray msg; + msg.append("dragon_status "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) { + if (m_response == "alive") return DragonAlive; + else if (m_response == "critical") return DragonCritical; + else if (m_response == "dead") return DragonDead; + else if (m_response == "unknown") return DragonUnknown; + else return DragonInvalid; /* should never happen */ + } else + return DragonInvalid; +} + +bool Gtp::sameDragon(const Stone &field1, const Stone &field2) +{ + QByteArray msg; + msg.append("same_dragon "); + msg.append(field1.toLatin1()); + msg.append(" "); + msg.append(field2.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse() && m_response == "1") + return true; + else + return false; +} + +QString Gtp::dragonData(const Stone &field) +{ + QByteArray msg; + msg.append("dragon_data "); + if (field.isValid()) + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +Gtp::FinalState Gtp::finalStatus(const Stone &field) +{ + if (!field.isValid()) + return StateInvalid; + + QByteArray msg; + msg.append("final_status "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) { + if (m_response == "alive") return Alive; + else if (m_response == "dead") return Dead; + else if (m_response == "seki") return Seki; + else if (m_response == "white_territory") return WhiteTerritory; + else if (m_response == "blacK_territory") return BlackTerritory; + else if (m_response == "dame") return Dame; + else return StateInvalid; + } else + return StateInvalid; +} + +QList Gtp::finalStatusList(FinalState state) +{ + QList list; + if (state == StateInvalid) + return list; + + QByteArray msg; + msg.append("final_status_list "); + switch (state) { + case Alive: msg.append("alive"); break; + case Dead: msg.append("dead"); break; + case Seki: msg.append("seki"); break; + case WhiteTerritory: msg.append("white_territory"); break; + case BlackTerritory: msg.append("black_territory"); break; + case Dame: msg.append("dame"); break; + case StateInvalid: /* Will never happen */ break; + } + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) { + foreach (QString entry, m_response.split(' ')) + list.append(Stone(entry)); + } + return list; +} + +Gtp::Score Gtp::finalScore() +{ + QByteArray msg; + msg.append("final_score\n"); + m_process.write(msg); + if (waitResponse()) + return Score(m_response); + else + return Score(); +} + +Gtp::Score Gtp::estimateScore() +{ + QByteArray msg; + msg.append("estimate_score\n"); + m_process.write(msg); + if (waitResponse()) + return Score(m_response); + else + return Score(); +} + +int Gtp::getLifeNodeCounter() +{ + QByteArray msg; + msg.append("get_life_node_counter\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +bool Gtp::resetLifeNodeCounter() +{ + QByteArray msg; + msg.append("reset_life_node_counter\n"); + m_process.write(msg); + return waitResponse(); +} + +int Gtp::getOwlNodeCounter() +{ + QByteArray msg; + msg.append("get_owl_node_counter\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +bool Gtp::resetOwlNodeCounter() +{ + QByteArray msg; + msg.append("reset_owl_node_counter\n"); + m_process.write(msg); + return waitResponse(); +} + +int Gtp::getReadingNodeCounter() +{ + QByteArray msg; + msg.append("get_reading_node_counter\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +bool Gtp::resetReadingNodeCounter() +{ + QByteArray msg; + msg.append("reset_reading_node_counter\n"); + m_process.write(msg); + return waitResponse(); +} + +int Gtp::getTryMoveCounter() +{ + QByteArray msg; + msg.append("get_trymove_counter\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +bool Gtp::resetTryMoveCounter() +{ + QByteArray msg; + msg.append("reset_trymove_counter\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::showBoard() +{ + QByteArray msg; + msg.append("showboard\n"); + m_process.write(msg); + return waitResponse(); +} + +bool Gtp::dumpStack() +{ + QByteArray msg; + msg.append("dump_stack\n"); + m_process.write(msg); + return waitResponse(); +} + +int Gtp::wormCutStone(const Stone &field) +{ + if (!field.isValid()) + return -1; + + QByteArray msg; + msg.append("worm_cutstone "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response.toInt(); + else + return -1; +} + +QString Gtp::wormData(const Stone &field) +{ + QByteArray msg; + msg.append("worm_data "); + if (field.isValid()) + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +QList Gtp::wormStones(const Stone &field) +{ + QList list; + if (!field.isValid()) + return list; + + QByteArray msg; + msg.append("worm_stones "); + msg.append(field.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) { + foreach (QString entry, m_response.split(' ')) + list.append(Stone(entry)); + } + return list; +} + +bool Gtp::tuneMoveOrdering(int parameters) +{ + QByteArray msg; + msg.append("tune_move_ordering "); + msg.append(parameters); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +QList Gtp::help() +{ + QByteArray msg; + msg.append("help\n"); + m_process.write(msg); + QList list; + if (waitResponse()) { + foreach (QString entry, m_response.split('\n')) + list.append(entry); + } + return list; +} + +bool Gtp::reportUncertainty(bool enabled) +{ + QByteArray msg; + msg.append("report_uncertainty "); + msg.append(enabled ? "on" : "off"); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +QString Gtp::shell(const QString &command) +{ + if (command.isEmpty()) + return QString(); + + QByteArray msg; + msg.append(command.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +bool Gtp::knownCommand(const QString &command) +{ + if (command.isEmpty()) + return false; + + QByteArray msg; + msg.append("known_command "); + msg.append(command.toLatin1()); + msg.append("\n"); + m_process.write(msg); + return waitResponse(); +} + +QString Gtp::echo(const QString &command) +{ + if (command.isEmpty()) + return QString(); + + QByteArray msg; + msg.append("echo "); + msg.append(command.toLatin1()); + msg.append("\n"); + m_process.write(msg); + if (waitResponse()) + return m_response; + else + return QString(); +} + +void Gtp::readStandardOutput() +{ + m_response = m_process.readAllStandardOutput(); +} + +void Gtp::readStandardError() +{ + kDebug() << "Error occured:" << m_process.readAllStandardError(); +} + +bool Gtp::waitResponse() +{ + QString tmp = m_response; + do { // Process some events till our response arrives + qApp->processEvents(); // to not slow down this thread too much + } while (m_response.length() == 0 || m_response == tmp); + + tmp = m_response[0]; + m_response.remove(0, 2); // Remove the first two chars (e.g. "? " or "= " + m_response.remove(m_response.size() - 2, 2); // Remove the two trailing newlines + + emit ready(); + if (tmp == "?") // '?' Means the engine didn't understand the query + return false; + else + return true; +} + +} // End of namespace KGo + +#include "moc_gtp.cpp" diff --git a/src/game/gtp.h b/src/game/gtp.h new file mode 100644 index 0000000..89a6aeb --- /dev/null +++ b/src/game/gtp.h @@ -0,0 +1,730 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and defines the classes Gtp, Gtp::Stone + * and Gtp::Score, which together implement a Go Text Protocol (GTP) + * interface to communicate with Go engines supporting GTP protocol + * version 2. + * + * @author Sascha Peilicke + */ +#ifndef KGO_GTP_H +#define KGO_GTP_H + +#include +#include +#include +#include + +namespace KGo { + +/** + * The Gtp class implements the Go game and acts as a wrapper around a + * remote Go Game engine implementing the Go Text Protocol (GTP). It uses + * GTP protocol version 2 and interfaces the engine executable in an + * asynchronous manor. The best supported engine should (naturally) + * be GnuGo. + * + * @code + * Gtp *gtp = new Gtp; + * + * // Open a session with a Go engine in GTP mode + * gtp->openSession("gnugo --mode gtp"); + * + * // Get some informations about the Go engine + * gtp->name(); + * gtp->version(); + * gtp->help(); + * + * gtp->quit(); + * @endcode + * + * @author Sascha Peilicke + * @since 0.1 + */ +class Gtp : public QObject +{ + Q_OBJECT + +public: + /** + * Enumeration of available player colors. + */ + enum PlayerColor { + PlayerWhite = 1, ///< The white player + PlayerBlack ///< The black player + }; + + /** + * Enumeration of what color the stone has on a certain board field. + */ + enum FieldStatus { + FieldEmpty = 1, ///< The field is empty + FieldWhite, ///< The field has a white stone on it + FieldBlack, ///< The field has a black stone on it + FieldInvalid ///< An invalid field was queried, shows error + }; + + /** + * Enumeration of all possible states of a dragon + */ + enum DragonStatus { + DragonAlive = 1, ///< The dragon lives + DragonCritical, ///< The dragon is critical + DragonDead, ///< The dragon is dead + DragonUnknown, ///< The state of the dragon is unknown + DragonInvalid ///< An invalid field was querid, shows error + }; + + /** + * Enumeration of all possible final states of a field when a game is over + */ + enum FinalState { + Alive = 1, ///< The stone on the field is alive + Dead, ///< The stone on the field is dead + Seki, ///< + WhiteTerritory, ///< The field belongs to the white player + BlackTerritory, ///< The field belongs to the black player + Dame, ///< The field belongs to no player + StateInvalid ///< The state is invalid, shows error + }; + + /** + * This class represents a stone on a field of the game board. + */ + class Stone + { + public: + /** + * Standard constructor. Can optionally set from the given coordinates. + * + * @param x The x coordinate of the stone + * @param y The y coordinate of the stone + */ + Stone(char x = -1, int y = -1) : m_x(x), m_y(y) {} + + /** + * Constructor to set from a stone given as a string. + * + * @param stone The stone as string + */ + Stone(const QString &stone); + + /** + * Checks wether the stone is valid or not + */ + bool isValid() const; + + /** + * Returns the stone as a string + */ + QString toString() const; + + /** + * Returns the stone as a byte array + */ + QByteArray toLatin1() const; + + /** + * Retrieves the x coordinate of the stone + */ + char x() const { return m_x; } + + /** + * Retrieves the y coordinate of the stone + */ + int y() const { return m_y; } + + private: + char m_x; ///< The horizontal field coordinate (from 'A' to 'T') + int m_y; ///< The vertical field coordinate (from 1 to 19) + }; + + /** + * This class is used as return value by the 'newScore', 'estimateScore' + * and 'finalScore' Gtp methods. + */ + class Score + { + public: + /** + * Standard constructor. Used to create a Score object from a + * score string returned by the Go engine. + * + * @param scoreString The score string from the engine + */ + Score(const QString &scoreString = QString()); + + /** + * Checks wether the score is valid or not. + */ + bool isValid() const; + + /** + * Converts the score into a string. + */ + QString toString() const; + + /** + * Returns the player which currently leads by points. + */ + PlayerColor player() const { return m_player; } + + /** + * Returns the amount of points (aka score) which the leading + * player has more than the other. + */ + int score() const { return m_score; } + + /** + * Returns the lower bound for a score estimate. + */ + int lowerBound() const { return m_lowerBound; } + + /** + * Returns the upper bound for a score estimate. + */ + int upperBound() const { return m_upperBound; } + + private: + PlayerColor m_player; ///< The player which has more points + int m_score; ///< The amount of points the player leads with + int m_lowerBound; ///< Estimate lower bound + int m_upperBound; ///< Estimate upper bound + }; + + //////////////////////////////////////////////////////////////////// + + Gtp(); + ~Gtp(); + + //////////////////////////////////////////////////////////////////// + // GTP: Administrative commands + //////////////////////////////////////////////////////////////////// + + /** + * Connect to the given Go game engine in GTP mode. The most common + * used case is 'gnugo --mode gtp' but this depends on your platform + * and installed Go engine(s). + * + * @param command The executable command to start in GTP mode. + */ + bool openSession(const QString &command = "gnugo --mode gtp"); + + /** + * Check wether the Gtp object is connected to a Go engine, running + * and waiting for commands to be fed with. + */ + bool isRunning() const { return m_process.state() == QProcess::Running; } + + /** + * Retrieve the last response the Go game engine made occuredafter it + * received a command. + */ + QString response() const { return m_response; } + + /** + * Gracefully stop and exit the Go game engine. + */ + void quit(); + + /** + * Load a SGF file, possibly up to a move number or the first + * occurence of a move. + * + * @param fileName The SGF file name + * @param moveNumber The move number + */ + bool loadSgf(const QString &fileName, int moveNumber = 0); + + /** + * Save the current game as a SGF filer. + * + * @param fileName The SGF file name + */ + bool saveSgf(const QString &fileName); + + //////////////////////////////////////////////////////////////////// + // GTP: Program identity + //////////////////////////////////////////////////////////////////// + + /** + * Retrieves the name of the Go game engine application. + */ + QString name(); + + /** + * Retrieves the GTP protocol version implemented by the Go game engine. + */ + int protocolVersion(); + + /** + * Retrieves the version of the Go game engine application. + */ + QString version(); + + //////////////////////////////////////////////////////////////////// + // GTP: Setting the board size, clearing + //////////////////////////////////////////////////////////////////// + + /** + * Set the board size to NxN. + * + * @param size The board size (standard are 9x9, 13x13 and 19x19) + */ + bool setBoardSize(int size); + + /** + * Retrieves the current board size. + */ + int boardSize(); + + /** + * Clears the board. + */ + bool clearBoard(); + + //////////////////////////////////////////////////////////////////// + // GTP: Setting komi, level, handicap + //////////////////////////////////////////////////////////////////// + + /** + * Set the komi. + * + * @param komi The komi to be set (usually 4.5 or 4.5 on 19x19 boards) + */ + bool setKomi(float komi); + + /** + * Set the Go engine strength level. + * + * @param level The strength level (from 1 to 10) + */ + bool setLevel(int level); + + /** + * Set up fixed placement handicap stones. + * + * @param handicap The number of handicap stones. + */ + bool setFixedHandicap(int handicap); + + //////////////////////////////////////////////////////////////////// + // GTP: Playing and generating moves + //////////////////////////////////////////////////////////////////// + + /** + * Play a stone for the player with 'color' at 'field' + * + * @param color The player's color for whom to play the stone + * @param field The board field on which to play the stone + */ + bool playMove(PlayerColor color, const Stone &field); + + /** + * Let the player with 'color' pass. + * + * @param color The player's color who want's to pass + */ + bool passMove(PlayerColor color); + + /** + * Generate and play the supposedly best move for 'color'. + * + * @param color Play the move for player with that color + */ + bool generateMove(PlayerColor color); + + /** + * Undo last move. + * + * @param i + */ + bool undoMove(int i = 1); + + ///////////////////////////////////////////////////////////////////// + // GTP: Retractable moves + ///////////////////////////////////////////////////////////////////// + + /** + * Play a stone of the given color at the given field. + * + * @param color Play a stone for that color + * @param field Play a stone at that field + */ + bool tryMove(PlayerColor color, const Stone &field); + + /** + * Undo a trymove. + */ + bool popGo(); + + //////////////////////////////////////////////////////////////////// + // GTP: Board status + //////////////////////////////////////////////////////////////////// + + /** + * Return the color (state) of a specific board field. + * + * @param field The field to report the state + * @see FieldStatus + */ + FieldStatus whatColor(const Stone &field); + + /** + * Count the number of liberties for the stone at 'field'. + * + * @param field The field to count liberties for + */ + int countLiberties(const Stone &field); + + /** + * Returns the positions of the liberties for the stone at 'field'. + * + * @param field The field to return liberties for + */ + QList findLiberties(const Stone &field); + + /** + * Tell wether a move at 'field' for player 'color' is legal. + * + * @param color The player to test the move for + * @param field The field to test the move for + */ + bool isLegal(PlayerColor color, const Stone &field); + + /** + * Generate a list of the best moves for a player with 'color' with + * weights. + * + * @param color Player to generate the list for + */ + QString topMoves(PlayerColor color); + + /** + * List all legal moves for either color. + * + * @param color List legal moves for this color + */ + QList legalMoves(PlayerColor color); + + /** + * List the number of captures taken by either color. + */ + int captures(PlayerColor color); + + ///////////////////////////////////////////////////////////////////// + // GTP: Tactical reading + ///////////////////////////////////////////////////////////////////// + + /** + * Try to attack a field. + * + * @param field The field to attack + */ + QString attack(const Stone &field); + + /** + * Try to defend a field. + * + * @param field The field to defend> + */ + QString defend(const Stone &field); + + /** + * Increase depth values by one. + */ + bool increaseDepths(); + + /** + * Decrease depth values by one. + */ + bool decreaseDepths(); + + ///////////////////////////////////////////////////////////////////// + // GTP: OWL reading and eyes + ///////////////////////////////////////////////////////////////////// + + /** + * Try to attack a dragon. + * + * @param field The dragon field to attack + */ + QString owlAttack(const Stone &field); + + /** + * Try to defend a dragon. + * + * @param field The dragon field to defend + */ + QString owlDefense(const Stone &field); + + /** + * Evaluate an eye space and returns a minumum and maximum number of + * eyes. If these differ an attack and a defense point are additionally + * returned. If the field is not an eye space or not of unique color, + * a single -1 is returned. + * + * @param field The eye field to evaluate + * @return Minimum and maximum nuber of eyes. + * @see EyeInfo + */ + QString evalEye(const Stone &field); + + ///////////////////////////////////////////////////////////////////// + // GTP: Dragon status + ///////////////////////////////////////////////////////////////////// + + /** + * Determine status of a dragon. Returns the dragon status, attack + * points, defense points. Points of attack and defense are only given + * if the status is critical and the owl code is enabled. + * + * @param field The dragon stone + * @see DragonStatus + */ + DragonStatus dragonStatus(const Stone &field); + + /** + * Determine wether two stones belong to the same dragon. + * + * @param field1 The first stone + * @param field2 The second stone + */ + bool sameDragon(const Stone &field1, const Stone &field2); + + /** + * Returns the information in the dragon data structure. The data + * is formatted corresponding to gtp_worm__. If a field is given + * only worm data for the field is returned. + * + * @param field The field for which information is wanted + */ + QString dragonData(const Stone &field = Stone()); + + ///////////////////////////////////////////////////////////////////// + // GTP: Score + ///////////////////////////////////////////////////////////////////// + + /** + * Report the final status of a field in a finished game. + * + * @param field Report status for that feed + * @see FinalState + */ + FinalState finalStatus(const Stone &field); + + /** + * Report fields with a specified final status in a finished game. + * + * @param state Report only fields with that state + * @see FinalState + */ + QList finalStatusList(FinalState state); + + /** + * Compute the score of a finished game. + * + * @return Score in SGF format (RE property) + */ + Score finalScore(); + + /** + * Returns an estimate of the final score based on the current game + * situation. + */ + Score estimateScore(); + + ///////////////////////////////////////////////////////////////////// + // GTP: Statistics + ///////////////////////////////////////////////////////////////////// + + /** + * Retrieve the count of life nodes. + * + * @return The number of life nodes + */ + int getLifeNodeCounter(); + + /** + * Reset the count of life nodes. + */ + bool resetLifeNodeCounter(); + + /** + * Retrieve the count of owl nodes. + * + * @return The number of owl nodes. + */ + int getOwlNodeCounter(); + + /** + * Reset the count of owl nodes. + */ + bool resetOwlNodeCounter(); + + /** + * Retrieve the count of reading nodes. + * + * @return The number of reading nodes. + */ + int getReadingNodeCounter(); + + /** + * Reset the count of reading nodes. + */ + bool resetReadingNodeCounter(); + + /** + * Retrieve the count of trymoves/trykos. + */ + int getTryMoveCounter(); + + /** + * Reset the count of trymoves/trykos. + */ + bool resetTryMoveCounter(); + + ///////////////////////////////////////////////////////////////////// + // GTP: debug + ///////////////////////////////////////////////////////////////////// + + /** + * Write the complete board to stdout. + */ + bool showBoard(); + + /** + * Dump stack to stdout. + */ + bool dumpStack(); + + /** + * Return the cutstone field in the worm data structure. + * + * @param field The field to inspect + * @return The cutstone value of worm data for that field + */ + int wormCutStone(const Stone &field); + + /** + * Return the information in the worm data structure. If no + * valid field is given, worm data is returned for all fields. + * + * @param field The field to inspect + * @return Worm data formatted + */ + QString wormData(const Stone &field = Stone()); + + /** + * List of lists of linked together stones around a given field + * from the worm data structure. + * + * @param field The location + */ + QList wormStones(const Stone &field); + + /** + * Tune the parameters for the move ordering in the tactical reading. + * + * @param parameters The move ordering parameters + */ + bool tuneMoveOrdering(int parameters); + + /** + * List all known commands. + * + * @return The list of known commands + */ + QList help(); + + /** + * Turn uncertainty reports from owl_attack and owl_defend on or off. + * + * @param enabled Wether to turn uncertainty reports on or off + */ + bool reportUncertainty(bool enabled); + + /** + * Sends a custom command to the Go engine and returns the result. + * + * @param command The custom command + * @return Result of the command + */ + QString shell(const QString &command); + + /** + * Evaluate wether a command is known. + * + * @param command The command to evaluate + */ + bool knownCommand(const QString &command); + + /** + * A simple echo command to test the engine. + * + * @param command The command to echo + * @return + */ + QString echo(const QString &command); + +signals: + /** + * This signal is emmited when the process encounters an error. + */ + void error(QProcess::ProcessError); + + /** + * This signal is emitted when all heavy computation is over + * and the Go engine is ready to receive the next command. + */ + void ready(); + +private slots: + /** + * This slot reads everything from the process's stdout + */ + void readStandardOutput(); + + /** + * This slot reads everything from the process's stderr. This is + * mainly for debugging purposes, because this should only happen + * if a bug occured. + */ + void readStandardError(); + + /** + * Wait gracefully for a response from the Go engine. The returned string + * from the Go engine is stored in 'm_response'. + */ + bool waitResponse(); + +private: + QString m_response; ///< Stores the last answer from the engine + QProcess m_process; ///< To interact with the engine executable +}; + +} // End of namespace KGo + +#endif diff --git a/src/gui/config.cpp b/src/gui/config.cpp new file mode 100644 index 0000000..e3fed11 --- /dev/null +++ b/src/gui/config.cpp @@ -0,0 +1,43 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the class GeneralConfig, + * which displays the general configuration options tab in the + * Kgo configuration screen. + * + * @author Sascha Peilicke + */ +#include "config.h" + +namespace KGo { + +GeneralConfig::GeneralConfig(QWidget *parent) + : QWidget(parent) +{ + setupUi(this); +} + +} // End of namespace KGo + +#include "moc_config.cpp" diff --git a/src/gui/config.h b/src/gui/config.h new file mode 100644 index 0000000..eb3e9f5 --- /dev/null +++ b/src/gui/config.h @@ -0,0 +1,60 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and defines the class GeneralConfig, + * which displays the general configuration options tab in the + * Kgo configuration screen. + * + * @author Sascha Peilicke + */ +#ifndef KGO_CONFIG_H +#define KGO_CONFIG_H + +#include "ui_config.h" + +#include + +namespace KGo { + +/** + * Represents the general configuration tab in the KGo + * configuration screen. + * + * @author Sascha Peilicke + * @since 0.1 + */ +class GeneralConfig : public QWidget, private Ui::GeneralConfig +{ + Q_OBJECT + +public: + /** + * Standard Constructor. Sets up the loaded user interface. + */ + explicit GeneralConfig(QWidget *parent = 0); +}; + +} // End of namespace KGo + +#endif diff --git a/src/gui/config.ui b/src/gui/config.ui new file mode 100644 index 0000000..29b6505 --- /dev/null +++ b/src/gui/config.ui @@ -0,0 +1,71 @@ + + GeneralConfig + + + + 0 + 0 + 359 + 347 + + + + Form + + + + + + + 0 + 0 + + + + Go Engine Settings + + + + + + Executable command: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + kcfg_EngineCommand + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 256 + + + + + + + + + KLineEdit + QLineEdit +
klineedit.h
+
+
+ + +
diff --git a/src/gui/gamescene.cpp b/src/gui/gamescene.cpp new file mode 100644 index 0000000..7e5e7f0 --- /dev/null +++ b/src/gui/gamescene.cpp @@ -0,0 +1,109 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the class GameScene, + * which displays the go game. + * + * @author Sascha Peilicke + */ +#include "gamescene.h" +#include "game/gtp.h" +#include "themerenderer.h" + +#include +#include + +#include + +namespace KGo { + +GameScene::GameScene(Gtp *gtp) + : m_gtp(gtp) + , m_showLabels(false) + , m_cursorItem(0) +{ + Q_ASSERT(gtp); +} + +void GameScene::resizeScene(int width, int height) +{ + setSceneRect(0, 0, width, height); + + int size = qMin(width, height); + m_boardRect.setRect(width / 2 - size / 2, height / 2 - size / 2, size, size); + + // Determine size of board cell element based on width (same as height, board is a quad) + int defWidth = ThemeRenderer::instance()->elementSize(ThemeRenderer::BoardBackground).width(); + qreal scale = (qreal)size / defWidth; + if (scale <= 0) + return; + + // Make sure the cell element has the correct size (correspoding to current board size) + m_currentCellSize = defWidth * scale / (m_gtp->boardSize() + 3); +} + +void GameScene::update() +{ + //TODO: Resize, set komi, board size ... +} + +void GameScene::showMoveHistory(bool show) +{ + +} + +void GameScene::hint() +{ + +} + +void GameScene::drawBackground(QPainter *painter, const QRectF &rect) +{ + ThemeRenderer::instance()->renderElement(ThemeRenderer::SceneBackground, painter, sceneRect()); + ThemeRenderer::instance()->renderElement(ThemeRenderer::BoardBackground, painter, m_boardRect); + if (m_showLabels) + ThemeRenderer::instance()->renderElement(ThemeRenderer::BoardLabels, painter, m_boardRect); + + /*// Draw the board cells + QPointF upLeftPoint(m_boardRect.x() + m_currentCellSize * 1.5, + m_boardRect.y() + m_currentCellSize * 1.5); + QPointF upRightPoint(m_boardRect.x() + m_boardRect.width() - m_currentCellSize * 1.5, + m_boardRect.y() + m_currentCellSize * 1.5); + QPointF downLeftPoint(upLeftPoint.x(), + upLeftPoint.y() + m_boardRect.height() - m_currentCellSize * 3); + + for (int i = 0; i < m_gtp->boardSize() - 1; i++) { + // Draw horizontal line + panter->drawLine(QPointF(upLeftPoint.x(), upLeftPoint.y() + i * m_currentCellSize), + QPointF(upRightPoint.x(), upRightPoint.y() + i * m_currentCellSize)); + + // Draw vertical line + painter->drawLine(QPointF(upLeftPoint.x() + i * m_currentCellSize, upLeftPoint.y()), + QPointF(downLeftPoint.x() + i * m_currentCellSize, downLeftPoint.y())); + }*/ +} + +} // End of namespace KGo + +#include "moc_gamescene.cpp" diff --git a/src/gui/gamescene.h b/src/gui/gamescene.h new file mode 100644 index 0000000..21852fe --- /dev/null +++ b/src/gui/gamescene.h @@ -0,0 +1,112 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and defines the class GameScene, + * which displays the go game. + * + * @author Sascha Peilicke + */ +#ifndef KGO_GAMESCENE_H +#define KGO_GAMESCENE_H + +#include + +class QGraphicsPixmapItem; + +namespace KGo { + +class Gtp; + +/** + * This class provides a graphical representation of the go game using + * QGraphicsScene. + * + * It displays the go board in its current state, receives mouse events, + * translates them so that KGo::Gtp can understand, send them to it, + * receives board-changed notificationi and nicely animates them. + * + * It also drives the game flow, i.e. tells game when to make the + * next move. + * + * @author Sascha Peilicke + * @since 0.1 + */ +class GameScene : public QGraphicsScene +{ + Q_OBJECT + +public: + /** + * Constructs a new game scene object from a correctly configured Gtp + * object. + * + * @param gtp A configured, "ready to start gaming with" Gtp object + */ + explicit GameScene(Gtp *gtp); + + /** + * + * @param width + * @param height + */ + void resizeScene(int width, int height); + +public slots: + /** + * + */ + void update(); + + /** + * + * @param show Wether to show the move history or not + */ + void showMoveHistory(bool show); + + /** + * + */ + void hint(); + +private: + /** + * Used to draw the scene background and the Go board. + * + * @param painter + * @param + * @see QGraphicsScene::drawBackground() + */ + void drawBackground(QPainter *painter, const QRectF &); + + Gtp *m_gtp; ///< To interface with the go engine + bool m_showLabels; ///< Show board labels or not + qreal m_currentCellSize; ///< + QRectF m_boardRect; ///< Position of board in the scene + QList m_stoneItemList; ///< + QGraphicsPixmapItem *m_cursorItem; ///< +}; + +} // End of namespace KGo + +#endif diff --git a/src/gui/gamescreen.cpp b/src/gui/gamescreen.cpp new file mode 100644 index 0000000..be6e82a --- /dev/null +++ b/src/gui/gamescreen.cpp @@ -0,0 +1,60 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the class GameScreen, + * which acts as a compound widget to display the game view and + * several additional information panels. + * + * @author Sascha Peilicke + */ +#include "gamescreen.h" +#include "preferences.h" +#include "game/gtp.h" +#include "gamescene.h" +#include "gameview.h" + +namespace KGo { + +GameScreen::GameScreen(Gtp *gtp, QWidget *parent) + : QWidget(parent) + , m_gtp(gtp) + , m_gameScene(new GameScene(gtp)) + , m_gameView(new GameView(m_gameScene, this)) +{ + Q_ASSERT(gtp); + + setupUi(this); + m_gameView->setInteractive(true); + gameFrame->setLayout(new QHBoxLayout()); + gameFrame->layout()->addWidget(m_gameView); +} + +GameScreen::~GameScreen() +{ + m_gtp->quit(); +} + +} // End of namespace KGo + +#include "moc_gamescreen.cpp" diff --git a/src/gui/gamescreen.h b/src/gui/gamescreen.h new file mode 100644 index 0000000..c65b6f6 --- /dev/null +++ b/src/gui/gamescreen.h @@ -0,0 +1,86 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and defines the class GameScreen, + * which acts as a compound widget to display the game view and + * several additional information panels. + * + * @author Sascha Peilicke + */ +#ifndef KGO_GAMESCREEN_H +#define KGO_GAMESCREEN_H + +#include "ui_gamescreen.h" +#include + +namespace KGo { + +class Gtp; +class GameScene; +class GameView; + +/** + * The game screen acts as a compound widget for the game view and + * some additional information panels. The panels include the move + * history and game statistics. + * + * @see GameView + * @author Sascha Peilicke + * @since 0.1 + */ +class GameScreen : public QWidget, private Ui::GameScreen +{ + Q_OBJECT + +public: + /** + * Standard constructor. Creates a new game screen and sets up + * some informational panels as well as the main Go game board + * view. + * + * @param gtp A configured, ready to start gaming with Gtp object + * @param parent The parent widget or none + */ + explicit GameScreen(Gtp *gtp, QWidget *parent = 0); + + /** + * Standard destructor. + */ + ~GameScreen(); + +signals: + +public slots: + //void setMoveHistoryVisible(bool visible); + //void setGameStatisticsVisible(bool visible); + +private: + Gtp *m_gtp; ///< + GameScene *m_gameScene; ///< + GameView *m_gameView; ///< +}; + +} // End of namespace KGo + +#endif diff --git a/src/gui/gamescreen.ui b/src/gui/gamescreen.ui new file mode 100644 index 0000000..83ab757 --- /dev/null +++ b/src/gui/gamescreen.ui @@ -0,0 +1,137 @@ + + GameScreen + + + + 0 + 0 + 239 + 321 + + + + Form + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 0 + 0 + + + + 0 + + + + + 0 + 0 + 130 + 241 + + + + Game Information + + + + + + Score Estimates + + + + + + + Statistics + + + + + + White Captures: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 0 + + + + + + + Black Captures: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 0 + + + + + + + + + + + + 0 + 0 + 264 + 241 + + + + Move History + + + + + + false + + + + + + + + + + + + KListWidget + QListWidget +
klistwidget.h
+
+
+ + +
diff --git a/src/gui/gameview.cpp b/src/gui/gameview.cpp new file mode 100644 index 0000000..8b19c11 --- /dev/null +++ b/src/gui/gameview.cpp @@ -0,0 +1,57 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the class GameView, + * which implements the view for a go game scene. + * + * @author Sascha Peilicke + */ +#include "gameview.h" +#include "gamescene.h" + +#include + +namespace KGo { + +GameView::GameView(GameScene *scene, QWidget *parent) + : QGraphicsView(scene, parent) + , m_scene(scene) +{ + setCacheMode(QGraphicsView::CacheBackground); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setFrameStyle(QFrame::NoFrame); + setOptimizationFlags(QGraphicsView::DontClipPainter | + QGraphicsView::DontSavePainterState | + QGraphicsView::DontAdjustForAntialiasing); +} + +void GameView::resizeEvent(QResizeEvent *event) +{ + m_scene->resizeScene(event->size().width(), event->size().height()); +} + +} // End of namespace KGo + +#include "moc_gameview.cpp" diff --git a/src/gui/gameview.h b/src/gui/gameview.h new file mode 100644 index 0000000..de78345 --- /dev/null +++ b/src/gui/gameview.h @@ -0,0 +1,73 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and defines the class GameView, + * which implements the view for a go game scene. + * + * @author Sascha Peilicke + */ +#ifndef KGO_GAMEVIEW_H +#define KGO_GAMEVIEW_H + +#include + +namespace KGo { + +class GameScene; + +/** + * This class represents a view on a Go game view. This widget can be + * included into a main window. + * + * @author Sascha Peilicke + * @since 0.1 + */ +class GameView : public QGraphicsView +{ + Q_OBJECT + +public: + /** + * Standard constructor. Creates a game view based on a given game scene. + * + * @param scene The game scene + * @param parent The (optional) parent widget + * @see GameScene + */ + explicit GameView(GameScene *scene, QWidget *parent = 0); + +private: + /** + * The resize event happens when the user changes the window size. + * + * @param event The resize event + */ + virtual void resizeEvent(QResizeEvent *event); + + GameScene *m_scene; ///< Pointer to the game scene +}; + +} // End of namespace KGo + +#endif diff --git a/src/gui/kgo.desktop b/src/gui/kgo.desktop new file mode 100644 index 0000000..0eed24f --- /dev/null +++ b/src/gui/kgo.desktop @@ -0,0 +1,16 @@ +[Desktop Entry] +Type=Application +Icon=kgo +Encoding=UTF-8 +Exec=kgo %i -caption "%c" +Terminal=false +Categories=Qt;KDE;Game;BoardGame; +DocPath=kgo/index.html +#X-KDE-StartupNotify=true +#X-DBUS-StartupType=Multi + +Name=KGo + +GenericName=Go Board Game +GenericName[de]=Go Brettspiel +GenericName[fr]=Jeu de plateau Go diff --git a/src/gui/kgoui.rc b/src/gui/kgoui.rc new file mode 100644 index 0000000..7008018 --- /dev/null +++ b/src/gui/kgoui.rc @@ -0,0 +1,28 @@ + + + + + + + + + + &aml;Settings + + + + + Main ToolBar + + + + + + + + diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp new file mode 100644 index 0000000..ce139fe --- /dev/null +++ b/src/gui/mainwindow.cpp @@ -0,0 +1,157 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the class MainWindow, + * which acts as the main window of the graphical user interface + * for KGo. + * + * @author Sascha Peilicke + */ + +#include "mainwindow.h" +#include "preferences.h" +#include "gui/setupscreen.h" +#include "gui/gamescreen.h" +#include "gui/config.h" +#include "game/gtp.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace KGo { + +MainWindow::MainWindow(QWidget *parent, bool startDemo) + : KXmlGuiWindow(parent) + , m_gtp(new Gtp()) + , m_setupScreen(new SetupScreen(m_gtp, this)) + , m_gameScreen(new GameScreen(m_gtp, this)) + , m_startInDemoMode(startDemo) +{ + // Handle the start game whish the user entered in the setup screen + connect(m_setupScreen, SIGNAL(startClicked()), this, SLOT(startGame())); + + QStackedWidget *mainWidget = new QStackedWidget; + mainWidget->addWidget(m_setupScreen); + mainWidget->addWidget(m_gameScreen); + mainWidget->setCurrentWidget(m_setupScreen); + setCentralWidget(mainWidget); + + setupActions(); + setupGUI(); +} + +MainWindow::~MainWindow() +{ + m_gtp->quit(); // Gently disconnect the Go engine +} + +void MainWindow::setupActions() +{ + // Game menu + KStandardGameAction::gameNew(this, SLOT(newGame()), actionCollection()); + KStandardGameAction::load(this, SLOT(loadGame()), actionCollection()); + m_saveAsAction = KStandardGameAction::saveAs(this, SLOT(saveGame()), actionCollection()); + m_saveAsAction->setEnabled(false); + KStandardGameAction::quit(this, SLOT(close()), actionCollection()); + + // Move menu + //TODO FIXME: Integrate move forward/backward stuff + m_previousMoveAction = KStandardGameAction::undo(this, SLOT(undo()), actionCollection()); + m_previousMoveAction->setEnabled(false); + m_nextMoveAction = KStandardGameAction::redo(this, SLOT(redo()), actionCollection()); + m_nextMoveAction->setEnabled(false); + m_demoAction = KStandardGameAction::demo(this, SLOT(toggleDemoMode()), actionCollection()); + m_demoAction->setEnabled(false); + + // Settings menu + KStandardAction::preferences(this, SLOT(showPreferences()), actionCollection()); +} + +void MainWindow::newGame() +{ + m_saveAsAction->setEnabled(false); + m_setupScreen->setupNewGame(); + qobject_cast(centralWidget())->setCurrentWidget(m_setupScreen); +} + +void MainWindow::loadGame() +{ + m_saveAsAction->setEnabled(false); + QString fileName = KFileDialog::getOpenFileName(KUrl(QDir::homePath()), "*.sgf"); + if (!fileName.isEmpty()) { + m_setupScreen->setupLoadedGame(fileName, true); + qobject_cast(centralWidget())->setCurrentWidget(m_setupScreen); + } +} + +void MainWindow::saveGame() +{ + QString fileName = KFileDialog::getSaveFileName(KUrl(QDir::homePath()), "*.sgf"); + if (!fileName.isEmpty()) + m_gtp->saveSgf(fileName); +} + +void MainWindow::startGame() +{ + m_saveAsAction->setEnabled(true); + qobject_cast(centralWidget())->setCurrentWidget(m_gameScreen); + //TODO: gameScreen should be notified somehow to start the game +} + +void MainWindow::undo() +{ +} + +void MainWindow::redo() +{ +} + +void MainWindow::toggleDemoMode() +{ +} + +void MainWindow::showPreferences() +{ + if (KConfigDialog::showDialog("settings")) + return; + KConfigDialog *dialog = new KConfigDialog(this, "settings", Preferences::self()); + dialog->addPage(new GeneralConfig(), i18n("General"), "preferences-other"); + dialog->addPage(new KGameThemeSelector(dialog, Preferences::self()), i18n("Themes"), "games-config-theme"); + dialog->setHelp(QString(),"KGo"); + dialog->show(); +} + +} // End of namespace KGo + +#include "moc_mainwindow.cpp" diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h new file mode 100644 index 0000000..4a81e22 --- /dev/null +++ b/src/gui/mainwindow.h @@ -0,0 +1,99 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and defines the class MainWindow, + * which acts as the main window of the graphical user interface + * for KGo. + * + * @author Sascha Peilicke + */ +#ifndef KGO_MAINWINDOW_H +#define KGO_MAINWINDOW_H + +#include + +class QAction; +class QStackedWidget; +class KToggleAction; + +namespace KGo { + +class Gtp; +class SetupScreen; +class GameScreen; + +/** + * The MainWindow class acts as the main window of the KGo graphical + * user interface. + * + * @author Sascha Peilicke + * @since 0.1 + */ +class MainWindow : public KXmlGuiWindow +{ + Q_OBJECT + +public: + /** + * Standard Constructor + * + * @param parent The parent widget + * @param startDemo Start in demo mode? + */ + MainWindow(QWidget *parent = 0, bool startDemo = false); + + /** + * + */ + ~MainWindow(); + +private slots: + void newGame(); ///< Configure new game with setupscreen + void loadGame(); ///< Configure loaded game with ~ + void saveGame(); ///< Save the current game state + void startGame(); ///< React on setupscreen start button + void undo(); ///< + void redo(); ///< + void toggleDemoMode(); ///< + void showPreferences(); ///< Show settings dialog + +private: + void setupActions(); + + Gtp* m_gtp; ///< + SetupScreen *m_setupScreen; ///< Pointer to the game setup screen + GameScreen *m_gameScreen; ///< Pointer to the game playing screen + bool m_startInDemoMode; ///< Start application in demo mode + + QAction *m_saveAsAction; ///< Action to save the current game + QAction *m_firstMoveAction; ///< Action to jump to the first move + QAction *m_previousMoveAction; ///< Action to jump to the previous move + QAction *m_nextMoveAction; ///< Action to jump to the next move + QAction *m_lastMoveAction; ///< Action to jump to the last move + KToggleAction *m_demoAction; ///< Action to change to demo mode +}; + +} // End of namespace KGo + +#endif diff --git a/src/gui/setupscreen.cpp b/src/gui/setupscreen.cpp new file mode 100644 index 0000000..aff5c78 --- /dev/null +++ b/src/gui/setupscreen.cpp @@ -0,0 +1,232 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the class SetupScreen. + * + * @author Sascha Peilicke + */ +#include "setupscreen.h" +#include "preferences.h" +#include "game/gtp.h" +#include "gamescene.h" +#include "gameview.h" + +#include + +namespace KGo { + +SetupScreen::SetupScreen(Gtp *gtp, QWidget *parent) + : QWidget(parent) + , m_gtp(gtp) + , m_gameScene(new GameScene(m_gtp)) + , m_gameView(new GameView(m_gameScene, this)) +{ + Q_ASSERT(gtp); + + setupUi(this); + m_gameView->setInteractive(false); // This is just a preview, not a real game + previewFrame->setLayout(new QHBoxLayout()); + previewFrame->layout()->addWidget(m_gameView); + setupNewGame(); // Configure new game per default +} + +SetupScreen::~SetupScreen() +{ + saveSettings(); +} + +void SetupScreen::setupNewGame() +{ + newGameBox->show(); + loadedGameBox->hide(); + infoBox->hide(); + loadSettings(); + m_gtp->openSession(Preferences::engineCommand()); // (Re)Connect to the configured go engine + m_gtp->clearBoard(); +} + +void SetupScreen::setupLoadedGame(const QString &fileName, bool showInfo) +{ + Q_ASSERT(!fileName.isEmpty()); + + newGameBox->hide(); + loadedGameBox->show(); + infoBox->setVisible(showInfo); + loadSettings(); + m_gtp->openSession(Preferences::engineCommand()); // (Re)Connect to the configured go engine + m_gtp->loadSgf(fileName); + //TODO: Set max value of startMoveSpinBox + if (showInfo) { + //TODO: Display all related game information in the info box + } +} + +void SetupScreen::on_whitePlayerCombo_currentIndexChanged(const QString &text) +{ + if (text == tr("Human")) { + whitePlayerName->setEnabled(true); + if (blackPlayerCombo->currentText() == tr("Human")) { + difficultyBox->setEnabled(false); + difficultySlider->setEnabled(false); + } else { + difficultyBox->setEnabled(true); + difficultySlider->setEnabled(true); + } + } else if (text == tr("Computer")) { + whitePlayerName->setEnabled(false); + if (blackPlayerCombo->currentText() == tr("Computer")) { + difficultyBox->setEnabled(false); + difficultySlider->setEnabled(false); + } else { + difficultyBox->setEnabled(true); + difficultySlider->setEnabled(true); + } + } +} + +void SetupScreen::on_blackPlayerCombo_currentIndexChanged(const QString &text) +{ + if (text == tr("Human")) { + blackPlayerName->setEnabled(true); + if (whitePlayerCombo->currentText() == tr("Human")) { + difficultyBox->setEnabled(false); + difficultySlider->setEnabled(false); + } else { + difficultyBox->setEnabled(true); + difficultySlider->setEnabled(true); + } + } else if (text == tr("Computer")) { + blackPlayerName->setEnabled(false); + if (whitePlayerCombo->currentText() == tr("Computer")) { + difficultyBox->setEnabled(false); + difficultySlider->setEnabled(false); + } else { + difficultyBox->setEnabled(true); + difficultySlider->setEnabled(true); + } + } +} + +void SetupScreen::on_startMoveSpinBox_valueChanged(int value) +{ + //TODO: Show the corresponding board +} + +void SetupScreen::on_sizeGroupBox_changed(int /*id*/) +{ + if (sizeOther->isChecked()) + sizeOtherSpinBox->setEnabled(true); + else + sizeOtherSpinBox->setEnabled(false); +} + +void SetupScreen::on_startButton_clicked() +{ + saveSettings(); + if (newGameBox->isVisible()) { // Means we configured a new game + m_gtp->setBoardSize(Preferences::boardSize()); + m_gtp->setLevel(Preferences::difficulty()); + m_gtp->setKomi(Preferences::komi()); + m_gtp->setFixedHandicap(Preferences::fixedHandicap()); + } else { // Means we configured a loaded game + //NOTE: Nothing to do here, all settings where already loaded from the SGF file. + } + emit startClicked(); +} + +void SetupScreen::loadSettings() +{ + kDebug() << "Load settings"; + if (Preferences::whitePlayerHuman()) { + whitePlayerCombo->setCurrentIndex(whitePlayerCombo->findText(tr("Human"))); + whitePlayerName->setEnabled(true); + } else { + whitePlayerCombo->setCurrentIndex(whitePlayerCombo->findText(tr("Computer"))); + whitePlayerName->setEnabled(false); + } + whitePlayerName->setText(Preferences::whitePlayerName()); + + if (Preferences::blackPlayerHuman()) { + blackPlayerCombo->setCurrentIndex(blackPlayerCombo->findText(tr("Human"))); + blackPlayerName->setEnabled(true); + } else { + blackPlayerCombo->setCurrentIndex(blackPlayerCombo->findText(tr("Computer"))); + blackPlayerName->setEnabled(false); + } + blackPlayerName->setText(Preferences::blackPlayerName()); + + if ((Preferences::blackPlayerHuman() && !Preferences::whitePlayerHuman()) || (!Preferences::blackPlayerHuman() && Preferences::whitePlayerHuman())) { + difficultyBox->setEnabled(true); + difficultySlider->setEnabled(true); + } + + difficultySlider->setValue(Preferences::difficulty()); + komiSpinBox->setValue(Preferences::komi()); + handicapSpinBox->setValue(Preferences::fixedHandicap()); + + switch (Preferences::boardSize()) { + case 9: + sizeSmall->setChecked(true); + break; + case 13: + sizeMedium->setChecked(true); + break; + case 19: + sizeBig->setChecked(true); + break; + default: + sizeOther->setChecked(true); + sizeOtherSpinBox->setEnabled(true); + sizeOtherSpinBox->setValue(Preferences::boardSize()); + break; + } +} + +void SetupScreen::saveSettings() +{ + kDebug () << "Save settings"; + Preferences::setWhitePlayerHuman(whitePlayerCombo->currentText() == tr("Human")); + Preferences::setWhitePlayerName(whitePlayerName->text()); + Preferences::setBlackPlayerHuman(blackPlayerCombo->currentText() == tr("Human")); + Preferences::setBlackPlayerName(blackPlayerName->text()); + + Preferences::setDifficulty(difficultySlider->value()); + Preferences::setKomi(komiSpinBox->value()); + Preferences::setFixedHandicap(handicapSpinBox->value()); + + if (sizeSmall->isChecked()) + Preferences::setBoardSize(9); + else if (sizeMedium->isChecked()) + Preferences::setBoardSize(13); + else if (sizeBig->isChecked()) + Preferences::setBoardSize(19); + else if (sizeOther->isChecked()) + Preferences::setBoardSize(sizeOtherSpinBox->value()); + + Preferences::self()->writeConfig(); +} + +} // End of namespace KGo + +#include "moc_setupscreen.cpp" diff --git a/src/gui/setupscreen.h b/src/gui/setupscreen.h new file mode 100644 index 0000000..966fbb4 --- /dev/null +++ b/src/gui/setupscreen.h @@ -0,0 +1,113 @@ +/******************************************************************* +* +* Copyright 2008 Sascha Peilicke +* +* This file is part of the KDE project "KGo" +* +* KGo 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, or (at your option) +* any later version. +* +* KGo 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 KReversi; see the file COPYING. If not, write to +* the Free Software Foundation, 51 Franklin Street, Fifth Floor, +* Boston, MA 02110-1301, USA. +* +*******************************************************************/ + +/** + * @file This file is part of KGO and defines the class SetupScreen. + * + * @author Sascha Peilicke + */ +#ifndef KGO_SETUPSCREEN_H +#define KGO_SETUPSCREEN_H + +#include "ui_setupscreen.h" + +#include + +namespace KGo { + +class Gtp; +class GameScene; +class GameView; + +/** + * The game setup screen lets the user choose a variety of game + * options preview the configured game and start it. + * + * The user can make all necessary settings for the game he/she + * wishes to start, the welcome screen only sets the KGo::Game to + * these values and emits a signal when the user wants to start. + * Further interaction with the KGo::Game (and it's graphical + * representation KGo::BoardView and KGo::BoardScene) has to happen + * elsewhere. + * + * @author Sascha Peilicke + * @since 0.1 + */ +class SetupScreen : public QWidget, private Ui::SetupScreen +{ + Q_OBJECT + +public: + /** + * Standard constructor. Sets up the loaded user interface and initial state. + * + * @param gtp A valid Gtp object + * @param parent The parent widget or none + */ + explicit SetupScreen(Gtp *gtp, QWidget *parent = 0); + + /** + * Standard destructor. + */ + ~SetupScreen(); + + /** + * Use the setup screen to configure a new game. This sets the right widgets + * for that purpose. + */ + void setupNewGame(); + + /** + * Use the setup screen to configure a loaded game. This sets the right widgets + * bases on the paramters. + * + * @param fileName The SGF file to load the game from + * @param showInfo Wether to show some info found in the SGF or not + */ + void setupLoadedGame(const QString &fileName, bool showInfo = false); + +signals: + /** + * This signal is emmited when the user clicked the 'start game' button. + */ + void startClicked(); + +private slots: + void on_whitePlayerCombo_currentIndexChanged(const QString &); + void on_blackPlayerCombo_currentIndexChanged(const QString &); + void on_startMoveSpinBox_valueChanged(int); + void on_sizeGroupBox_changed(int); + void on_startButton_clicked(); + + void loadSettings(); ///< Load KConfigXT application settings + void saveSettings(); ///< Store KConfigXT application settings + +private: + Gtp *m_gtp; ///< + GameScene *m_gameScene; ///< + GameView *m_gameView; ///< +}; + +} // End of namespace KGo + +#endif diff --git a/src/gui/setupscreen.ui b/src/gui/setupscreen.ui new file mode 100644 index 0000000..5d5636a --- /dev/null +++ b/src/gui/setupscreen.ui @@ -0,0 +1,536 @@ + + SetupScreen + + + + 0 + 0 + 701 + 722 + + + + Form + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + 0 + + + + 0 + + + + + + + + + + + + Human + + + + + Computer + + + + + + + + Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + blackPlayerName + + + + + + + true + + + + + + + + + + Black: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + blackPlayerCombo + + + + + + + + + + + + + + + + White: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + whitePlayerCombo + + + + + + + + Human + + + + + Computer + + + + + + + + Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + whitePlayerName + + + + + + + false + + + + + + + + + + + + + false + + + Computer Difficulty + + + + + + false + + + 1 + + + 10 + + + 1 + + + 1 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 0 + + + + + + + Easy + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + difficultySlider + + + + + + + Hard + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + difficultySlider + + + + + + + + + + true + + + + 0 + 0 + + + + Loaded Game Setup + + + + + + Start with Move: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + startMoveSpinBox + + + + + + + + + + + + + true + + + + 0 + 0 + + + + New Game Setup + + + + + + BoardSize + + + false + + + 2 + + + + + + Tiny (9x9) + + + false + + + + + + + Small (13x13) + + + + + + + Normal (19x19) + + + true + + + + + + + Other: + + + + + + + false + + + 5 + + + 19 + + + 19 + + + + + + + + + + + + Komi: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + komiSpinBox + + + + + + + Points + + + 1 + + + 50.000000000000000 + + + 4.500000000000000 + + + + + + + Fixed Handicap: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + handicapSpinBox + + + + + + + Stones + + + 9 + + + + + + + + + + + + Qt::Vertical + + + + 38 + 33 + + + + + + blackPlayerBox + whitePlayerBox + difficultyBox + loadedGameBox + newGameBox + verticalSpacer_2 + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + 0 + + + + 0 + + + + + + 0 + 0 + + + + Game Information + + + + + + PLACEHOLDER + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + Qt::Horizontal + + + + 577 + 27 + + + + + + + + + 0 + 0 + + + + Start Game + + + Ctrl+S + + + + + + + + KButtonGroup + QGroupBox +
kbuttongroup.h
+ 1 +
+ + KComboBox + QComboBox +
kcombobox.h
+
+ + KIntSpinBox + QSpinBox +
knuminput.h
+
+ + KLineEdit + QLineEdit +
klineedit.h
+
+ + KPushButton + QPushButton +
kpushbutton.h
+
+
+ + blackPlayerCombo + blackPlayerName + whitePlayerCombo + whitePlayerName + difficultySlider + startMoveSpinBox + startButton + + + +
diff --git a/src/gui/themerenderer.cpp b/src/gui/themerenderer.cpp new file mode 100644 index 0000000..3d0a01f --- /dev/null +++ b/src/gui/themerenderer.cpp @@ -0,0 +1,220 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and implements the class ThemeRenderer, + * which provides means to get parts of the current selected theme. + * + * @author Sascha Peilicke + */ +#include "themerenderer.h" +#include "preferences.h" + +#include +#include + +#include +#include +#include +#include +#include + +namespace KGo { + +ThemeRenderer::ThemeRenderer() + : m_renderer(new KSvgRenderer) + , m_cache(new KPixmapCache("kgo-cache")) +{ + m_cache->setCacheLimit(3 * 1024); + if (!loadTheme(Preferences::theme())) + kDebug() << "Failed to load any game theme!"; +} + +ThemeRenderer::~ThemeRenderer() +{ + delete m_cache; + delete m_renderer; +} + +bool ThemeRenderer::loadTheme(const QString &themeName) +{ + bool discardCache = !m_currentTheme.isEmpty(); + + if (!m_currentTheme.isEmpty() && m_currentTheme == themeName) { + kDebug() << "Notice: Loading the same theme"; + return true; // We don't have to do anything + } + + m_currentTheme = themeName; + + KGameTheme theme; + if (themeName.isEmpty() || !theme.load(themeName)) { + kDebug() << "Failed to load theme" << Preferences::theme(); + kDebug() << "Trying to load default"; + if (!theme.loadDefault()) + return true; + + discardCache = true; + m_currentTheme = "default"; + } + + kDebug() << "Loading" << theme.graphics(); + if (!m_renderer->load(theme.graphics())) + return false; + + if (discardCache) { + kDebug() << "Discarding cache"; + m_cache->discard(); + } + return true; +} + +void ThemeRenderer::renderElement(Element element, QPainter *painter, const QRectF &rect) const +{ + if (!m_renderer->isValid() || rect.isEmpty() || painter == 0) + return; + + QPixmap pixmap = renderElement(element, rect.size().toSize()); + + // Draw pixmap with the parameter provided painter + painter->drawPixmap(static_cast(rect.x()), static_cast(rect.y()), pixmap); +} + +QPixmap ThemeRenderer::renderElement(Element element, const QSize &size) const +{ + if (!m_renderer->isValid() || size.isEmpty()) + return QPixmap(); + + // Determine which board element we have to render and set the cache item name + QString cacheName; + switch (element) { + case SceneBackground: + cacheName = QString("background_%1x%2").arg(size.width()).arg(size.height()); + break; + case BoardBackground: + cacheName = QString("board_background_%1x%2").arg(size.width()).arg(size.height()); + break; + case BoardCell: + cacheName = QString("board_cell_%1x%2").arg(size.width()).arg(size.height()); + break; + case BoardHandicapMark: + cacheName = QString("board_handicap_mark_%1x%2").arg(size.width()).arg(size.height()); + break; + case BoardLabels: + cacheName = QString("board_labels_%1x%2").arg(size.width()).arg(size.height()); + break; + case WhiteStone: + cacheName = QString("board_stone_white_%1x%2").arg(size.width()).arg(size.height()); + break; + case WhiteStoneTransparent: + cacheName = QString("board_stone_white_%1x%2_trans").arg(size.width()).arg(size.height()); + break; + case BlackStone: + cacheName = QString("board_stone_black_%1x%2").arg(size.width()).arg(size.height()); + break; + case BlackStoneTransparent: + cacheName = QString("board_stone_black_%1x%2_trans").arg(size.width()).arg(size.height()); + break; + } + + // Check if board element is already in cache, if not render it + QPixmap pixmap; + if (!m_cache->find(cacheName, pixmap)) { + pixmap = QPixmap(size); + pixmap.fill(Qt::transparent); + QPainter p(&pixmap); + switch (element) { + case SceneBackground: + m_renderer->render(&p, "background"); + break; + case BoardBackground: + m_renderer->render(&p, "board_background"); + break; + case BoardCell: + m_renderer->render(&p, "board_cell"); + break; + case BoardHandicapMark: + m_renderer->render(&p, "board_handicap_mark"); + break; + case BoardLabels: + m_renderer->render(&p, "board_labels"); + break; + case WhiteStone: + m_renderer->render(&p, "board_stone_white"); + break; + case WhiteStoneTransparent: + p.setOpacity(0.5); + m_renderer->render(&p, "board_stone_white"); + break; + case BlackStone: + m_renderer->render(&p, "board_stone_black"); + break; + case BlackStoneTransparent: + p.setOpacity(0.5); + m_renderer->render(&p, "board_stone_black"); + break; + } + p.end(); + m_cache->insert(cacheName, pixmap); + } + return pixmap; +} + +QSize ThemeRenderer::elementSize(Element element) const +{ + QRectF sizeRect; + switch(element) { + case SceneBackground: + sizeRect = m_renderer->boundsOnElement("background"); + break; + case BoardBackground: + sizeRect = m_renderer->boundsOnElement("board_background"); + break; + case BoardCell: + sizeRect = m_renderer->boundsOnElement("board_cell"); + break; + case BoardHandicapMark: + sizeRect = m_renderer->boundsOnElement("board_handicap_mark"); + break; + case BoardLabels: + sizeRect = m_renderer->boundsOnElement("board_labels"); + break; + case WhiteStone: + sizeRect = m_renderer->boundsOnElement("board_stone_white"); + break; + case WhiteStoneTransparent: + sizeRect = m_renderer->boundsOnElement("board_stone_white"); + break; + case BlackStone: + sizeRect = m_renderer->boundsOnElement("board_stone_black"); + break; + case BlackStoneTransparent: + sizeRect = m_renderer->boundsOnElement("board_stone_black"); + break; + } + return QSize((int)sizeRect.width(), (int)sizeRect.height()); +} + +} // End of namespace KGo + +#include "moc_themerenderer.cpp" diff --git a/src/gui/themerenderer.h b/src/gui/themerenderer.h new file mode 100644 index 0000000..f425368 --- /dev/null +++ b/src/gui/themerenderer.h @@ -0,0 +1,129 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + *******************************************************************/ + +/** + * @file This file is part of KGO and defines the class ThemeRenderer, + * which provides means to get parts of the current selected theme. + * + * @author Sascha Peilicke + */ +#ifndef KGO_THEMERENDERER_H +#define KGO_THEMERENDERER_H + +#include + +class QPixmap; +class QRectF; +class QSize; +class QPainter; +class KSvgRenderer; +class KPixmapCache; + +namespace KGo { + +/** + * The class ThemeRenderer loads shapes from a SVG theme file and converts them into + * pixmaps which can be used by QGraphicsView classes to display the game scene. + * The class is implemented as a singleton because it is needed only once per + * application and uses a pixamp cache to efficiently store the pixmaps. + * + * ThemeRenderer is implemented as a singleton. + * + * @author Sascha Peilicke + * @since 0.1 + */ +class ThemeRenderer +{ +private: + ThemeRenderer(); + ~ThemeRenderer(); + +public: + /** + * Enumeration of all possible renderable scene element types. + */ + enum Element { + SceneBackground = 0x0, ///< + BoardBackground = 0x1, ///< + BoardCell = 0x2, ///< + BoardHandicapMark = 0x3, ///< + BoardLabels = 0x4, ///< + WhiteStone = 0x5, ///< + WhiteStoneTransparent = 0x6, ///< + BlackStone = 0x7, ///< + BlackStoneTransparent = 0x8 //<< + }; + + /** + * Only one ThemeRenderer is needed per application, this method returns + * the singleton instance. + * + * @return ThemeRenderer instance + */ + inline static ThemeRenderer* instance() + { + static ThemeRenderer instance; + return &instance; + } + + /** + * Load the game theme specified by 'name'. See the correspondig KConfigXT + * settings file and available themes for details. + * + * @param themeName The name of the theme to load + */ + bool loadTheme(const QString &themeName); + + /** + * Renders a specific element of the current SVG theme. + * + * @param element Determines which part of the theme to render + * @param painter The QPainter to paint the element with + * @param rect The desired size of the element to render + */ + void renderElement(Element element, QPainter *painter, const QRectF &rect) const; + /** + * Renders and returns a specific element of the current SVG theme. + * + * @param element Determines which part of the theme to render + * @param size The desired size of the element to render + */ + QPixmap renderElement(Element element, const QSize &size) const; + + /** + * Retrieves the default size of a given theme element from the current SVG theme. + * + * @param element The theme element to return the size of + * @return The rounded size of the elements rectangle + */ + QSize elementSize(Element element) const; + +private: + QString m_currentTheme; ///< Holds the current seleted theme + KSvgRenderer *m_renderer; ///< Converts SVG parts into pixmaps + KPixmapCache *m_cache; ///< Stores pixmaps efficiently +}; + +} // End of namespace KGo + +#endif diff --git a/src/kgo.kcfg b/src/kgo.kcfg new file mode 100644 index 0000000..e9d194d --- /dev/null +++ b/src/kgo.kcfg @@ -0,0 +1,66 @@ + + + + + + + Enter here a valid path to your favorite Go game engine executable + gnugo --mode gtp + + + + + + default + + + + + + true + + + + Black Player + + + + false + + + + White Player + + + + The difficulty level controls the computer player's strength + 10 + 1 + 10 + + + + + 19 + 5 + 19 + + + + With komi you can give the black player some extra points + 4.5 + 0 + 50 + + + + To make life easier for the white player, you can him extra stones to start with + 0 + 0 + 9 + + + diff --git a/src/kgo.knsrc b/src/kgo.knsrc new file mode 100644 index 0000000..957edc7 --- /dev/null +++ b/src/kgo.knsrc @@ -0,0 +1,4 @@ +[KNewStuff2] +ProvidersUrl=http://newstuff.kde.org/cgi-bin/hotstuff-provider?site=kgo +TargetDir=kgo/themes +Uncompress=true diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..a744e91 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,77 @@ +/******************************************************************* + * + * Copyright 2008 Sascha Peilicke + * + * This file is part of the KDE project "KGo" + * + * KGo 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, or (at your option) + * any later version. + * + * KGo 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 KReversi; see the file COPYING. If not, write to + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + ******************************************************************* + */ + +/** + * @file This file is part of KGO and contains the main application + * entry point. + * + * @author Sascha Peilicke + */ +#include +#include +#include +#include + +#include "gui/mainwindow.h" + +/** + * This namespace collects all classes related to KGo, the Go board game. + */ +namespace KGo +{ + /* This is only a Doxygen stub */ +} + +/** + * The standard C/C++ program entry point. Application 'about' data + * is created here and command line options are configured and checked + * if the user invokes the application. If everything is set up, the + * method displays the main window and jumps into the Qt event loop. + */ +int main(int argc, char *argv[]) +{ + KAboutData aboutData("kgo", 0, ki18n("KGo"), "v0.2", + ki18n("KDE Go Board Game"), KAboutData::License_GPL_V3, + ki18n("Copyright (c) 2008 Sascha Peilicke")); + aboutData.addAuthor(ki18n("Sascha Peilicke"), ki18n("Original author"), "sasch.pe@gmx.de"); + aboutData.setHomepage("http://games.kde.org/kgo"); + KCmdLineArgs::init(argc, argv, &aboutData); + + KCmdLineOptions options; + options.add("demo", ki18n("Start with a demo game playing")); + KCmdLineArgs::addCmdLineOptions(options); + + KApplication app; + KGlobal::locale()->insertCatalog("libkdegames"); + + if (app.isSessionRestored()) { + RESTORE(KGo::MainWindow) + } else { + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + KGo::MainWindow *mainWin = new KGo::MainWindow(0, args->isSet("demo")); + mainWin->show(); + args->clear(); + } + return app.exec(); +} diff --git a/src/module.dsc b/src/module.dsc new file mode 100644 index 0000000..c9f25da --- /dev/null +++ b/src/module.dsc @@ -0,0 +1,9 @@ +[ModuleInfo] +Name = KGo +Author = Sascha Peilicke +CommandLine = kgo +Frontend = kde +Homepage = http://games.kde.org/ +ProtocolEngine = Go +ProtocolVersion = 1 +Version = 1.0 diff --git a/src/preferences.kcfgc b/src/preferences.kcfgc new file mode 100644 index 0000000..d39534c --- /dev/null +++ b/src/preferences.kcfgc @@ -0,0 +1,7 @@ +# Code generation options for kconfig_compiler +File=kgo.kcfg +#IncludeFiles=defines.h +ClassName=Preferences +Singleton=true +CustomAdditions=false +Mutators=true diff --git a/themes/CMakeLists.txt b/themes/CMakeLists.txt new file mode 100644 index 0000000..72ae496 --- /dev/null +++ b/themes/CMakeLists.txt @@ -0,0 +1,3 @@ +install(FILES + default.desktop kgo_default.svgz +DESTINATION ${DATA_INSTALL_DIR}/kgo/themes) diff --git a/themes/default.desktop b/themes/default.desktop new file mode 100644 index 0000000..2056877 --- /dev/null +++ b/themes/default.desktop @@ -0,0 +1,60 @@ +[KGameTheme] +Name=Default +Name[be]=Прадвызначаны +Name[br]=Dre ziouer +Name[ca]=Predeterminat +Name[da]=Standard +Name[de]=Standard +Name[el]=Προκαθορισμένο +Name[eo]=Defaŭlto +Name[es]=Predeterminado +Name[et]=Vaikimisi +Name[fa]=پیش‌فرض +Name[fi]=Oletus +Name[fr]=Par défaut +Name[ga]=Réamhshocrú +Name[gl]=Predeterminado +Name[hu]=Alapértelmezés +Name[it]=Predefinito +Name[ja]=標準 +Name[km]=លំនាំដើម +Name[ko]=기본 +Name[lv]=Noklusējuma +Name[nds]=Standard +Name[ne]=पूर्वनिर्धारित +Name[nl]=Standaard +Name[nn]=Standard +Name[oc]=Defaut +Name[pl]=Domyślne +Name[pt]=Predefinição +Name[pt_BR]=Padrão +Name[sl]=Privzeto +Name[sv]=Förval +Name[te]=అప్రమెయం +Name[tr]=Öntanımlı +Name[uk]=Типові +Name[wa]=Prémetou +Name[x-test]=xxDefaultxx +Name[zh_CN]=默认 +Name[zh_TW]=預設 +Description=KGo Default theme for KDE 4 +Description[el]=Προκαθορισμένο θέμα KGo για το KDE 4 +Description[es]=Tema predeterminado de KGo para KDE 4 +Description[ga]=Téama réamhshocraithe KGo le haghaidh KDE 4 +Description[gl]=Tema predeterminado de KGo para KDE 4 +Description[ja]=KGo の KDE 4 標準テーマ +Description[km]=ស្បែក​លំនាំដើម​របស់ KGo សម្រាប់ KDE 4 +Description[nds]=KGo-Standardmuster för KDE 4 +Description[pt]=Tema Predefinido para o KGo do KDE 4 +Description[pt_BR]=Tema padrão do KGo para o KDE4 +Description[sv]=Standardtema för Ksudoku i KDE4 +Description[uk]=Типова тема KGo для KDE 4 +Description[x-test]=xxKGo Default theme for KDE 4xx +Description[zh_CN]=为 KDE 4 设计的 KGo 默认主题 +Description[zh_TW]=KGo KDE4 預設主題 +VersionFormat=1 +Author=Sascha Peilicke +AuthorEmail=sasch.pe@gmx.de +Type=SVG +FileName=kgo_default.svgz +#Preview=kgo_default.png diff --git a/themes/kgo_default.svgz b/themes/kgo_default.svgz new file mode 100644 index 0000000..4db4fc9 Binary files /dev/null and b/themes/kgo_default.svgz differ