diff options
author | Anish Mangal <anish@activitycentral.com> | 2012-02-14 18:55:40 (GMT) |
---|---|---|
committer | Anish Mangal <anish@activitycentral.com> | 2012-04-27 10:02:36 (GMT) |
commit | f2bc15b2573c8f0f5a7424ee71c29799fc8d03d7 (patch) | |
tree | 6f69f130d36acb2de2d481d7f4116a204378a3f9 | |
parent | 86d8e90b5dd975279435bd06af1be9cee982eef7 (diff) |
Revert 1-to-N feature
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | data/icons/module-configuration.svg | 190 | ||||
-rw-r--r-- | extensions/cpsection/Makefile.am | 1 | ||||
-rw-r--r-- | extensions/cpsection/configuration/Makefile.am | 6 | ||||
-rw-r--r-- | extensions/cpsection/configuration/__init__.py | 22 | ||||
-rw-r--r-- | extensions/cpsection/configuration/model.py | 21 | ||||
-rw-r--r-- | extensions/cpsection/configuration/view.py | 432 | ||||
-rw-r--r-- | src/jarabe/frame/activitiestray.py | 69 | ||||
-rw-r--r-- | src/jarabe/journal/palettes.py | 127 | ||||
-rw-r--r-- | src/jarabe/model/buddy.py | 12 | ||||
-rw-r--r-- | src/jarabe/model/filetransfer.py | 18 | ||||
-rw-r--r-- | src/jarabe/model/friends.py | 267 | ||||
-rw-r--r-- | src/jarabe/view/buddymenu.py | 87 |
13 files changed, 33 insertions, 1220 deletions
diff --git a/configure.ac b/configure.ac index c028d14..8e6d871 100644 --- a/configure.ac +++ b/configure.ac @@ -52,7 +52,6 @@ data/sugar-emulator.desktop extensions/cpsection/aboutcomputer/Makefile extensions/cpsection/accessibility/Makefile extensions/cpsection/aboutme/Makefile -extensions/cpsection/configuration/Makefile extensions/cpsection/datetime/Makefile extensions/cpsection/frame/Makefile extensions/cpsection/keyboard/Makefile diff --git a/data/icons/module-configuration.svg b/data/icons/module-configuration.svg deleted file mode 100644 index 16ca355..0000000 --- a/data/icons/module-configuration.svg +++ /dev/null @@ -1,190 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - version="1.1" - inkscape:version="0.48.1 r9760" - sodipodi:docname="module-configuration.svg"> - <defs - id="defs4"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective6637" /> - <inkscape:perspective - id="perspective6615" - inkscape:persp3d-origin="0.5 : 0.33333333 : 1" - inkscape:vp_z="1 : 0.5 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 0.5 : 1" - sodipodi:type="inkscape:persp3d" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.35" - inkscape:cx="375" - inkscape:cy="514.28571" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:window-width="1366" - inkscape:window-height="693" - inkscape:window-x="0" - inkscape:window-y="25" - inkscape:window-maximized="1" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <g - id="layer1-3" - inkscape:label="Layer 1" - transform="matrix(2.0112611,0,0,2.8271726,-382.79436,-991.72999)"> - <g - inkscape:label="Layer 1" - id="layer1-1" - transform="translate(170.0671,-314.28571)"> - <g - transform="matrix(9.8137136,0,0,9.8137136,-2250.1262,598.08659)" - id="g6596"> - <g - id="g7197"> - <path - sodipodi:type="arc" - style="fill:none;stroke:#00000f;stroke-width:9.03419971;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" - id="path5989" - sodipodi:cx="307.3714" - sodipodi:cy="24.611456" - sodipodi:rx="12.380237" - sodipodi:ry="11.953332" - d="m 319.75164,24.611456 c 0,6.601643 -5.54283,11.953332 -12.38024,11.953332 -6.83742,0 -12.38024,-5.351689 -12.38024,-11.953332 0,-6.601643 5.54282,-11.953332 12.38024,-11.953332 6.83741,0 12.38024,5.351689 12.38024,11.953332 z" - transform="matrix(0.77926228,0,0,0.79380856,10.613376,6.1120011)" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505" - width="7.9117804" - height="9.2506971" - x="246.11057" - y="7.1083627" - ry="0.82999998" - rx="0.82999998" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505-9" - width="7.9117804" - height="9.2506971" - x="246.21878" - y="35.461403" - rx="0.82999998" - ry="0.82999998" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505-7" - width="7.9117804" - height="9.2506971" - x="-29.96331" - y="231.45294" - transform="matrix(0,-1,1,0,0,0)" - ry="0.82999998" - rx="0.82999998" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505-6" - width="7.9117804" - height="9.2506971" - x="-29.848055" - y="259.62869" - transform="matrix(0,-1,1,0,0,0)" - ry="0.82999998" - rx="0.82999998" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505-76" - width="7.9117804" - height="9.2506971" - x="154.41437" - y="176.47606" - transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" - ry="0.82999998" - rx="0.82999998" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505-76-7" - width="7.9117804" - height="9.2506971" - x="-199.0881" - y="-177.31622" - transform="matrix(-0.70710678,-0.70710678,-0.70710678,0.70710678,0,0)" - ry="0.82999998" - rx="0.82999998" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505-76-5" - width="7.9117804" - height="9.2506971" - x="154.6358" - y="204.75911" - transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" - ry="0.82999998" - rx="0.82999998" /> - <rect - style="fill:#00000f;fill-opacity:1;stroke:none" - id="rect6505-76-0" - width="7.9117804" - height="9.2506971" - x="-199.24612" - y="-148.95982" - transform="matrix(-0.70710678,-0.70710678,-0.70710678,0.70710678,0,0)" - ry="0.82999998" - rx="0.82999998" /> - </g> - </g> - </g> - <path - inkscape:connector-curvature="0" - id="path3073" - d="M 340.90476,719.02884 C 339.85714,717.98124 339,703.77275 339,687.4545 l 0,-29.6696 -10.32864,-4.3156 -10.32863,-4.31557 -22.38347,21.78237 c -18.44567,17.95034 -23.2886,21.29505 -27.52851,19.01228 -6.09928,-3.28383 -46.57361,-44.63814 -46.57361,-47.5862 0,-1.12068 9.16077,-11.48513 20.35725,-23.03211 l 20.35725,-20.99453 -4.31522,-10.84382 -4.31523,-10.84382 -29.61345,-1.42857 -29.61345,-1.42858 -0.80918,-34.05845 c -0.60171,-25.32665 0.13079,-34.65488 2.85715,-36.38482 2.01647,-1.2795 15.35566,-2.34605 29.64263,-2.37012 l 25.97632,-0.0437 3.54536,-11.83336 3.54537,-11.83336 -18.8074,-18.95263 c -10.34407,-10.42395 -18.8074,-20.23446 -18.8074,-21.80115 0,-1.56668 10.92551,-13.71726 24.2789,-27.00129 l 24.2789,-24.15277 19.97202,19.81898 19.97202,19.81898 12.17765,-4.4318 12.17766,-4.4318 0.71651,-24.02847 c 1.19845,-40.19036 -1.99777,-37.19155 38.64555,-36.25866 L 409,356.6479 l 0.80987,28.88986 0.80986,28.88986 11.95928,4.69773 11.95928,4.69774 18.73113,-18.5876 c 10.30212,-10.22317 20.65581,-18.58759 23.00821,-18.58759 2.3524,0 15.0678,10.84703 28.2564,24.10452 l 23.97931,24.10453 -20.52888,21.17152 -20.52889,21.17153 4.32606,8.29538 c 2.37931,4.56245 4.33394,9.85754 4.34363,11.76685 0.0114,2.44368 8.68823,3.71255 29.30331,4.28572 l 29.28572,0.81423 0,35.71429 0,35.71428 -29.28915,0.81428 -29.28914,0.81428 -4.3258,10.35309 -4.3258,10.3531 20.04351,20.67097 c 11.02395,11.36904 20.04352,22.24137 20.04352,24.16074 0,5.18526 -43.1282,48.54783 -48.28543,48.54783 -2.44054,0 -13.64577,-9.14697 -24.90053,-20.32663 l -20.46319,-20.3266 -10.31828,3.40534 -10.31829,3.40532 0,28.11617 c 0,15.46391 -0.78041,30.14991 -1.73425,32.63557 -1.44498,3.76557 -7.32266,4.5194 -35.23809,4.5194 -18.42712,0 -34.36099,-0.85714 -35.40861,-1.90477 l 0,0 z M 394.3828,591.70551 c 16.14693,-4.82459 33.99418,-23.23962 38.65434,-39.88406 7.17003,-25.60883 -3.3713,-52.07528 -26.41559,-66.32247 -11.46728,-7.08967 -16.74237,-8.49394 -31.90726,-8.49394 -25.11984,0 -42.50709,10.48723 -53.57143,32.31195 -12.59921,24.85226 -8.97102,47.7484 10.68602,67.43544 17.12848,17.15462 38.27107,22.20862 62.55392,14.95308 l 0,0 z" - style="fill:#a0a0a0;stroke:none" /> - <path - inkscape:connector-curvature="0" - id="path3075" - d="m 340.31812,686.89964 -2.03213,-31.35394 -10.35728,-4.13652 -10.35728,-4.13651 -22.11154,21.11617 c -12.16135,11.61391 -23.18839,21.1162 -24.50454,21.1162 -1.31614,0 -12.4099,-10.29334 -24.65281,-22.87409 -25.3507,-26.05026 -25.50888,-21.71631 1.82765,-50.07477 l 16.61352,-17.23457 -4.608,-11.73082 -4.608,-11.73082 -29.78067,-2.02985 -29.78067,-2.02985 0.80253,-33.29047 0.80253,-33.29047 28.48749,-2.85715 28.48749,-2.85714 3.28334,-11.42857 3.28334,-11.42857 -18.1994,-19.00791 c -10.00967,-10.45436 -18.1994,-20.12738 -18.1994,-21.4956 0,-1.36824 10.28354,-12.71092 22.85231,-25.20598 l 22.85231,-22.71828 19.3964,19.24778 19.3964,19.24777 13.13154,-4.47437 13.13155,-4.47437 1.15055,-26.27381 c 0.63281,-14.45059 2.14472,-27.88095 3.3598,-29.84523 1.55902,-2.52031 11.82996,-3.57143 34.89776,-3.57143 l 32.68852,0 0,22.67114 c 0,30.00654 2.58714,36.16256 17.01434,40.48506 l 11.55808,3.46288 18.32364,-17.59525 c 10.078,-9.67739 19.89161,-17.59526 21.80802,-17.59526 1.9164,0 13.92055,10.23947 26.67586,22.75438 l 23.19149,22.75438 -19.88883,20.06797 -19.88886,20.06796 4.43392,12.17766 c 4.09622,11.25017 5.3934,12.32472 17.03171,14.10873 6.92877,1.06209 19.99063,2.02637 29.02634,2.14285 l 16.42857,0.21178 0,34.28572 0,34.28571 -21.07142,0 c -33.44695,0 -38.35323,1.70239 -42.23369,14.65427 l -3.32149,11.0861 19.02758,19.70916 c 10.4652,10.84003 19.0276,21.34799 19.0276,23.35102 0,4.76402 -40.74506,45.48517 -45.51189,45.48517 -2.01771,0 -12.90991,-8.96083 -24.20489,-19.91295 -20.44586,-19.82525 -20.58136,-19.89914 -30.76296,-16.77431 l -10.22664,3.13866 -2.50396,31.77428 L 409,716.6479 l -33.32487,0.80283 -33.32488,0.80282 -2.03213,-31.35391 z m 58.05936,-96.11759 c 41.48929,-17.33107 50.46415,-70.92953 16.82283,-100.467 -5.72605,-5.02754 -15.82082,-10.5977 -22.43283,-12.37813 -14.95988,-4.02828 -38.40229,-1.33506 -50.05351,5.75047 -22.67204,13.78769 -35.67939,49.00392 -26.7625,72.45711 3.99028,10.49523 19.70634,27.24005 31.3352,33.38637 12.72992,6.72828 36.58078,7.31236 51.09081,1.25118 z" - style="fill:#a0a0a0;stroke:none" /> - <path - inkscape:connector-curvature="0" - id="path3077" - d="m 340.31239,686.8111 -2.0264,-31.2654 -10.35728,-4.13652 -10.35728,-4.13651 -22.11154,21.11617 c -12.16135,11.61391 -23.18839,21.1162 -24.50454,21.1162 -1.31614,0 -12.4099,-10.29334 -24.65281,-22.87409 -25.3507,-26.05026 -25.50888,-21.71631 1.82765,-50.07477 l 16.61352,-17.23457 -4.73383,-12.05114 c -4.33898,-11.04598 -5.59133,-12.05284 -15.01471,-12.07146 -5.65448,-0.0112 -18.95946,-0.83994 -29.5666,-1.84172 l -19.28571,-1.82142 0,-33.48294 0,-33.48293 29.21025,-2.53248 29.21025,-2.53248 3.27487,-11.42857 3.27486,-11.42857 -18.1994,-19.00791 c -10.00967,-10.45436 -18.1994,-20.12738 -18.1994,-21.4956 0,-1.36824 10.28354,-12.71092 22.85231,-25.20598 l 22.85231,-22.71828 19.3964,19.24778 19.3964,19.24777 13.13154,-4.47437 13.13155,-4.47437 1.15055,-26.27381 c 0.63281,-14.45059 2.14472,-27.88095 3.3598,-29.84523 1.55902,-2.52031 11.82996,-3.57143 34.89776,-3.57143 l 32.68852,0 0.2848,22.14286 c 0.406,31.56613 2.03422,35.66433 16.12267,40.58042 l 11.8983,4.15186 18.45696,-17.72329 c 10.15133,-9.7478 20.02494,-17.72328 21.94135,-17.72328 1.9164,0 13.92055,10.23947 26.67586,22.75438 l 23.19149,22.75438 -19.88883,20.06797 -19.88886,20.06796 4.43392,12.17766 c 4.09622,11.25017 5.3934,12.32472 17.03171,14.10873 6.92877,1.06209 19.99063,2.02637 29.02634,2.14285 l 16.42857,0.21178 0,34.28572 0,34.28571 -23.57142,0.0421 c -27.72475,0.0495 -36.66832,3.7013 -40.32949,16.46697 -2.54951,8.88964 -1.8394,10.14932 16.33206,28.97166 10.44857,10.82287 18.99743,21.31677 18.99743,23.3198 0,4.74805 -40.73712,45.48517 -45.48518,45.48517 -2.00302,0 -12.29835,-8.35715 -22.87852,-18.57143 -18.70259,-18.05583 -23.52162,-20.28709 -36.37094,-16.84 -5.69473,1.52771 -6.31799,4.13083 -8.1997,34.24668 l -2.03651,32.59332 -33.70233,0 -33.70233,0 -2.02639,-31.26537 z m 58.06509,-96.02905 c 31.3829,-13.10939 46.15865,-49.6639 32.35734,-80.05056 -16.96561,-37.35354 -70.38585,-46.62407 -98.95583,-17.17275 -24.62497,25.38461 -24.40007,61.43104 0.53077,85.07441 16.93513,16.06056 44.54805,21.13818 66.06772,12.1489 l 0,0 z" - style="fill:#ffffff;stroke:none" /> - </g> - </g> -</svg> diff --git a/extensions/cpsection/Makefile.am b/extensions/cpsection/Makefile.am index 7324431..1cbf8ea 100644 --- a/extensions/cpsection/Makefile.am +++ b/extensions/cpsection/Makefile.am @@ -2,7 +2,6 @@ SUBDIRS = \ aboutme \ aboutcomputer \ accessibility \ - configuration \ datetime \ frame \ keyboard \ diff --git a/extensions/cpsection/configuration/Makefile.am b/extensions/cpsection/configuration/Makefile.am deleted file mode 100644 index 9f3718a..0000000 --- a/extensions/cpsection/configuration/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -sugardir = $(pkgdatadir)/extensions/cpsection/configuration - -sugar_PYTHON = \ - __init__.py \ - model.py \ - view.py diff --git a/extensions/cpsection/configuration/__init__.py b/extensions/cpsection/configuration/__init__.py deleted file mode 100644 index dd61992..0000000 --- a/extensions/cpsection/configuration/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) 2012 Simon Schampijer <erikos@sugarlabs.org> -# Copyright (C) 2012 Ajay Garg <ajay@activitycentral.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 - -from gettext import gettext as _ - -CLASS = 'Configuration' -ICON = 'module-configuration' -TITLE = _('Configuration') diff --git a/extensions/cpsection/configuration/model.py b/extensions/cpsection/configuration/model.py deleted file mode 100644 index 4fd798d..0000000 --- a/extensions/cpsection/configuration/model.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (C) 2012 Simon Schampijer <erikos@sugarlabs.org> -# Copyright (C) 2012 Ajay Garg <ajay@activitycentral.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 - -_logger = logging.getLogger('ControlPanel - Configuration') diff --git a/extensions/cpsection/configuration/view.py b/extensions/cpsection/configuration/view.py deleted file mode 100644 index 8389fd3..0000000 --- a/extensions/cpsection/configuration/view.py +++ /dev/null @@ -1,432 +0,0 @@ -# Copyright (C) 2012 Simon Schampijer <erikos@sugarlabs.org> -# Copyright (C) 2012 Ajay Garg <ajay@activitycentral.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 gtk -import gobject -from gettext import gettext as _ - -from sugar.graphics import style -from sugar.graphics.alert import Alert -from sugar.graphics.icon import Icon - -from jarabe.model import buddy -from jarabe.model import friends -from jarabe.model import neighborhood - -from jarabe.controlpanel.sectionview import SectionView -from jarabe.controlpanel.inlinealert import InlineAlert - -owner_model = buddy.get_owner_instance() -friends_model = friends.get_model() -neighborhood_model = neighborhood.get_model() - -class LeftAlignedLabelWidget(gtk.HBox): - - def __init__(self, label): - gtk.HBox.__init__(self) - label_widget = gtk.Label(label) - label_widget.set_line_wrap(True) - self.pack_start(label_widget, expand=False) - self.show_all() - - -class CenterAlignedLabelWidget(gtk.VBox): - - def __init__(self, label): - gtk.VBox.__init__(self) - label_widget = gtk.Label(label) - label_widget.set_line_wrap(True) - self.pack_start(label_widget, expand=False) - self.show_all() - - -class BuddyWidget(gtk.HBox): - - def __init__(self, buddy): - gtk.HBox.__init__(self) - self._buddy = buddy - - self._check_button = gtk.CheckButton(label=self._buddy.nick) - self._check_button.set_active(False) - self.pack_start(self._check_button, expand=False) - self.show_all() - - def _is_buddy_selected(self): - return self._check_button.get_active() - - def _get_buddy_key(self): - return self._buddy.key - - def _get_buddy_nick(self): - return self._buddy.nick - - def _get_buddy_account(self): - if hasattr(self._buddy, 'account'): - return self._buddy.account - return None - - def _get_buddy_contact_id(self): - if hasattr(self._buddy, 'contact_id'): - return self._buddy.contact_id - return None - - -class AddRemoveWidget(gtk.VBox): - - def __init__(self, label, group_detail, add_button_clicked_cb, - remove_button_clicked_cb, index): - gtk.VBox.__init__(self) - self.set_homogeneous(False) - self.set_spacing(10) - - self._potential_new_group = False - self._group_name = label - self._group_detail = group_detail - - self._primary_box = gtk.HBox() - self._primary_box.set_homogeneous(False) - self._primary_box.set_spacing(10) - self.pack_start(self._primary_box, expand=False) - self._primary_box.show_all() - - self._index = index - self._add_button_added = False - self._remove_button_added = False - - self._label = gtk.Entry() - self._label.set_text(label) - - # Do not allow an already existing group name to be modified. - if len(label) > 0: - self._label.set_sensitive(False) - # Else, this is a potentially new group. - # Mark this is as new. - # However, this will ACTUALLY be a new group, - # only if it is given a name. - # That check will be done, after the user clicks the final save - # button. - else: - self._potential_new_group = True - - self._primary_box.pack_start(self._label, expand=False) - - if not self._potential_new_group: - self._details_button = gtk.Button(_('View Details')) - self._view_id = self._details_button.connect('clicked', self.__view_details_cb) - self._primary_box.pack_start(self._details_button, - expand=False) - - add_icon = Icon(icon_name='list-add') - self._add_button = gtk.Button() - self._add_button.set_image(add_icon) - self._add_button.connect('clicked', - add_button_clicked_cb, - self) - - remove_icon = Icon(icon_name='list-remove') - self._remove_button = gtk.Button() - self._remove_button.set_image(remove_icon) - self._remove_button.connect('clicked', - remove_button_clicked_cb, - self) - - self.__add_add_button() - self.__add_remove_button() - - self._details_table = gtk.VBox() - self._details_table.set_spacing(20) - self._details_table.show_all() - self.pack_start(self._details_table, expand=False) - - if self._potential_new_group: - info_label = LeftAlignedLabelWidget(_('You may batch add' - ' from the following available online buddies. Any' - ' currently offline buddy may be added later from the' - ' neighborhood view, when it comes online.')) - self.pack_start(info_label, expand=False) - self._friends_list_box = gtk.VBox() - self._friends_list_box.set_homogeneous(True) - self._friends_list_box.set_spacing(20) - self.pack_start(self._friends_list_box, expand=False) - self._populate_friends_list() - - self.pack_start(gtk.HSeparator()) - - self._primary_box.show_all() - self.show_all() - - def _populate_friends_list(self): - buddies = neighborhood_model.get_buddies() - for buddy in buddies: - - # Only make the buddy visible, if it has a valid key at - # this time. - if ((hasattr(buddy, 'key')) and (buddy.key is not None)): - - # Do not show self :) - if buddy.key == owner_model.get_key(): - continue - - self._friends_list_box.pack_start(BuddyWidget(buddy)) - - self._friends_list_box.show_all() - - def _get_buddy_widgets(self): - return self._friends_list_box.get_children() - - def _get_index(self): - return self._index - - def _set_index(self, value): - self._index = value - - def _get_entry(self): - return self._label.get_text() - - def __add_add_button(self): - self._primary_box.pack_start(self._add_button, expand=False) - self._add_button_added = True - - def _remove_remove_button_if_not_already(self): - if self._remove_button_added: - self.__remove_remove_button() - - def __remove_remove_button(self): - self._primary_box.remove(self._remove_button) - self._remove_button_added = False - - def _add_remove_button_if_not_already(self): - if not self._remove_button_added: - self.__add_remove_button() - - def __add_remove_button(self): - self._primary_box.pack_start(self._remove_button, expand=False) - self._remove_button_added = True - - def __activate_view_id(self): - self._details_button.disconnect(self._hide_id) - self._view_id = self._details_button.connect('clicked', - self.__view_details_cb) - - def __activate_hide_id(self): - self._details_button.disconnect(self._view_id) - self._hide_id = self._details_button.connect('clicked', - self.__hide_details_cb) - - def __view_details_cb(self, widget): - if self._group_detail is None: - return - - last_operation_value = friends_model._get_last_group_operation(self._group_name) - - self._last_operation_box = gtk.VBox() - self._last_operation_box.pack_start(LeftAlignedLabelWidget(_('Last' - ' Operation On This Group :: ')), expand=False) - self._last_operation_box.pack_start(CenterAlignedLabelWidget( - last_operation_value), expand=False) - self._last_operation_box.show_all() - - self._details_table.pack_start(self._last_operation_box, - expand=False) - - self._container = gtk.Table() - self._details_table.pack_start(self._container, expand=False) - - headings_list = [_('Nick'), _('Last Operation Status')] - for i in range(0, len(headings_list)): - self._container.attach(gtk.Label(headings_list[i]), i, i+1, - 0, 1) - for i in range(0, len(headings_list)): - self._container.attach(gtk.Label(''), i, i+1, 1, 2) - - index = 2 - friend_keys_of_group = \ - friends_model._get_friend_keys_of_group(self._group_name) - - for friend_key in friend_keys_of_group: - friend_model = friends_model._get_friend_by_key(friend_key) - label_widgets = [] - nick = friend_model.get_nick() - label_widgets.append(CenterAlignedLabelWidget(nick)) - - last_operation_status = \ - friends_model._get_last_operation_status_of_friend_in_group(self._group_name, - friend_key) - label_widgets.append(CenterAlignedLabelWidget(last_operation_status)) - - for i in range(0, len(label_widgets)): - self._container.attach(label_widgets[i], i, i+1, index, - index+1) - index = index + 1 - - self._container.show_all() - - self._details_button.set_label(_('Hide Details')) - self.__activate_hide_id() - - def __hide_details_cb(self, widget): - self._details_table.remove(self._last_operation_box) - self._details_table.remove(self._container) - - self._details_button.set_label(_('View Details')) - self.__activate_view_id() - - -class MultiWidget(gtk.VBox): - - def __init__(self): - gtk.VBox.__init__(self) - self.set_spacing(10) - - def _add_widget(self, label, metadata): - new_widget = AddRemoveWidget(label, - metadata, - self.__add_button_clicked_cb, - self.__remove_button_clicked_cb, - len(self.get_children())) - self.add(new_widget) - self.show_all() - self._update_remove_button_statuses() - - def _add_blank_entry(self): - self._add_widget('', None) - - def __add_button_clicked_cb(self, add_button, - add_button_container): - self._add_blank_entry() - self._update_remove_button_statuses() - - def __remove_button_clicked_cb(self, remove_button, - remove_button_container): - # Remove group from the model. - group_name = remove_button_container._get_entry() - friends_model.remove_group(group_name) - - # Remove group from the view. - self.remove(remove_button_container) - - self._update_remove_button_statuses() - - def _update_remove_button_statuses(self): - children = self.get_children() - - # Now, if there is only one entry, remove-button - # should not be shown. - if len(children) == 1: - children[0]._remove_remove_button_if_not_already() - - # Alternatively, if there are more than 1 entries, - # remove-button should be shown for all. - if len(children) > 1: - for child in children: - child._add_remove_button_if_not_already() - - def set_groups(self, groups): - self._groups = groups - - def _pre_save_operations(self): - for child in self.get_children(): - if child._potential_new_group: - group_name = child._get_entry() - if len(group_name) > 0: - friends_model.add_group(group_name, False) - - # Also, add all the selected buddies as friends. - buddy_widgets = child._get_buddy_widgets() - for widget in buddy_widgets: - if widget._is_buddy_selected(): - # Add as friend. - friends_model.make_friend_by_parameters( - widget._get_buddy_key(), - widget._get_buddy_nick(), - widget._get_buddy_account(), - widget._get_buddy_contact_id()) - - # Add as friend in group. - friends_model.add_friend_to_group(widget._get_buddy_key(), - group_name, - False) - - # Perform just one disk-write for groups. - friends_model.save_groups() - - -class Configuration(SectionView): - def __init__(self, model, alerts=None): - SectionView.__init__(self) - - self._model = model - - self.set_border_width(style.DEFAULT_SPACING * 2) - self.set_spacing(style.DEFAULT_SPACING) - group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) - - workspace = gtk.VBox() - workspace.show() - - separator = gtk.HSeparator() - workspace.pack_start(separator, expand=False) - - label_friend_groups = gtk.Label(_('Groups configuration')) - label_friend_groups.set_alignment(0, 0) - workspace.pack_start(label_friend_groups, expand=False) - - box_friend_groups = gtk.VBox() - box_friend_groups.set_border_width(style.DEFAULT_SPACING * 2) - box_friend_groups.set_spacing(style.DEFAULT_SPACING) - - self._widget_table = MultiWidget() - box_friend_groups.pack_start(self._widget_table, expand=False) - - save_button = gtk.Button() - save_button.set_alignment(0, 0) - save_button.set_label('Save') - save_button.connect('clicked', self.__save_button_clicked_cb) - box_save_button = gtk.HBox() - box_save_button.set_homogeneous(False) - box_save_button.pack_start(save_button, expand=False) - box_save_button.show_all() - - box_friend_groups.pack_start(box_save_button, expand=False) - - box_friend_groups.show_all() - workspace.pack_start(box_friend_groups, expand=False) - - scrolled = gtk.ScrolledWindow() - scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) - scrolled.add_with_viewport(workspace) - scrolled.show() - self.add(scrolled) - - workspace.show_all() - self.setup() - - def setup(self): - groups = friends_model._get_groups() - groups.sort() - - if len(groups) == 0: - self._widget_table._add_blank_entry() - else: - for group_name in groups: - group_detail = \ - friends_model._get_group_by_key_name(group_name) - self._widget_table._add_widget(group_name, group_detail) - - def __save_button_clicked_cb(self, save_button): - save_button.set_sensitive(False) - self._widget_table._pre_save_operations() diff --git a/src/jarabe/frame/activitiestray.py b/src/jarabe/frame/activitiestray.py index d2902be..941b174 100644 --- a/src/jarabe/frame/activitiestray.py +++ b/src/jarabe/frame/activitiestray.py @@ -354,9 +354,7 @@ class BaseTransferButton(ToolButton): def remove(self): frame = jarabe.frame.get_view() frame.remove_notification(self.notif_icon) - if (self.props.parent is not None) and \ - (self in self.props.parent.get_children()): - self.props.parent.remove(self) + self.props.parent.remove(self) def __notify_state_cb(self, file_transfer, pspec): logging.debug('_update state: %r %r', file_transfer.props.state, @@ -473,13 +471,6 @@ class OutgoingTransferButton(BaseTransferButton): frame.add_notification(self.notif_icon, gtk.CORNER_TOP_LEFT) - # TODO: figure out why this is necessary to do. - # if this step is not done, then invoking - # "__dismiss_clicked_cb()" WITHOUT clicking the "Dismiss" - # option (as in the case of auto-dismiss for bulk - # operations), DOES NOT WORK. - self.create_palette() - def create_palette(self): palette = OutgoingTransferPalette(self.file_transfer) palette.connect('dismiss-clicked', self.__dismiss_clicked_cb) @@ -489,14 +480,6 @@ class OutgoingTransferButton(BaseTransferButton): def __dismiss_clicked_cb(self, palette): self.remove() - bulk_operation_details = \ - self.file_transfer._get_bulk_operation_details() - if bulk_operation_details is not None: - group_name = bulk_operation_details._get_group_name() - friend_keys = bulk_operation_details._get_friend_keys() - counter = bulk_operation_details._get_counter() - proceed_cb = bulk_operation_details._get_proceed_cb() - proceed_cb(group_name, friend_keys, counter) class BaseTransferPalette(Palette): @@ -582,7 +565,6 @@ class IncomingTransferPalette(BaseTransferPalette): def _update(self): logging.debug('_update state: %r', self.file_transfer.props.state) - if self.file_transfer.props.state == filetransfer.FT_STATE_PENDING: menu_item = MenuItem(_('Accept'), icon_name='dialog-ok') menu_item.connect('activate', self.__accept_activate_cb) @@ -613,6 +595,7 @@ class IncomingTransferPalette(BaseTransferPalette): elif self.file_transfer.props.state in \ [filetransfer.FT_STATE_ACCEPTED, filetransfer.FT_STATE_OPEN]: + for item in self.menu.get_children(): self.menu.remove(item) @@ -636,6 +619,7 @@ class IncomingTransferPalette(BaseTransferPalette): self.update_progress() elif self.file_transfer.props.state == filetransfer.FT_STATE_COMPLETED: + for item in self.menu.get_children(): self.menu.remove(item) @@ -645,8 +629,8 @@ class IncomingTransferPalette(BaseTransferPalette): menu_item.show() self.update_progress() - elif self.file_transfer.props.state == filetransfer.FT_STATE_CANCELLED: + for item in self.menu.get_children(): self.menu.remove(item) @@ -700,21 +684,11 @@ class OutgoingTransferPalette(BaseTransferPalette): self.progress_bar = None self.progress_label = None - self._bulk_operation_details = \ - file_transfer._get_bulk_operation_details() self.file_transfer.connect('notify::state', self.__notify_state_cb) nick = str(file_transfer.buddy.props.nick) - - label = None - if self._bulk_operation_details is None: - label = glib.markup_escape_text(_('Transfer to %s') % (nick,)) - else: - counter = self._bulk_operation_details._get_counter() - total = self._bulk_operation_details._get_total() - label = glib.markup_escape_text(_('( %d / %d ) Transfer to %s') \ - % (counter, total, nick,)) + label = glib.markup_escape_text(_('Transfer to %s') % (nick,)) self.props.secondary_text = label self._update() @@ -725,8 +699,8 @@ class OutgoingTransferPalette(BaseTransferPalette): def _update(self): new_state = self.file_transfer.props.state logging.debug('_update state: %r', new_state) - if new_state == filetransfer.FT_STATE_PENDING: + menu_item = MenuItem(_('Cancel'), icon_name='dialog-cancel') menu_item.connect('activate', self.__cancel_activate_cb) self.menu.append(menu_item) @@ -751,6 +725,7 @@ class OutgoingTransferPalette(BaseTransferPalette): elif new_state in [filetransfer.FT_STATE_ACCEPTED, filetransfer.FT_STATE_OPEN]: + for item in self.menu.get_children(): self.menu.remove(item) @@ -775,6 +750,7 @@ class OutgoingTransferPalette(BaseTransferPalette): elif new_state in [filetransfer.FT_STATE_COMPLETED, filetransfer.FT_STATE_CANCELLED]: + for item in self.menu.get_children(): self.menu.remove(item) @@ -782,35 +758,8 @@ class OutgoingTransferPalette(BaseTransferPalette): menu_item.connect('activate', self.__dismiss_activate_cb) self.menu.append(menu_item) menu_item.show() - self.update_progress() - # Perform actions specific to bulk-operation. - if self._bulk_operation_details is not None: - - # Update the peration status. - status = None - if new_state == filetransfer.FT_STATE_COMPLETED: - status = _('Success.') - elif new_state == filetransfer.FT_STATE_CANCELLED: - if self.file_transfer.reason_last_change == \ - filetransfer.FT_REASON_REMOTE_STOPPED: - status = _('FAILURE:\tOperation Cancelled Remotely.') - elif self.file_transfer.reason_last_change == \ - filetransfer.FT_REASON_LOCAL_STOPPED: - status = _('FAILURE:\tOperation Cancelled Locally.') - - self._set_bulk_operation_status_if_applicable(status) - - # "Dismiss' automatically for all, except the last of - # the bulk-operation. - counter = self._bulk_operation_details._get_counter() - total = self._bulk_operation_details._get_total() - if counter < total: - self.__dismiss_activate_cb(None) - - def _set_bulk_operation_status_if_applicable(self, status): - if self._bulk_operation_details is not None: - self._bulk_operation_details._set_operation_status(status) + self.update_progress() def __cancel_activate_cb(self, menu_item): self.file_transfer.cancel() diff --git a/src/jarabe/journal/palettes.py b/src/jarabe/journal/palettes.py index 56275e7..740b65a 100644 --- a/src/jarabe/journal/palettes.py +++ b/src/jarabe/journal/palettes.py @@ -49,38 +49,6 @@ friends_model = friends.get_model() _copy_menu_helper = None - -class BulkOperationDetails(): - - def __init__(self, group_name, friend, friend_keys, total, counter, proceed_cb): - self._group_name = group_name - self._friend = friend - self._friend_keys = friend_keys - self._counter = counter - self._total = total - self._proceed_cb = proceed_cb - - def _get_group_name(self): - return self._group_name - - def _get_friend_keys(self): - return self._friend_keys - - def _get_counter(self): - return self._counter - - def _get_total(self): - return self._total - - def _get_proceed_cb(self): - return self._proceed_cb - - def _set_operation_status(self, status): - friends_model._set_last_operation_status_of_friend_in_group(self._group_name, - self._friend.get_key(), - status) - - class ObjectPalette(Palette): __gtype_name__ = 'ObjectPalette' @@ -169,10 +137,6 @@ class ObjectPalette(Palette): friends_menu.connect('friend-selected', self.__friend_selected_cb) menu_item.set_submenu(friends_menu) - groups_menu = GroupsMenu() - groups_menu.connect('group-selected', self.__group_selected_cb) - friends_menu._set_group_menu(groups_menu) - if detail == True: menu_item = MenuItem(_('View Details'), 'go-right') menu_item.connect('activate', self.__detail_activate_cb) @@ -206,8 +170,7 @@ class ObjectPalette(Palette): def __volume_error_cb(self, menu_item, message, severity): self.emit('volume-error', message, severity) - def __friend_selected_cb(self, menu_item, buddy, - bulk_operation_details=None): + def __friend_selected_cb(self, menu_item, buddy): logging.debug('__friend_selected_cb') file_name = model.get_file(self._metadata['uid']) @@ -224,51 +187,9 @@ class ObjectPalette(Palette): if not mime_type: mime_type = mime.get_for_file(file_name) - filetransfer.start_transfer(buddy, file_name, title, description, - mime_type, bulk_operation_details) - - def __group_selected_cb(self, menu_item, group_name): - logging.debug('__group_selected_cb') - if group_name is not None: - friends_model._set_last_group_operation(group_name, - _('(TRANSFER) %s') % (self._metadata['title'],)) - friends_model._set_last_operation_status_of_friends_in_group_with_common_status( - group_name, _('PENDING ...')) - friend_keys = \ - friends_model._get_friend_keys_of_group(group_name) - - self._proceed_with_next_friend(group_name, friend_keys, 0) - """ - This is the (callback) function that needs to be called per friend. - Note that this function is a callback (and not a looped one), since - the "next" friend iteration begins, only when the current iteration - has finished - which is asynchronous. - """ - def _proceed_with_next_friend(self, group_name, friend_keys, counter): - counter = counter + 1 - - if counter <= len(friend_keys): - friend_key = friend_keys[counter-1] - friend = friends_model._get_friend_by_key(friend_key) - - bulk_operation_details = \ - BulkOperationDetails(group_name, - friend, - friend_keys, - len(friend_keys), - counter, - self._proceed_with_next_friend) - - # Only proceed if the friend is online. - # Else, set the failure-status, and move forward. - if friend.is_present(): - self.__friend_selected_cb(None, friend, bulk_operation_details) - else: - bulk_operation_details._set_operation_status(_('FAILURE:\tFriend' - ' is offline.')) - self._proceed_with_next_friend(group_name, friend_keys, - counter) + filetransfer.start_transfer(buddy, file_name, title, description, + mime_type) class CopyMenu(gtk.Menu): @@ -787,41 +708,6 @@ class DocumentsMenu(BaseCopyMenuItem): self._post_operate_per_metadata_per_action(metadata) -class GroupsMenu(gtk.Menu): - __gtype_name__ = 'GroupsMenu' - - __gsignals__ = { - 'group-selected': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([object])), - } - - def __init__(self): - gobject.GObject.__init__(self) - - if filetransfer.file_transfer_available(): - for group in friends_model._get_groups(): - menu_item = MenuItem(text_label=group, - icon_name='zoom-groups') - menu_item.connect('activate', self.__item_activate_cb, - group) - self.append(menu_item) - menu_item.show() - - if not self.get_children(): - menu_item = MenuItem(_('No groups present')) - menu_item.set_sensitive(False) - self.append(menu_item) - menu_item.show() - else: - menu_item = MenuItem(_('No valid connection found')) - menu_item.set_sensitive(False) - self.append(menu_item) - menu_item.show() - - def __item_activate_cb(self, menu_item, group): - self.emit('group-selected', group) - - class FriendsMenu(gtk.Menu): __gtype_name__ = 'JournalFriendsMenu' @@ -834,6 +720,7 @@ class FriendsMenu(gtk.Menu): gobject.GObject.__init__(self) if filetransfer.file_transfer_available(): + friends_model = friends.get_model() for friend in friends_model: if friend.is_present(): menu_item = MenuItem(text_label=friend.get_nick(), @@ -858,12 +745,6 @@ class FriendsMenu(gtk.Menu): def __item_activate_cb(self, menu_item, friend): self.emit('friend-selected', friend) - def _set_group_menu(self, group_menu): - menu_item = MenuItem(_('Select a group, to send')) - menu_item.set_submenu(group_menu) - self.append(menu_item) - menu_item.show() - class StartWithMenu(gtk.Menu): __gtype_name__ = 'JournalStartWithMenu' diff --git a/src/jarabe/model/buddy.py b/src/jarabe/model/buddy.py index c6c6a4c..8f17d7e 100644 --- a/src/jarabe/model/buddy.py +++ b/src/jarabe/model/buddy.py @@ -43,7 +43,6 @@ class BaseBuddyModel(gobject.GObject): self._color = None self._tags = None self._current_activity = None - self._groups = None gobject.GObject.__init__(self, **kwargs) @@ -88,16 +87,6 @@ class BaseBuddyModel(gobject.GObject): getter=get_current_activity, setter=set_current_activity) - def get_groups(self): - return self._groups - - def set_groups(self, groups): - self._groups = groups - - groups = gobject.property(type=object, - getter=get_groups, - setter=set_groups) - def is_owner(self): raise NotImplementedError @@ -190,7 +179,6 @@ class BuddyModel(BaseBuddyModel): self._account = None self._contact_id = None self._handle = None - self._groups_list = [] BaseBuddyModel.__init__(self, **kwargs) diff --git a/src/jarabe/model/filetransfer.py b/src/jarabe/model/filetransfer.py index 3de8c20..447a74a 100644 --- a/src/jarabe/model/filetransfer.py +++ b/src/jarabe/model/filetransfer.py @@ -124,7 +124,6 @@ class BaseFileTransfer(gobject.GObject): self.mime_type = None self.initial_offset = 0 self.reason_last_change = FT_REASON_NONE - self._bulk_operation_details = None def set_channel(self, channel): self.channel = channel @@ -157,12 +156,6 @@ class BaseFileTransfer(gobject.GObject): def _get_transferred_bytes(self): return self._transferred_bytes - def _get_bulk_operation_details(self): - return self._bulk_operation_details - - def _set_bulk_operation_details(self, bulk_operation_details): - self._bulk_operation_details = bulk_operation_details - transferred_bytes = gobject.property(type=int, default=0, getter=_get_transferred_bytes, setter=_set_transferred_bytes) @@ -233,8 +226,7 @@ class IncomingFileTransfer(BaseFileTransfer): class OutgoingFileTransfer(BaseFileTransfer): - def __init__(self, buddy, file_name, title, description, mime_type, - bulk_operation_details): + def __init__(self, buddy, file_name, title, description, mime_type): presence_service = presenceservice.get_instance() name, path = presence_service.get_preferred_connection() @@ -249,7 +241,6 @@ class OutgoingFileTransfer(BaseFileTransfer): self._socket = None self._splicer = None self._output_stream = None - self._set_bulk_operation_details(bulk_operation_details) self.buddy = buddy self.title = title @@ -333,12 +324,9 @@ def init(): _monitor_connection(connection) -def start_transfer(buddy, file_name, title, description, mime_type, - bulk_operation_details): +def start_transfer(buddy, file_name, title, description, mime_type): outgoing_file_transfer = OutgoingFileTransfer(buddy, file_name, title, - description, - mime_type, - bulk_operation_details) + description, mime_type) new_file_transfer.send(None, file_transfer=outgoing_file_transfer) diff --git a/src/jarabe/model/friends.py b/src/jarabe/model/friends.py index 448a36e..7605af1 100644 --- a/src/jarabe/model/friends.py +++ b/src/jarabe/model/friends.py @@ -14,8 +14,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -from gettext import gettext as _ - import os import logging from ConfigParser import ConfigParser @@ -24,7 +22,6 @@ import gobject import dbus from sugar import env -from sugar.util import unique_id from sugar.graphics.xocolor import XoColor from jarabe.model.buddy import BuddyModel @@ -39,11 +36,11 @@ class FriendBuddyModel(BuddyModel): _NOT_PRESENT_COLOR = '#D5D5D5,#FFFFFF' - def __init__(self, nick, key, account=None, contact_id=None, groups=[]): + def __init__(self, nick, key, account=None, contact_id=None): self._online_buddy = None BuddyModel.__init__(self, nick=nick, key=key, account=account, - contact_id=contact_id, groups=groups) + contact_id=contact_id) neighborhood_model = neighborhood.get_model() neighborhood_model.connect('buddy-added', self.__buddy_added_cb) @@ -113,239 +110,35 @@ class Friends(gobject.GObject): def __init__(self): gobject.GObject.__init__(self) - self._path = os.path.join(env.get_profile_path(), 'friends') - self._groups_path = os.path.join(env.get_profile_path(), 'groups') - self.reinit() - def reinit(self): self._friends = {} - self._groups = {} + self._path = os.path.join(env.get_profile_path(), 'friends') + self.load() def has_buddy(self, buddy): - return self.check_buddy_existence_by_key(buddy.get_key()) - - """ - Ideally, this should be the only publically exposed API, since - only the buddy_key is the deciding factor of the existence of - a friend. There can never be two friends of the same key. - """ - def check_buddy_existence_by_key(self, buddy_key): - return buddy_key in self._friends + return buddy.get_key() in self._friends def add_friend(self, buddy_info): self._friends[buddy_info.get_key()] = buddy_info self.emit('friend-added', buddy_info) - def add_friend_to_group(self, buddy_key, group_name, - save_group=True): - if not self.__group_exists(group_name): - return _('Cannot add to group !! Create this group first !!') - - if self.__friend_exists_in_group(group_name, buddy_key): - return _('Friend already exists in this group') - - # If we reach here, it is safe to add this buddy :) - self._groups[group_name]['friends'][buddy_key] = {} - - # Also, update the association from the buddy side, and save. - groups = self._get_groups_of_a_friend(buddy_key) - if group_name not in groups: - groups.append(group_name) - groups.sort() - self.save() - - if save_group: - self.save_groups() - - def remove_friend_group_assoc_using_friend_key(self, group_name, - friend_key, save_friend=True, save_group=True): - if not self.__group_exists(group_name): - return _('No such group exists !!') - - # Remove association from friend. - if group_name in self._friends[friend_key].get_groups(): - self._friends[friend_key].get_groups().remove(group_name) - - # Remove association from group. - if friend_key in self._groups[group_name]['friends'].keys(): - del self._groups[group_name]['friends'][friend_key] - - if save_friend: - self.save() - if save_group: - self.save_groups() - - def _get_groups_of_a_friend(self, friend_key): - if friend_key not in self._friends.keys(): - return [] - - return self._friends[friend_key].get_groups() - - def add_group(self, group_name, save_group=True): - if self.__group_exists(group_name): - return _('A group with the same name already exists !!' - 'Choose a different group-name.') - - # If we reach here, it is safe to add a group of this name. - self._groups[group_name] = {} - self._groups[group_name]['friends'] = {} - self._groups[group_name]['last-operation'] = 'NONE.' - if save_group: - self.save_groups() - - def remove_group(self, group_name, save_friend=True, - save_group=True): - if not self.__group_exists(group_name): - return _('No group exists of this name !!') - - # Remove this group, from all the friend-associations. - for friend_key in self._friends.keys(): - friend_groups_list = self._friends[friend_key].get_groups() - if group_name in friend_groups_list: - friend_groups_list.remove(group_name) - if save_friend: - self.save() - - # Remove the group itself. - del self._groups[group_name] - if save_group: - self.save_groups() - - def __group_exists(self, group_name): - if group_name in self._groups.keys(): - return True - return False - - def __friend_exists_in_group(self, group_name, friend_key): - if friend_key in \ - self._groups[group_name]['friends'].keys(): - return True - return False - - """ - This method is useful in the case, when the buddy is to be added as - a friend in deferred sense. For example, the buddies list may first be - fetched by virtue of their being online, but may go offline by the - time they are about to be saved. So, in that case, we retrieve the - parameters that are required for saving in the early stages itself. - """ - def make_friend_by_parameters(self, buddy_key, buddy_nick, buddy_account, buddy_contact_id): - if not self.check_buddy_existence_by_key(buddy_key): - buddy = FriendBuddyModel(key=buddy_key, - nick=buddy_nick, - account=buddy_account, - contact_id=buddy_contact_id) - self.add_friend(buddy) - self.save() - def make_friend(self, buddy): - self.make_friend_by_parameters(buddy.key, buddy.nick, - buddy.account, buddy.contact_id) - - def remove_groups_of_friend(self, buddy_info, save_friend=True, - save_group=True): - groups = self._get_groups_of_a_friend(buddy_info.get_key()) - for group in groups: - self.remove_friend_group_assoc_using_friend_key(group, - buddy_info.get_key(), False, False) - - if save_friend: + if not self.has_buddy(buddy): + buddy = FriendBuddyModel(key=buddy.key, nick=buddy.nick, + account=buddy.account, + contact_id=buddy.contact_id) + self.add_friend(buddy) self.save() - if save_group: - self.save_groups() def remove(self, buddy_info): - # First remove its association from all its groups - self.remove_groups_of_friend(buddy_info, False, True) - - # Now, remove the friend-entity itself. del self._friends[buddy_info.get_key()] self.save() - self.emit('friend-removed', buddy_info.get_key()) def __iter__(self): return self._friends.values().__iter__() - def _get_friend_by_key(self, key): - if not (key in self._friends.keys()): - return _('No friend found !!') - return self._friends[key] - - def _get_friend_keys_of_group(self, group_name): - if not self.__group_exists(group_name): - return [] - - return self._groups[group_name]['friends'].keys() - - def _get_groups(self): - # Sascha's wonderful feedback: always export only the thing - # required. Here, we required only the group-names; so export - # just the keys - return self._groups.keys() - - def _set_groups(self, groups): - self._groups = groups - - def _get_group_by_key_name(self, group_name): - if not self.__group_exists(group_name): - return None - return self._groups[group_name] - - def _get_last_group_operation(self, group_name): - if not self.__group_exists(group_name): - return _('No group of this name exists !!') - return self._groups[group_name]['last-operation'] - - def _set_last_group_operation(self, group_name, operation): - if not self.__group_exists(group_name): - return _('No group exists.') - self._groups[group_name]['last-operation'] = operation - self.save_groups - - def _get_last_operation_status_of_friend_in_group(self, group_name, - friend_key): - if not self.__group_exists(group_name): - return _('No group exists.') - - if not self.__friend_exists_in_group(group_name, friend_key): - return _('Friend does not exist in group') - - if 'last-operation-status' in \ - self._groups[group_name]['friends'][friend_key].keys(): - return self._groups[group_name]['friends'][friend_key]['last-operation-status'] - - def _set_last_operation_status_of_friend_in_group(self, group_name, - friend_key, status, - save_group=True): - if not self.__group_exists(group_name): - return _('No group exists.') - - if not self.__friend_exists_in_group(group_name, friend_key): - return _('Friend does not exist in group') - - self._groups[group_name]['friends'][friend_key]['last-operation-status'] = \ - status - - if save_group: - self.save_groups() - - def _set_last_operation_status_of_friends_in_group_with_common_status( - self, group_name, status): - if not self.__group_exists(group_name): - return _('No group exists.') - - friend_keys = self._get_friend_keys_of_group(group_name) - for friend_key in friend_keys: - self._set_last_operation_status_of_friend_in_group(group_name, - friend_key, - status, - False) - - # Save the groups in one go. - self.save_groups() - def load(self): cp = ConfigParser() @@ -356,36 +149,11 @@ class Friends(gobject.GObject): # HACK: don't screw up on old friends files if len(key) < 20: continue - - # Check for the existence of 'groups' option (for - # backwards compatability) - groups = [] - if cp.has_option(key, 'groups'): - groups = eval(cp.get(key, 'groups')) - - buddy = FriendBuddyModel(key=key, nick=cp.get(key, - 'nick'), groups=groups) + buddy = FriendBuddyModel(key=key, nick=cp.get(key, 'nick')) self.add_friend(buddy) except Exception: logging.exception('Error parsing friends file') - self.__load_groups() - - def __load_groups(self): - cp = ConfigParser() - - try: - success = cp.read([self._groups_path]) - if success: - for group_name in cp.sections(): - self._groups[group_name] = {} - self._groups[group_name]['friends'] = \ - eval(cp.get(group_name, 'friends')) - self._groups[group_name]['last-operation'] = \ - cp.get(group_name, 'last-operation') - except: - logging.exception('Error while loading config') - def save(self): cp = ConfigParser() @@ -393,24 +161,11 @@ class Friends(gobject.GObject): section = friend.get_key() cp.add_section(section) cp.set(section, 'nick', friend.get_nick()) - cp.set(section, 'groups', friend.get_groups()) fileobject = open(self._path, 'w') cp.write(fileobject) fileobject.close() - def save_groups(self): - cp = ConfigParser() - - for group in self._groups.keys(): - cp.add_section(group) - cp.set(group, 'friends', self._groups[group]['friends']) - cp.set(group, 'last-operation', - self._groups[group]['last-operation']) - - fileobject = open(self._groups_path, 'w') - cp.write(fileobject) - fileobject.close() def get_model(): global _model diff --git a/src/jarabe/view/buddymenu.py b/src/jarabe/view/buddymenu.py index 544faeb..de5a772 100644 --- a/src/jarabe/view/buddymenu.py +++ b/src/jarabe/view/buddymenu.py @@ -22,7 +22,6 @@ import gtk import gconf import glib import dbus -import gobject from sugar.graphics.palette import Palette from sugar.graphics.menuitem import MenuItem @@ -34,34 +33,6 @@ from jarabe.model.session import get_session_manager from jarabe.controlpanel.gui import ControlPanel import jarabe.desktop.homewindow -friends_model = friends.get_model() - -class GroupsMenu(gtk.Menu): - __gtype_name__ = 'NeighbourhoodGroupsMenu' - - __gsignals__ = { - 'group-selected': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([object])), - } - - def __init__(self, groups, no_groups_label): - gobject.GObject.__init__(self) - - for group in groups: - menu_item = MenuItem(text_label=group, icon_name='zoom-groups') - menu_item.connect('activate', self.__item_activate_cb, group) - self.append(menu_item) - menu_item.show() - - if not self.get_children(): - menu_item = MenuItem(no_groups_label) - menu_item.set_sensitive(False) - self.append(menu_item) - menu_item.show() - - def __item_activate_cb(self, menu_item, group): - self.emit('group-selected', group) - class BuddyMenu(Palette): def __init__(self, buddy): @@ -93,57 +64,19 @@ class BuddyMenu(Palette): def _add_buddy_items(self): if friends.get_model().has_buddy(self._buddy): - menu_item = MenuItem(_('Remove friend, and its association' - ' from all groups'), 'list-remove') + menu_item = MenuItem(_('Remove friend'), 'list-remove') menu_item.connect('activate', self._remove_friend_cb) - self.menu.append(menu_item) else: - menu_item = MenuItem(_('Make friend (without associating' - ' to any group)'), 'list-add') + menu_item = MenuItem(_('Make friend'), 'list-add') menu_item.connect('activate', self._make_friend_cb) - self.menu.append(menu_item) - - menu_item_2 = MenuItem(_('Make friend (if not already), and add to group'), - 'list-add') - - all_groups = friends_model._get_groups() - groups_of_friend = \ - friends_model._get_groups_of_a_friend(self._buddy.get_key()) - - # Make a local copy of groups, of which the friend is not - # associated with. - groups_not_of_friend = [] - for group in all_groups: - groups_not_of_friend.append(group) - for group in groups_of_friend: - groups_not_of_friend.remove(group) - - groups_of_friend.sort() - groups_not_of_friend.sort() - - add_groups_menu = GroupsMenu(groups_not_of_friend, _('No groups to' - ' associate')) - add_groups_menu.connect('group-selected', - self.__make_friend_and_add_to_group) - self.menu.append(menu_item_2) - menu_item_2.set_submenu(add_groups_menu) - add_groups_menu.show() - - menu_item_3 = MenuItem(_('Remove friend from group'), 'list-remove') - remove_groups_menu = GroupsMenu(groups_of_friend, _('No groups to' - ' disassociate')) - remove_groups_menu.connect('group-selected', - self.__remove_friend_from_group) - self.menu.append(menu_item_3) - menu_item_3.set_submenu(remove_groups_menu) - remove_groups_menu.show() + + self.menu.append(menu_item) + menu_item.show() self._invite_menu = MenuItem('') self._invite_menu.connect('activate', self._invite_friend_cb) self.menu.append(self._invite_menu) - self.menu.show_all() - home_model = shell.get_model() self._active_activity_changed_hid = home_model.connect( 'active-activity-changed', self._cur_activity_changed_cb) @@ -221,7 +154,7 @@ class BuddyMenu(Palette): def __buddy_notify_nick_cb(self, buddy, pspec): self.set_primary_text(glib.markup_escape_text(buddy.props.nick)) - def _make_friend_cb(self, menuitem=None): + def _make_friend_cb(self, menuitem): friends.get_model().make_friend(self._buddy) def _remove_friend_cb(self, menuitem): @@ -245,11 +178,3 @@ class BuddyMenu(Palette): raise else: logging.error('Invite failed, activity service not ') - - def __make_friend_and_add_to_group(self, menu_item, group): - self._make_friend_cb() - friends_model.add_friend_to_group(self._buddy.get_key(), group) - - def __remove_friend_from_group(self, menu_item, group): - friends_model.remove_friend_group_assoc_using_friend_key(group, - self._buddy.get_key()) |