From 6a78924855d6d0b8c5482422efb8c28483649d4f Mon Sep 17 00:00:00 2001 From: kriss Date: Wed, 2 Jul 2008 18:35:35 +0000 Subject: [PATCH] Release 0.2 - grid of lines git-svn-id: http://www.neo1973-germany.de/svn@81 46df4e5c-bc4e-4628-a0fc-830ba316316d --- .../tags/0.2/doc/2d_slider-screenshot-0.1.jpg | Bin 0 -> 41409 bytes 2D_Slider/tags/0.2/src/COPYING | 340 +++++++++++++++++ 2D_Slider/tags/0.2/src/point.png | Bin 0 -> 447 bytes 2D_Slider/tags/0.2/src/point_inv.png | Bin 0 -> 443 bytes 2D_Slider/tags/0.2/src/slider_2d.py | 361 ++++++++++++++++++ 2D_Slider/tags/0.2/src/slider_2d_test.py | 63 +++ 6 files changed, 764 insertions(+) create mode 100644 2D_Slider/tags/0.2/doc/2d_slider-screenshot-0.1.jpg create mode 100644 2D_Slider/tags/0.2/src/COPYING create mode 100644 2D_Slider/tags/0.2/src/point.png create mode 100644 2D_Slider/tags/0.2/src/point_inv.png create mode 100644 2D_Slider/tags/0.2/src/slider_2d.py create mode 100644 2D_Slider/tags/0.2/src/slider_2d_test.py diff --git a/2D_Slider/tags/0.2/doc/2d_slider-screenshot-0.1.jpg b/2D_Slider/tags/0.2/doc/2d_slider-screenshot-0.1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73447ebc77895b364c4f1e04cf50721db42e6e35 GIT binary patch literal 41409 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 literal 0 HcmV?d00001 diff --git a/2D_Slider/tags/0.2/src/COPYING b/2D_Slider/tags/0.2/src/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/2D_Slider/tags/0.2/src/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/2D_Slider/tags/0.2/src/point.png b/2D_Slider/tags/0.2/src/point.png new file mode 100644 index 0000000000000000000000000000000000000000..704f91dbeb12f45f7c191cba6f86db5af60d5ee3 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>VN3FMcVYMs zf(!O8p9~b?EbxddW?wc6x=<11Hv2m#DP{xdAc};NL&u>+vs;FL8O)6gM*hZ^$=_G z#=M@j!uk%65}K6z7x*XK{lK|kvTWoN)e43hR_oHl-{%!|9ivKqaCe&T+8}|kRV6aZRfQ_2G5*Lkoqe|Y z{&)GX)mPnhyB6K7`18d_%A>`w$s>RzbGt@Y<>B3*)fP3XOlaDs?(xmbV%pOs7vIM1 zoN_KRXadK?32SUm8*kq@^~2`-x0marf4F%}28J29*~C-V}>VN3FMcVYMs zf(!O8p9~b?EbxddW?Y%ztQhdf=DZW?$m89#dSi$ zLN7yv=Qr$Y7uM^$+u^Se{aW~dvOqjzxTm>g=%Y4M(Fwb6XUb$Ie?Di=w1{@zE>!!H| g`dl*cWq828=tE#a#Ns|vU@$Uxy85}Sb4q9e0Qjw`bpQYW literal 0 HcmV?d00001 diff --git a/2D_Slider/tags/0.2/src/slider_2d.py b/2D_Slider/tags/0.2/src/slider_2d.py new file mode 100644 index 0000000..d484ff5 --- /dev/null +++ b/2D_Slider/tags/0.2/src/slider_2d.py @@ -0,0 +1,361 @@ +""" + * 2d_slider.py + * widget to allow for 2D selection of values + * + * (C) 2008 by Kristian Mueller + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" + +import os +import gtk + +IMAGE_DIRECTORY = os.path.join(os.path.realpath(os.path.curdir), "./") +POINT_IMAGE = os.path.join(IMAGE_DIRECTORY, "point.png") +POINT_INV_IMAGE = os.path.join(IMAGE_DIRECTORY, "point_inv.png") +IMAGE_SIZE_X = 10 +IMAGE_SIZE_Y = 10 + + +class slider_2d(gtk.HBox): + """ + Widget to allow for two dimensional selection of values + """ + + def __init__(self, x_range = (0, 10), y_range = (0, 10), + bg_color = "#222222", fg_color = "#555566"): + gtk.HBox.__init__(self, False, 0) + + self.x_range = x_range + self.y_range = y_range + self.x_resolution = x_range[1] - x_range[0] + self.y_resolution = y_range[1] - y_range[0] + self.bg_color = bg_color + self.fg_color = fg_color + + self.mark_color = "#AAAAAA" + self.hover_color = "#555588" + + self.x_value = int(x_range[1] - x_range[0] / 2) + self.y_value = int(x_range[1] - x_range[0] / 2) + self.mouse_x_position = -1 + self.mouse_y_position = -1 + self.clicked = False + + self.area = gtk.DrawingArea() + # self.area.set_size_request(400, 300) + style = self.area.get_style() + self.gc = style.fg_gc[gtk.STATE_NORMAL] + self.area.set_events(gtk.gdk.POINTER_MOTION_MASK | + gtk.gdk.POINTER_MOTION_HINT_MASK ) + self.area.add_events(gtk.gdk.BUTTON_MOTION_MASK | \ + gtk.gdk.BUTTON_PRESS_MASK | \ + gtk.gdk.BUTTON_RELEASE_MASK) + self.area.connect("expose-event", self.area_expose_cb) + self.area.connect("button-press-event", self.area_click_cb) + self.area.connect("button-release-event", self.area_unclick_cb) + self.area.connect("motion-notify-event", self.area_mousemove_cb) + + self.x_value_changed_callback = 0 + self.y_value_changed_callback = 0 + + # define Horizontal and Vertical Rulers + self.hruler = gtk.HRuler() + self.vruler = gtk.VRuler() + self.hruler.set_range(x_range[0], x_range[1], x_range[0], x_range[1]) + self.vruler.set_range(y_range[0], y_range[1], y_range[0], y_range[1]) + + def motion_notify(ruler, event): + return ruler.emit("motion_notify_event", event) + + self.area.connect_object("motion_notify_event", motion_notify, + self.hruler) + self.area.connect_object("motion_notify_event", motion_notify, + self.vruler) + + def size_allocate_cb(wid, allocation): + x, y, width, height = allocation + lower, upper, position, max_size = self.hruler.get_range() + self.hruler.set_range(lower, self.x_resolution, position, max_size) + lower, upper, position, max_size = self.vruler.get_range() + self.vruler.set_range(lower, self.y_resolution, position, max_size) + self.width = width + self.height = height + self.area.connect('size-allocate', size_allocate_cb) + + + self.table = gtk.Table(2,2) + self.table.attach(self.hruler, 1, 2, 0, 1, yoptions=0) + self.table.attach(self.vruler, 0, 1, 1, 2, xoptions=0) + self.table.attach(self.area, 1, 2, 1, 2) + + self.add(self.table) + + + def connect(self, event_name, callback): + if event_name == "x_value_changed_event": + self.x_value_changed_callback = callback + elif event_name == "y_value_changed_event": + self.y_value_changed_callback = callback + else: + super(slider_2d, self).connect(event_name, callback) + + + ############################################################################ + ## callbacks to draw 2D Slider ############################################# + ############################################################################ + def area_expose_cb(self, area, event): + self.redraw() + + def area_click_cb(self, area, event): + self.clicked = True + self.put_value_point(area) + + def area_unclick_cb(self, area, event): + self.clicked = False + self.put_value_point(area) + + def area_mousemove_cb(self, area, event): + pos = area.get_pointer() + + x_max = self.width * 1.0 -1 + y_max = self.height * 1.0 -1 + x_spacing = x_max / self.x_resolution + y_spacing = y_max / self.y_resolution + + # get position of point in grid + x = int((pos[0] + x_spacing/2) / x_spacing) + y = int((pos[1] + y_spacing/2) / y_spacing) + + if self.mouse_x_position != x or self.mouse_y_position != y: + self.redraw_area(self.mouse_x_position, self.mouse_y_position) + self.mouse_x_position = x + self.mouse_y_position = y + self.show_inv_point(x, y) + + if self.clicked: + self.put_value_point(area) + + + def put_value_point(self, area): + """ + actually setting a new value + """ + pos = area.get_pointer() + + x_max = self.width * 1.0 -1 + y_max = self.height * 1.0 -1 + x_spacing = x_max / self.x_resolution + y_spacing = y_max / self.y_resolution + + # get position of point in grid + x = int((pos[0] + x_spacing/2) / x_spacing) + y = int((pos[1] + y_spacing/2) / y_spacing) + + if (self.x_value != x or self.y_value != y) \ + and x in range(self.x_range[0], self.x_range[1]+1)\ + and y in range(self.y_range[0], self.y_range[1]+1): + backup_x = self.x_value + backup_y = self.y_value + self.x_value = x + self.y_value = y + self.redraw_area(backup_x, backup_y) + self.show_point(self.x_value, self.y_value) + + # here we call the callbacks! + if backup_x != self.x_value: + self.x_value_changed_callback(self.x_value) + if backup_y != self.y_value: + self.y_value_changed_callback(self.y_value) + + + ############################################################################ + ## actually writing to our area ############################################ + ############################################################################ + + def redraw(self): + """ + writing all elements to drawing area + (clears screen, draws grid, draws value) + """ + + # get gc + style = self.area.get_style() + self.gc = style.fg_gc[gtk.STATE_NORMAL] + + # clear screen + if self.gc: + fg_backup = self.gc.foreground + self.gc.foreground = self.area.window.get_colormap()\ + .alloc_color(self.bg_color) + # 1) clear screen + self.area.window.draw_rectangle(self.gc, True, 0, 0, -1, -1) + self.gc.foreground = fg_backup + self.draw_grid() + self.show_point(self.x_value, self.y_value) + + + def draw_grid(self): + backup_fb = self.gc.foreground + try: + self.set_color(self.fg_color) + self.gc.set_line_attributes(1, \ + gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, \ + gtk.gdk.CAP_ROUND) + # 2) draw grid + x_max = self.width * 1.0 -1 + y_max = self.height * 1.0 -1 + x_spacing = x_max / self.x_resolution + y_spacing = y_max / self.y_resolution + for i in range(self.x_resolution+2): + if i == self.x_value: + self.set_color(self.mark_color) + self.area.window.draw_line(self.gc, int(x_spacing * i),\ + 0, int(x_spacing * i), int(y_max)) + self.set_color(self.fg_color) + elif i == self.mouse_x_position: + self.set_color(self.hover_color) + self.area.window.draw_line(self.gc, int(x_spacing * i),\ + 0, int(x_spacing * i), int(y_max)) + self.set_color(self.fg_color) + else: + self.area.window.draw_line(self.gc, int(x_spacing * i),\ + 0, int(x_spacing * i), int(y_max)) + + for i in range(self.y_resolution+2): + if i == self.y_value: + self.set_color(self.mark_color) + self.area.window.draw_line(self.gc, 0, \ + int(y_spacing * i), int(x_max), int(y_spacing * i)) + self.set_color(self.fg_color) + elif i == self.mouse_y_position: + self.set_color(self.hover_color) + self.area.window.draw_line(self.gc, 0, \ + int(y_spacing * i), int(x_max), int(y_spacing * i)) + self.set_color(self.fg_color) + else: + self.area.window.draw_line(self.gc, 0, \ + int(y_spacing * i), int(x_max), int(y_spacing * i)) + + # redraw hover (was overdrawn my other lines) + self.set_color(self.hover_color) + self.area.window.draw_line(self.gc, \ + int(x_spacing * self.mouse_x_position),\ + 0, int(x_spacing * self.mouse_x_position), int(y_max)) + self.area.window.draw_line(self.gc, 0, \ + int(y_spacing * self.mouse_y_position), int(x_max), \ + int(y_spacing * self.mouse_y_position)) + + # redraw value (was overdrawn my other lines) + self.set_color(self.mark_color) + self.area.window.draw_line(self.gc, \ + int(x_spacing * self.x_value),\ + 0, int(x_spacing * self.x_value), int(y_max)) + self.area.window.draw_line(self.gc, 0, \ + int(y_spacing * self.y_value), int(x_max), \ + int(y_spacing * self.y_value)) + + finally: + self.gc.foreground = backup_fb + + def set_color(self, color_string): + self.gc.foreground = self.area.window.get_colormap()\ + .alloc_color(color_string) + + + def draw_pixmap(self, x, y, img): + """ + loads and draws image to our area + """ + + pixmap, mask = gtk.gdk.pixmap_create_from_xpm(self.area.window, \ + self.area.window.get_colormap().alloc_color(self.bg_color), img) + + self.area.window.draw_drawable(self.gc, pixmap, 0, 0, \ + int(x-5), int(y-5), -1, -1) + + def show_point(self, x_value, y_value): + """ + shows the value-marker at a specific place + """ + x_max = self.width * 1.0 -1 + y_max = self.height * 1.0 -1 + x_spacing = x_max / self.x_resolution + y_spacing = y_max / self.y_resolution + + self.draw_pixmap(x_spacing * x_value, y_spacing * y_value, POINT_IMAGE) + + def show_inv_point(self, x_value, y_value): + """ + shows the inverted value-marker (mouse indicator) at a specific place + """ + x_max = self.width * 1.0 -1 + y_max = self.height * 1.0 -1 + x_spacing = x_max / self.x_resolution + y_spacing = y_max / self.y_resolution + + self.draw_grid() + self.show_point(self.x_value, self.y_value) + self.draw_pixmap(x_spacing * int(x_value), y_spacing * int(y_value),\ + POINT_INV_IMAGE) + + def redraw_area(self, x_value, y_value): + """ + redraws the area of a value marker, without clearing out the whole + screen - to prevent flickering + """ + + x_max = self.width * 1.0 -1 + y_max = self.height * 1.0 -1 + x_spacing = x_max / self.x_resolution + y_spacing = y_max / self.y_resolution + + start_x = int((x_spacing * x_value) - (IMAGE_SIZE_X / 2)) + start_y = int((y_spacing * y_value) - (IMAGE_SIZE_Y / 2)) + + fg_backup = self.gc.foreground + self.gc.foreground = self.area.window.get_colormap()\ + .alloc_color(self.bg_color) + self.area.window.draw_rectangle(self.gc, True, \ + start_x, start_y, IMAGE_SIZE_X, IMAGE_SIZE_Y) + self.gc.foreground = fg_backup + + + # easyest way for now: redraw all lines + self.draw_grid() + + """ + backup_fb = self.gc.foreground + try: + self.gc.foreground = self.area.window.get_colormap()\ + .alloc_color(self.fg_color) + self.gc.set_line_attributes(1, \ + gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, \ + gtk.gdk.CAP_ROUND) + + # 2) draw grid + x_max = self.width * 1.0 -1 + y_max = self.height * 1.0 -1 + x_spacing = x_max / self.x_resolution + y_spacing = y_max / self.y_resolution + for i in range(self.x_resolution+2): + self.area.window.draw_line(self.gc, int(x_spacing * i), 0, int(x_spacing * i), int(y_max)) + for i in range(self.y_resolution+2): + self.area.window.draw_line(self.gc, 0, int(y_spacing * i), int(x_max), int(y_spacing * i)) + finally: + self.gc.foreground = backup_fb + """ + self.show_point(self.x_value, self.y_value) diff --git a/2D_Slider/tags/0.2/src/slider_2d_test.py b/2D_Slider/tags/0.2/src/slider_2d_test.py new file mode 100644 index 0000000..23bc08b --- /dev/null +++ b/2D_Slider/tags/0.2/src/slider_2d_test.py @@ -0,0 +1,63 @@ +""" + * 2d_slider_test.py + * 2D slider widget - test program + * + * (C) 2008 by Kristian Mueller + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" + +import gtk +import slider_2d + +def delete_event(widget, event, data=None): + print("closing") + gtk.main_quit() + +def x_changed_callback(new_x_value): + value_x_label.set_text("Value X: %s" % new_x_value) + +def y_changed_callback(new_y_value): + value_y_label.set_text("Value Y: %s" % new_y_value) + + +## main program ## +window = gtk.Window(gtk.WINDOW_TOPLEVEL) +window.set_title("2D Slider Test Program") +window.connect("delete_event", delete_event) +window.set_border_width(0) +window.set_default_size(450, 200) + +value_x_label = gtk.Label("Value X: none") +value_y_label = gtk.Label("Value Y: none") + +init_box = gtk.VBox() +init_box.set_border_width(10) + +slider_2d = slider_2d.slider_2d(\ + x_range = (0, 30), y_range = (0, 10)) + +slider_2d.connect('x_value_changed_event', x_changed_callback) +slider_2d.connect('y_value_changed_event', y_changed_callback) + +init_box.pack_start(slider_2d, True, True, 0) +init_box.pack_start(value_x_label, False, False, 0) +init_box.pack_start(value_y_label, False, False, 0) +init_box.show_all() +window.add(init_box) +window.show_all() + +gtk.main()