Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Dengler <martin@martindengler.com>1999-11-30 02:15:16 (GMT)
committer Martin Dengler <martin@martindengler.com>1999-11-30 02:15:16 (GMT)
commit110f530c8549fa53a6f31811b9808020459c947e (patch)
tree9692baae2a61ebf1cb5f5066081f23eb2560f605
initial commit
-rw-r--r--COPYING339
-rw-r--r--MANIFEST7
-rw-r--r--NEWS15
-rw-r--r--TODO15
-rw-r--r--activity/activity.info7
-rw-r--r--activity/network-graph.svg12
-rwxr-xr-xnetworkgraph.py226
-rw-r--r--networkgraphactivity.py45
-rwxr-xr-xsetup.py22
9 files changed, 688 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..200160e
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,7 @@
+NEWS
+setup.py
+COPYING
+networkgraph.py
+networkgraphactivity.py
+activity/activity.info
+activity/network-graph.svg
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..85e7469
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,15 @@
+6
+
+* reasonably packaged as an activity
+
+5
+
+4
+
+3
+
+2
+
+1
+
+* Initial Version
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..cdc3a64
--- /dev/null
+++ b/TODO
@@ -0,0 +1,15 @@
+6
+
+* Re-think the data series data structure/s
+* Break out API for multiple participants
+* Understand collaboration APIs - take notes
+
+5
+
+4
+
+3
+
+2
+
+1
diff --git a/activity/activity.info b/activity/activity.info
new file mode 100644
index 0000000..bdc219d
--- /dev/null
+++ b/activity/activity.info
@@ -0,0 +1,7 @@
+[Activity]
+name = NetworkGraph
+activity_version = 6
+service_name = com.martindengler.NetworkGraph
+exec = sugar-activity networkgraphactivity.NetworkGraphActivity -s
+icon = network-graph
+license = GPLv2+
diff --git a/activity/network-graph.svg b/activity/network-graph.svg
new file mode 100644
index 0000000..d0062b7
--- /dev/null
+++ b/activity/network-graph.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#666666">
+ <!ENTITY fill_color "#ffffff">
+]><svg enable-background="new 0 0 55 55" height="55px" id="Layer_1" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="network-graph">
+ <g display="inline">
+
+ <rect fill="&fill_color;" height="32.442" stroke="&stroke_color;" stroke-linecap="round" stroke-width="3.5" width="43.458" x="5.646" y="9.404"/>
+ <circle cx="27.000" cy="25.424" fill="&stroke_color;" r="10.931"/>
+ <circle cx="27.000" cy="31.424" fill="&fill_color;" r="4.931"/>
+ <circle cx="27.000" cy="34.424" fill="&stroke_color;" r="1.931"/>
+ </g>
+</g></svg>
diff --git a/networkgraph.py b/networkgraph.py
new file mode 100755
index 0000000..e343a83
--- /dev/null
+++ b/networkgraph.py
@@ -0,0 +1,226 @@
+#!/usr/bin/env python
+
+import cairo
+import gobject
+import gtk
+import gtk.gdk
+import math
+import random
+import time
+
+from sugar import profile
+from sugar.graphics.style import Color
+
+black = (0.0, 0.0, 0.0, 1.0)
+blue = (0.2, 0.0, 0.8, 1.0)
+red = (1.0, 0.0, 0.0, 1.0)
+grey = (0.6, 0.6, 0.6, 1.0)
+white = (1, 1, 1, 1)
+
+
+def _mean(data, previous_mean=None):
+ return sum(data) / float(len(data))
+
+def _central_moment(moment, mean, data, previous_moment=None):
+ n = float(len(data))
+ return pow((1 / n) * sum([pow((d - mean), moment) for d in data]), 1/moment)
+
+class Graph(gtk.Image):
+ """Displays a graph of changing linear data points
+
+ TODO: improve this overview
+ """
+ def __init__(self, *args, **kwargs):
+ gtk.Image.__init__(self, *args, **kwargs)
+ self.connect_after("expose-event", self._do_expose_event)
+ self.timer = gobject.timeout_add(250, self.__timeout_cb)
+
+ self.line_width = 0.05
+ self.shrink_by = 1
+ self.width = 1.0
+ self.padding_x = 0.05
+
+ self.nick_name = profile.get_nick_name()
+ self.colors = {}
+
+ self.data_length = 40
+ self.data_moments = (0, 1, 2, 3)
+
+ self.data = {}
+ self.moments = {}
+
+ self.add_nick(self.nick_name, profile.get_color())
+
+ def add_nick(self, nick_name, nick_xocolor):
+ """get ready to receive data series for nick_name with nick_xocolor
+
+ nick_name is a string and nick_xocolor is an XoColor class"""
+ my_color = profile.get_color()
+ self.colors[nick_name] = (Color(my_color.stroke).get_rgba(),
+ Color(my_color.fill).get_rgba(),
+ grey)
+ self.data[nick_name] = []
+ self.moments[nick_name] = [[] for m in self.data_moments]
+
+ def record_new_value(self, new_value, nick_name=None):
+ """record a new value for a nick_name (default: for self.nick_name)"""
+ if nick_name is None:
+ nick_name = self.nick_name
+
+ self.data[nick_name].append(new_value)
+
+ if len(self.data[nick_name]) > self.data_length:
+ del self.data[nick_name][:self.shrink_by]
+
+ for moment in self.data_moments[1:]:
+ means = self.moments[nick_name][1]
+ moments = self.moments[nick_name][moment]
+
+ if moment == 1:
+ moments.append(_mean(self.data[nick_name]))
+ else:
+ moments.append(_central_moment(moment, means[-1], self.data[nick_name]))
+
+ if len(moments) > self.data_length:
+ del moments[:self.shrink_by]
+
+ def __timeout_cb(self):
+ self.record_new_value(self._get_next_value())
+ if self.window is not None:
+ x, y, w, h = self.allocation
+ self.window.invalidate_rect((x, y, x+w, y+h), False)
+ return True
+
+ def __get_cairo_region(self):
+ cr = self.window.cairo_create()
+ x, y, w, h = self.allocation
+ cr.translate(x, y)
+ cr.scale(float(h), float(h))
+ self.width = w / float(h)
+ cr.set_line_cap(cairo.LINE_CAP_BUTT)
+ cr.set_line_join(cairo.LINE_JOIN_ROUND)
+ return cr
+
+ def _do_expose_event(self, widget, event):
+ """called on expose events; set up a unit-height canvas for the drawing method"""
+ cr = self.__get_cairo_region()
+ self._draw_frame(cr)
+ if len(self.data[self.nick_name]) > 0:
+ self._draw_lines(cr)
+ self._draw_metrics(cr)
+
+ def _draw_frame(self, cr):
+ cr.set_source_rgb(0.5, 0.5, 0.5)
+ cr.move_to(0, 0)
+ cr.line_to(self.width, 0)
+ cr.line_to(self.width, 1.0)
+ cr.line_to(0, 1.0)
+ cr.line_to(0, 0)
+ cr.stroke()
+
+ def _draw_lines(self, cr):
+ def _plot_line(color, line_width, data, offset=0.0):
+ dx = (self.width - (2 * self.padding_x)) / float(len(data))
+ last_x = 0.0
+ last_y = 1.0 - data[0] - offset
+
+ cr.set_line_width(line_width)
+ cr.set_source_rgba(*color)
+ cr.move_to(last_x, last_y)
+ for idx in range(1, len(data[1:])):
+ cur_y = 1.0 - data[idx] - offset
+ dy = cur_y - last_y
+ cr.rel_line_to(dx, dy)
+ last_x += dx
+ last_y += dy
+ cr.stroke()
+
+ def _tick_mark(color, tick_width, line_width, datum, tick_x_offset=0.0,
+ label=None):
+ cr.set_source_rgba(*color)
+ cr.set_line_width(line_width)
+ tick_y = 1.0 - datum
+ tick_x = self.width - (2.0 * self.padding_x) + tick_x_offset
+ cr.move_to(tick_x, tick_y)
+ cr.line_to(tick_x + tick_width, tick_y)
+ if label is not None:
+ cr.set_font_size(0.035)
+ cr.move_to(tick_x + tick_width, tick_y + line_width)
+ cr.show_text(label)
+ cr.stroke()
+
+ tick_line_width = 0.005
+
+ for nick_name in self.data:
+ data = self.data[nick_name]
+ means = self.moments[nick_name][1]
+ colors = self.colors[nick_name]
+ _plot_line(colors[0], self.line_width, data)
+ _plot_line(colors[1], tick_line_width, means)
+
+ line1_tick_offset = -(self.padding_x / 1.99)
+ _tick_mark(colors[0], self.padding_x / 2.0, self.line_width, data[-1],
+ tick_x_offset=line1_tick_offset)
+ _tick_mark(colors[1], self.padding_x, tick_line_width, means[-1],
+ label="%i" % (means[-1] * 100))
+
+ min_datum = min(data)
+ max_datum = max(data)
+ _tick_mark(colors[2], self.padding_x, tick_line_width, min_datum,
+ tick_x_offset=line1_tick_offset, label="%i" % (min_datum * 100))
+ _tick_mark(colors[2], self.padding_x, tick_line_width, max_datum,
+ tick_x_offset=line1_tick_offset, label="%i" % (max_datum * 100))
+
+ #cr.set_source_rgba(*colors[1])
+ #cr.set_line_width(0.015)
+ #std_dev = self.moments[2][-1]
+ #cr.move_to(self.width - self.padding_x, mean_y - std_dev)
+ #cr.rel_line_to(0.0, std_dev * 2.0)
+ #cr.stroke()
+
+ def _draw_metrics(self, cr):
+ cr.set_font_size(0.09)
+
+ colors = self.colors[self.nick_name]
+ data = self.data[self.nick_name]
+ means = self.moments[self.nick_name][1]
+
+ def _draw_outlined_text(text, color, pos, font_size=0.09):
+ x, y = pos
+ cr.set_source_rgba(*black)
+ cr.move_to(x - (0.005 * x), y + (0.005 * y))
+ cr.set_font_size(font_size * 1.005)
+ cr.show_text(text)
+
+ cr.set_source_rgba(*color)
+ cr.move_to(x, y)
+ cr.set_font_size(font_size)
+ cr.show_text(text)
+
+ _draw_outlined_text("Link quality: %i" % (data[-1] * 100),
+ colors[0],
+ (0.0, 0.9))
+
+ _draw_outlined_text("Mean: %i" % (means[-1] * 100),
+ colors[1],
+ (0.79, 0.9))
+
+ def _get_next_value(self):
+ return random.random()
+
+
+class NetworkGraph(Graph):
+ def _get_next_value(self):
+ reported = int(open("/sys/class/net/eth0/wireless/link").read().strip())
+ return reported / 100.0
+
+
+if __name__ == "__main__":
+ vbox = gtk.VBox()
+ vbox.pack_start(NetworkGraph())
+
+ w = gtk.Window()
+ w.add(vbox)
+ w.show_all()
+
+ gtk.main()
diff --git a/networkgraphactivity.py b/networkgraphactivity.py
new file mode 100644
index 0000000..ecd5011
--- /dev/null
+++ b/networkgraphactivity.py
@@ -0,0 +1,45 @@
+# Copyright (C) 2009, Martin Dengler <martin@martindengler.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import logging
+
+import gtk
+
+from gettext import gettext as _
+from sugar.activity import activity
+
+from networkgraph import NetworkGraph
+
+class NetworkGraphActivity(activity.Activity):
+ def __init__(self, handle):
+ activity.Activity.__init__(self, handle)
+
+ self._logger = logging.getLogger("NetworkGraph")
+ self._logger.info("NetworkGraphActivity self.show()")
+
+ self.set_title(_('NetworkGraph'))
+ self._build_toolbox()
+
+ vbox = gtk.VBox()
+ self.graph = NetworkGraph()
+ vbox.pack_start(self.graph)
+ self.set_canvas(vbox)
+ vbox.show_all()
+
+ def _build_toolbox(self):
+ toolbox = activity.ActivityToolbox(self)
+ toolbox.show()
+ self.set_toolbox(toolbox)
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..876cd3f
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,22 @@
+#!/usr/bin/python
+
+# Copyright (C) 2006, Red Hat, Inc.
+#
+# 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from sugar.activity import bundlebuilder
+
+bundlebuilder.start()
+