Merge lp:~samitheberber/openfilepad/gui-dev into lp:openfilepad

Proposed by Sami Saada
Status: Merged
Merged at revision: not available
Proposed branch: lp:~samitheberber/openfilepad/gui-dev
Merge into: lp:openfilepad
Diff against target: 1147 lines
19 files modified
README (+5/-4)
src/gfx/home.svg (+33/-0)
src/gfx/logo.svg (+171/-0)
src/gfx/mugshot_new.svg (+95/-0)
src/gfx/mugshot_unknown.svg (+91/-0)
src/gui/__init__.py (+2/-0)
src/gui/friendtab.py (+15/-0)
src/gui/hometab.py (+14/-0)
src/gui/mainwindow.py (+18/-0)
src/gui/newfriendtab.py (+111/-0)
src/gui/userfiles.py (+34/-0)
src/gui/userinfo.py (+90/-0)
src/gui/userpicture.py (+59/-0)
src/gui/usertab.py (+19/-0)
src/gui/usertabwidget.py (+66/-0)
src/guicontrol.py (+76/-0)
src/qfriendslol.pyw (+31/-0)
src/remote.py (+6/-7)
src/store.py (+15/-14)
To merge this branch: bzr merge lp:~samitheberber/openfilepad/gui-dev
Reviewer Review Type Date Requested Status
Martti Rannanjärvi Approve
Review via email: mp+14053@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Sami Saada (samitheberber) wrote :

There is working gui, which should be merged in trunk.

Revision history for this message
Martti Rannanjärvi (mrannanj) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'README'
--- README 2009-10-26 02:34:05 +0000
+++ README 2009-10-27 21:15:19 +0000
@@ -7,12 +7,13 @@
77
8QFriendsLOL is a simple QT file drop box application that enables friends to exchange files by using OpenLookup v2.8QFriendsLOL is a simple QT file drop box application that enables friends to exchange files by using OpenLookup v2.
99
10To get QFriendsLOL running you need to get the latest OpenLookup.10QFriendsLOL requires simplejson and openlookup to run. Simplejson is probably
11You can download it to your home directory by commanding:11packaged by your distribution. The name of the package is python-simplejson in
12 cd ~12Ubuntu and dev-python/simplejson in Gentoo. Openlookup you can download to your
13home directory with these commands:
14 cd
13 svn checkout http://openlookup.googlecode.com/svn/v2 openlookup215 svn checkout http://openlookup.googlecode.com/svn/v2 openlookup2
1416
15then set python path as follows before starting QFriendsLOL:17then set python path as follows before starting QFriendsLOL:
16 export PYTHONPATH=~/openlookup218 export PYTHONPATH=~/openlookup2
1719
18
1920
=== added directory 'src/gfx'
=== added file 'src/gfx/home.svg'
--- src/gfx/home.svg 1970-01-01 00:00:00 +0000
+++ src/gfx/home.svg 2009-10-27 21:15:19 +0000
@@ -0,0 +1,33 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg
4 xmlns:svg="http://www.w3.org/2000/svg"
5 xmlns="http://www.w3.org/2000/svg"
6 version="1.0"
7 width="16"
8 height="16"
9 id="svg1901">
10 <defs
11 id="defs1903" />
12 <g
13 id="layer1"
14 style="opacity:1">
15 <g
16 transform="matrix(3.3802679e-2,0,0,3.9578024e-2,-3.7983281,-8.644124)"
17 id="g2405">
18 <rect
19 width="302.85715"
20 height="211.42857"
21 rx="0"
22 ry="0"
23 x="188.57143"
24 y="375.21933"
25 id="rect2380"
26 style="fill:#000000;fill-opacity:1" />
27 <path
28 d="M 340,252.36219 L 542.8571,378.07646 L 151.42857,378.07646 L 340,252.36219 z"
29 id="rect2382"
30 style="fill:#000000;fill-opacity:1" />
31 </g>
32 </g>
33</svg>
034
=== added file 'src/gfx/logo.svg'
--- src/gfx/logo.svg 1970-01-01 00:00:00 +0000
+++ src/gfx/logo.svg 2009-10-27 21:15:19 +0000
@@ -0,0 +1,171 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg
4 xmlns:dc="http://purl.org/dc/elements/1.1/"
5 xmlns:cc="http://creativecommons.org/ns#"
6 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7 xmlns:svg="http://www.w3.org/2000/svg"
8 xmlns="http://www.w3.org/2000/svg"
9 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
10 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11 version="1.0"
12 width="53.300831"
13 height="50.020782"
14 id="svg1901"
15 inkscape:version="0.46"
16 sodipodi:docname="qfriendslol_logo.svg"
17 sodipodi:version="0.32"
18 inkscape:output_extension="org.inkscape.output.svg.inkscape">
19 <metadata
20 id="metadata28">
21 <rdf:RDF>
22 <cc:Work
23 rdf:about="">
24 <dc:format>image/svg+xml</dc:format>
25 <dc:type
26 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
27 </cc:Work>
28 </rdf:RDF>
29 </metadata>
30 <sodipodi:namedview
31 pagecolor="#ffffff"
32 bordercolor="#666666"
33 borderopacity="1"
34 objecttolerance="10"
35 gridtolerance="10"
36 guidetolerance="10"
37 inkscape:pageopacity="0"
38 inkscape:pageshadow="2"
39 inkscape:window-width="789"
40 inkscape:window-height="786"
41 id="namedview26"
42 showgrid="false"
43 inkscape:zoom="5.3299604"
44 inkscape:cx="55.118585"
45 inkscape:cy="7.1743389"
46 inkscape:window-x="0"
47 inkscape:window-y="12"
48 inkscape:window-maximized="0"
49 inkscape:current-layer="g2899" />
50 <defs
51 id="defs1903">
52 <inkscape:perspective
53 sodipodi:type="inkscape:persp3d"
54 inkscape:vp_x="0 : 372.04724 : 1"
55 inkscape:vp_y="0 : 1000 : 0"
56 inkscape:vp_z="1052.3622 : 372.04724 : 1"
57 inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
58 id="perspective30" />
59 </defs>
60 <g
61 transform="matrix(0.7786856,0,0,0.7880085,-69.510459,-145.8237)"
62 id="g2899">
63 <g
64 id="g2974"
65 transform="matrix(7.1574807e-2,0,0,7.1574807e-2,82.877173,171.80829)">
66 <g
67 transform="matrix(1.2842154,0,0,1.2690218,896.81145,162.03984)"
68 id="g2930">
69 <g
70 id="g2561"
71 transform="matrix(0.7121539,0,0,0.7121539,-652.62997,34.07993)">
72 <g
73 style="fill:#729fcf"
74 id="g2390">
75 <path
76 style="fill:#729fcf"
77 id="path2382"
78 d="M 508.57143,223.79076 C 508.57143,342.1375 412.63244,438.07648 294.28571,438.07648 C 175.93897,438.07648 79.999985,342.1375 79.999985,223.79076 C 79.999985,105.44402 175.93897,9.5050375 294.28571,9.5050375 C 412.63244,9.5050375 508.57143,105.44402 508.57143,223.79076 L 508.57143,223.79076 z" />
79 <rect
80 style="fill:#729fcf"
81 id="rect2384"
82 y="419.50504"
83 x="33.428574"
84 ry="120"
85 rx="174.28572"
86 height="474.28574"
87 width="522.85712" />
88 </g>
89 </g>
90 <g
91 style="fill:#ef2929"
92 id="g2566"
93 transform="matrix(0.7121539,0,0,0.7121539,-280.2977,34.066399)">
94 <g
95 style="fill:#ef2929"
96 id="g2568">
97 <path
98 style="fill:#ef2929"
99 id="path2570"
100 d="M 508.57143,223.79076 C 508.57143,342.1375 412.63244,438.07648 294.28571,438.07648 C 175.93897,438.07648 79.999985,342.1375 79.999985,223.79076 C 79.999985,105.44402 175.93897,9.5050375 294.28571,9.5050375 C 412.63244,9.5050375 508.57143,105.44402 508.57143,223.79076 L 508.57143,223.79076 z" />
101 <rect
102 style="fill:#ef2929"
103 id="rect2572"
104 y="419.50504"
105 x="33.428574"
106 ry="120"
107 rx="174.28572"
108 height="474.28574"
109 width="522.85712" />
110 </g>
111 </g>
112 </g>
113 <g
114 id="g2952">
115 <g
116 style="fill:#8ae234"
117 id="g2574"
118 transform="matrix(1.0149288,0,0,1.0029211,272.88051,175.52064)">
119 <g
120 style="fill:#8ae234"
121 id="g2576">
122 <path
123 style="fill:#8ae234"
124 id="path2578"
125 d="M 508.57143,223.79076 C 508.57143,342.1375 412.63244,438.07648 294.28571,438.07648 C 175.93897,438.07648 79.999985,342.1375 79.999985,223.79076 C 79.999985,105.44402 175.93897,9.5050375 294.28571,9.5050375 C 412.63244,9.5050375 508.57143,105.44402 508.57143,223.79076 L 508.57143,223.79076 z" />
126 <rect
127 style="fill:#8ae234"
128 id="rect2580"
129 y="419.50504"
130 x="33.428574"
131 ry="120"
132 rx="174.28572"
133 height="474.28574"
134 width="522.85712" />
135 </g>
136 </g>
137 <text
138 x="444.51709"
139 y="516.66309"
140 id="text3360"
141 xml:space="preserve"
142 style="font-size:323.3861084px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"><tspan
143 x="444.51709"
144 y="516.66309"
145 id="tspan3362">Q</tspan></text>
146 <g
147 id="g2877"
148 transform="matrix(1.0216867,0,0,1.0216867,166.7808,-619.91001)">
149 <text
150 style="font-size:237.41375732px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
151 xml:space="preserve"
152 id="text3364"
153 y="1561.1241"
154 x="165.02359"><tspan
155 id="tspan3366"
156 y="1561.1241"
157 x="165.02359">LOL</tspan></text>
158 <text
159 style="font-size:99.64174652px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
160 xml:space="preserve"
161 id="text3368"
162 y="1359.7706"
163 x="178.23366"><tspan
164 id="tspan3370"
165 y="1359.7706"
166 x="178.23366">FRIENDS</tspan></text>
167 </g>
168 </g>
169 </g>
170 </g>
171</svg>
0172
=== added file 'src/gfx/mugshot_new.svg'
--- src/gfx/mugshot_new.svg 1970-01-01 00:00:00 +0000
+++ src/gfx/mugshot_new.svg 2009-10-27 21:15:19 +0000
@@ -0,0 +1,95 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg
4 xmlns:dc="http://purl.org/dc/elements/1.1/"
5 xmlns:cc="http://creativecommons.org/ns#"
6 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7 xmlns:svg="http://www.w3.org/2000/svg"
8 xmlns="http://www.w3.org/2000/svg"
9 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
10 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11 version="1.0"
12 width="57.575825"
13 height="97.375511"
14 id="svg1901"
15 sodipodi:version="0.32"
16 inkscape:version="0.46"
17 sodipodi:docname="mugshot_new.svg"
18 inkscape:output_extension="org.inkscape.output.svg.inkscape">
19 <metadata
20 id="metadata2424">
21 <rdf:RDF>
22 <cc:Work
23 rdf:about="">
24 <dc:format>image/svg+xml</dc:format>
25 <dc:type
26 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
27 </cc:Work>
28 </rdf:RDF>
29 </metadata>
30 <sodipodi:namedview
31 inkscape:window-height="1022"
32 inkscape:window-width="789"
33 inkscape:pageshadow="2"
34 inkscape:pageopacity="0.0"
35 guidetolerance="10.0"
36 gridtolerance="10.0"
37 objecttolerance="10.0"
38 borderopacity="1.0"
39 bordercolor="#666666"
40 pagecolor="#ffffff"
41 id="base"
42 showgrid="false"
43 inkscape:zoom="1.8928844"
44 inkscape:cx="115.61036"
45 inkscape:cy="39.417556"
46 inkscape:window-x="0"
47 inkscape:window-y="0"
48 inkscape:current-layer="svg1901" />
49 <defs
50 id="defs1903">
51 <inkscape:perspective
52 sodipodi:type="inkscape:persp3d"
53 inkscape:vp_x="0 : 526.18109 : 1"
54 inkscape:vp_y="0 : 1000 : 0"
55 inkscape:vp_z="744.09448 : 526.18109 : 1"
56 inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
57 id="perspective2426" />
58 </defs>
59 <g
60 id="layer1"
61 style="opacity:1"
62 transform="matrix(0.1101177,0,0,0.1101177,-13.056815,-7.4177671)">
63 <g
64 transform="translate(85.14287,57.857131)"
65 id="g2433"
66 style="opacity:1">
67 <g
68 id="g2390"
69 style="fill:#729fcf">
70 <path
71 d="M 508.57143,223.79076 C 508.57143,342.1375 412.63244,438.07648 294.28571,438.07648 C 175.93897,438.07648 79.999985,342.1375 79.999985,223.79076 C 79.999985,105.44402 175.93897,9.5050375 294.28571,9.5050375 C 412.63244,9.5050375 508.57143,105.44402 508.57143,223.79076 L 508.57143,223.79076 z"
72 id="path2382"
73 style="fill:#729fcf" />
74 <rect
75 width="522.85712"
76 height="474.28574"
77 rx="174.28572"
78 ry="120"
79 x="33.428574"
80 y="419.50504"
81 id="rect2384"
82 style="fill:#729fcf" />
83 </g>
84 </g>
85 <text
86 x="71.970245"
87 y="942.89124"
88 id="text2438"
89 xml:space="preserve"
90 style="font-size:731.74212646px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"><tspan
91 x="71.970245"
92 y="942.89124"
93 id="tspan2440">+</tspan></text>
94 </g>
95</svg>
096
=== added file 'src/gfx/mugshot_unknown.svg'
--- src/gfx/mugshot_unknown.svg 1970-01-01 00:00:00 +0000
+++ src/gfx/mugshot_unknown.svg 2009-10-27 21:15:19 +0000
@@ -0,0 +1,91 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg
4 xmlns:dc="http://purl.org/dc/elements/1.1/"
5 xmlns:cc="http://creativecommons.org/ns#"
6 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7 xmlns:svg="http://www.w3.org/2000/svg"
8 xmlns="http://www.w3.org/2000/svg"
9 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
10 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11 version="1.0"
12 width="49.8494"
13 height="84.308144"
14 id="svg1901"
15 sodipodi:version="0.32"
16 inkscape:version="0.46"
17 sodipodi:docname="mugshot_unknown.svg"
18 inkscape:output_extension="org.inkscape.output.svg.inkscape">
19 <metadata
20 id="metadata2540">
21 <rdf:RDF>
22 <cc:Work
23 rdf:about="">
24 <dc:format>image/svg+xml</dc:format>
25 <dc:type
26 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
27 </cc:Work>
28 </rdf:RDF>
29 </metadata>
30 <sodipodi:namedview
31 inkscape:window-height="510"
32 inkscape:window-width="487"
33 inkscape:pageshadow="2"
34 inkscape:pageopacity="0.0"
35 guidetolerance="10.0"
36 gridtolerance="10.0"
37 objecttolerance="10.0"
38 borderopacity="1.0"
39 bordercolor="#666666"
40 pagecolor="#ffffff"
41 id="base"
42 showgrid="false"
43 inkscape:zoom="2.6769428"
44 inkscape:cx="36.591392"
45 inkscape:cy="21.560543"
46 inkscape:window-x="791"
47 inkscape:window-y="0"
48 inkscape:current-layer="svg1901" />
49 <defs
50 id="defs1903">
51 <inkscape:perspective
52 sodipodi:type="inkscape:persp3d"
53 inkscape:vp_x="0 : 526.18109 : 1"
54 inkscape:vp_y="0 : 1000 : 0"
55 inkscape:vp_z="744.09448 : 526.18109 : 1"
56 inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
57 id="perspective2542" />
58 </defs>
59 <g
60 id="layer1"
61 style="opacity:1"
62 transform="matrix(9.5340385e-2,0,0,9.5340385e-2,-3.1870931,-0.9062139)">
63 <g
64 id="g2390"
65 style="fill:#729fcf">
66 <path
67 d="M 508.57143,223.79076 C 508.57143,342.1375 412.63244,438.07648 294.28571,438.07648 C 175.93897,438.07648 79.999985,342.1375 79.999985,223.79076 C 79.999985,105.44402 175.93897,9.5050375 294.28571,9.5050375 C 412.63244,9.5050375 508.57143,105.44402 508.57143,223.79076 L 508.57143,223.79076 z"
68 id="path2382"
69 style="fill:#729fcf" />
70 <rect
71 width="522.85712"
72 height="474.28574"
73 rx="174.28572"
74 ry="120"
75 x="33.428574"
76 y="419.50504"
77 id="rect2384"
78 style="fill:#729fcf" />
79 </g>
80 <text
81 x="159.92941"
82 y="632.41937"
83 transform="scale(0.8084629,1.2369151)"
84 id="text2386"
85 xml:space="preserve"
86 style="font-size:778.21777344px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Rudelsberg;-inkscape-font-specification:Rudelsberg Medium"><tspan
87 x="159.92941"
88 y="632.41937"
89 id="tspan2388">?</tspan></text>
90 </g>
91</svg>
092
=== added directory 'src/gui'
=== added file 'src/gui/__init__.py'
--- src/gui/__init__.py 1970-01-01 00:00:00 +0000
+++ src/gui/__init__.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,2 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
03
=== added file 'src/gui/friendtab.py'
--- src/gui/friendtab.py 1970-01-01 00:00:00 +0000
+++ src/gui/friendtab.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,15 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from userfiles import UserFiles
5from userinfo import UserInfo
6from usertab import UserTab
7
8
9class FriendTab(UserTab):
10
11 def __init__(self, control, friendId, *args):
12 apply(UserTab.__init__, (self, control, ) + args)
13 self._friendId = friendId
14 self.addWidget(UserInfo(control, self._friendId))
15 self.addWidget(UserFiles(control, self._friendId))
016
=== added file 'src/gui/hometab.py'
--- src/gui/hometab.py 1970-01-01 00:00:00 +0000
+++ src/gui/hometab.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,14 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from userfiles import UserFiles
5from userinfo import UserInfo
6from usertab import UserTab
7
8
9class HomeTab(UserTab):
10
11 def __init__(self, control, *args):
12 apply(UserTab.__init__, (self, control, ) + args)
13 self.addWidget(UserInfo(control))
14 self.addWidget(UserFiles(control))
015
=== added file 'src/gui/mainwindow.py'
--- src/gui/mainwindow.py 1970-01-01 00:00:00 +0000
+++ src/gui/mainwindow.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,18 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from usertabwidget import UserTabWidget
5
6from PyQt4.QtGui import QIcon
7from PyQt4.QtGui import QMainWindow
8
9
10class MainWindow(QMainWindow):
11
12 def __init__(self, control, *args):
13 apply(QMainWindow.__init__, (self, ) + args)
14 self.setWindowTitle(u'QFriendsLOL')
15 self._control = control
16 self.setWindowIcon(QIcon(self._control.getGFXPath() + '/logo.svg'))
17 self._userTabs = UserTabWidget(control)
18 self.setCentralWidget(self._userTabs)
019
=== added file 'src/gui/newfriendtab.py'
--- src/gui/newfriendtab.py 1970-01-01 00:00:00 +0000
+++ src/gui/newfriendtab.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,111 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from usertab import UserTab
5
6from PyQt4.QtGui import QLabel
7from PyQt4.QtGui import QWidget
8from PyQt4.QtGui import QHBoxLayout
9from PyQt4.QtGui import QVBoxLayout
10from PyQt4.QtGui import QPixmap
11from PyQt4.QtGui import QLineEdit
12from PyQt4.QtGui import QPushButton
13from PyQt4.QtGui import QScrollArea
14from PyQt4.QtCore import Qt
15from PyQt4.QtCore import QObject
16from PyQt4.QtCore import SIGNAL
17from PyQt4.QtCore import SLOT
18
19
20class NewFriendTab(UserTab):
21
22 def __init__(self, control, *args):
23 apply(UserTab.__init__, (self, control, ) + args)
24 self._searchBox()
25 self._searchResults()
26
27 def _searchBox(self):
28 searchBoxWidget = QWidget()
29 self.addWidget(searchBoxWidget)
30 searchBoxLayout = QHBoxLayout()
31 searchBoxWidget.setLayout(searchBoxLayout)
32
33 searchBoxLayout.addWidget(self._searchBoxPicture())
34 searchBoxLayout.addWidget(self._searchBoxDataField())
35 searchBoxLayout.addWidget(self._searchBoxSubmit())
36
37 QObject.connect(self._addButton, SIGNAL('pressed()'), self._searchUser)
38 QObject.connect(self._searchField, SIGNAL('returnPressed()'), self._searchUser)
39
40 def _searchBoxPicture(self):
41 picture = QLabel()
42 picture.setPixmap(QPixmap(self._control.getGFXPath() + '/mugshot_new.svg'))
43 return picture
44
45 def _searchBoxDataField(self):
46 self._searchField = QLineEdit()
47 self._errorMessage = QLabel()
48 self._errorMessage.hide()
49
50 searchData = QWidget()
51 searchLayout = QVBoxLayout()
52 searchLayout.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop);
53 searchData.setLayout(searchLayout)
54
55 searchLayout.addWidget(QLabel(u'Enter email or user id:'))
56 searchLayout.addWidget(self._searchField)
57 searchLayout.addWidget(self._errorMessage)
58 return searchData
59
60 def _searchBoxSubmit(self):
61 self._addButton = QPushButton(u'Add')
62 self._addButton.setAutoDefault(True)
63 self._addButton.setDefault(True)
64 return self._addButton
65
66 def _searchResults(self):
67 self._results = QScrollArea()
68 self.addWidget(self._results)
69
70 def _searchUser(self):
71 searchData = str(self._searchField.text())
72 hits = [uid for uid in self._control.getRemote().findUser(searchData) \
73 if not uid == self._control.getRemote().localIdentityHex()]
74
75 old = self._results.widget()
76 if old:
77 old.destroy()
78 self._results.setWidget(QWidget())
79
80 if len(hits) == 0:
81 self._errorMessage.setText(u'No such user.')
82 self._errorMessage.show()
83 elif len(hits) > 1:
84 self._errorMessage.setText(u'Many hits from such user.')
85 self._errorMessage.show()
86 self._addToSearchResults(hits)
87 else:
88 hit = hits[0]
89 if hit in self._control.getStore().getFriends():
90 self._errorMessage.setText(u'Found user is already in your friends.')
91 self._errorMessage.show()
92 else:
93 self._searchField.setText(u'')
94 self._errorMessage.setText(u'')
95 self._errorMessage.hide()
96 if not self._control.getRemote().isValidId(searchData):
97 self._control.addUser(hit, searchData)
98 else:
99 self._control.addUser(hit)
100
101 def _addToSearchResults(self, hits):
102 results = QWidget()
103 resultsLayout = QVBoxLayout()
104 results.setLayout(resultsLayout)
105 for hit in hits:
106 resultsLayout.addWidget(self._morphHit(hit))
107 self._results.setWidget(results)
108
109 def _morphHit(self, hit):
110 #TODO: Add better view.
111 return QLabel(u'%s' % hit)
0112
=== added file 'src/gui/userfiles.py'
--- src/gui/userfiles.py 1970-01-01 00:00:00 +0000
+++ src/gui/userfiles.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,34 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from PyQt4.QtGui import QLabel
5from PyQt4.QtGui import QScrollArea
6from PyQt4.QtGui import QVBoxLayout
7from PyQt4.QtCore import Qt
8
9
10class UserFiles(QScrollArea):
11
12 def __init__(self, control, userId = None, *args):
13 apply(QScrollArea.__init__, (self, ) + args)
14
15 self._control = control
16 self._userId = self._control.getRemote().localIdentityHex() \
17 if userId == None else userId
18
19 self._layout = QVBoxLayout()
20 self.setLayout(self._layout)
21
22 self.update()
23
24 def update(self):
25 files = self._control.getRemote().getfilenames(self._userId)
26 if files:
27 for file in files:
28 fileLabel = QLabel(u'%s' % file)
29 fileLabel.setAlignment(Qt.AlignLeft|Qt.AlignTop)
30 self._layout.addWidget(fileLabel)
31 else:
32 notFoundLabel = QLabel(u'No files found.')
33 notFoundLabel.setAlignment(Qt.AlignHCenter|Qt.AlignTop)
34 self._layout.addWidget(notFoundLabel)
035
=== added file 'src/gui/userinfo.py'
--- src/gui/userinfo.py 1970-01-01 00:00:00 +0000
+++ src/gui/userinfo.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,90 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from userpicture import UserPicture
5
6from PyQt4.QtGui import QHBoxLayout
7from PyQt4.QtGui import QLabel
8from PyQt4.QtGui import QLineEdit
9from PyQt4.QtGui import QPushButton
10from PyQt4.QtGui import QVBoxLayout
11from PyQt4.QtGui import QWidget
12from PyQt4.QtCore import Qt
13from PyQt4.QtCore import QObject
14from PyQt4.QtCore import SIGNAL
15from PyQt4.QtCore import SLOT
16
17
18class UserInfo(QWidget):
19
20 def __init__(self, control, userId = None, *args):
21 apply(QWidget.__init__, (self, ) + args)
22 self._control = control
23 self._layout = QHBoxLayout()
24 self._layout.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop);
25 self.setLayout(self._layout)
26 self._email = None
27 self._layout.addWidget(UserPicture(self._control, userId))
28 if userId:
29 self._friendHeader(userId)
30 else:
31 self._userHeader()
32 self._uid = userId
33
34 def _userHeader(self):
35 emailData = self._control.getStore().getEmail()
36 if not emailData:
37 emailData = ''
38 self._email = QLineEdit(u'%s' % emailData)
39 QObject.connect(self._email, SIGNAL('returnPressed()'), self._changeEmail)
40
41 data = QWidget()
42 dataLayout = QVBoxLayout()
43 dataLayout.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop);
44 data.setLayout(dataLayout)
45
46 userId = QLabel(u'User id: %s' % self._control.getRemote().localIdentityHex())
47 userId.setTextInteractionFlags(Qt.TextSelectableByMouse)
48 dataLayout.addWidget(userId)
49
50 email = QWidget()
51 emailLayout = QHBoxLayout()
52 email.setLayout(emailLayout)
53 emailLayout.addWidget(QLabel(u'Email:'))
54 emailLayout.addWidget(self._email)
55 dataLayout.addWidget(email)
56
57 self._layout.addWidget(data)
58
59 def _friendHeader(self, friendId):
60 data = QWidget()
61
62 dataLayout = QVBoxLayout()
63 dataLayout.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop);
64
65 userId = QLabel(u'User id: %s' % friendId)
66 userId.setTextInteractionFlags(Qt.TextSelectableByMouse)
67 dataLayout.addWidget(userId)
68
69 emailData = self._control.getStore().getEmail(friendId)
70 if emailData:
71 email = QLabel(u'Email: %s' % emailData)
72 email.setTextInteractionFlags(Qt.TextSelectableByMouse)
73 dataLayout.addWidget(email)
74
75 data.setLayout(dataLayout)
76 self._layout.addWidget(data)
77
78 actionButton = QPushButton(u'Forget')
79 QObject.connect(actionButton, SIGNAL('pressed()'), self._forgetUser)
80 self._layout.addWidget(actionButton)
81
82 def _forgetUser(self):
83 self._control.forgetUser(self._uid)
84
85 def _changeEmail(self):
86 self._control.changeEmail(str(self._email.text()))
87
88 def _changeMugshot(self):
89 #self._control.changeMugshot(str(self._email.text()))
90 pass
091
=== added file 'src/gui/userpicture.py'
--- src/gui/userpicture.py 1970-01-01 00:00:00 +0000
+++ src/gui/userpicture.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,59 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from PyQt4.QtGui import QHBoxLayout
5from PyQt4.QtGui import QImage
6from PyQt4.QtGui import QPushButton
7from PyQt4.QtGui import QPixmap
8from PyQt4.QtGui import QIcon
9from PyQt4.QtGui import QFileDialog
10from PyQt4.QtCore import Qt
11from PyQt4.QtCore import QSize
12from PyQt4.QtCore import QObject
13from PyQt4.QtCore import SIGNAL
14from PyQt4.QtCore import SLOT
15
16
17class UserPicture(QPushButton):
18
19 def __init__(self, control, userId = None, *args):
20 apply(QPushButton.__init__, (self, ) + args)
21 self._control = control
22 self._userId = userId
23 self.setIconSize(QSize(100, 100))
24 self.setFlat(True)
25 self.update()
26 if userId:
27 QObject.connect(self, SIGNAL('pressed()'), self._pictureUpdate)
28 else:
29 QObject.connect(self, SIGNAL('pressed()'), self._pictureChange)
30
31 def update(self):
32 mugshot = self._control.getStore().getMugshot(self._userId)
33 if mugshot:
34 mugData = QPixmap()
35 mugData.loadFromData(mugshot)
36 pictureData = mugData.scaled(100,100, Qt.KeepAspectRatio)
37 else:
38 pictureData = QPixmap(self._control.getGFXPath() + '/mugshot_unknown.svg')
39 self.setIcon(QIcon(pictureData))
40
41 def _pictureChange(self):
42 filePath = QFileDialog.getOpenFileName(None, u'Open Image', '', 'Image Files (*.png *.jpg *.bmp *.svg)');
43 import os.path
44 if os.path.isfile(filePath):
45 file = open(filePath, 'r')
46 data = file.read()
47 file.close()
48 self._control.changeMugshot(data)
49 self.update()
50
51 def _pictureUpdate(self):
52 try:
53 mugshot = self._control.getRemote().retrieve('mugshot', self._userId)
54 except:
55 mugshot = None
56 if mugshot:
57 self._control.getStore().putMugshot(mugshot, self._userId)
58 self.update()
59 self._control.refreshTab(self._userId)
060
=== added file 'src/gui/usertab.py'
--- src/gui/usertab.py 1970-01-01 00:00:00 +0000
+++ src/gui/usertab.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,19 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from PyQt4.QtGui import QWidget
5from PyQt4.QtGui import QVBoxLayout
6from PyQt4.QtCore import Qt
7
8
9class UserTab(QWidget):
10
11 def __init__(self, control, *args):
12 apply(QWidget.__init__, (self, ) + args)
13 self._control = control
14 self._layout = QVBoxLayout()
15 self._layout.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop);
16 self.setLayout(self._layout)
17
18 def addWidget(self, widget):
19 self._layout.addWidget(widget)
020
=== added file 'src/gui/usertabwidget.py'
--- src/gui/usertabwidget.py 1970-01-01 00:00:00 +0000
+++ src/gui/usertabwidget.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,66 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from hometab import HomeTab
5from friendtab import FriendTab
6from newfriendtab import NewFriendTab
7
8from PyQt4.QtGui import QIcon
9from PyQt4.QtGui import QTabWidget
10from PyQt4.QtGui import QPixmap
11
12
13class UserTabWidget(QTabWidget):
14
15 def __init__(self, control, *args):
16 apply(QTabWidget.__init__, (self, ) + args)
17 self._control = control
18 self._control.addUserTabWidget(self)
19 self._addUserTab()
20 self._addFriendTabs()
21 self._addNewFriendTab()
22
23 def _addUserTab(self):
24 self.addTab(HomeTab(self._control), QIcon(self._control.getGFXPath() + '/home.svg'), u'&Home')
25
26 def _addFriendTabs(self):
27 order = 0
28 for friendId in self._control.getStore().getFriends():
29 (icon, title) = self._getFriendTabInfo(friendId)
30 self.addTab(FriendTab(self._control, friendId), icon, u'%s' % title)
31 self._control.addUserTab((order, friendId))
32 order+=1
33
34 def addFriendTab(self, friendId):
35 pos = self.count()-1
36 order = pos-1
37 (icon, title) = self._getFriendTabInfo(friendId)
38 self.insertTab(pos, FriendTab(self._control, friendId), icon, u'%s' % title)
39 self._control.addUserTab((order, friendId))
40 self.setCurrentIndex(pos)
41
42 def _getFriendTabInfo(self, uid):
43 email = self._control.getStore().getEmail(uid)
44
45 if email == None:
46 title = uid[:5]
47 else:
48 title = email.split('@')[0]
49
50 return (self.getFriendIcon(uid), title)
51
52 def getFriendIcon(self, uid):
53 mugshot = self._control.getStore().getMugshot(uid)
54 if mugshot:
55 iconData = QPixmap()
56 iconData.loadFromData(mugshot)
57 icon = QIcon(iconData)
58 else:
59 icon = self._loadUnknownMugshot()
60 return icon
61
62 def _addNewFriendTab(self):
63 self.addTab(NewFriendTab(self._control), u'+')
64
65 def _loadUnknownMugshot(self):
66 return QIcon(self._control.getGFXPath() + '/mugshot_unknown.svg')
067
=== added file 'src/guicontrol.py'
--- src/guicontrol.py 1970-01-01 00:00:00 +0000
+++ src/guicontrol.py 2009-10-27 21:15:19 +0000
@@ -0,0 +1,76 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from remote import Remote
5from store import Store
6from realfs import Realfs
7
8import os
9
10
11class GUIControl(object):
12
13 def __init__(self):
14 self._gfx = ''
15 self._store = Store(Realfs([os.environ['HOME'], '.qfriendslol']))
16 self._remote = Remote()
17 self._tabW = None
18 self._tabs = []
19
20 def setGFXPath(self, path):
21 self._gfx = path
22
23 def getGFXPath(self):
24 return self._gfx
25
26 def getRemote(self):
27 return self._remote
28
29 def getStore(self):
30 return self._store
31
32 def addUserTabWidget(self, tabW):
33 self._tabW = tabW
34
35 def addUserTab(self, tuple):
36 self._tabs.append(tuple)
37
38 def changeEmail(self, email):
39 if not email == self.getStore().getEmail():
40 self.getStore().putEmail(email)
41 self.getRemote().advertise(email)
42
43 def changeMugshot(self, mugshot):
44 if not mugshot == self.getStore().getMugshot():
45 self.getStore().putMugshot(mugshot)
46 self.getRemote().store('mugshot', mugshot)
47
48 def addUser(self, uid, email = None):
49 self.getStore().addFriend(uid)
50 if email:
51 self.getStore().putEmail(email, uid)
52 self.updateUserData(uid)
53 self._tabW.addFriendTab(uid)
54
55 def forgetUser(self, uid):
56 self.getStore().removeFriend(uid)
57 index = map(lambda (x,_): x, filter(lambda (_,y): y == uid,
58 self._tabs))[0]
59 self._tabs = filter(lambda (x,_): x < index, self._tabs) + map(
60 lambda (x,y): (x-1,y), filter(
61 lambda (x,_): x > index, self._tabs))
62 self._tabW.removeTab(index+1)
63
64 def updateUserData(self, uid):
65 try:
66 rdata = self.getRemote().retrieve('mugshot', uid)
67 except:
68 rdata = None
69
70 if rdata:
71 self.getStore().putMugshot(rdata, uid)
72
73 def refreshTab(self, userId):
74 index = map(lambda (x,_): x, filter(lambda (_,y): y == userId,
75 self._tabs))[0]+1
76 self._tabW.setTabIcon(index, self._tabW.getFriendIcon(userId))
077
=== added file 'src/qfriendslol.pyw'
--- src/qfriendslol.pyw 1970-01-01 00:00:00 +0000
+++ src/qfriendslol.pyw 2009-10-27 21:15:19 +0000
@@ -0,0 +1,31 @@
1#!/usr/bin/python2.6
2# -*- coding: utf-8 -*-
3
4from guicontrol import GUIControl
5from gui.mainwindow import MainWindow
6
7import sys
8import os.path
9from PyQt4.QtGui import QApplication
10
11def main():
12 app = QApplication(sys.argv)
13
14 control = GUIControl()
15 control.setGFXPath(os.path.dirname(__file__) + '/gfx')
16 #configTestStore(control.getStore())
17
18 window = MainWindow(control)
19 window.show()
20
21 app.exec_()
22
23def configTestStore(store):
24 store.putEmail('me@localhost')
25 store.addFriend('8682065025227700138022978937487170069337')
26 store.putEmail('frank@gmail.com', '8682065025227700138022978937487170069337')
27 store.putMugshot(open(os.path.dirname(__file__) + '/../branding/qfriendslol_logo_64x64.png').read(), '8682065025227700138022978937487170069337')
28 store.addFriend('e4e8743ffd801b2a126de53607c9ccd383fb71b8')
29
30if __name__ == '__main__':
31 main()
032
=== modified file 'src/remote.py'
--- src/remote.py 2009-10-27 14:38:48 +0000
+++ src/remote.py 2009-10-27 21:15:19 +0000
@@ -54,7 +54,7 @@
54 qfriendslol-1-metsä.jpg → piece154 qfriendslol-1-metsä.jpg → piece1
55 '''55 '''
56 keyformat = 'qfriendslol-%s-' + filename56 keyformat = 'qfriendslol-%s-' + filename
57 block = int(self.get(keyformat % 0, userid))57 block = self.get(keyformat % 0, userid)
58 if block == None:58 if block == None:
59 raise Error('Header unavailable')59 raise Error('Header unavailable')
60 try:60 try:
@@ -119,24 +119,23 @@
119 f = open('uppi.jpeg')119 f = open('uppi.jpeg')
120 upattava = f.read()120 upattava = f.read()
121 f.close()121 f.close()
122 r.store('mugshot.jpeg',upattava)122 r.store('mugshot',upattava)
123123
124124
125 r.advertise('muumi@golf.uk')125 r.advertise('muumi@golf.uk')
126 users = r.findUser('muumi@golf.uk')126 users = r.findUser('muumi@golf.uk')
127 user = users[0]127 user = users[0]
128 print user128 print user
129 (size,time)= r.fileinfo('mugshot.jpeg', user)129 (size,time)= r.fileinfo('mugshot', user)
130 130
131 from logic import seconds2string131 from logic import seconds2string
132 print seconds2string(time)132 print seconds2string(time)
133 print '%sB' % size133 print '%sB' % size
134 134
135 r.putfilenames(['mugshot.jpeg'])135 r.putfilenames(['mugshot'])
136 136
137 data = r.retrieve('mugshot.jpeg', user)137 data = r.retrieve('mugshot', user)
138138
139 f = open('mugshot.jpeg','w')139 f = open('mugshot','w')
140 f.write(data)140 f.write(data)
141 f.close()141 f.close()
142
143142
=== modified file 'src/store.py'
--- src/store.py 2009-10-27 00:55:02 +0000
+++ src/store.py 2009-10-27 21:15:19 +0000
@@ -5,21 +5,21 @@
55
6 def __init__(self, fs):6 def __init__(self, fs):
7 self._fs = fs7 self._fs = fs
8 self._friends = []8 self._updFriends()
99
10 def putMugshot(self, pic, userid = None):10 def putMugshot(self, pic, userid = None):
11 if (userid == None):11 if (userid == None):
12 self._fs.write(['mugshot.jpeg'], pic)12 self._fs.write(['mugshot'], pic)
13 elif self._isValidId(userid) and userid in self.getFriends():13 elif self._isValidId(userid) and userid in self.getFriends():
14 self._fs.write([self._getFriendFolderName(userid), 'mugshot.jpeg'], pic)14 self._fs.write(['friends', self._getFriendFolderName(userid), 'mugshot'], pic)
15 else:15 else:
16 raise ValueError16 raise ValueError
1717
18 def getMugshot(self, userid = None):18 def getMugshot(self, userid = None):
19 if (userid == None):19 if (userid == None):
20 return self._fs.read(['mugshot.jpeg'])20 return self._fs.read(['mugshot'])
21 elif self._isValidId(userid) and userid in self.getFriends():21 elif self._isValidId(userid) and userid in self.getFriends():
22 return self._fs.read([self._getFriendFolderName(userid), 'mugshot.jpeg'])22 return self._fs.read(['friends', self._getFriendFolderName(userid), 'mugshot'])
23 else:23 else:
24 raise ValueError24 raise ValueError
2525
@@ -27,7 +27,7 @@
27 if (userid == None):27 if (userid == None):
28 self._fs.write(['email.txt'], email)28 self._fs.write(['email.txt'], email)
29 elif self._isValidId(userid) and userid in self.getFriends():29 elif self._isValidId(userid) and userid in self.getFriends():
30 self._fs.write([self._getFriendFolderName(userid), 'email.txt'], email)30 self._fs.write(['friends', self._getFriendFolderName(userid), 'email.txt'], email)
31 else:31 else:
32 raise ValueError32 raise ValueError
3333
@@ -35,7 +35,7 @@
35 if (userid == None):35 if (userid == None):
36 return self._fs.read(['email.txt'])36 return self._fs.read(['email.txt'])
37 elif self._isValidId(userid) and userid in self.getFriends():37 elif self._isValidId(userid) and userid in self.getFriends():
38 return self._fs.read([self._getFriendFolderName(userid), 'email.txt'])38 return self._fs.read(['friends', self._getFriendFolderName(userid), 'email.txt'])
39 else:39 else:
40 raise ValueError40 raise ValueError
4141
@@ -56,18 +56,19 @@
56 return map(lambda (_, id): id, self._friends)56 return map(lambda (_, id): id, self._friends)
5757
58 def _updFriends(self):58 def _updFriends(self):
59 self._friends = []59 self._friends = filter(lambda (_, uid): self._isValidId(uid), map(lambda folder: tuple(folder.split('-')), self._fs.ls(['friends'])))
60 for item in self._fs.ls(['friends']):60
61 item = item.split('-')
62 if (len(item) == 2) and (self._isValidId(item[1])):
63 self._friends.append((item[0], item[1]))
6461
65 def _getFriendFolderName(self, userid):62 def _getFriendFolderName(self, userid):
66 return "%s-%s" % (self._getFriendNum(userid), userid)63 return "%s-%s" % (self._getFriendNum(userid), userid)
6764
68 def _getFriendNum(self, userid):65 def _getFriendNum(self, userid):
69 return map(lambda (order,_): order, filter(lambda (_,id): id == userid,66 orders = map(lambda (order,_): order, filter(lambda (_,id): id == userid,
70 self._friends))[0]67 self._friends))
68 if orders:
69 return orders[0]
70 else:
71 return -1
7172
72 def _nextFriendNum(self):73 def _nextFriendNum(self):
73 max = 074 max = 0

Subscribers

People subscribed via source and target branches

to all changes: