32 files changed, 3723 insertions, 111 deletions
diff --git a/apps/Applications/camera2.desktop b/apps/Applications/camera2.desktop new file mode 100644 index 0000000..4662080 --- a/dev/null +++ b/apps/Applications/camera2.desktop | |||
@@ -0,0 +1,26 @@ | |||
1 | [Desktop Entry] | ||
2 | Exec=camera2 | ||
3 | File=camera2 | ||
4 | Icon=camera2/Camera | ||
5 | Type=Application | ||
6 | Name=OpieCam2 | ||
7 | Comment=A Camera Program | ||
8 | Name[de]=Kamera2 | ||
9 | Comment[de]=Ein Kamera-Programm | ||
10 | Name[fr]=Photo2 | ||
11 | Comment[fr]=Gestionnaire de photos et images | ||
12 | Name[it]=Telecamera2 | ||
13 | Comment[it]=Programma per telecamera | ||
14 | Name[pt]=Câmera2 | ||
15 | Comment[pt]=Uma aplicação de câmera | ||
16 | Name[pt_BR]=Câmera2 | ||
17 | Comment[pt_BR]=Uma aplicação de câmera | ||
18 | Name[sl]=OpieKamera2 | ||
19 | Comment[sl]=Program za kamero | ||
20 | Naam[nl]=Camera2 | ||
21 | Comment[nl]=Een camerabesturingsprogramma | ||
22 | Name[ru]=Камера2 | ||
23 | Comment[ru]=Программа для управления (фото)камерой | ||
24 | Name[lv]=OpieCam2 | ||
25 | Comment[lv]=Opie Kameras Programma | ||
26 | |||
diff --git a/library/backend/categories.h b/library/backend/categories.h index 91c93e7..6be3bc0 100644 --- a/library/backend/categories.h +++ b/library/backend/categories.h | |||
@@ -31,6 +31,7 @@ | |||
31 | #include "palmtopuidgen.h" | 31 | #include "palmtopuidgen.h" |
32 | 32 | ||
33 | class CategoryGroup; | 33 | class CategoryGroup; |
34 | QString categoryFileName(); | ||
34 | 35 | ||
35 | #if defined(QPC_TEMPLATEDLL) | 36 | #if defined(QPC_TEMPLATEDLL) |
36 | // MOC_SKIP_BEGIN | 37 | // MOC_SKIP_BEGIN |
diff --git a/library/global.cpp b/library/global.cpp index ec87555..f7a0767 100644 --- a/library/global.cpp +++ b/library/global.cpp | |||
@@ -808,5 +808,54 @@ QStringList Global::helpPath() | |||
808 | return path; | 808 | return path; |
809 | } | 809 | } |
810 | 810 | ||
811 | /*! | ||
812 | \internal | ||
813 | Truncate file to size specified | ||
814 | \a f must be an open file | ||
815 | \a size must be a positive value | ||
816 | */ | ||
817 | bool Global::truncateFile(QFile &f, int size){ | ||
818 | if (!f.isOpen()) | ||
819 | return FALSE; | ||
820 | |||
821 | return ::ftruncate(f.handle(), size) != -1; | ||
822 | } | ||
823 | |||
824 | |||
825 | |||
826 | |||
827 | // #if defined(Q_OS_UNIX) && defined(Q_WS_QWS) | ||
828 | // extern int qws_display_id; | ||
829 | // #endif | ||
830 | |||
831 | /*! | ||
832 | /internal | ||
833 | Returns the default system path for storing temporary files. | ||
834 | Note: This does not it ensure that the provided directory exists | ||
835 | */ | ||
836 | QString Global::tempDir() | ||
837 | { | ||
838 | QString result; | ||
839 | #ifdef Q_OS_UNIX | ||
840 | #ifdef Q_WS_QWS | ||
841 | result = QString("/tmp/qtopia-%1/").arg(QString::number(qws_display_id)); | ||
842 | #else | ||
843 | result="/tmp/"; | ||
844 | #endif | ||
845 | #else | ||
846 | if (getenv("TEMP")) | ||
847 | result = getenv("TEMP"); | ||
848 | else | ||
849 | result = getenv("TMP"); | ||
850 | |||
851 | if (result[(int)result.length() - 1] != QDir::separator()) | ||
852 | result.append(QDir::separator()); | ||
853 | #endif | ||
854 | |||
855 | return result; | ||
856 | } | ||
857 | |||
858 | //#endif | ||
859 | |||
811 | 860 | ||
812 | #include "global.moc" | 861 | #include "global.moc" |
diff --git a/library/global.h b/library/global.h index 1136b12..f32c498 100644 --- a/library/global.h +++ b/library/global.h | |||
@@ -27,7 +27,7 @@ class QLabel; | |||
27 | class QWidget; | 27 | class QWidget; |
28 | class AppLnk; | 28 | class AppLnk; |
29 | class DocLnkSet; | 29 | class DocLnkSet; |
30 | 30 | class QFile; | |
31 | class Global | 31 | class Global |
32 | { | 32 | { |
33 | public: | 33 | public: |
@@ -80,6 +80,10 @@ public: | |||
80 | static QStringList languageList(); | 80 | static QStringList languageList(); |
81 | static QStringList helpPath(); | 81 | static QStringList helpPath(); |
82 | #endif | 82 | #endif |
83 | //#ifdef QTOPIA_INTERNAL_FILEOPERATIONS | ||
84 | static bool truncateFile(QFile &f, int size); | ||
85 | static QString tempDir( ); | ||
86 | //#endif | ||
83 | 87 | ||
84 | private: | 88 | private: |
85 | static void invoke( const QString &exec); | 89 | static void invoke( const QString &exec); |
diff --git a/library/library.pro b/library/library.pro index 7143454..4142529 100644 --- a/library/library.pro +++ b/library/library.pro | |||
@@ -59,6 +59,7 @@ HEADERS = calendar.h \ | |||
59 | windowdecorationinterface.h \ | 59 | windowdecorationinterface.h \ |
60 | textcodecinterface.h \ | 60 | textcodecinterface.h \ |
61 | imagecodecinterface.h \ | 61 | imagecodecinterface.h \ |
62 | locationcombo.h \ | ||
62 | qpeglobal.h | 63 | qpeglobal.h |
63 | 64 | ||
64 | SOURCES= calendar.cpp \ | 65 | SOURCES= calendar.cpp \ |
@@ -116,6 +117,7 @@ SOURCES = calendar.cpp \ | |||
116 | findwidget_p.cpp \ | 117 | findwidget_p.cpp \ |
117 | finddialog.cpp \ | 118 | finddialog.cpp \ |
118 | lnkproperties.cpp \ | 119 | lnkproperties.cpp \ |
120 | locationcombo.cpp \ | ||
119 | widget_showing.cpp | 121 | widget_showing.cpp |
120 | 122 | ||
121 | 123 | ||
diff --git a/library/locationcombo.cpp b/library/locationcombo.cpp new file mode 100644 index 0000000..31429f5 --- a/dev/null +++ b/library/locationcombo.cpp | |||
@@ -0,0 +1,295 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #include "locationcombo.h" | ||
37 | |||
38 | #include <qpe/ir.h> | ||
39 | #include <qpe/applnk.h> | ||
40 | #include <qpe/global.h> | ||
41 | #include <qpe/categorywidget.h> | ||
42 | #include <qpe/categoryselect.h> | ||
43 | #ifdef QWS | ||
44 | #include <qpe/qcopenvelope_qws.h> | ||
45 | #endif | ||
46 | #include <qpe/filemanager.h> | ||
47 | #include <qpe/config.h> | ||
48 | #include <qpe/storage.h> | ||
49 | #include <qpe/global.h> | ||
50 | #include <qtopia/qpemessagebox.h> | ||
51 | |||
52 | #include <qlineedit.h> | ||
53 | #include <qtoolbutton.h> | ||
54 | #include <qpushbutton.h> | ||
55 | #include <qgroupbox.h> | ||
56 | #include <qcheckbox.h> | ||
57 | #include <qlabel.h> | ||
58 | #include <qlayout.h> | ||
59 | #include <qfile.h> | ||
60 | #include <qdir.h> | ||
61 | #include <qfileinfo.h> | ||
62 | #include <qmessagebox.h> | ||
63 | #include <qsize.h> | ||
64 | #include <qcombobox.h> | ||
65 | #include <qregexp.h> | ||
66 | |||
67 | #include <qradiobutton.h> | ||
68 | #include <qlayout.h> | ||
69 | |||
70 | #include <stdlib.h> | ||
71 | |||
72 | /*! | ||
73 | \class LocationCombo locationcombo.h | ||
74 | \brief The LocationCombo class displays a list of available storage | ||
75 | locations. | ||
76 | |||
77 | First availability: Qtopia 1.6 | ||
78 | |||
79 | \ingroup qtopiaemb | ||
80 | \sa DocPropertiesDialog | ||
81 | */ | ||
82 | |||
83 | |||
84 | class LocationComboPrivate | ||
85 | { | ||
86 | public: | ||
87 | LocationComboPrivate() : homeLocation(-1), fileSize(0), listEmpty(TRUE) {} | ||
88 | QString originalPath; | ||
89 | int homeLocation; | ||
90 | int fileSize; | ||
91 | bool listEmpty; | ||
92 | }; | ||
93 | |||
94 | /*! | ||
95 | Constructs a LocationCombo with parent \a parent and name \a name. | ||
96 | */ | ||
97 | LocationCombo::LocationCombo( QWidget *parent, const char *name ) | ||
98 | : QComboBox( FALSE, parent, name ) | ||
99 | { | ||
100 | storage = new StorageInfo; | ||
101 | d = new LocationComboPrivate; | ||
102 | setLocation( 0 ); | ||
103 | connect( this, SIGNAL(activated(int)), this, SIGNAL(newPath()) ); | ||
104 | connect( storage, SIGNAL(disksChanged()), this, SLOT(updatePaths()) ); | ||
105 | } | ||
106 | |||
107 | /*! | ||
108 | Constructs a LocationCombo with parent \a parent and name \a name. | ||
109 | \a lnk is pointer to an existing AppLnk. | ||
110 | */ | ||
111 | LocationCombo::LocationCombo( const AppLnk * lnk, QWidget *parent, const char *name ) | ||
112 | : QComboBox( FALSE, parent, name ) | ||
113 | { | ||
114 | storage = new StorageInfo; | ||
115 | d = new LocationComboPrivate; | ||
116 | setLocation(lnk); | ||
117 | connect( this, SIGNAL(activated(int)), this, SIGNAL(newPath()) ); | ||
118 | connect( storage, SIGNAL(disksChanged()), this, SLOT(updatePaths()) ); | ||
119 | } | ||
120 | |||
121 | /*! | ||
122 | Destroys the widget. | ||
123 | */ | ||
124 | LocationCombo::~LocationCombo() | ||
125 | { | ||
126 | delete storage; | ||
127 | delete d; | ||
128 | } | ||
129 | |||
130 | /*! | ||
131 | Sets the display of the LocationCombo to the location associated with the | ||
132 | AppLnk \a lnk. | ||
133 | */ | ||
134 | void LocationCombo::setLocation( const AppLnk * lnk ) | ||
135 | { | ||
136 | // NB: setLocation(const QString) assumes only lnk->file() is used. | ||
137 | |||
138 | if ( lnk ) { | ||
139 | QFileInfo fi( lnk->file() ); | ||
140 | d->fileSize = fi.size(); | ||
141 | const FileSystem *fs = storage->fileSystemOf( lnk->file() ); | ||
142 | d->originalPath = fs ? fs->path() : QString::null; | ||
143 | } else { | ||
144 | d->fileSize = 0; | ||
145 | d->originalPath = QString::null; | ||
146 | } | ||
147 | |||
148 | setupCombo(); | ||
149 | |||
150 | int currentLocation = -1; | ||
151 | if ( lnk ) { | ||
152 | int n = locations.count(); | ||
153 | for ( int i = 0; i < n; i++ ) { | ||
154 | if ( lnk->file().contains( locations[i] ) ) | ||
155 | currentLocation = i; | ||
156 | } | ||
157 | } | ||
158 | if ( currentLocation == -1 ) | ||
159 | currentLocation = 0; //default to the first one | ||
160 | |||
161 | setCurrentItem( currentLocation ); | ||
162 | } | ||
163 | |||
164 | /*! | ||
165 | \internal | ||
166 | */ | ||
167 | void LocationCombo::setupCombo() | ||
168 | { | ||
169 | clear(); | ||
170 | locations.clear(); | ||
171 | |||
172 | const QList<FileSystem> &fs = storage->fileSystems(); | ||
173 | QListIterator<FileSystem> it ( fs ); | ||
174 | QString s; | ||
175 | QString homeDir = QDir::homeDirPath(); | ||
176 | QString homeFs; | ||
177 | QString homeFsPath; | ||
178 | int index = 0; | ||
179 | for ( ; it.current(); ++it ) { | ||
180 | // we add 10k to the file size so we are sure we can also save the desktop file | ||
181 | if ( !d->fileSize || (*it)->path() == d->originalPath || | ||
182 | (ulong)(*it)->availBlocks() * (ulong)(*it)->blockSize() | ||
183 | > (ulong)d->fileSize + 10000 ) | ||
184 | { | ||
185 | if ( (*it)->isRemovable() ) { | ||
186 | insertItem( (*it)->name(), index ); | ||
187 | locations.append( (*it)->path() ); | ||
188 | index++; | ||
189 | } else if ( homeDir.contains( (*it)->path() ) && | ||
190 | (*it)->path().length() > homeFsPath.length() ) { | ||
191 | homeFs = (*it)->name(); | ||
192 | homeFsPath = (*it)->path(); | ||
193 | } | ||
194 | } | ||
195 | } | ||
196 | |||
197 | // $HOME is *somewhere*, but not shown in Storage::fileSystems(), | ||
198 | // eg. because it's mounted in some unexpected way. | ||
199 | if ( homeFsPath.isEmpty() ) { | ||
200 | homeFs = StorageInfo::tr("Internal Storage"); | ||
201 | homeFsPath = homeDir; | ||
202 | } | ||
203 | |||
204 | if ( !homeFsPath.isEmpty() ) { | ||
205 | d->homeLocation = 0; | ||
206 | insertItem( homeFs, d->homeLocation ); | ||
207 | locations.prepend( homeDir ); | ||
208 | } else { | ||
209 | d->homeLocation = -1; | ||
210 | } | ||
211 | |||
212 | d->listEmpty = locations.count() == 0; | ||
213 | if ( d->listEmpty ) { | ||
214 | insertItem( tr("No FileSystems Available!"), 0 ); | ||
215 | locations.append( "" ); | ||
216 | } | ||
217 | } | ||
218 | |||
219 | /*! | ||
220 | \internal | ||
221 | */ | ||
222 | void LocationCombo::updatePaths() | ||
223 | { | ||
224 | QString oldPath = locations[currentItem()]; | ||
225 | |||
226 | setupCombo(); | ||
227 | |||
228 | int currentLocation = 0; | ||
229 | int n = locations.count(); | ||
230 | for ( int i = 0; i < n; i++ ) { | ||
231 | if ( oldPath == locations[i] ) { | ||
232 | currentLocation = i; | ||
233 | } | ||
234 | } | ||
235 | setCurrentItem( currentLocation ); | ||
236 | if ( locations[currentItem()] != oldPath ) | ||
237 | emit newPath(); | ||
238 | } | ||
239 | |||
240 | /*! | ||
241 | Returns TRUE to indicate that the user has changed the location displayed | ||
242 | by the LocationCombo. Most useful when the LocationCombo is part of a | ||
243 | dialog; when the dialog is accept()ed, LocationCombo::isChanged() can be | ||
244 | examined to check for a change of location. | ||
245 | */ | ||
246 | bool LocationCombo::isChanged() const | ||
247 | { | ||
248 | if ( const FileSystem *fs = storage->fileSystemOf(locations[currentItem()]) ) | ||
249 | return fs->path() != d->originalPath; | ||
250 | |||
251 | return TRUE; | ||
252 | } | ||
253 | |||
254 | /*! | ||
255 | Returns the default (home) location for the file associated with this | ||
256 | LocationCombo. | ||
257 | */ | ||
258 | QString LocationCombo::installationPath() const | ||
259 | { | ||
260 | return currentItem() == d->homeLocation ? | ||
261 | QString("/") : locations[ currentItem() ]+"/"; | ||
262 | } | ||
263 | |||
264 | /*! | ||
265 | Returns the document path associated with this LocationCombo. This | ||
266 | will be "\<path\>/Documents". | ||
267 | */ | ||
268 | QString LocationCombo::documentPath() const | ||
269 | { | ||
270 | return locations[ currentItem() ]+"/Documents/"; | ||
271 | } | ||
272 | |||
273 | /*! | ||
274 | Returns a pointer to FileSystem object, associated with the current | ||
275 | selection of the LocationCombo. | ||
276 | */ | ||
277 | const FileSystem *LocationCombo::fileSystem() const | ||
278 | { | ||
279 | if ( d->listEmpty ) | ||
280 | return 0; | ||
281 | return storage->fileSystemOf( locations[ currentItem() ] ); | ||
282 | } | ||
283 | |||
284 | /*! | ||
285 | \fn LocationCombo::newPath() | ||
286 | Emitted when the LocationCombo changes to a new location. | ||
287 | */ | ||
288 | |||
289 | |||
290 | #if 0 | ||
291 | void LocationCombo::apply() | ||
292 | { | ||
293 | } | ||
294 | #endif | ||
295 | |||
diff --git a/library/locationcombo.h b/library/locationcombo.h new file mode 100644 index 0000000..fab3dfc --- a/dev/null +++ b/library/locationcombo.h | |||
@@ -0,0 +1,88 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #ifndef LOCATIONCOMBO_H | ||
37 | #define LOCATIONCOMBO_H | ||
38 | |||
39 | #include <qpe/qpeglobal.h> | ||
40 | |||
41 | #ifdef Q_WS_QWS | ||
42 | |||
43 | #include <qstringlist.h> | ||
44 | #include <qcombobox.h> | ||
45 | |||
46 | class AppLnk; | ||
47 | class QListViewItem; | ||
48 | class DocLnk; | ||
49 | class FileSystem; | ||
50 | class StorageInfo; | ||
51 | |||
52 | |||
53 | class LocationComboPrivate; | ||
54 | |||
55 | class LocationCombo : public QComboBox | ||
56 | { | ||
57 | Q_OBJECT | ||
58 | public: | ||
59 | LocationCombo( QWidget *parent, const char *name=0 ); | ||
60 | LocationCombo( const AppLnk * lnk, QWidget *parent, const char *name=0 ); | ||
61 | |||
62 | ~LocationCombo(); | ||
63 | |||
64 | void setLocation( const QString& path ); // qtopia 2 | ||
65 | void setLocation( const AppLnk * ); | ||
66 | |||
67 | QString installationPath() const; | ||
68 | QString documentPath() const; | ||
69 | const FileSystem *fileSystem() const; | ||
70 | |||
71 | bool isChanged() const; | ||
72 | |||
73 | signals: | ||
74 | void newPath(); | ||
75 | |||
76 | private slots: | ||
77 | void updatePaths(); | ||
78 | |||
79 | private: | ||
80 | void setupCombo(); | ||
81 | QStringList locations; | ||
82 | StorageInfo *storage; | ||
83 | LocationComboPrivate *d; | ||
84 | }; | ||
85 | |||
86 | |||
87 | #endif // QWS | ||
88 | #endif // LNKPROPERTIES_H | ||
diff --git a/library/qlibrary_unix.cpp b/library/qlibrary_unix.cpp index fee73c2..f4d60cb 100644 --- a/library/qlibrary_unix.cpp +++ b/library/qlibrary_unix.cpp | |||
@@ -198,7 +198,7 @@ bool QLibraryPrivate::loadLibrary() | |||
198 | 198 | ||
199 | QString filename = library->library(); | 199 | QString filename = library->library(); |
200 | 200 | ||
201 | pHnd = dlopen( filename.latin1() , RTLD_LAZY ); | 201 | pHnd = ::dlopen( filename.latin1() , RTLD_LAZY ); |
202 | // #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) | 202 | // #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) |
203 | if ( !pHnd ) | 203 | if ( !pHnd ) |
204 | qWarning( "%s", dlerror() ); | 204 | qWarning( "%s", dlerror() ); |
@@ -211,7 +211,7 @@ bool QLibraryPrivate::freeLibrary() | |||
211 | if ( !pHnd ) | 211 | if ( !pHnd ) |
212 | return TRUE; | 212 | return TRUE; |
213 | 213 | ||
214 | int ec = dlclose( pHnd ); | 214 | int ec = ::dlclose( pHnd ); |
215 | if ( !ec ) | 215 | if ( !ec ) |
216 | pHnd = 0; | 216 | pHnd = 0; |
217 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) | 217 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) |
diff --git a/library/timestring.cpp b/library/timestring.cpp index 91c29ae..afd162d 100644 --- a/library/timestring.cpp +++ b/library/timestring.cpp | |||
@@ -1,15 +1,30 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of the Qtopia Environment. | 4 | ** This file is part of the Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This program is free software; you can redistribute it and/or modify it |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** under the terms of the GNU General Public License as published by the |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Free Software Foundation; either version 2 of the License, or (at your |
9 | ** packaging of this file. | 9 | ** option) any later version. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** A copy of the GNU GPL license version 2 is included in this package as |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** LICENSE.GPL. |
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
13 | ** | 28 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 30 | ** |
@@ -20,18 +35,21 @@ | |||
20 | 35 | ||
21 | #include "timestring.h" | 36 | #include "timestring.h" |
22 | #include <qobject.h> | 37 | #include <qobject.h> |
23 | #include <qpe/qpeapplication.h> //for qApp | 38 | #include <qdatetime.h> |
39 | #include <qapplication.h> | ||
24 | #include "config.h" | 40 | #include "config.h" |
25 | 41 | ||
42 | #include <time.h> | ||
43 | |||
26 | 44 | ||
27 | class TimeStringFormatKeeper : public QObject | 45 | class TimeStringFormat : public QObject |
28 | { | 46 | { |
29 | Q_OBJECT | 47 | Q_OBJECT |
30 | public: | 48 | public: |
31 | static DateFormat currentFormat() | 49 | static DateFormat currentFormat() |
32 | { | 50 | { |
33 | if ( !self ) | 51 | if ( !self ) |
34 | self = new TimeStringFormatKeeper; | 52 | self = new TimeStringFormat; |
35 | return self->format; | 53 | return self->format; |
36 | } | 54 | } |
37 | private slots: | 55 | private slots: |
@@ -40,24 +58,24 @@ private slots: | |||
40 | format = f; | 58 | format = f; |
41 | } | 59 | } |
42 | private: | 60 | private: |
43 | static TimeStringFormatKeeper *self; | 61 | static TimeStringFormat *self; |
44 | DateFormat format; | 62 | DateFormat format; |
45 | 63 | ||
46 | TimeStringFormatKeeper() | 64 | TimeStringFormat() |
47 | : QObject( qApp ) | 65 | : QObject( qApp ) |
48 | { | 66 | { |
49 | Config config("qpe"); | 67 | Config config("qpe"); |
50 | config.setGroup( "Date" ); | 68 | config.setGroup( "Date" ); |
51 | format = DateFormat(QChar(config.readEntry("Separator", "/")[0]), | 69 | format = ::DateFormat(QChar(config.readEntry("Separator", "/")[0]), |
52 | (DateFormat::Order)config .readNumEntry("ShortOrder", DateFormat::DayMonthYear), | 70 | (::DateFormat::Order)config.readNumEntry("ShortOrder", ::DateFormat::DayMonthYear), |
53 | (DateFormat::Order)config.readNumEntry("LongOrder", DateFormat::DayMonthYear)); | 71 | (::DateFormat::Order)config.readNumEntry("LongOrder", ::DateFormat::DayMonthYear)); |
54 | 72 | ||
55 | connect( qApp, SIGNAL( dateFormatChanged(DateFormat) ), | 73 | connect( qApp, SIGNAL( dateFormatChanged(DateFormat) ), |
56 | this, SLOT( formatChanged(DateFormat) ) ); | 74 | this, SLOT( formatChanged(DateFormat) ) ); |
57 | } | 75 | } |
58 | }; | 76 | }; |
59 | 77 | ||
60 | TimeStringFormatKeeper *TimeStringFormatKeeper::self = 0; | 78 | TimeStringFormat *TimeStringFormat::self = 0; |
61 | 79 | ||
62 | QString DateFormat::toNumberString() const | 80 | QString DateFormat::toNumberString() const |
63 | { | 81 | { |
@@ -67,13 +85,13 @@ QString DateFormat::toNumberString() const | |||
67 | // switch on the relavent 3 bits. | 85 | // switch on the relavent 3 bits. |
68 | switch((_shortOrder >> (i * 3)) & 0x0007) { | 86 | switch((_shortOrder >> (i * 3)) & 0x0007) { |
69 | case 0x0001: | 87 | case 0x0001: |
70 | buf += QObject::tr( "D" , "Shortcut for Day"); | 88 | buf += TimeStringFormat::tr( "D", "first letter of the word 'Day'" ); |
71 | break; | 89 | break; |
72 | case 0x0002: | 90 | case 0x0002: |
73 | buf += QObject::tr( "M", "Shortcur for Month" ); | 91 | buf += TimeStringFormat::tr( "M" , "first letter of the word 'Month'" ); |
74 | break; | 92 | break; |
75 | case 0x0004: | 93 | case 0x0004: |
76 | buf += QObject::tr( "Y" ); | 94 | buf += TimeStringFormat::tr( "Y" , "first letter of the word 'Year'" ); |
77 | break; | 95 | break; |
78 | } | 96 | } |
79 | if (i < 2) | 97 | if (i < 2) |
@@ -90,7 +108,7 @@ QString DateFormat::toWordString() const | |||
90 | // switch on the relavent 3 bits. | 108 | // switch on the relavent 3 bits. |
91 | switch((_longOrder >> (i * 3)) & 0x0007) { | 109 | switch((_longOrder >> (i * 3)) & 0x0007) { |
92 | case 0x0001: | 110 | case 0x0001: |
93 | buf += QObject::tr( "day" ); | 111 | buf += TimeStringFormat::tr( "day", "in month" ); |
94 | if (i < 2) { | 112 | if (i < 2) { |
95 | if ((_shortOrder << ((i+1) * 3)) & 0x0007) | 113 | if ((_shortOrder << ((i+1) * 3)) & 0x0007) |
96 | buf += ", "; | 114 | buf += ", "; |
@@ -99,12 +117,12 @@ QString DateFormat::toWordString() const | |||
99 | } | 117 | } |
100 | break; | 118 | break; |
101 | case 0x0002: | 119 | case 0x0002: |
102 | buf += QObject::tr( "month" ); | 120 | buf += TimeStringFormat::tr( "month" ); |
103 | if (i < 2) | 121 | if (i < 2) |
104 | buf += " "; | 122 | buf += " "; |
105 | break; | 123 | break; |
106 | case 0x0004: | 124 | case 0x0004: |
107 | buf += QObject::tr( "year" ); | 125 | buf += TimeStringFormat::tr( "year" ); |
108 | if (i < 2) | 126 | if (i < 2) |
109 | buf += ", "; | 127 | buf += ", "; |
110 | break; | 128 | break; |
@@ -149,64 +167,140 @@ QString DateFormat::numberDate(const QDate &d, int v) const | |||
149 | return buf; | 167 | return buf; |
150 | } | 168 | } |
151 | 169 | ||
170 | static const char* unTranslatedFullMonthNames[] = { | ||
171 | QT_TRANSLATE_NOOP( "QDate", "January" ), | ||
172 | QT_TRANSLATE_NOOP( "QDate", "February" ), | ||
173 | QT_TRANSLATE_NOOP( "QDate", "March" ), | ||
174 | QT_TRANSLATE_NOOP( "QDate", "April" ), | ||
175 | QT_TRANSLATE_NOOP( "QDate", "May" ), | ||
176 | QT_TRANSLATE_NOOP( "QDate", "June" ), | ||
177 | QT_TRANSLATE_NOOP( "QDate", "July" ), | ||
178 | QT_TRANSLATE_NOOP( "QDate", "August" ), | ||
179 | QT_TRANSLATE_NOOP( "QDate", "September" ), | ||
180 | QT_TRANSLATE_NOOP( "QDate", "October" ), | ||
181 | QT_TRANSLATE_NOOP( "QDate", "November" ), | ||
182 | QT_TRANSLATE_NOOP( "QDate", "December" ) | ||
183 | }; | ||
184 | |||
185 | static const char* unTranslatedFullDayNames[] = { | ||
186 | QT_TRANSLATE_NOOP( "QDate", "Monday" ), | ||
187 | QT_TRANSLATE_NOOP( "QDate", "Tuesday" ), | ||
188 | QT_TRANSLATE_NOOP( "QDate", "Wednesday" ), | ||
189 | QT_TRANSLATE_NOOP( "QDate", "Thursday" ), | ||
190 | QT_TRANSLATE_NOOP( "QDate", "Friday" ), | ||
191 | QT_TRANSLATE_NOOP( "QDate", "Saturday" ), | ||
192 | QT_TRANSLATE_NOOP( "QDate", "Sunday" ) | ||
193 | }; | ||
194 | |||
195 | #ifdef QTOPIA_DESKTOP | ||
196 | //translations in qt.qm | ||
197 | static const char* unTranslatedMediumDayNames[] = { | ||
198 | "Mon" , "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" | ||
199 | }; | ||
200 | |||
201 | static const char* unTranslatedMediumMonthNames[] = { | ||
202 | "Jan", "Feb", "Mar", "Apr", "May", "Jun", | ||
203 | "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" | ||
204 | }; | ||
205 | #endif | ||
206 | |||
207 | static QString dayname(const QDate& d, bool lng) | ||
208 | { | ||
209 | if (lng && qApp) | ||
210 | return qApp->translate("QDate", unTranslatedFullDayNames[d.dayOfWeek()-1]); | ||
211 | else { | ||
212 | #ifdef QTOPIA_DESKTOP | ||
213 | if (qApp) | ||
214 | return qApp->translate("QDate", unTranslatedMediumDayNames[ d.dayOfWeek()-1]); | ||
215 | #endif | ||
216 | return d.dayName(d.dayOfWeek()); | ||
217 | } | ||
218 | } | ||
219 | |||
152 | QString DateFormat::wordDate(const QDate &d, int v) const | 220 | QString DateFormat::wordDate(const QDate &d, int v) const |
153 | { | 221 | { |
154 | QString buf = ""; | ||
155 | // for each part of the order | 222 | // for each part of the order |
156 | if (v & showWeekDay) { | 223 | QString weekDay; |
157 | QString weekDay = d.dayName(d.dayOfWeek()); | 224 | if (v & showWeekDay) |
158 | if (!(v & longWord)) { | 225 | weekDay = ::dayname(d,(v & longWord)); |
159 | weekDay = weekDay.left(3); | ||
160 | } | ||
161 | buf += weekDay; | ||
162 | if ((_longOrder & 0x0007) == 0x0002) | ||
163 | buf += ' '; | ||
164 | else | ||
165 | buf += ", "; | ||
166 | } | ||
167 | 226 | ||
227 | QString date=""; | ||
228 | QString sep=""; | ||
168 | for (int i = 0; i < 3; i++) { | 229 | for (int i = 0; i < 3; i++) { |
169 | // switch on the relavent 3 bits. | 230 | // switch on the relavent 3 bits. |
170 | switch((_longOrder >> (i * 3)) & 0x0007) { | 231 | int field = (_longOrder >> (i * 3)) & 0x0007; |
171 | case 0x0001: | 232 | if ( field && !date.isEmpty() ) |
172 | if (i==1) { | 233 | date += sep; |
173 | buf += QString().sprintf("%02d, ",d.day()); | 234 | switch (field) { |
174 | } else { | 235 | case 0x0001: // Day |
175 | buf += QString().sprintf("%2d",d.day()); | 236 | { |
176 | if (separator()=='.') // 2002/1/11 | 237 | QString daysuffix = TimeStringFormat::tr("@day", "day suffix - applies to some asian languages (e.g. Japanese and Trad. Chinese). If it doesn't apply to your language it has to be translated to an '@day' " ); |
177 | buf += ". "; | 238 | if (i==1) { |
178 | else | 239 | date += QString().sprintf("%02d",d.day()); |
179 | buf += " "; | 240 | if (daysuffix != "@day") |
180 | } | 241 | date+=daysuffix; |
242 | sep = TimeStringFormat::tr(",","day-date separator") + " "; | ||
243 | } else { | ||
244 | date += QString().sprintf("%2d",d.day()); | ||
245 | if (daysuffix == "@day") { | ||
246 | if (separator()=='.') // 2002/1/11 | ||
247 | sep = ". "; | ||
248 | else | ||
249 | sep = " "; | ||
250 | } else { | ||
251 | date += daysuffix+" "; | ||
252 | sep = " "; | ||
253 | } | ||
254 | } | ||
255 | } | ||
181 | break; | 256 | break; |
182 | case 0x0002: | 257 | case 0x0002: // Month |
183 | { | 258 | { |
184 | QString monthName = d.monthName(d.month()); | 259 | QString monthName; |
185 | if (!(v & longWord)) { | 260 | |
186 | monthName = monthName.left(3); | 261 | if (v & longWord) |
187 | } | 262 | monthName = qApp->translate("QDate", unTranslatedFullMonthNames[d.month()-1] ); |
188 | buf += monthName; | 263 | else { |
264 | #ifdef QTOPIA_DESKTOP | ||
265 | monthName = qApp->translate("QDate", unTranslatedMediumMonthNames[d.month()-1] ); | ||
266 | #else | ||
267 | monthName = d.monthName( d.month() ); | ||
268 | #endif | ||
269 | } | ||
270 | date += monthName; | ||
189 | } | 271 | } |
190 | if (i < 2) | 272 | sep = " ";//TimeStringFormat::tr(" ","month-date separator"); |
191 | buf += " "; | ||
192 | break; | 273 | break; |
193 | case 0x0004: | 274 | case 0x0004: // Year |
194 | { | 275 | { |
195 | int year = d.year(); | 276 | int year = d.year(); |
196 | if (!(v & longNumber)) | 277 | if (!(v & longNumber)) |
197 | year = year % 100; | 278 | year = year % 100; |
198 | 279 | ||
199 | if (year < 10) | 280 | if (year < 10) |
200 | buf += "0"; | 281 | date += "0"; |
282 | |||
283 | date += QString::number(year); | ||
284 | QString yearsuffix = TimeStringFormat::tr("@year", "year suffix - applies to some asian languages (e.g. Japanese and Trad. Chinese). If it doesn't apply to your language it has to be translated to an '@year' " ); | ||
285 | if (yearsuffix != "@year") | ||
286 | date += yearsuffix; | ||
201 | 287 | ||
202 | buf += QString::number(year); | ||
203 | } | 288 | } |
204 | if (i < 2) | 289 | sep = TimeStringFormat::tr(",","year-date seperator") + " "; |
205 | buf += ", "; | ||
206 | break; | 290 | break; |
207 | } | 291 | } |
208 | } | 292 | } |
209 | return buf; | 293 | |
294 | QString r = ""; | ||
295 | if ( weekDay.isEmpty() ) | ||
296 | r = date; | ||
297 | else if ((_longOrder & 0x0007) == 0x0002) | ||
298 | r = TimeStringFormat::tr("%1 %2","1=Monday 2=January 12").arg(weekDay).arg(date); | ||
299 | else if ( _longOrder ) | ||
300 | r = TimeStringFormat::tr("%1, %2","1=Monday 2=12 January").arg(weekDay).arg(date); | ||
301 | else | ||
302 | r = weekDay; | ||
303 | return r; | ||
210 | } | 304 | } |
211 | 305 | ||
212 | #ifndef QT_NO_DATASTREAM | 306 | #ifndef QT_NO_DATASTREAM |
@@ -251,19 +345,19 @@ QString TimeString::shortDate( const QDate &d, DateFormat dtf ) | |||
251 | 345 | ||
252 | QString TimeString::dateString( const QDate &d, DateFormat dtf ) | 346 | QString TimeString::dateString( const QDate &d, DateFormat dtf ) |
253 | { | 347 | { |
254 | return QObject::tr( dtf.wordDate(d, DateFormat::longNumber | DateFormat::longWord) ); | 348 | return dtf.wordDate(d, DateFormat::longNumber); |
255 | } | 349 | } |
256 | 350 | ||
257 | 351 | ||
258 | QString TimeString::longDateString( const QDate &d, DateFormat dtf ) | 352 | QString TimeString::longDateString( const QDate &d, DateFormat dtf ) |
259 | { | 353 | { |
260 | return QObject::tr( dtf.wordDate(d, DateFormat::showWeekDay | DateFormat::longNumber | 354 | return dtf.wordDate(d, DateFormat::showWeekDay | DateFormat::longNumber |
261 | | DateFormat::longWord) ); | 355 | | DateFormat::longWord); |
262 | } | 356 | } |
263 | 357 | ||
264 | DateFormat TimeString::currentDateFormat() | 358 | DateFormat TimeString::currentDateFormat() |
265 | { | 359 | { |
266 | return TimeStringFormatKeeper::currentFormat(); | 360 | return TimeStringFormat::currentFormat(); |
267 | } | 361 | } |
268 | 362 | ||
269 | 363 | ||
@@ -313,28 +407,19 @@ QString TimeString::timeString( const QTime &t, bool ampm, bool seconds ) | |||
313 | if ( seconds ) | 407 | if ( seconds ) |
314 | argString = argString.arg( strSec ); | 408 | argString = argString.arg( strSec ); |
315 | if ( hour >= 12 ) | 409 | if ( hour >= 12 ) |
316 | argString = argString.arg( QObject::tr("PM") ); | 410 | argString = argString.arg( TimeStringFormat::tr("PM") ); |
317 | else | 411 | else |
318 | argString = argString.arg( QObject::tr("AM") ); | 412 | argString = argString.arg( TimeStringFormat::tr("AM") ); |
319 | return argString; | 413 | return argString; |
320 | } | 414 | } |
321 | 415 | ||
322 | QString TimeString::shortTime( bool ampm, bool seconds ) | 416 | QString TimeString::shortTime( bool ampm, bool seconds ) |
323 | { | 417 | { |
324 | static const char* const day[] = { | ||
325 | QT_TRANSLATE_NOOP( "QObject", "Mon" ), | ||
326 | QT_TRANSLATE_NOOP( "QObject", "Tue" ), | ||
327 | QT_TRANSLATE_NOOP( "QObject", "Wed" ), | ||
328 | QT_TRANSLATE_NOOP( "QObject", "Thu" ), | ||
329 | QT_TRANSLATE_NOOP( "QObject", "Fri" ), | ||
330 | QT_TRANSLATE_NOOP( "QObject", "Sat" ), | ||
331 | QT_TRANSLATE_NOOP( "QObject", "Sun" ) | ||
332 | }; | ||
333 | // just create a shorter time String | 418 | // just create a shorter time String |
334 | QDateTime dtTmp = QDateTime::currentDateTime(); | 419 | QDateTime dtTmp = QDateTime::currentDateTime(); |
335 | QString strTime; | 420 | QString strTime = TimeStringFormat::tr( "%1 %2", "1=Monday 2=12:45" ) |
336 | strTime = QObject::tr( day[dtTmp.date().dayOfWeek()-1] ) + " " + | 421 | .arg(::dayname(dtTmp.date(),FALSE)) |
337 | timeString( dtTmp.time(), ampm, seconds ); | 422 | .arg(timeString( dtTmp.time(), ampm, seconds )); |
338 | return strTime; | 423 | return strTime; |
339 | } | 424 | } |
340 | 425 | ||
@@ -361,5 +446,21 @@ QString TimeString::longNumberDateString( const QDate &d, DateFormat dtf ) | |||
361 | { | 446 | { |
362 | return dtf.numberDate(d,DateFormat::longNumber); | 447 | return dtf.numberDate(d,DateFormat::longNumber); |
363 | } | 448 | } |
449 | /*! | ||
450 | Returns date/time \a dt as a string, | ||
451 | showing year, month, date, hours, minutes, and seconds. | ||
452 | \a len determines the length of the resulting string. | ||
453 | |||
454 | The format, including order depends on the user's settings. | ||
455 | |||
456 | First availability: Qtopia 1.6 | ||
457 | */ | ||
458 | //QString TimeString::localYMDHMS( const QDateTime &dt, Length len ) | ||
459 | //{ | ||
460 | // const QDate& d = dt.date(); | ||
461 | // const QTime& t = dt.time(); | ||
462 | // return LocalTimeFormat::tr("%1 %2","date,time").arg(localYMD(d,len)).arg(localHMS(t)); | ||
463 | //} | ||
464 | |||
364 | 465 | ||
365 | #include "timestring.moc" | 466 | #include "timestring.moc" |
diff --git a/library/timestring.h b/library/timestring.h index 875c8bf..b8d1aea 100644 --- a/library/timestring.h +++ b/library/timestring.h | |||
@@ -1,16 +1,31 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of the Qtopia Environment. | 4 | ** This file is part of the Qtopia Environment. |
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
5 | ** | 13 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This program is distributed in the hope that it will be useful, but |
7 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
9 | ** packaging of this file. | 17 | ** See the GNU General Public License for more details. |
10 | ** | ||
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
13 | ** | 18 | ** |
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 30 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
@@ -22,23 +37,28 @@ | |||
22 | #define _TIMESTRING_H_ | 37 | #define _TIMESTRING_H_ |
23 | #include <qdatetime.h> | 38 | #include <qdatetime.h> |
24 | #include <qstring.h> | 39 | #include <qstring.h> |
40 | #include <qarray.h> | ||
25 | 41 | ||
26 | #if (QT_VERSION-0 >= 0x030000) | 42 | #if (QT_VERSION-0 >= 0x030000) |
27 | #define DateFormat QPEDateFormat | 43 | #define DateFormat QPEDateFormat |
28 | #endif | 44 | #endif |
29 | 45 | ||
46 | #include <qtopia/qpeglobal.h> | ||
47 | |||
48 | class QObject; | ||
49 | |||
30 | // return a string with the time based on whether or not you want | 50 | // return a string with the time based on whether or not you want |
31 | // you want it in 12 hour form. if ampm is true, then return | 51 | // you want it in 12 hour form. if ampm is true, then return |
32 | // it in 12 hour (am/pm) form otherwise return it in 24 hour form | 52 | // it in 12 hour (am/pm) form otherwise return it in 24 hour form |
33 | // in theory Qt 3,0 handles this better (hopefully obsoleteing this) | 53 | // in theory Qt 3,0 handles this better (hopefully obsoleteing this) |
34 | class DateFormat | 54 | class DateFormat |
35 | { | 55 | { |
36 | public: | 56 | public: |
37 | // date format type 001,010,100 = day month year | 57 | // date format type 1,2,4 = day,month,year |
38 | enum Order { | 58 | enum Order { |
39 | DayMonthYear = 0x0111, // 0x001 + 0x010(0x2 << 3) + 0x100(0x4 << 3) | 59 | DayMonthYear = 0421, // right-to-left |
40 | MonthDayYear = 0x010A, | 60 | MonthDayYear = 0412, |
41 | YearMonthDay = 0x0054 | 61 | YearMonthDay = 0124 |
42 | }; | 62 | }; |
43 | 63 | ||
44 | DateFormat(QChar s = '/', Order so = MonthDayYear) : _shortOrder(so), | 64 | DateFormat(QChar s = '/', Order so = MonthDayYear) : _shortOrder(so), |
@@ -99,34 +119,48 @@ class TimeString | |||
99 | { | 119 | { |
100 | public: | 120 | public: |
101 | 121 | ||
102 | //enum DateFormat { MonthDayYear, DayMonthYear, ISO8601, | 122 | //enum DateFormat { MonthDayYear, DayMonthYear, ISO8601, |
103 | //YearMonthDay = ISO8601 }; | 123 | //YearMonthDay = ISO8601 }; |
104 | 124 | ||
105 | /** | 125 | |
106 | * @name Convience functions which use currentDateFormat | 126 | //private: |
107 | */ | 127 | static QString shortDate( const QDate &d ) |
108 | //@{ | ||
109 | static QString shortDate( const QDate &d ) | ||
110 | { return shortDate( d, currentDateFormat() ); } | 128 | { return shortDate( d, currentDateFormat() ); } |
111 | static QString dateString( const QDate &d ) | 129 | static QString dateString( const QDate &d ) |
112 | { return dateString( d, currentDateFormat() ); } | 130 | { return dateString( d, currentDateFormat() ); } |
113 | static QString longDateString( const QDate &d ) | 131 | static QString longDateString( const QDate &d ) |
114 | { return longDateString( d, currentDateFormat() ); } | 132 | { return longDateString( d, currentDateFormat() ); } |
115 | //@} | ||
116 | static QString dateString( const QDateTime &dt, bool ampm, bool seconds ) | 133 | static QString dateString( const QDateTime &dt, bool ampm, bool seconds ) |
117 | { return dateString( dt, ampm, seconds, currentDateFormat() ); } | 134 | { return dateString( dt, ampm, seconds, currentDateFormat() ); } |
118 | 135 | ||
136 | public: | ||
137 | enum Length { Short, Medium, Long }; | ||
138 | static QString localH( int hour ); | ||
139 | static QString localHM( const QTime & ); | ||
140 | static QString localHM( const QTime &, Length ); // qtopia 2.1.0 | ||
141 | static QString localHMS( const QTime & ); | ||
142 | static QString localHMDayOfWeek( const QDateTime &t ); | ||
143 | static QString localHMSDayOfWeek( const QDateTime &t ); | ||
144 | static QString localMD( const QDate &, Length=Medium ); | ||
145 | static QString localYMD( const QDate &, Length=Medium ); | ||
146 | static QString localYMDHMS( const QDateTime &, Length=Medium ); | ||
147 | static QString localDayOfWeek( const QDate&, Length=Medium ); | ||
148 | static QString localDayOfWeek( int day1to7, Length=Medium ); | ||
149 | |||
150 | static QString hourString( int hour, bool ampm ); | ||
151 | static bool currentAMPM(); | ||
152 | static DateFormat currentDateFormat(); | ||
153 | static QArray<DateFormat> formatOptions(); // qtopia 1.6.0 | ||
154 | |||
155 | static void connectChange(QObject*,const char* member); | ||
156 | static void disconnectChange(QObject*,const char* member); | ||
119 | 157 | ||
120 | /** @name Do not use as they don't honor system settings for AMPM | 158 | // Not recommended to call these (they don't honor system ampm) |
121 | * | 159 | static QString dateString( const QDateTime &t, bool ampm ); |
122 | */ | ||
123 | //@{ | ||
124 | static QString dateString( const QDateTime &t, bool ampm = false ); | ||
125 | static QString timeString( const QTime &t, bool ampm, bool seconds ); | 160 | static QString timeString( const QTime &t, bool ampm, bool seconds ); |
126 | static QString timeString( const QTime &t, bool ampm = false ); | 161 | static QString timeString( const QTime &t, bool ampm ); |
127 | static QString shortTime( bool ampm, bool seconds ); | 162 | static QString shortTime( bool ampm, bool seconds ); |
128 | static QString shortTime( bool ampm = false ); | 163 | static QString shortTime( bool ampm ); |
129 | //@} | ||
130 | 164 | ||
131 | static QString numberDateString( const QDate &d, DateFormat ); | 165 | static QString numberDateString( const QDate &d, DateFormat ); |
132 | static QString numberDateString( const QDate &d ) | 166 | static QString numberDateString( const QDate &d ) |
@@ -139,11 +173,9 @@ public: | |||
139 | static QString dateString( const QDate &, DateFormat ); | 173 | static QString dateString( const QDate &, DateFormat ); |
140 | static QString longDateString( const QDate &, DateFormat ); | 174 | static QString longDateString( const QDate &, DateFormat ); |
141 | 175 | ||
142 | static DateFormat currentDateFormat(); | ||
143 | |||
144 | private: | 176 | private: |
145 | static QString dateString( const QDateTime &t, bool ampm, bool seconds, DateFormat ); | 177 | static QString dateString( const QDateTime &t, bool ampm, bool seconds, DateFormat ); |
146 | 178 | ||
147 | 179 | ||
148 | }; | 180 | }; |
149 | 181 | ||
diff --git a/noncore/multimedia/camera2/camera2.pro b/noncore/multimedia/camera2/camera2.pro new file mode 100644 index 0000000..b6e2826 --- a/dev/null +++ b/noncore/multimedia/camera2/camera2.pro | |||
@@ -0,0 +1,27 @@ | |||
1 | DESTDIR = $(OPIEDIR)/bin | ||
2 | TEMPLATE = app | ||
3 | CONFIG += qte warn_on quick_app | ||
4 | INTERFACES=camerabase.ui camerasettings.ui | ||
5 | HEADERS = mainwindow.h \ | ||
6 | image.h \ | ||
7 | thumbbutton.h \ | ||
8 | videocaptureview.h | ||
9 | SOURCES = mainwindow.cpp\ | ||
10 | image.cpp \ | ||
11 | videocaptureview.cpp \ | ||
12 | main.cpp | ||
13 | |||
14 | TARGET = camera2 | ||
15 | DEFINES += HAVE_VIDEO4LINUX | ||
16 | |||
17 | LIBS += -lopiecore2 -lopieui2 | ||
18 | INCLUDEPATH += $(OPIEDIR)/include | ||
19 | DEPENDPATH += $(OPIEDIR)/include | ||
20 | contains(CONFIG,quick-app) { | ||
21 | DESTDIR = $(OPIEDIR)/bin | ||
22 | DEFINES += NOQUICKLAUNCH | ||
23 | } | ||
24 | |||
25 | |||
26 | include( $(OPIEDIR)/include.pro ) | ||
27 | |||
diff --git a/noncore/multimedia/camera2/camerabase.cpp b/noncore/multimedia/camera2/camerabase.cpp new file mode 100644 index 0000000..cbb1ba9 --- a/dev/null +++ b/noncore/multimedia/camera2/camerabase.cpp | |||
@@ -0,0 +1,93 @@ | |||
1 | /**************************************************************************** | ||
2 | ** Form implementation generated from reading ui file 'camerabase.ui' | ||
3 | ** | ||
4 | ** Created: Mon Jul 10 04:21:25 2006 | ||
5 | ** by: The User Interface Compiler (uic) | ||
6 | ** | ||
7 | ** WARNING! All changes made in this file will be lost! | ||
8 | ****************************************************************************/ | ||
9 | #include "camerabase.h" | ||
10 | |||
11 | #include <qframe.h> | ||
12 | #include <qpushbutton.h> | ||
13 | #include "thumbbutton.h" | ||
14 | #include "videocaptureview.h" | ||
15 | #include <qlayout.h> | ||
16 | #include <qvariant.h> | ||
17 | #include <qtooltip.h> | ||
18 | #include <qwhatsthis.h> | ||
19 | |||
20 | /* | ||
21 | * Constructs a CameraBase which is a child of 'parent', with the | ||
22 | * name 'name' and widget flags set to 'f' | ||
23 | */ | ||
24 | CameraBase::CameraBase( QWidget* parent, const char* name, WFlags fl ) | ||
25 | : QWidget( parent, name, fl ) | ||
26 | { | ||
27 | if ( !name ) | ||
28 | setName( "camera" ); | ||
29 | resize( 311, 381 ); | ||
30 | setCaption( tr( "Camera" ) ); | ||
31 | cameraLayout = new QGridLayout( this ); | ||
32 | cameraLayout->setSpacing( 0 ); | ||
33 | cameraLayout->setMargin( 0 ); | ||
34 | |||
35 | Frame3 = new QFrame( this, "Frame3" ); | ||
36 | Frame3->setFrameShape( QFrame::Panel ); | ||
37 | Frame3->setFrameShadow( QFrame::Sunken ); | ||
38 | Frame3->setLineWidth( 4 ); | ||
39 | Frame3->setMargin( 4 ); | ||
40 | Frame3->setMidLineWidth( 3 ); | ||
41 | Frame3Layout = new QVBoxLayout( Frame3 ); | ||
42 | Frame3Layout->setSpacing( 6 ); | ||
43 | Frame3Layout->setMargin( 4 ); | ||
44 | |||
45 | videocaptureview = new VideoCaptureView( Frame3, "videocaptureview" ); | ||
46 | videocaptureview->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, videocaptureview->sizePolicy().hasHeightForWidth() ) ); | ||
47 | Frame3Layout->addWidget( videocaptureview ); | ||
48 | |||
49 | cameraLayout->addMultiCellWidget( Frame3, 0, 0, 0, 1 ); | ||
50 | |||
51 | photo = new QPushButton( this, "photo" ); | ||
52 | photo->setText( tr( "Photo" ) ); | ||
53 | |||
54 | cameraLayout->addWidget( photo, 1, 0 ); | ||
55 | |||
56 | video = new QPushButton( this, "video" ); | ||
57 | video->setText( tr( "Video" ) ); | ||
58 | |||
59 | cameraLayout->addWidget( video, 1, 1 ); | ||
60 | |||
61 | thumbs = new QFrame( this, "thumbs" ); | ||
62 | thumbs->setFrameShape( QFrame::NoFrame ); | ||
63 | thumbs->setFrameShadow( QFrame::Plain ); | ||
64 | thumbsLayout = new QHBoxLayout( thumbs ); | ||
65 | thumbsLayout->setSpacing( 0 ); | ||
66 | thumbsLayout->setMargin( 0 ); | ||
67 | |||
68 | thumb1 = new ThumbButton( thumbs, "thumb1" ); | ||
69 | thumbsLayout->addWidget( thumb1 ); | ||
70 | |||
71 | thumb2 = new ThumbButton( thumbs, "thumb2" ); | ||
72 | thumbsLayout->addWidget( thumb2 ); | ||
73 | |||
74 | thumb3 = new ThumbButton( thumbs, "thumb3" ); | ||
75 | thumbsLayout->addWidget( thumb3 ); | ||
76 | |||
77 | thumb4 = new ThumbButton( thumbs, "thumb4" ); | ||
78 | thumbsLayout->addWidget( thumb4 ); | ||
79 | |||
80 | thumb5 = new ThumbButton( thumbs, "thumb5" ); | ||
81 | thumbsLayout->addWidget( thumb5 ); | ||
82 | |||
83 | cameraLayout->addMultiCellWidget( thumbs, 2, 2, 0, 1 ); | ||
84 | } | ||
85 | |||
86 | /* | ||
87 | * Destroys the object and frees any allocated resources | ||
88 | */ | ||
89 | CameraBase::~CameraBase() | ||
90 | { | ||
91 | // no need to delete child widgets, Qt does it all for us | ||
92 | } | ||
93 | |||
diff --git a/noncore/multimedia/camera2/camerabase.h b/noncore/multimedia/camera2/camerabase.h new file mode 100644 index 0000000..77ab4f0 --- a/dev/null +++ b/noncore/multimedia/camera2/camerabase.h | |||
@@ -0,0 +1,47 @@ | |||
1 | /**************************************************************************** | ||
2 | ** Form interface generated from reading ui file 'camerabase.ui' | ||
3 | ** | ||
4 | ** Created: Mon Jul 10 04:21:22 2006 | ||
5 | ** by: The User Interface Compiler (uic) | ||
6 | ** | ||
7 | ** WARNING! All changes made in this file will be lost! | ||
8 | ****************************************************************************/ | ||
9 | #ifndef CAMERA_H | ||
10 | #define CAMERA_H | ||
11 | |||
12 | #include <qvariant.h> | ||
13 | #include <qwidget.h> | ||
14 | class QVBoxLayout; | ||
15 | class QHBoxLayout; | ||
16 | class QGridLayout; | ||
17 | class QFrame; | ||
18 | class QPushButton; | ||
19 | class ThumbButton; | ||
20 | class VideoCaptureView; | ||
21 | |||
22 | class CameraBase : public QWidget | ||
23 | { | ||
24 | Q_OBJECT | ||
25 | |||
26 | public: | ||
27 | CameraBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); | ||
28 | ~CameraBase(); | ||
29 | |||
30 | QFrame* Frame3; | ||
31 | VideoCaptureView* videocaptureview; | ||
32 | QPushButton* photo; | ||
33 | QPushButton* video; | ||
34 | QFrame* thumbs; | ||
35 | ThumbButton* thumb1; | ||
36 | ThumbButton* thumb2; | ||
37 | ThumbButton* thumb3; | ||
38 | ThumbButton* thumb4; | ||
39 | ThumbButton* thumb5; | ||
40 | |||
41 | protected: | ||
42 | QGridLayout* cameraLayout; | ||
43 | QVBoxLayout* Frame3Layout; | ||
44 | QHBoxLayout* thumbsLayout; | ||
45 | }; | ||
46 | |||
47 | #endif // CAMERA_H | ||
diff --git a/noncore/multimedia/camera2/camerabase.ui b/noncore/multimedia/camera2/camerabase.ui new file mode 100644 index 0000000..e102f79 --- a/dev/null +++ b/noncore/multimedia/camera2/camerabase.ui | |||
@@ -0,0 +1,209 @@ | |||
1 | <!DOCTYPE UI><UI> | ||
2 | <class>CameraBase</class> | ||
3 | <widget> | ||
4 | <class>QWidget</class> | ||
5 | <property stdset="1"> | ||
6 | <name>name</name> | ||
7 | <cstring>camera</cstring> | ||
8 | </property> | ||
9 | <property stdset="1"> | ||
10 | <name>geometry</name> | ||
11 | <rect> | ||
12 | <x>0</x> | ||
13 | <y>0</y> | ||
14 | <width>311</width> | ||
15 | <height>381</height> | ||
16 | </rect> | ||
17 | </property> | ||
18 | <property stdset="1"> | ||
19 | <name>caption</name> | ||
20 | <string>Camera</string> | ||
21 | </property> | ||
22 | <grid> | ||
23 | <property stdset="1"> | ||
24 | <name>margin</name> | ||
25 | <number>0</number> | ||
26 | </property> | ||
27 | <property stdset="1"> | ||
28 | <name>spacing</name> | ||
29 | <number>0</number> | ||
30 | </property> | ||
31 | <widget row="0" column="0" rowspan="1" colspan="2" > | ||
32 | <class>QFrame</class> | ||
33 | <property stdset="1"> | ||
34 | <name>name</name> | ||
35 | <cstring>Frame3</cstring> | ||
36 | </property> | ||
37 | <property stdset="1"> | ||
38 | <name>frameShape</name> | ||
39 | <enum>Panel</enum> | ||
40 | </property> | ||
41 | <property stdset="1"> | ||
42 | <name>frameShadow</name> | ||
43 | <enum>Sunken</enum> | ||
44 | </property> | ||
45 | <property stdset="1"> | ||
46 | <name>lineWidth</name> | ||
47 | <number>4</number> | ||
48 | </property> | ||
49 | <property stdset="1"> | ||
50 | <name>margin</name> | ||
51 | <number>4</number> | ||
52 | </property> | ||
53 | <property stdset="1"> | ||
54 | <name>midLineWidth</name> | ||
55 | <number>3</number> | ||
56 | </property> | ||
57 | <property> | ||
58 | <name>layoutMargin</name> | ||
59 | </property> | ||
60 | <vbox> | ||
61 | <property stdset="1"> | ||
62 | <name>margin</name> | ||
63 | <number>4</number> | ||
64 | </property> | ||
65 | <property stdset="1"> | ||
66 | <name>spacing</name> | ||
67 | <number>6</number> | ||
68 | </property> | ||
69 | <widget> | ||
70 | <class>VideoCaptureView</class> | ||
71 | <property stdset="1"> | ||
72 | <name>name</name> | ||
73 | <cstring>videocaptureview</cstring> | ||
74 | </property> | ||
75 | <property stdset="1"> | ||
76 | <name>sizePolicy</name> | ||
77 | <sizepolicy> | ||
78 | <hsizetype>7</hsizetype> | ||
79 | <vsizetype>7</vsizetype> | ||
80 | </sizepolicy> | ||
81 | </property> | ||
82 | </widget> | ||
83 | </vbox> | ||
84 | </widget> | ||
85 | <widget row="1" column="0" > | ||
86 | <class>QPushButton</class> | ||
87 | <property stdset="1"> | ||
88 | <name>name</name> | ||
89 | <cstring>photo</cstring> | ||
90 | </property> | ||
91 | <property stdset="1"> | ||
92 | <name>text</name> | ||
93 | <string>Photo</string> | ||
94 | </property> | ||
95 | </widget> | ||
96 | <widget row="1" column="1" > | ||
97 | <class>QPushButton</class> | ||
98 | <property stdset="1"> | ||
99 | <name>name</name> | ||
100 | <cstring>video</cstring> | ||
101 | </property> | ||
102 | <property stdset="1"> | ||
103 | <name>text</name> | ||
104 | <string>Video</string> | ||
105 | </property> | ||
106 | </widget> | ||
107 | <widget row="2" column="0" rowspan="1" colspan="2" > | ||
108 | <class>QFrame</class> | ||
109 | <property stdset="1"> | ||
110 | <name>name</name> | ||
111 | <cstring>thumbs</cstring> | ||
112 | </property> | ||
113 | <property stdset="1"> | ||
114 | <name>frameShape</name> | ||
115 | <enum>NoFrame</enum> | ||
116 | </property> | ||
117 | <property stdset="1"> | ||
118 | <name>frameShadow</name> | ||
119 | <enum>Plain</enum> | ||
120 | </property> | ||
121 | <hbox> | ||
122 | <property stdset="1"> | ||
123 | <name>margin</name> | ||
124 | <number>0</number> | ||
125 | </property> | ||
126 | <property stdset="1"> | ||
127 | <name>spacing</name> | ||
128 | <number>0</number> | ||
129 | </property> | ||
130 | <widget> | ||
131 | <class>ThumbButton</class> | ||
132 | <property stdset="1"> | ||
133 | <name>name</name> | ||
134 | <cstring>thumb1</cstring> | ||
135 | </property> | ||
136 | </widget> | ||
137 | <widget> | ||
138 | <class>ThumbButton</class> | ||
139 | <property stdset="1"> | ||
140 | <name>name</name> | ||
141 | <cstring>thumb2</cstring> | ||
142 | </property> | ||
143 | </widget> | ||
144 | <widget> | ||
145 | <class>ThumbButton</class> | ||
146 | <property stdset="1"> | ||
147 | <name>name</name> | ||
148 | <cstring>thumb3</cstring> | ||
149 | </property> | ||
150 | </widget> | ||
151 | <widget> | ||
152 | <class>ThumbButton</class> | ||
153 | <property stdset="1"> | ||
154 | <name>name</name> | ||
155 | <cstring>thumb4</cstring> | ||
156 | </property> | ||
157 | </widget> | ||
158 | <widget> | ||
159 | <class>ThumbButton</class> | ||
160 | <property stdset="1"> | ||
161 | <name>name</name> | ||
162 | <cstring>thumb5</cstring> | ||
163 | </property> | ||
164 | </widget> | ||
165 | </hbox> | ||
166 | </widget> | ||
167 | </grid> | ||
168 | </widget> | ||
169 | <customwidgets> | ||
170 | <customwidget> | ||
171 | <class>VideoCaptureView</class> | ||
172 | <header location="local">videocaptureview.h</header> | ||
173 | <sizehint> | ||
174 | <width>-1</width> | ||
175 | <height>-1</height> | ||
176 | </sizehint> | ||
177 | <container>0</container> | ||
178 | <sizepolicy> | ||
179 | <hordata>7</hordata> | ||
180 | <verdata>7</verdata> | ||
181 | </sizepolicy> | ||
182 | <pixmap>image0</pixmap> | ||
183 | </customwidget> | ||
184 | <customwidget> | ||
185 | <class>ThumbButton</class> | ||
186 | <header location="local">thumbbutton.h</header> | ||
187 | <sizehint> | ||
188 | <width>-1</width> | ||
189 | <height>-1</height> | ||
190 | </sizehint> | ||
191 | <container>0</container> | ||
192 | <sizepolicy> | ||
193 | <hordata>5</hordata> | ||
194 | <verdata>5</verdata> | ||
195 | </sizepolicy> | ||
196 | <pixmap>image1</pixmap> | ||
197 | </customwidget> | ||
198 | </customwidgets> | ||
199 | <images> | ||
200 | <image> | ||
201 | <name>image0</name> | ||
202 | <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> | ||
203 | </image> | ||
204 | <image> | ||
205 | <name>image1</name> | ||
206 | <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753</data> | ||
207 | </image> | ||
208 | </images> | ||
209 | </UI> | ||
diff --git a/noncore/multimedia/camera2/camerasettings.cpp b/noncore/multimedia/camera2/camerasettings.cpp new file mode 100644 index 0000000..d284128 --- a/dev/null +++ b/noncore/multimedia/camera2/camerasettings.cpp | |||
@@ -0,0 +1,166 @@ | |||
1 | /**************************************************************************** | ||
2 | ** Form implementation generated from reading ui file 'camerasettings.ui' | ||
3 | ** | ||
4 | ** Created: Mon Jul 10 04:21:25 2006 | ||
5 | ** by: The User Interface Compiler (uic) | ||
6 | ** | ||
7 | ** WARNING! All changes made in this file will be lost! | ||
8 | ****************************************************************************/ | ||
9 | #include "camerasettings.h" | ||
10 | |||
11 | #include <qcombobox.h> | ||
12 | #include <qgroupbox.h> | ||
13 | #include <qlabel.h> | ||
14 | #include <qpushbutton.h> | ||
15 | #include <qslider.h> | ||
16 | #include <qtopia/locationcombo.h> | ||
17 | #include <qlayout.h> | ||
18 | #include <qvariant.h> | ||
19 | #include <qtooltip.h> | ||
20 | #include <qwhatsthis.h> | ||
21 | |||
22 | /* | ||
23 | * Constructs a CameraSettings which is a child of 'parent', with the | ||
24 | * name 'name' and widget flags set to 'f' | ||
25 | * | ||
26 | * The dialog will by default be modeless, unless you set 'modal' to | ||
27 | * TRUE to construct a modal dialog. | ||
28 | */ | ||
29 | CameraSettings::CameraSettings( QWidget* parent, const char* name, bool modal, WFlags fl ) | ||
30 | : QDialog( parent, name, modal, fl ) | ||
31 | { | ||
32 | if ( !name ) | ||
33 | setName( "CameraSettings" ); | ||
34 | resize( 324, 465 ); | ||
35 | setCaption( tr( "Settings" ) ); | ||
36 | CameraSettingsLayout = new QVBoxLayout( this ); | ||
37 | CameraSettingsLayout->setSpacing( 6 ); | ||
38 | CameraSettingsLayout->setMargin( 11 ); | ||
39 | |||
40 | location = new LocationCombo( this, "location" ); | ||
41 | CameraSettingsLayout->addWidget( location ); | ||
42 | |||
43 | photo = new QGroupBox( this, "photo" ); | ||
44 | photo->setTitle( tr( "Photo" ) ); | ||
45 | photo->setColumnLayout(0, Qt::Vertical ); | ||
46 | photo->layout()->setSpacing( 0 ); | ||
47 | photo->layout()->setMargin( 0 ); | ||
48 | photoLayout = new QVBoxLayout( photo->layout() ); | ||
49 | photoLayout->setAlignment( Qt::AlignTop ); | ||
50 | photoLayout->setSpacing( 2 ); | ||
51 | photoLayout->setMargin( 4 ); | ||
52 | |||
53 | Layout1 = new QHBoxLayout; | ||
54 | Layout1->setSpacing( 6 ); | ||
55 | Layout1->setMargin( 0 ); | ||
56 | |||
57 | TextLabel1 = new QLabel( photo, "TextLabel1" ); | ||
58 | TextLabel1->setText( tr( "Size" ) ); | ||
59 | Layout1->addWidget( TextLabel1 ); | ||
60 | |||
61 | photo_size = new QComboBox( FALSE, photo, "photo_size" ); | ||
62 | photo_size->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, photo_size->sizePolicy().hasHeightForWidth() ) ); | ||
63 | Layout1->addWidget( photo_size ); | ||
64 | photoLayout->addLayout( Layout1 ); | ||
65 | |||
66 | Layout2 = new QHBoxLayout; | ||
67 | Layout2->setSpacing( 6 ); | ||
68 | Layout2->setMargin( 0 ); | ||
69 | |||
70 | TextLabel2 = new QLabel( photo, "TextLabel2" ); | ||
71 | TextLabel2->setText( tr( "Quality" ) ); | ||
72 | Layout2->addWidget( TextLabel2 ); | ||
73 | |||
74 | photo_quality = new QSlider( photo, "photo_quality" ); | ||
75 | photo_quality->setMinValue( 0 ); | ||
76 | photo_quality->setMaxValue( 100 ); | ||
77 | photo_quality->setValue( 75 ); | ||
78 | photo_quality->setOrientation( QSlider::Horizontal ); | ||
79 | Layout2->addWidget( photo_quality ); | ||
80 | |||
81 | photo_quality_n = new QLabel( photo, "photo_quality_n" ); | ||
82 | photo_quality_n->setText( tr( "75" ) ); | ||
83 | Layout2->addWidget( photo_quality_n ); | ||
84 | photoLayout->addLayout( Layout2 ); | ||
85 | CameraSettingsLayout->addWidget( photo ); | ||
86 | |||
87 | video = new QGroupBox( this, "video" ); | ||
88 | video->setTitle( tr( "Video" ) ); | ||
89 | video->setColumnLayout(0, Qt::Vertical ); | ||
90 | video->layout()->setSpacing( 0 ); | ||
91 | video->layout()->setMargin( 0 ); | ||
92 | videoLayout = new QVBoxLayout( video->layout() ); | ||
93 | videoLayout->setAlignment( Qt::AlignTop ); | ||
94 | videoLayout->setSpacing( 2 ); | ||
95 | videoLayout->setMargin( 4 ); | ||
96 | |||
97 | Layout1_2 = new QHBoxLayout; | ||
98 | Layout1_2->setSpacing( 6 ); | ||
99 | Layout1_2->setMargin( 0 ); | ||
100 | |||
101 | TextLabel1_2 = new QLabel( video, "TextLabel1_2" ); | ||
102 | TextLabel1_2->setText( tr( "Size" ) ); | ||
103 | Layout1_2->addWidget( TextLabel1_2 ); | ||
104 | |||
105 | video_size = new QComboBox( FALSE, video, "video_size" ); | ||
106 | video_size->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, video_size->sizePolicy().hasHeightForWidth() ) ); | ||
107 | Layout1_2->addWidget( video_size ); | ||
108 | videoLayout->addLayout( Layout1_2 ); | ||
109 | |||
110 | Layout2_2 = new QHBoxLayout; | ||
111 | Layout2_2->setSpacing( 6 ); | ||
112 | Layout2_2->setMargin( 0 ); | ||
113 | |||
114 | TextLabel2_2 = new QLabel( video, "TextLabel2_2" ); | ||
115 | TextLabel2_2->setText( tr( "Quality" ) ); | ||
116 | Layout2_2->addWidget( TextLabel2_2 ); | ||
117 | |||
118 | video_quality = new QSlider( video, "video_quality" ); | ||
119 | video_quality->setMinValue( 0 ); | ||
120 | video_quality->setMaxValue( 100 ); | ||
121 | video_quality->setValue( 75 ); | ||
122 | video_quality->setOrientation( QSlider::Horizontal ); | ||
123 | Layout2_2->addWidget( video_quality ); | ||
124 | |||
125 | video_quality_n = new QLabel( video, "video_quality_n" ); | ||
126 | video_quality_n->setText( tr( "75" ) ); | ||
127 | Layout2_2->addWidget( video_quality_n ); | ||
128 | videoLayout->addLayout( Layout2_2 ); | ||
129 | |||
130 | Layout6 = new QHBoxLayout; | ||
131 | Layout6->setSpacing( 6 ); | ||
132 | Layout6->setMargin( 0 ); | ||
133 | |||
134 | TextLabel4 = new QLabel( video, "TextLabel4" ); | ||
135 | TextLabel4->setText( tr( "Frame rate" ) ); | ||
136 | Layout6->addWidget( TextLabel4 ); | ||
137 | |||
138 | video_framerate = new QSlider( video, "video_framerate" ); | ||
139 | video_framerate->setMinValue( 1 ); | ||
140 | video_framerate->setMaxValue( 60 ); | ||
141 | video_framerate->setValue( 5 ); | ||
142 | video_framerate->setOrientation( QSlider::Horizontal ); | ||
143 | Layout6->addWidget( video_framerate ); | ||
144 | |||
145 | TextLabel6 = new QLabel( video, "TextLabel6" ); | ||
146 | TextLabel6->setText( tr( "5" ) ); | ||
147 | Layout6->addWidget( TextLabel6 ); | ||
148 | videoLayout->addLayout( Layout6 ); | ||
149 | CameraSettingsLayout->addWidget( video ); | ||
150 | QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); | ||
151 | CameraSettingsLayout->addItem( spacer ); | ||
152 | |||
153 | // signals and slots connections | ||
154 | connect( photo_quality, SIGNAL( valueChanged(int) ), photo_quality_n, SLOT( setNum(int) ) ); | ||
155 | connect( video_quality, SIGNAL( valueChanged(int) ), video_quality_n, SLOT( setNum(int) ) ); | ||
156 | connect( video_framerate, SIGNAL( valueChanged(int) ), TextLabel6, SLOT( setNum(int) ) ); | ||
157 | } | ||
158 | |||
159 | /* | ||
160 | * Destroys the object and frees any allocated resources | ||
161 | */ | ||
162 | CameraSettings::~CameraSettings() | ||
163 | { | ||
164 | // no need to delete child widgets, Qt does it all for us | ||
165 | } | ||
166 | |||
diff --git a/noncore/multimedia/camera2/camerasettings.h b/noncore/multimedia/camera2/camerasettings.h new file mode 100644 index 0000000..dcc48a0 --- a/dev/null +++ b/noncore/multimedia/camera2/camerasettings.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /**************************************************************************** | ||
2 | ** Form interface generated from reading ui file 'camerasettings.ui' | ||
3 | ** | ||
4 | ** Created: Mon Jul 10 04:21:22 2006 | ||
5 | ** by: The User Interface Compiler (uic) | ||
6 | ** | ||
7 | ** WARNING! All changes made in this file will be lost! | ||
8 | ****************************************************************************/ | ||
9 | #ifndef CAMERASETTINGS_H | ||
10 | #define CAMERASETTINGS_H | ||
11 | |||
12 | #include <qvariant.h> | ||
13 | #include <qdialog.h> | ||
14 | class QVBoxLayout; | ||
15 | class QHBoxLayout; | ||
16 | class QGridLayout; | ||
17 | class LocationCombo; | ||
18 | class QComboBox; | ||
19 | class QGroupBox; | ||
20 | class QLabel; | ||
21 | class QSlider; | ||
22 | |||
23 | class CameraSettings : public QDialog | ||
24 | { | ||
25 | Q_OBJECT | ||
26 | |||
27 | public: | ||
28 | CameraSettings( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); | ||
29 | ~CameraSettings(); | ||
30 | |||
31 | LocationCombo* location; | ||
32 | QGroupBox* photo; | ||
33 | QLabel* TextLabel1; | ||
34 | QComboBox* photo_size; | ||
35 | QLabel* TextLabel2; | ||
36 | QSlider* photo_quality; | ||
37 | QLabel* photo_quality_n; | ||
38 | QGroupBox* video; | ||
39 | QLabel* TextLabel1_2; | ||
40 | QComboBox* video_size; | ||
41 | QLabel* TextLabel2_2; | ||
42 | QSlider* video_quality; | ||
43 | QLabel* video_quality_n; | ||
44 | QLabel* TextLabel4; | ||
45 | QSlider* video_framerate; | ||
46 | QLabel* TextLabel6; | ||
47 | |||
48 | protected: | ||
49 | QVBoxLayout* CameraSettingsLayout; | ||
50 | QVBoxLayout* photoLayout; | ||
51 | QHBoxLayout* Layout1; | ||
52 | QHBoxLayout* Layout2; | ||
53 | QVBoxLayout* videoLayout; | ||
54 | QHBoxLayout* Layout1_2; | ||
55 | QHBoxLayout* Layout2_2; | ||
56 | QHBoxLayout* Layout6; | ||
57 | }; | ||
58 | |||
59 | #endif // CAMERASETTINGS_H | ||
diff --git a/noncore/multimedia/camera2/camerasettings.ui b/noncore/multimedia/camera2/camerasettings.ui new file mode 100644 index 0000000..276694b --- a/dev/null +++ b/noncore/multimedia/camera2/camerasettings.ui | |||
@@ -0,0 +1,433 @@ | |||
1 | <!DOCTYPE UI><UI> | ||
2 | <class>CameraSettings</class> | ||
3 | <widget> | ||
4 | <class>QDialog</class> | ||
5 | <property stdset="1"> | ||
6 | <name>name</name> | ||
7 | <cstring>CameraSettings</cstring> | ||
8 | </property> | ||
9 | <property stdset="1"> | ||
10 | <name>geometry</name> | ||
11 | <rect> | ||
12 | <x>0</x> | ||
13 | <y>0</y> | ||
14 | <width>324</width> | ||
15 | <height>465</height> | ||
16 | </rect> | ||
17 | </property> | ||
18 | <property stdset="1"> | ||
19 | <name>caption</name> | ||
20 | <string>Settings</string> | ||
21 | </property> | ||
22 | <property> | ||
23 | <name>layoutMargin</name> | ||
24 | </property> | ||
25 | <property> | ||
26 | <name>layoutSpacing</name> | ||
27 | </property> | ||
28 | <vbox> | ||
29 | <property stdset="1"> | ||
30 | <name>margin</name> | ||
31 | <number>11</number> | ||
32 | </property> | ||
33 | <property stdset="1"> | ||
34 | <name>spacing</name> | ||
35 | <number>6</number> | ||
36 | </property> | ||
37 | <widget> | ||
38 | <class>LocationCombo</class> | ||
39 | <property stdset="1"> | ||
40 | <name>name</name> | ||
41 | <cstring>location</cstring> | ||
42 | </property> | ||
43 | </widget> | ||
44 | <widget> | ||
45 | <class>QGroupBox</class> | ||
46 | <property stdset="1"> | ||
47 | <name>name</name> | ||
48 | <cstring>photo</cstring> | ||
49 | </property> | ||
50 | <property stdset="1"> | ||
51 | <name>title</name> | ||
52 | <string>Photo</string> | ||
53 | </property> | ||
54 | <property> | ||
55 | <name>layoutMargin</name> | ||
56 | </property> | ||
57 | <property> | ||
58 | <name>layoutSpacing</name> | ||
59 | </property> | ||
60 | <vbox> | ||
61 | <property stdset="1"> | ||
62 | <name>margin</name> | ||
63 | <number>4</number> | ||
64 | </property> | ||
65 | <property stdset="1"> | ||
66 | <name>spacing</name> | ||
67 | <number>2</number> | ||
68 | </property> | ||
69 | <widget> | ||
70 | <class>QLayoutWidget</class> | ||
71 | <property stdset="1"> | ||
72 | <name>name</name> | ||
73 | <cstring>Layout1</cstring> | ||
74 | </property> | ||
75 | <hbox> | ||
76 | <property stdset="1"> | ||
77 | <name>margin</name> | ||
78 | <number>0</number> | ||
79 | </property> | ||
80 | <property stdset="1"> | ||
81 | <name>spacing</name> | ||
82 | <number>6</number> | ||
83 | </property> | ||
84 | <widget> | ||
85 | <class>QLabel</class> | ||
86 | <property stdset="1"> | ||
87 | <name>name</name> | ||
88 | <cstring>TextLabel1</cstring> | ||
89 | </property> | ||
90 | <property stdset="1"> | ||
91 | <name>text</name> | ||
92 | <string>Size</string> | ||
93 | </property> | ||
94 | </widget> | ||
95 | <widget> | ||
96 | <class>QComboBox</class> | ||
97 | <property stdset="1"> | ||
98 | <name>name</name> | ||
99 | <cstring>photo_size</cstring> | ||
100 | </property> | ||
101 | <property stdset="1"> | ||
102 | <name>sizePolicy</name> | ||
103 | <sizepolicy> | ||
104 | <hsizetype>7</hsizetype> | ||
105 | <vsizetype>0</vsizetype> | ||
106 | </sizepolicy> | ||
107 | </property> | ||
108 | </widget> | ||
109 | </hbox> | ||
110 | </widget> | ||
111 | <widget> | ||
112 | <class>QLayoutWidget</class> | ||
113 | <property stdset="1"> | ||
114 | <name>name</name> | ||
115 | <cstring>Layout2</cstring> | ||
116 | </property> | ||
117 | <hbox> | ||
118 | <property stdset="1"> | ||
119 | <name>margin</name> | ||
120 | <number>0</number> | ||
121 | </property> | ||
122 | <property stdset="1"> | ||
123 | <name>spacing</name> | ||
124 | <number>6</number> | ||
125 | </property> | ||
126 | <widget> | ||
127 | <class>QLabel</class> | ||
128 | <property stdset="1"> | ||
129 | <name>name</name> | ||
130 | <cstring>TextLabel2</cstring> | ||
131 | </property> | ||
132 | <property stdset="1"> | ||
133 | <name>text</name> | ||
134 | <string>Quality</string> | ||
135 | </property> | ||
136 | </widget> | ||
137 | <widget> | ||
138 | <class>QSlider</class> | ||
139 | <property stdset="1"> | ||
140 | <name>name</name> | ||
141 | <cstring>photo_quality</cstring> | ||
142 | </property> | ||
143 | <property stdset="1"> | ||
144 | <name>minValue</name> | ||
145 | <number>0</number> | ||
146 | </property> | ||
147 | <property stdset="1"> | ||
148 | <name>maxValue</name> | ||
149 | <number>100</number> | ||
150 | </property> | ||
151 | <property stdset="1"> | ||
152 | <name>value</name> | ||
153 | <number>75</number> | ||
154 | </property> | ||
155 | <property stdset="1"> | ||
156 | <name>orientation</name> | ||
157 | <enum>Horizontal</enum> | ||
158 | </property> | ||
159 | </widget> | ||
160 | <widget> | ||
161 | <class>QLabel</class> | ||
162 | <property stdset="1"> | ||
163 | <name>name</name> | ||
164 | <cstring>photo_quality_n</cstring> | ||
165 | </property> | ||
166 | <property stdset="1"> | ||
167 | <name>text</name> | ||
168 | <string>75</string> | ||
169 | </property> | ||
170 | </widget> | ||
171 | </hbox> | ||
172 | </widget> | ||
173 | </vbox> | ||
174 | </widget> | ||
175 | <widget> | ||
176 | <class>QGroupBox</class> | ||
177 | <property stdset="1"> | ||
178 | <name>name</name> | ||
179 | <cstring>video</cstring> | ||
180 | </property> | ||
181 | <property stdset="1"> | ||
182 | <name>title</name> | ||
183 | <string>Video</string> | ||
184 | </property> | ||
185 | <property> | ||
186 | <name>layoutMargin</name> | ||
187 | </property> | ||
188 | <property> | ||
189 | <name>layoutSpacing</name> | ||
190 | </property> | ||
191 | <vbox> | ||
192 | <property stdset="1"> | ||
193 | <name>margin</name> | ||
194 | <number>4</number> | ||
195 | </property> | ||
196 | <property stdset="1"> | ||
197 | <name>spacing</name> | ||
198 | <number>2</number> | ||
199 | </property> | ||
200 | <widget> | ||
201 | <class>QLayoutWidget</class> | ||
202 | <property stdset="1"> | ||
203 | <name>name</name> | ||
204 | <cstring>Layout1_2</cstring> | ||
205 | </property> | ||
206 | <hbox> | ||
207 | <property stdset="1"> | ||
208 | <name>margin</name> | ||
209 | <number>0</number> | ||
210 | </property> | ||
211 | <property stdset="1"> | ||
212 | <name>spacing</name> | ||
213 | <number>6</number> | ||
214 | </property> | ||
215 | <widget> | ||
216 | <class>QLabel</class> | ||
217 | <property stdset="1"> | ||
218 | <name>name</name> | ||
219 | <cstring>TextLabel1_2</cstring> | ||
220 | </property> | ||
221 | <property stdset="1"> | ||
222 | <name>text</name> | ||
223 | <string>Size</string> | ||
224 | </property> | ||
225 | </widget> | ||
226 | <widget> | ||
227 | <class>QComboBox</class> | ||
228 | <property stdset="1"> | ||
229 | <name>name</name> | ||
230 | <cstring>video_size</cstring> | ||
231 | </property> | ||
232 | <property stdset="1"> | ||
233 | <name>sizePolicy</name> | ||
234 | <sizepolicy> | ||
235 | <hsizetype>7</hsizetype> | ||
236 | <vsizetype>0</vsizetype> | ||
237 | </sizepolicy> | ||
238 | </property> | ||
239 | </widget> | ||
240 | </hbox> | ||
241 | </widget> | ||
242 | <widget> | ||
243 | <class>QLayoutWidget</class> | ||
244 | <property stdset="1"> | ||
245 | <name>name</name> | ||
246 | <cstring>Layout2_2</cstring> | ||
247 | </property> | ||
248 | <hbox> | ||
249 | <property stdset="1"> | ||
250 | <name>margin</name> | ||
251 | <number>0</number> | ||
252 | </property> | ||
253 | <property stdset="1"> | ||
254 | <name>spacing</name> | ||
255 | <number>6</number> | ||
256 | </property> | ||
257 | <widget> | ||
258 | <class>QLabel</class> | ||
259 | <property stdset="1"> | ||
260 | <name>name</name> | ||
261 | <cstring>TextLabel2_2</cstring> | ||
262 | </property> | ||
263 | <property stdset="1"> | ||
264 | <name>text</name> | ||
265 | <string>Quality</string> | ||
266 | </property> | ||
267 | </widget> | ||
268 | <widget> | ||
269 | <class>QSlider</class> | ||
270 | <property stdset="1"> | ||
271 | <name>name</name> | ||
272 | <cstring>video_quality</cstring> | ||
273 | </property> | ||
274 | <property stdset="1"> | ||
275 | <name>minValue</name> | ||
276 | <number>0</number> | ||
277 | </property> | ||
278 | <property stdset="1"> | ||
279 | <name>maxValue</name> | ||
280 | <number>100</number> | ||
281 | </property> | ||
282 | <property stdset="1"> | ||
283 | <name>value</name> | ||
284 | <number>75</number> | ||
285 | </property> | ||
286 | <property stdset="1"> | ||
287 | <name>orientation</name> | ||
288 | <enum>Horizontal</enum> | ||
289 | </property> | ||
290 | </widget> | ||
291 | <widget> | ||
292 | <class>QLabel</class> | ||
293 | <property stdset="1"> | ||
294 | <name>name</name> | ||
295 | <cstring>video_quality_n</cstring> | ||
296 | </property> | ||
297 | <property stdset="1"> | ||
298 | <name>text</name> | ||
299 | <string>75</string> | ||
300 | </property> | ||
301 | </widget> | ||
302 | </hbox> | ||
303 | </widget> | ||
304 | <widget> | ||
305 | <class>QLayoutWidget</class> | ||
306 | <property stdset="1"> | ||
307 | <name>name</name> | ||
308 | <cstring>Layout6</cstring> | ||
309 | </property> | ||
310 | <hbox> | ||
311 | <property stdset="1"> | ||
312 | <name>margin</name> | ||
313 | <number>0</number> | ||
314 | </property> | ||
315 | <property stdset="1"> | ||
316 | <name>spacing</name> | ||
317 | <number>6</number> | ||
318 | </property> | ||
319 | <widget> | ||
320 | <class>QLabel</class> | ||
321 | <property stdset="1"> | ||
322 | <name>name</name> | ||
323 | <cstring>TextLabel4</cstring> | ||
324 | </property> | ||
325 | <property stdset="1"> | ||
326 | <name>text</name> | ||
327 | <string>Frame rate</string> | ||
328 | </property> | ||
329 | </widget> | ||
330 | <widget> | ||
331 | <class>QSlider</class> | ||
332 | <property stdset="1"> | ||
333 | <name>name</name> | ||
334 | <cstring>video_framerate</cstring> | ||
335 | </property> | ||
336 | <property stdset="1"> | ||
337 | <name>minValue</name> | ||
338 | <number>1</number> | ||
339 | </property> | ||
340 | <property stdset="1"> | ||
341 | <name>maxValue</name> | ||
342 | <number>60</number> | ||
343 | </property> | ||
344 | <property stdset="1"> | ||
345 | <name>value</name> | ||
346 | <number>5</number> | ||
347 | </property> | ||
348 | <property stdset="1"> | ||
349 | <name>orientation</name> | ||
350 | <enum>Horizontal</enum> | ||
351 | </property> | ||
352 | </widget> | ||
353 | <widget> | ||
354 | <class>QLabel</class> | ||
355 | <property stdset="1"> | ||
356 | <name>name</name> | ||
357 | <cstring>TextLabel6</cstring> | ||
358 | </property> | ||
359 | <property stdset="1"> | ||
360 | <name>text</name> | ||
361 | <string>5</string> | ||
362 | </property> | ||
363 | </widget> | ||
364 | </hbox> | ||
365 | </widget> | ||
366 | </vbox> | ||
367 | </widget> | ||
368 | <spacer> | ||
369 | <property> | ||
370 | <name>name</name> | ||
371 | <cstring>Spacer1</cstring> | ||
372 | </property> | ||
373 | <property stdset="1"> | ||
374 | <name>orientation</name> | ||
375 | <enum>Vertical</enum> | ||
376 | </property> | ||
377 | <property stdset="1"> | ||
378 | <name>sizeType</name> | ||
379 | <enum>Expanding</enum> | ||
380 | </property> | ||
381 | <property> | ||
382 | <name>sizeHint</name> | ||
383 | <size> | ||
384 | <width>20</width> | ||
385 | <height>20</height> | ||
386 | </size> | ||
387 | </property> | ||
388 | </spacer> | ||
389 | </vbox> | ||
390 | </widget> | ||
391 | <customwidgets> | ||
392 | <customwidget> | ||
393 | <class>LocationCombo</class> | ||
394 | <header location="global">qtopia/locationcombo.h</header> | ||
395 | <sizehint> | ||
396 | <width>-1</width> | ||
397 | <height>-1</height> | ||
398 | </sizehint> | ||
399 | <container>0</container> | ||
400 | <sizepolicy> | ||
401 | <hordata>5</hordata> | ||
402 | <verdata>5</verdata> | ||
403 | </sizepolicy> | ||
404 | <pixmap>image0</pixmap> | ||
405 | </customwidget> | ||
406 | </customwidgets> | ||
407 | <images> | ||
408 | <image> | ||
409 | <name>image0</name> | ||
410 | <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> | ||
411 | </image> | ||
412 | </images> | ||
413 | <connections> | ||
414 | <connection> | ||
415 | <sender>photo_quality</sender> | ||
416 | <signal>valueChanged(int)</signal> | ||
417 | <receiver>photo_quality_n</receiver> | ||
418 | <slot>setNum(int)</slot> | ||
419 | </connection> | ||
420 | <connection> | ||
421 | <sender>video_quality</sender> | ||
422 | <signal>valueChanged(int)</signal> | ||
423 | <receiver>video_quality_n</receiver> | ||
424 | <slot>setNum(int)</slot> | ||
425 | </connection> | ||
426 | <connection> | ||
427 | <sender>video_framerate</sender> | ||
428 | <signal>valueChanged(int)</signal> | ||
429 | <receiver>TextLabel6</receiver> | ||
430 | <slot>setNum(int)</slot> | ||
431 | </connection> | ||
432 | </connections> | ||
433 | </UI> | ||
diff --git a/noncore/multimedia/camera2/config.in b/noncore/multimedia/camera2/config.in new file mode 100644 index 0000000..8838008 --- a/dev/null +++ b/noncore/multimedia/camera2/config.in | |||
@@ -0,0 +1,7 @@ | |||
1 | config CAMERA2 | ||
2 | boolean "opie-camera2 (camera app to use with Video4Linux)" | ||
3 | default "n" | ||
4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI | ||
5 | comment "opie-camera needs a libqpe, libopie2core & libopie2ui" | ||
6 | depends !(( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI ) | ||
7 | |||
diff --git a/noncore/multimedia/camera2/image.cpp b/noncore/multimedia/camera2/image.cpp new file mode 100644 index 0000000..39b6d8b --- a/dev/null +++ b/noncore/multimedia/camera2/image.cpp | |||
@@ -0,0 +1,239 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #include "image.h" | ||
37 | |||
38 | #include <qfileinfo.h> | ||
39 | #include <qimage.h> | ||
40 | #include <qstring.h> | ||
41 | |||
42 | /*! | ||
43 | Returns an image created by loading the \a filename, | ||
44 | and scalining it, preserving aspect ratio, to fit in | ||
45 | \a width by \a height pixels. | ||
46 | |||
47 | First availability: Qtopia 2.0 | ||
48 | */ | ||
49 | QImage Image::loadScaled(const QString & filename, const int width, const int height, | ||
50 | ScaleMode mode) | ||
51 | { | ||
52 | QImageIO iio; | ||
53 | QString param; | ||
54 | int w = width; | ||
55 | int h = height; | ||
56 | |||
57 | if (width == 0 || height == 0) | ||
58 | return QImage(); | ||
59 | |||
60 | iio.setFileName(filename); | ||
61 | |||
62 | // | ||
63 | // Try and load and scale the image in one hit. | ||
64 | // | ||
65 | param.sprintf("GetHeaderInformation"); | ||
66 | iio.setParameters(param); | ||
67 | iio.read(); | ||
68 | |||
69 | // | ||
70 | // If we don't have bits(), read() understands parameters, | ||
71 | // and we can setup for fast reading. Otherwise, take the | ||
72 | // performance hit and do things slowly. | ||
73 | // | ||
74 | if (!iio.image().bits()) { | ||
75 | if ((iio.image().width() < w) && (iio.image().height() < h)) { | ||
76 | param.sprintf("%s", "Fast"); // No Tr | ||
77 | } | ||
78 | else { | ||
79 | int shrink_factor = 1; | ||
80 | QString smode; | ||
81 | switch (mode) { | ||
82 | case ScaleMin: | ||
83 | smode = "ScaleMin"; | ||
84 | shrink_factor = QMAX(iio.image().width() / w, iio.image().height() / h); | ||
85 | break; | ||
86 | case ScaleMax: | ||
87 | smode = "ScaleMax"; | ||
88 | shrink_factor = QMIN(iio.image().width() / w, iio.image().height() / h); | ||
89 | break; | ||
90 | case ScaleFree: | ||
91 | smode = "ScaleFree"; | ||
92 | shrink_factor = QMIN(iio.image().width() / w, iio.image().height() / h); | ||
93 | break; | ||
94 | } | ||
95 | param.sprintf("Scale( %i, %i, %s )%s, Shrink( %i )", // No tr | ||
96 | w, h, smode.latin1(), ", Fast", shrink_factor); // No tr | ||
97 | } | ||
98 | |||
99 | iio.setParameters(param); | ||
100 | iio.read(); | ||
101 | return iio.image(); | ||
102 | } | ||
103 | |||
104 | if ((iio.image().width() > w) || (iio.image().height() > h)) { | ||
105 | QSize s = aspectScaleSize(iio.image().width(), iio.image().height(), w, h, mode); | ||
106 | return iio.image().smoothScale(s.width(), s.height()); | ||
107 | } | ||
108 | |||
109 | return iio.image(); | ||
110 | } | ||
111 | |||
112 | // | ||
113 | // Returns new size of image, scaled to target_width and target_height, | ||
114 | // whilst preserving aspect ratio. Useful when it's not possible to | ||
115 | // scale an image prior to using it (eg. using RichText). Should be in | ||
116 | // global image utils. | ||
117 | // | ||
118 | // NOTE | ||
119 | // - expensive for images whose drivers do not allow us to retrieve | ||
120 | // parameters without reading the entire image. Currently (20030930) | ||
121 | // only the jpeg driver allows parameter reading. | ||
122 | // | ||
123 | QSize Image::loadScaledImageSize(const QString & filename, int target_width, int target_height, | ||
124 | int maxscale, ScaleMode mode) | ||
125 | { | ||
126 | QImageIO iio; | ||
127 | iio.setFileName(filename); | ||
128 | iio.setParameters("GetHeaderInformation"); | ||
129 | iio.read(); | ||
130 | |||
131 | int w = iio.image().width(); | ||
132 | int h = iio.image().height(); | ||
133 | |||
134 | // | ||
135 | // Scaling up small pictures can be very ugly. | ||
136 | // Leave them alone if they are too small. | ||
137 | // | ||
138 | if (maxscale && w * maxscale < target_width && h * maxscale < target_height) | ||
139 | return QSize(w * maxscale, h * maxscale); | ||
140 | |||
141 | return aspectScaleSize(w, h, target_width, target_height, mode); | ||
142 | } | ||
143 | |||
144 | // Load an image to be used as a portrait. Force its height to height, | ||
145 | // scale width to new height, and crop the width if it's still > width | ||
146 | // XXX : Should be using integer math | ||
147 | QImage Image::loadPortrait(const QString & filename, const int width, const int height) | ||
148 | { | ||
149 | QImageIO iio; | ||
150 | QString param; | ||
151 | int w = width; | ||
152 | int h = height; | ||
153 | |||
154 | if (width == 0 || height == 0) | ||
155 | return QImage(); | ||
156 | |||
157 | iio.setFileName(filename); | ||
158 | |||
159 | // | ||
160 | // Try and load and scale the image in one hit. | ||
161 | // | ||
162 | param.sprintf("GetHeaderInformation"); | ||
163 | iio.setParameters(param); | ||
164 | iio.read(); | ||
165 | |||
166 | // | ||
167 | // If we don't have bits(), read() understands parameters, | ||
168 | // and we can setup for fast reading. Otherwise, take the | ||
169 | // performance hit and do things slowly. | ||
170 | // | ||
171 | if (!iio.image().bits()) { | ||
172 | |||
173 | w = (int) ((double) iio.image().width() / (double) (iio.image().height()) * | ||
174 | (double) height); | ||
175 | param.sprintf("Scale( %i, %i, ScaleFree )%s", // No tr | ||
176 | w, h, ", Fast"); // No tr | ||
177 | |||
178 | iio.setParameters(param); | ||
179 | iio.read(); | ||
180 | |||
181 | if (w > width) { | ||
182 | int x = (int) ((double) (w - width) / 2); | ||
183 | QRect r(x, 0, width, height); | ||
184 | return iio.image().copy(r); | ||
185 | } | ||
186 | else | ||
187 | return iio.image(); | ||
188 | } | ||
189 | else | ||
190 | //scale width to the new height | ||
191 | return sizeToPortrait(iio.image(), width, height); | ||
192 | } | ||
193 | |||
194 | QImage Image::sizeToPortrait(const QImage & image, const int width, const int height) | ||
195 | { | ||
196 | int w = (image.width() * height) / image.height(); | ||
197 | if (w > width) { | ||
198 | int x = (w - width) / 2; | ||
199 | QRect r(x, 0, width, height); | ||
200 | return image.smoothScale(w, height).copy(r); | ||
201 | } | ||
202 | else | ||
203 | return image.smoothScale(width, height); | ||
204 | } | ||
205 | |||
206 | // | ||
207 | // Return (w x h) scaled to (target_width x target_height) with aspect | ||
208 | // ratio preserved. | ||
209 | // | ||
210 | QSize | ||
211 | Image::aspectScaleSize(const int w, const int h, const int target_width, | ||
212 | const int target_height, ScaleMode mode) | ||
213 | { | ||
214 | QSize s; | ||
215 | if (mode == ScaleFree) { | ||
216 | s = QSize(target_width, target_height); | ||
217 | } | ||
218 | else { | ||
219 | bool useHeight = TRUE; | ||
220 | int rw = target_height * w / h; | ||
221 | |||
222 | if (mode == ScaleMin) { | ||
223 | useHeight = (rw <= target_width); | ||
224 | } | ||
225 | else { // mode == ScaleMax | ||
226 | useHeight = (rw >= target_width); | ||
227 | } | ||
228 | |||
229 | if (useHeight) { | ||
230 | s = QSize(rw, target_height); | ||
231 | } | ||
232 | else { | ||
233 | s = QSize(target_width, target_width * h / w); | ||
234 | } | ||
235 | } | ||
236 | |||
237 | return s; | ||
238 | } | ||
239 | |||
diff --git a/noncore/multimedia/camera2/image.h b/noncore/multimedia/camera2/image.h new file mode 100644 index 0000000..36394ff --- a/dev/null +++ b/noncore/multimedia/camera2/image.h | |||
@@ -0,0 +1,53 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #ifndef IMAGE_H | ||
37 | #define IMAGE_H | ||
38 | |||
39 | #include <qimage.h> | ||
40 | #include <qtopia/qpeglobal.h> | ||
41 | |||
42 | class Image { | ||
43 | public: | ||
44 | // namespace | ||
45 | enum ScaleMode { ScaleFree, ScaleMin, ScaleMax }; | ||
46 | static QImage loadScaled(const QString &filename, const int width, const int height, ScaleMode mode=ScaleMin); | ||
47 | static QSize loadScaledImageSize(const QString &filename, int target_width, int target_height, int maxscale=1, ScaleMode mode=ScaleMin); | ||
48 | static QImage loadPortrait(const QString &filename, const int width, const int height); | ||
49 | static QImage sizeToPortrait(const QImage &image, const int width, const int height); | ||
50 | static QSize aspectScaleSize(const int w, const int h, const int target_width, const int target_height, ScaleMode mode=ScaleMin); | ||
51 | }; | ||
52 | |||
53 | #endif // IMAGE_H | ||
diff --git a/noncore/multimedia/camera2/main.cpp b/noncore/multimedia/camera2/main.cpp new file mode 100644 index 0000000..00e21de --- a/dev/null +++ b/noncore/multimedia/camera2/main.cpp | |||
@@ -0,0 +1,44 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #include "mainwindow.h" | ||
37 | #include <opie2/oapplication.h> | ||
38 | #include <opie2/oapplicationfactory.h> | ||
39 | |||
40 | using namespace Opie::Core; | ||
41 | OPIE_EXPORT_APP(OApplicationFactory < CameraMainWindow >) | ||
42 | // QTOPIA_ADD_APPLICATION("camera",CameraMainWindow) | ||
43 | // QTOPIA_MAIN | ||
44 | |||
diff --git a/noncore/multimedia/camera2/mainwindow.cpp b/noncore/multimedia/camera2/mainwindow.cpp new file mode 100644 index 0000000..45f8cdf --- a/dev/null +++ b/noncore/multimedia/camera2/mainwindow.cpp | |||
@@ -0,0 +1,763 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #define QTOPIA_INTERNAL_FILEOPERATIONS | ||
37 | #include "mainwindow.h" | ||
38 | #include "videocaptureview.h" | ||
39 | #include "camerasettings.h" | ||
40 | #include "thumbbutton.h" | ||
41 | |||
42 | #include "image.h" | ||
43 | |||
44 | /* OPIE */ | ||
45 | #include <opie2/odebug.h> | ||
46 | #include <opie2/oresource.h> | ||
47 | using namespace Opie::Core; | ||
48 | |||
49 | #include <qpe/config.h> | ||
50 | #include <qpe/qpeapplication.h> | ||
51 | #include <qpe/locationcombo.h> | ||
52 | //#include <qtopia/contextmenu.h> | ||
53 | #include <qpe/qcopenvelope_qws.h> | ||
54 | #include <qpe/resource.h> | ||
55 | //#include <qtopia/services.h> | ||
56 | #include <qpe/categories.h> | ||
57 | #include <qpe/qpetoolbar.h> | ||
58 | #include <qpe/global.h> | ||
59 | |||
60 | #include <qaction.h> | ||
61 | #include <qlabel.h> | ||
62 | #include <qtoolbutton.h> | ||
63 | #include <qpushbutton.h> | ||
64 | #include <qgroupbox.h> | ||
65 | #include <qsignalmapper.h> | ||
66 | #include <qdir.h> | ||
67 | #include <qimage.h> | ||
68 | #include <qslider.h> | ||
69 | #include <qtimer.h> | ||
70 | #include <qmessagebox.h> | ||
71 | |||
72 | #include <stdlib.h> | ||
73 | |||
74 | #include <sys/types.h> | ||
75 | #include <sys/stat.h> | ||
76 | |||
77 | static const int thmarg = 2; | ||
78 | static const bool video_supported = FALSE; | ||
79 | |||
80 | CameraMainWindow::CameraMainWindow(QWidget * parent, const char *name, WFlags f) | ||
81 | :QMainWindow(parent, name, f) | ||
82 | { | ||
83 | setCaption(tr("Camera")); | ||
84 | |||
85 | picfile = Global::tempDir() + "image.jpg"; | ||
86 | camera = new CameraBase(this); | ||
87 | setCentralWidget(camera); | ||
88 | |||
89 | connect(qApp, SIGNAL(appMessage(const QCString &, const QByteArray &)), | ||
90 | this, SLOT(appMessage(const QCString &, const QByteArray &))); | ||
91 | connect(qApp, SIGNAL(linkChanged(const QString &)), this, SLOT(linkChanged(const QString &))); | ||
92 | |||
93 | Categories cats; | ||
94 | cats.load(categoryFileName()); | ||
95 | camcat = cats.id("Document View", "_Camera"); // No tr | ||
96 | if (!camcat) { | ||
97 | camcat = cats.addCategory("Document View", "_Camera"); // No tr | ||
98 | cats.save(categoryFileName()); | ||
99 | } | ||
100 | |||
101 | camera->photo->setFocus(); | ||
102 | |||
103 | connect(camera->photo, SIGNAL(clicked()), this, SLOT(takePhoto())); | ||
104 | connect(camera->video, SIGNAL(clicked()), this, SLOT(toggleVideo())); | ||
105 | |||
106 | refocusTimer = new QTimer(this); | ||
107 | connect(refocusTimer, SIGNAL(timeout()), this, SLOT(takePhotoNow())); | ||
108 | |||
109 | thumb[0] = camera->thumb1; | ||
110 | thumb[1] = camera->thumb2; | ||
111 | thumb[2] = camera->thumb3; | ||
112 | thumb[3] = camera->thumb4; | ||
113 | thumb[4] = camera->thumb5; | ||
114 | cur_thumb = -1; | ||
115 | |||
116 | QSignalMapper *sm = new QSignalMapper(this); | ||
117 | for (int i = 0; i < nthumb; i++) { | ||
118 | sm->setMapping(thumb[i], i); | ||
119 | connect(thumb[i], SIGNAL(clicked()), sm, SLOT(map())); | ||
120 | thumb[i]->installEventFilter(this); | ||
121 | } | ||
122 | connect(sm, SIGNAL(mapped(int)), this, SLOT(thumbClicked(int))); | ||
123 | |||
124 | #warning fixme | ||
125 | // AppLnk picture_viewer = Service::appLnk("PhotoEdit"); | ||
126 | // AppLnk video_viewer = Service::appLnk("Open/video/mpeg"); | ||
127 | |||
128 | a_pview = new QAction(tr("%1...", "app name").arg("" /*picture_viewer.name() */ ), | ||
129 | Resource::loadPixmap(NULL /*picture_viewer.icon() */ ), QString::null, 0, | ||
130 | this, 0); | ||
131 | connect(a_pview, SIGNAL(activated()), this, SLOT(viewPictures())); | ||
132 | a_vview = new QAction(tr("%1...", "app name").arg("" /*video_viewer.name() */ ), | ||
133 | Resource::loadIconSet(NULL /*video_viewer.icon() */ ), QString::null, 0, | ||
134 | this, 0); | ||
135 | connect(a_vview, SIGNAL(activated()), this, SLOT(viewVideos())); | ||
136 | |||
137 | a_settings = | ||
138 | new QAction(tr("Settings..."), Opie::Core::OResource::loadPixmap("camera2/settings", Opie::Core::OResource::SmallIcon), | ||
139 | QString::null, 0, this, 0); | ||
140 | connect(a_settings, SIGNAL(activated()), this, SLOT(doSettings())); | ||
141 | |||
142 | a_th_edit = new QAction(tr("Edit"), Opie::Core::OResource::loadPixmap("edit", Opie::Core::OResource::SmallIcon), | ||
143 | QString::null, 0, this, 0); | ||
144 | connect(a_th_edit, SIGNAL(activated()), this, SLOT(editThumb())); | ||
145 | a_th_del = new QAction(tr("Delete"), Opie::Core::OResource::loadPixmap("trash", Opie::Core::OResource::SmallIcon), | ||
146 | QString::null, 0, this, 0); | ||
147 | connect(a_th_del, SIGNAL(activated()), this, SLOT(delThumb())); | ||
148 | a_th_add = | ||
149 | new QAction(tr("Move to Contact..."), Opie::Core::OResource::loadPixmap("addressbook/generic-contact", Opie::Core::OResource::SmallIcon), | ||
150 | QString::null, 0, this, 0); | ||
151 | connect(a_th_add, SIGNAL(activated()), this, SLOT(moveToContact())); | ||
152 | a_send = | ||
153 | new QAction(tr("Beam to Contact..."), Opie::Core::OResource::loadPixmap("beam", Opie::Core::OResource::SmallIcon), | ||
154 | QString::null, 0, this, 0); | ||
155 | connect(a_send, SIGNAL(activated()), this, SLOT(sendFile())); | ||
156 | |||
157 | |||
158 | #ifndef QTOPIA_PHONE | ||
159 | // Create Toolbars | ||
160 | QPEToolBar *bar = new QPEToolBar(this); | ||
161 | bar->setHorizontalStretchable(TRUE); | ||
162 | setToolBarsMovable(FALSE); | ||
163 | |||
164 | a_pview->addTo(bar); | ||
165 | if (video_supported) | ||
166 | a_vview->addTo(bar); | ||
167 | a_th_edit->addTo(bar); | ||
168 | a_th_del->addTo(bar); | ||
169 | a_th_add->addTo(bar); | ||
170 | a_send->addTo(bar); | ||
171 | a_settings->addTo(bar); | ||
172 | #else | ||
173 | ContextMenu *contextMenu = new ContextMenu(this); | ||
174 | a_pview->addTo(contextMenu); | ||
175 | if (video_supported) | ||
176 | a_vview->addTo(contextMenu); | ||
177 | a_th_edit->addTo(contextMenu); | ||
178 | a_th_del->addTo(contextMenu); | ||
179 | a_th_add->addTo(contextMenu); | ||
180 | a_send->addTo(contextMenu); | ||
181 | a_settings->addTo(contextMenu); | ||
182 | #endif | ||
183 | |||
184 | installEventFilter(camera->photo); | ||
185 | installEventFilter(camera->video); | ||
186 | camera->photo->installEventFilter(this); | ||
187 | camera->video->installEventFilter(this); | ||
188 | |||
189 | // Load the allowable sizes from the camera hardware. | ||
190 | photo_size = camera->videocaptureview->photoSizes(); | ||
191 | video_size = camera->videocaptureview->videoSizes(); | ||
192 | |||
193 | settings = new CameraSettings(this, 0, TRUE); | ||
194 | // load settings from config | ||
195 | Config cfg("Camera"); | ||
196 | cfg.setGroup("General"); | ||
197 | QString l = cfg.readEntry("location"); | ||
198 | |||
199 | #warning fixme | ||
200 | /*if ( !l.isEmpty() ) | ||
201 | settings->location->setLocation(l); | ||
202 | */ | ||
203 | |||
204 | storagepath = settings->location->documentPath(); | ||
205 | cfg.setGroup("Photo"); | ||
206 | int w; | ||
207 | w = cfg.readNumEntry("width", camera->videocaptureview->recommendedPhotoSize().width()); | ||
208 | for (psize = 0; psize < (int) photo_size.count() - 1 && photo_size[psize].width() > w;) | ||
209 | psize++; | ||
210 | pquality = cfg.readNumEntry("quality", settings->photo_quality->value()); | ||
211 | cfg.setGroup("Video"); | ||
212 | w = cfg.readNumEntry("width", camera->videocaptureview->recommendedVideoSize().width()); | ||
213 | for (vsize = 0; vsize < (int) video_size.count() - 1 && video_size[vsize].width() > w;) | ||
214 | vsize++; | ||
215 | vquality = cfg.readNumEntry("quality", settings->video_quality->value()); | ||
216 | vframerate = cfg.readNumEntry("framerate", settings->video_framerate->value()); | ||
217 | |||
218 | for (int i = 0; i < (int) photo_size.count(); i++) { | ||
219 | settings->photo_size->insertItem(tr("%1 x %2").arg(photo_size[i].width()). | ||
220 | arg(photo_size[i].height())); | ||
221 | } | ||
222 | for (int i = 0; i < (int) video_size.count(); i++) { | ||
223 | settings->video_size->insertItem(tr("%1 x %2").arg(video_size[i].width()). | ||
224 | arg(video_size[i].height())); | ||
225 | } | ||
226 | |||
227 | namehint = 0; | ||
228 | recording = FALSE; | ||
229 | |||
230 | preview(); | ||
231 | |||
232 | if (!video_supported) { | ||
233 | // Room for longer text | ||
234 | camera->photo->setText(tr("Take Photo")); | ||
235 | camera->video->setEnabled(FALSE); | ||
236 | camera->video->hide(); | ||
237 | } | ||
238 | } | ||
239 | |||
240 | CameraMainWindow::~CameraMainWindow() | ||
241 | { | ||
242 | } | ||
243 | |||
244 | void CameraMainWindow::resizeEvent(QResizeEvent *) | ||
245 | { | ||
246 | thumbw = width() / 5 - 4; | ||
247 | thumbh = thumbw * 3 / 4; | ||
248 | thumb[0]->setFixedHeight(thumbh + thmarg * 2); | ||
249 | loadThumbs(); | ||
250 | } | ||
251 | |||
252 | bool CameraMainWindow::event(QEvent * e) | ||
253 | { | ||
254 | if (e->type() == QEvent::WindowActivate) { | ||
255 | if (cur_thumb < 0) | ||
256 | camera->videocaptureview->setLive(); | ||
257 | } | ||
258 | else if (e->type() == QEvent::WindowDeactivate) { | ||
259 | camera->videocaptureview->setLive(-1); | ||
260 | } | ||
261 | return QMainWindow::event(e); | ||
262 | } | ||
263 | |||
264 | bool CameraMainWindow::eventFilter(QObject * o, QEvent * e) | ||
265 | { | ||
266 | if (e->type() == QEvent::KeyPress) { | ||
267 | QKeyEvent *ke = (QKeyEvent *) e; | ||
268 | |||
269 | #if QTOPIA_PHONE | ||
270 | if (!ke->isAutoRepeat()) { | ||
271 | if (ke->key() == Key_1) { | ||
272 | takePhoto(); | ||
273 | return TRUE; | ||
274 | } | ||
275 | else if (ke->key() == Key_2) { | ||
276 | toggleVideo(); | ||
277 | return TRUE; | ||
278 | } | ||
279 | } | ||
280 | #endif | ||
281 | if (ke->key() == Key_Up) { | ||
282 | camera->photo->setFocus(); | ||
283 | return TRUE; | ||
284 | } | ||
285 | else if (ke->key() == Key_Down) { | ||
286 | thumb[0]->setFocus(); | ||
287 | return TRUE; | ||
288 | } | ||
289 | else if (ke->key() == Key_Left) { | ||
290 | if (o == camera->video) { | ||
291 | camera->photo->setFocus(); | ||
292 | return TRUE; | ||
293 | } | ||
294 | else { | ||
295 | if (o == thumb[0]) | ||
296 | return TRUE; | ||
297 | for (int i = 1; i < nthumb; ++i) { | ||
298 | if (o == thumb[i]) { | ||
299 | thumb[i - 1]->setFocus(); | ||
300 | return TRUE; | ||
301 | } | ||
302 | } | ||
303 | } | ||
304 | } | ||
305 | else if (ke->key() == Key_Right) { | ||
306 | if (o == camera->photo) { | ||
307 | camera->video->setFocus(); | ||
308 | return TRUE; | ||
309 | } | ||
310 | else { | ||
311 | if (o == thumb[nthumb - 1]) | ||
312 | return TRUE; | ||
313 | for (int i = 0; i < nthumb - 1; ++i) { | ||
314 | if (o == thumb[i]) { | ||
315 | thumb[i + 1]->setFocus(); | ||
316 | return TRUE; | ||
317 | } | ||
318 | } | ||
319 | } | ||
320 | } | ||
321 | } | ||
322 | else if (e->type() == QEvent::FocusIn) { | ||
323 | if (o == camera->photo) | ||
324 | camera->photo->setText(tr("Take Photo")); | ||
325 | updateActions(); | ||
326 | } | ||
327 | else if (e->type() == QEvent::FocusOut) { | ||
328 | if (o == camera->photo) | ||
329 | camera->photo->setText(tr("Activate Camera")); | ||
330 | } | ||
331 | return QWidget::eventFilter(o, e); | ||
332 | } | ||
333 | |||
334 | void CameraMainWindow::updateActions() | ||
335 | { | ||
336 | bool p = FALSE, v = FALSE; | ||
337 | QWidget *foc = focusWidget(); | ||
338 | if (foc == camera->photo) { | ||
339 | p = TRUE; | ||
340 | v = FALSE; | ||
341 | } | ||
342 | else if (foc == camera->video) { | ||
343 | v = TRUE; | ||
344 | p = FALSE; | ||
345 | } | ||
346 | a_pview->setEnabled(p); | ||
347 | a_vview->setEnabled(v); | ||
348 | a_settings->setEnabled(p || v); | ||
349 | bool th = !p && !v; | ||
350 | if (th) { | ||
351 | int i; | ||
352 | for (i = 0; i < nthumb; i++) { | ||
353 | if (thumb[i] == foc) { | ||
354 | selectThumb(i); | ||
355 | break; | ||
356 | } | ||
357 | } | ||
358 | if (i == nthumb || !thumb[i]->pixmap()) | ||
359 | th = FALSE; | ||
360 | } | ||
361 | else { | ||
362 | selectThumb(-1); | ||
363 | } | ||
364 | } | ||
365 | |||
366 | void CameraMainWindow::viewPictures() | ||
367 | { | ||
368 | #warning fixme | ||
369 | // ServiceRequest req("PhotoEdit","showCategory(int)"); | ||
370 | // req << camcat; | ||
371 | // req.send(); | ||
372 | } | ||
373 | |||
374 | void CameraMainWindow::viewVideos() | ||
375 | { | ||
376 | #warning fixme | ||
377 | // Service::appLnk("Open/video/mpeg").execute(); | ||
378 | } | ||
379 | |||
380 | void CameraMainWindow::doSettings() | ||
381 | { | ||
382 | bool v = video_supported; | ||
383 | #ifdef QTOPIA_PHONE | ||
384 | bool p; | ||
385 | p = a_pview->isEnabled(); | ||
386 | v = v && a_vview->isEnabled(); | ||
387 | if (p) | ||
388 | settings->photo->show(); | ||
389 | else | ||
390 | settings->photo->hide(); | ||
391 | #endif | ||
392 | if (v) | ||
393 | settings->video->show(); | ||
394 | else | ||
395 | settings->video->hide(); | ||
396 | settings->photo_size->setCurrentItem(psize); | ||
397 | settings->video_size->setCurrentItem(vsize); | ||
398 | settings->photo_quality->setValue(pquality); | ||
399 | settings->video_quality->setValue(vquality); | ||
400 | settings->video_framerate->setValue(vframerate); | ||
401 | settings->video_quality_n->setFixedWidth(fontMetrics().width("100")); | ||
402 | settings->photo_quality_n->setFixedWidth(fontMetrics().width("100")); | ||
403 | |||
404 | if (QPEApplication::execDialog(settings)) { | ||
405 | confirmSettings(); | ||
406 | } | ||
407 | else { | ||
408 | #warning fixme | ||
409 | // settings->location->setLocation(storagepath); | ||
410 | } | ||
411 | } | ||
412 | |||
413 | void CameraMainWindow::confirmSettings() | ||
414 | { | ||
415 | storagepath = settings->location->documentPath(); | ||
416 | psize = settings->photo_size->currentItem(); | ||
417 | vsize = settings->video_size->currentItem(); | ||
418 | pquality = settings->photo_quality->value(); | ||
419 | vquality = settings->video_quality->value(); | ||
420 | vframerate = settings->video_framerate->value(); | ||
421 | |||
422 | // save settings | ||
423 | Config cfg("Camera"); | ||
424 | cfg.setGroup("General"); | ||
425 | cfg.writeEntry("location", storagepath); | ||
426 | cfg.setGroup("Photo"); | ||
427 | cfg.writeEntry("width", photo_size[psize].width()); | ||
428 | cfg.writeEntry("quality", pquality); | ||
429 | cfg.setGroup("Video"); | ||
430 | cfg.writeEntry("width", video_size[vsize].width()); | ||
431 | cfg.writeEntry("quality", vquality); | ||
432 | cfg.writeEntry("framerate", vframerate); | ||
433 | |||
434 | loadThumbs(); | ||
435 | |||
436 | preview(); | ||
437 | } | ||
438 | |||
439 | static int cmpDocLnk(const void *a, const void *b) | ||
440 | { | ||
441 | const DocLnk *la = *(const DocLnk **) a; | ||
442 | const DocLnk *lb = *(const DocLnk **) b; | ||
443 | QFileInfo fa(la->linkFileKnown()? la->linkFile() : la->file()); | ||
444 | QFileInfo fb(lb->linkFileKnown()? lb->linkFile() : lb->file()); | ||
445 | return fa.lastModified().secsTo(fb.lastModified()); | ||
446 | } | ||
447 | |||
448 | void CameraMainWindow::loadThumbs() | ||
449 | { | ||
450 | if (storagepath.isEmpty()) { | ||
451 | updateActions(); | ||
452 | return; | ||
453 | } | ||
454 | |||
455 | DocLnkSet set(storagepath, "image/jpeg"); | ||
456 | const QList < DocLnk > &l = set.children(); | ||
457 | |||
458 | DocLnk *lnk; | ||
459 | DocLnk **array = new DocLnk *[l.count()]; | ||
460 | int n = 0; | ||
461 | for (QListIterator < DocLnk > it(l); (lnk = it.current()); ++it) { | ||
462 | if (lnk->categories().contains(camcat)) | ||
463 | array[n++] = lnk; | ||
464 | } | ||
465 | qsort(array, n, sizeof(array[0]), cmpDocLnk); | ||
466 | for (int i = 0; i < nthumb; i++) { | ||
467 | QPixmap pm; | ||
468 | if (i < n) { | ||
469 | picturefile[i] = *array[i]; | ||
470 | QImage img = Image::loadScaled(picturefile[i].file(), thumbw, thumbh); | ||
471 | pm.convertFromImage(img); | ||
472 | } | ||
473 | if (pm.isNull()) { | ||
474 | thumb[i]->setText(""); | ||
475 | } | ||
476 | else { | ||
477 | thumb[i]->setPixmap(pm); | ||
478 | } | ||
479 | thumb[i]->setEnabled(!pm.isNull()); | ||
480 | } | ||
481 | if (cur_thumb >= 0) | ||
482 | selectThumb(cur_thumb); | ||
483 | |||
484 | if (!camera->videocaptureview->available()) { | ||
485 | camera->photo->setEnabled(FALSE); | ||
486 | camera->video->setEnabled(FALSE); | ||
487 | if (!n) { | ||
488 | thumb[0]->setEnabled(FALSE); | ||
489 | } | ||
490 | else { | ||
491 | thumb[0]->setFocus(); | ||
492 | thumb[0]->setEnabled(TRUE); | ||
493 | } | ||
494 | } | ||
495 | |||
496 | updateActions(); | ||
497 | } | ||
498 | |||
499 | void CameraMainWindow::delThumb(int th) | ||
500 | { | ||
501 | switch (QMessageBox::warning(0, tr("Confirmation"), | ||
502 | tr("<qt>Delete '%1'?</qt>", | ||
503 | "%1 = file name").arg(picturefile[th].name()), QMessageBox::Yes, | ||
504 | QMessageBox::No)) { | ||
505 | case QMessageBox::Yes: | ||
506 | picturefile[th].removeFiles(); | ||
507 | |||
508 | // Rhys Hack - if we have just deleted the last image and there | ||
509 | // is no camera connected, then exit the application. This | ||
510 | // avoids a focus problem where it is impossible to exit with | ||
511 | // the back button due to the focus being in a stupid place. | ||
512 | loadThumbs(); | ||
513 | if (!camera->videocaptureview->available() && !(thumb[0]->isEnabled())) { | ||
514 | close(); | ||
515 | } | ||
516 | break; | ||
517 | default: | ||
518 | //nothing | ||
519 | break; | ||
520 | } | ||
521 | } | ||
522 | |||
523 | void CameraMainWindow::pushThumb(const DocLnk & f, const QImage & img) | ||
524 | { | ||
525 | for (int i = nthumb; --i;) { | ||
526 | bool en = thumb[i - 1]->isEnabled(); | ||
527 | thumb[i]->setEnabled(en); | ||
528 | picturefile[i] = picturefile[i - 1]; | ||
529 | const QPixmap *pm = thumb[i - 1]->pixmap(); | ||
530 | if (en && pm) { | ||
531 | thumb[i]->setPixmap(*pm); | ||
532 | } | ||
533 | else { | ||
534 | thumb[i]->setText(""); | ||
535 | } | ||
536 | } | ||
537 | QPixmap pm; | ||
538 | QSize sz = Image::aspectScaleSize(img.width(), img.height(), thumbw, thumbh); | ||
539 | QImage simg = img.smoothScale(sz.width(), sz.height()); | ||
540 | pm.convertFromImage(simg); | ||
541 | thumb[0]->setPixmap(pm); | ||
542 | thumb[0]->setEnabled(TRUE); | ||
543 | picturefile[0] = f; | ||
544 | } | ||
545 | |||
546 | void CameraMainWindow::takePhoto() | ||
547 | { | ||
548 | if (camera->photo != focusWidget()) { | ||
549 | camera->photo->setFocus(); | ||
550 | return; | ||
551 | } | ||
552 | QSize size = photo_size[psize]; | ||
553 | if (size == camera->videocaptureview->captureSize() || | ||
554 | camera->videocaptureview->refocusDelay() == 0) { | ||
555 | |||
556 | // We can grab the current image immediately. | ||
557 | takePhotoNow(); | ||
558 | |||
559 | } | ||
560 | else { | ||
561 | |||
562 | // Change the camera size and then wait for the camera to refocus. | ||
563 | camera->videocaptureview->setCaptureSize(size); | ||
564 | refocusTimer->start(camera->videocaptureview->refocusDelay(), TRUE); | ||
565 | |||
566 | } | ||
567 | } | ||
568 | |||
569 | void CameraMainWindow::takePhotoNow() | ||
570 | { | ||
571 | QImage img = camera->videocaptureview->image(); | ||
572 | |||
573 | if (inSnapMode()) { | ||
574 | QCopEnvelope e(snap_ch, "valueSupplied(QString,QImage)"); | ||
575 | QSize s = Image::aspectScaleSize(img.width(), img.height(), snap_maxw, snap_maxh); | ||
576 | e << snap_id << img.smoothScale(s.width(), s.height()); | ||
577 | setSnapMode(FALSE); | ||
578 | close(); | ||
579 | } | ||
580 | else { | ||
581 | DocLnk f; | ||
582 | //f.setLocation(storagepath); | ||
583 | f.setType("image/jpeg"); | ||
584 | QDateTime dt = QDateTime::currentDateTime(); | ||
585 | QString date = dt.toString(); | ||
586 | f.setName(tr("Photo, " + date)); | ||
587 | |||
588 | QArray < int >c(1); | ||
589 | c[0] = camcat; | ||
590 | f.setCategories(c); | ||
591 | img.save(f.file(), "JPEG", pquality); // Save the image in its original size. | ||
592 | f.writeLink(); | ||
593 | pushThumb(f, img); | ||
594 | } | ||
595 | |||
596 | preview(); | ||
597 | } | ||
598 | |||
599 | bool CameraMainWindow::inSnapMode() const | ||
600 | { | ||
601 | return !snap_ch.isEmpty(); | ||
602 | } | ||
603 | |||
604 | void CameraMainWindow::setSnapMode(bool y) | ||
605 | { | ||
606 | if (y) { | ||
607 | camera->thumbs->hide(); | ||
608 | camera->video->hide(); | ||
609 | } | ||
610 | else { | ||
611 | camera->thumbs->show(); | ||
612 | if (video_supported) | ||
613 | camera->video->show(); | ||
614 | else | ||
615 | camera->video->hide(); | ||
616 | snap_ch = QString::null; | ||
617 | } | ||
618 | } | ||
619 | |||
620 | void CameraMainWindow::toggleVideo() | ||
621 | { | ||
622 | if (recording) | ||
623 | stopVideo(); | ||
624 | else | ||
625 | startVideo(); | ||
626 | recording = !recording; | ||
627 | camera->video->setText(recording ? tr("Stop") : tr("Video")); | ||
628 | camera->photo->setEnabled(!recording); | ||
629 | for (int i = 0; i < nthumb; i++) | ||
630 | thumb[i]->setEnabled(!recording && thumb[i]->pixmap()); | ||
631 | } | ||
632 | |||
633 | void CameraMainWindow::startVideo() | ||
634 | { | ||
635 | // XXX eg. MJPG | ||
636 | } | ||
637 | void CameraMainWindow::stopVideo() | ||
638 | { | ||
639 | } | ||
640 | |||
641 | void CameraMainWindow::thumbClicked(int i) | ||
642 | { | ||
643 | selectThumb(i); | ||
644 | } | ||
645 | |||
646 | void CameraMainWindow::editThumb() | ||
647 | { | ||
648 | picturefile[cur_thumb].execute(); | ||
649 | } | ||
650 | |||
651 | void CameraMainWindow::selectThumb(int i) | ||
652 | { | ||
653 | cur_thumb = i; | ||
654 | if (i >= 0) { | ||
655 | QImage img(picturefile[i].file()); | ||
656 | camera->videocaptureview->setStill(img); | ||
657 | thumb[i]->setFocus(); | ||
658 | } | ||
659 | else { | ||
660 | camera->videocaptureview->setLive(); | ||
661 | } | ||
662 | a_th_edit->setEnabled(i >= 0); | ||
663 | a_th_del->setEnabled(i >= 0); | ||
664 | a_th_add->setEnabled(i >= 0); | ||
665 | a_send->setEnabled(i >= 0); | ||
666 | } | ||
667 | |||
668 | void CameraMainWindow::moveToContact() | ||
669 | { | ||
670 | if (cur_thumb >= 0) { | ||
671 | #warning fixme | ||
672 | // QCopEnvelope e(Service::channel("Contacts"),"setContactImage(QImage)"); | ||
673 | // QImage img; | ||
674 | // img.load(picturefile[cur_thumb].file()); | ||
675 | // e << img; | ||
676 | } | ||
677 | } | ||
678 | |||
679 | void CameraMainWindow::delThumb() | ||
680 | { | ||
681 | if (cur_thumb >= 0) { | ||
682 | int d = cur_thumb; | ||
683 | if (cur_thumb > 0) | ||
684 | selectThumb(cur_thumb - 1); | ||
685 | delThumb(d); | ||
686 | } | ||
687 | } | ||
688 | |||
689 | void CameraMainWindow::linkChanged(const QString &) | ||
690 | { | ||
691 | loadThumbs(); | ||
692 | } | ||
693 | |||
694 | void CameraMainWindow::appMessage(const QCString & msg, const QByteArray & data) | ||
695 | { | ||
696 | if (msg == "getImage(QCString,QString,int,int,QImage)") { | ||
697 | QDataStream ds(data, IO_ReadOnly); | ||
698 | ds >> snap_ch >> snap_id >> snap_maxw >> snap_maxh; | ||
699 | setSnapMode(TRUE); | ||
700 | QPEApplication::setKeepRunning(); | ||
701 | } | ||
702 | } | ||
703 | |||
704 | void CameraMainWindow::preview() | ||
705 | { | ||
706 | if (camera->videocaptureview->refocusDelay() > 200) { | ||
707 | camera->videocaptureview->setCaptureSize(photo_size[psize]); | ||
708 | } | ||
709 | else { | ||
710 | camera->videocaptureview->setCaptureSize(camera->videocaptureview-> | ||
711 | recommendedPreviewSize()); | ||
712 | } | ||
713 | } | ||
714 | |||
715 | void CameraMainWindow::sendFile() | ||
716 | { | ||
717 | if (cur_thumb >= 0) { | ||
718 | //copy file | ||
719 | QFile input(picturefile[cur_thumb].file()); | ||
720 | if (!input.open(IO_ReadOnly)) { | ||
721 | return; //error | ||
722 | } | ||
723 | QFile output(picfile); | ||
724 | if (!output.open(IO_WriteOnly)) { | ||
725 | return; | ||
726 | } | ||
727 | |||
728 | const int BUFFER_SIZE = 1024; | ||
729 | Q_INT8 buffer[BUFFER_SIZE]; | ||
730 | |||
731 | QDataStream srcStr(&input); | ||
732 | QDataStream destStr(&output); | ||
733 | |||
734 | while (!srcStr.atEnd()) { | ||
735 | int i = 0; | ||
736 | while (!srcStr.atEnd() && i < BUFFER_SIZE) { | ||
737 | srcStr >> buffer[i]; | ||
738 | i++; | ||
739 | } | ||
740 | for (int k = 0; k < i; k++) { | ||
741 | destStr << buffer[k]; | ||
742 | } | ||
743 | } | ||
744 | |||
745 | #warning fixme | ||
746 | // QCopEnvelope e(Service::channel("Email"),"writeMessage(QString,QString,QStringList,QStringList)"); | ||
747 | // e << QString() << QString() << QStringList() << QStringList( QString( picfile ) ); | ||
748 | } | ||
749 | } | ||
750 | |||
751 | void ThumbButton::drawButtonLabel(QPainter * p) | ||
752 | { | ||
753 | const QPixmap *pm = pixmap(); | ||
754 | if (pm) { | ||
755 | QSize s = (size() - pm->size()) / 2; | ||
756 | p->drawPixmap(s.width(), s.height(), *pm); | ||
757 | } | ||
758 | } | ||
759 | |||
760 | ThumbButton::ThumbButton(QWidget * parent, const char *name):QToolButton(parent, name) | ||
761 | { | ||
762 | } | ||
763 | |||
diff --git a/noncore/multimedia/camera2/mainwindow.h b/noncore/multimedia/camera2/mainwindow.h new file mode 100644 index 0000000..d6c5a7e --- a/dev/null +++ b/noncore/multimedia/camera2/mainwindow.h | |||
@@ -0,0 +1,132 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | #ifndef MAINWINDOW_H | ||
36 | #define MAINWINDOW_H | ||
37 | |||
38 | #include "camerabase.h" | ||
39 | #include <qvaluelist.h> | ||
40 | #include <qmainwindow.h> | ||
41 | #include <qpe/applnk.h> | ||
42 | |||
43 | class LocationCombo; | ||
44 | class QAction; | ||
45 | class QTimer; | ||
46 | class CameraSettings; | ||
47 | |||
48 | |||
49 | class CameraMainWindow : public QMainWindow | ||
50 | { | ||
51 | Q_OBJECT | ||
52 | public: | ||
53 | static QString appName() { return QString::fromLatin1("camera2"); } | ||
54 | |||
55 | CameraMainWindow( QWidget *parent=0, const char *name=0, WFlags fl=0 ); | ||
56 | ~CameraMainWindow(); | ||
57 | |||
58 | public slots: | ||
59 | void takePhoto(); | ||
60 | void toggleVideo(); | ||
61 | void selectThumb(int i); | ||
62 | void thumbClicked(int i); | ||
63 | |||
64 | private slots: | ||
65 | void viewPictures(); | ||
66 | void viewVideos(); | ||
67 | void doSettings(); | ||
68 | void appMessage(const QCString& msg, const QByteArray& data); | ||
69 | void editThumb(); | ||
70 | void delThumb(); | ||
71 | void moveToContact(); | ||
72 | void takePhotoNow(); | ||
73 | void sendFile(); | ||
74 | void linkChanged(const QString&); | ||
75 | |||
76 | private: | ||
77 | bool event(QEvent* e); | ||
78 | void updateActions(); | ||
79 | void resizeEvent(QResizeEvent*); | ||
80 | |||
81 | bool eventFilter(QObject*, QEvent*); | ||
82 | QString nextFileName(); | ||
83 | void loadThumbs(); | ||
84 | void pushThumb(const DocLnk& f, const QImage& img); | ||
85 | static const int nthumb = 5; | ||
86 | QToolButton* thumb[nthumb]; | ||
87 | DocLnk picturefile[nthumb]; | ||
88 | int cur_thumb; | ||
89 | void delThumb(int th); | ||
90 | |||
91 | // Settings | ||
92 | void confirmSettings(); | ||
93 | CameraSettings *settings; | ||
94 | QString storagepath; | ||
95 | int thumbw; | ||
96 | int thumbh; | ||
97 | int psize; | ||
98 | int vsize; | ||
99 | int pquality; | ||
100 | int vquality; | ||
101 | int vframerate; | ||
102 | |||
103 | // Snap | ||
104 | QCString snap_ch; | ||
105 | QString snap_id; | ||
106 | int snap_maxw, snap_maxh; | ||
107 | bool inSnapMode() const; | ||
108 | void setSnapMode(bool); | ||
109 | |||
110 | CameraBase *camera; | ||
111 | |||
112 | int namehint; | ||
113 | QAction *a_pview, *a_vview, *a_settings; | ||
114 | QAction *a_th_edit, *a_th_del, *a_th_add; | ||
115 | QAction *a_send; | ||
116 | QValueList<QSize> photo_size; | ||
117 | QValueList<QSize> video_size; | ||
118 | |||
119 | QTimer *refocusTimer; | ||
120 | QString picfile; | ||
121 | |||
122 | bool recording; | ||
123 | void stopVideo(); | ||
124 | void startVideo(); | ||
125 | |||
126 | void preview(); | ||
127 | |||
128 | int camcat; | ||
129 | }; | ||
130 | |||
131 | #endif | ||
132 | |||
diff --git a/noncore/multimedia/camera2/opie-camera2.control b/noncore/multimedia/camera2/opie-camera2.control new file mode 100644 index 0000000..a2d0700 --- a/dev/null +++ b/noncore/multimedia/camera2/opie-camera2.control | |||
@@ -0,0 +1,10 @@ | |||
1 | Package: opie-camera2 | ||
2 | Files: bin/camerapics/camera2 apps/Applications/camera2.desktop | ||
3 | Priority: optional | ||
4 | Section: opie/multimedia | ||
5 | Maintainer: Lorn "ljp" Potter <lorn.potter@trolltech.com> | ||
6 | Architecture: arm | ||
7 | Version: 1.0.1$EXTRAVERSION | ||
8 | Depends: libqpe1, libopiecore2, libopieui2 | ||
9 | Description: A Camera Application | ||
10 | A Camera Application to use with Video4Linux. | ||
diff --git a/noncore/multimedia/camera2/thumbbutton.h b/noncore/multimedia/camera2/thumbbutton.h new file mode 100644 index 0000000..f7ca3b4 --- a/dev/null +++ b/noncore/multimedia/camera2/thumbbutton.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | #ifndef THUMBBUTTON_H | ||
36 | #define THUMBBUTTON_H | ||
37 | |||
38 | #include <qtoolbutton.h> | ||
39 | |||
40 | class ThumbButton : public QToolButton | ||
41 | { | ||
42 | Q_OBJECT | ||
43 | public: | ||
44 | ThumbButton( QWidget *parent, const char* name ); | ||
45 | |||
46 | void drawButtonLabel( QPainter * ); | ||
47 | }; | ||
48 | |||
49 | #endif | ||
50 | |||
diff --git a/noncore/multimedia/camera2/videocaptureview.cpp b/noncore/multimedia/camera2/videocaptureview.cpp new file mode 100644 index 0000000..410634a --- a/dev/null +++ b/noncore/multimedia/camera2/videocaptureview.cpp | |||
@@ -0,0 +1,599 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #include "videocaptureview.h" | ||
37 | #include <qimage.h> | ||
38 | #include <qpainter.h> | ||
39 | #ifdef Q_WS_QWS | ||
40 | #include <qgfx_qws.h> | ||
41 | #include <qdirectpainter_qws.h> | ||
42 | #endif | ||
43 | |||
44 | #ifdef __linux__ | ||
45 | #defineHAVE_VIDEO4LINUX 1 | ||
46 | #endif | ||
47 | |||
48 | #ifdef HAVE_VIDEO4LINUX | ||
49 | |||
50 | #include <sys/types.h> | ||
51 | #include <sys/ioctl.h> | ||
52 | #include <unistd.h> | ||
53 | #include <fcntl.h> | ||
54 | #include <linux/videodev.h> | ||
55 | #include <errno.h> | ||
56 | #include <string.h> | ||
57 | #include <stdlib.h> | ||
58 | #include <sys/mman.h> | ||
59 | |||
60 | #endif /* HAVE_VIDEO4LINUX */ | ||
61 | |||
62 | class VideoCapture { | ||
63 | public: | ||
64 | VideoCapture(); | ||
65 | ~VideoCapture(); | ||
66 | |||
67 | bool hasCamera() const; | ||
68 | void getCameraImage(QImage & img, bool copy = FALSE); | ||
69 | |||
70 | QValueList < QSize > photoSizes() const; | ||
71 | QValueList < QSize > videoSizes() const; | ||
72 | |||
73 | QSize recommendedPhotoSize() const; | ||
74 | QSize recommendedVideoSize() const; | ||
75 | QSize recommendedPreviewSize() const; | ||
76 | |||
77 | QSize captureSize() const; | ||
78 | void setCaptureSize(QSize size); | ||
79 | |||
80 | uint refocusDelay() const; | ||
81 | int minimumFramePeriod() const; | ||
82 | |||
83 | private: | ||
84 | #ifdef HAVE_VIDEO4LINUX | ||
85 | int fd; | ||
86 | int width, height; | ||
87 | struct video_capability caps; | ||
88 | struct video_mbuf mbuf; | ||
89 | unsigned char *frames; | ||
90 | int currentFrame; | ||
91 | |||
92 | void setupCamera(QSize size); | ||
93 | void shutdown(); | ||
94 | #endif | ||
95 | }; | ||
96 | |||
97 | #ifdef HAVE_VIDEO4LINUX | ||
98 | |||
99 | #define VIDEO_DEVICE "/dev/video" | ||
100 | |||
101 | bool VideoCapture::hasCamera() const | ||
102 | { | ||
103 | return (fd != -1); | ||
104 | } | ||
105 | |||
106 | QSize VideoCapture::captureSize() const | ||
107 | { | ||
108 | return QSize(width, height); | ||
109 | } | ||
110 | |||
111 | uint VideoCapture::refocusDelay() const | ||
112 | { | ||
113 | return 250; | ||
114 | } | ||
115 | |||
116 | int VideoCapture::minimumFramePeriod() const | ||
117 | { | ||
118 | return 40; // milliseconds | ||
119 | } | ||
120 | |||
121 | VideoCapture::VideoCapture() | ||
122 | { | ||
123 | setupCamera(QSize(0, 0)); | ||
124 | } | ||
125 | |||
126 | VideoCapture::~VideoCapture() | ||
127 | { | ||
128 | shutdown(); | ||
129 | } | ||
130 | |||
131 | void VideoCapture::setupCamera(QSize size) | ||
132 | { | ||
133 | qWarning(" VideoCapture::setupCamera"); | ||
134 | // Clear important variables. | ||
135 | frames = 0; | ||
136 | currentFrame = 0; | ||
137 | width = 640; | ||
138 | height = 480; | ||
139 | caps.minwidth = width; | ||
140 | caps.minheight = height; | ||
141 | caps.maxwidth = width; | ||
142 | caps.maxheight = height; | ||
143 | |||
144 | // Open the video device. | ||
145 | fd = open(VIDEO_DEVICE, O_RDWR); | ||
146 | if (fd == -1) { | ||
147 | qWarning("%s: %s", VIDEO_DEVICE, strerror(errno)); | ||
148 | return; | ||
149 | } | ||
150 | |||
151 | // Get the device's current capabilities. | ||
152 | memset(&caps, 0, sizeof(caps)); | ||
153 | if (ioctl(fd, VIDIOCGCAP, &caps) < 0) { | ||
154 | qWarning("%s: could not retrieve the video capabilities", VIDEO_DEVICE); | ||
155 | close(fd); | ||
156 | fd = -1; | ||
157 | return; | ||
158 | } | ||
159 | |||
160 | // Change the channel to the first-connected camera, skipping TV inputs. | ||
161 | // If there are multiple cameras, this may need to be modified. | ||
162 | int chan; | ||
163 | struct video_channel chanInfo; | ||
164 | qWarning("available video capture inputs:"); | ||
165 | for (chan = 0; chan < caps.channels; ++chan) { | ||
166 | chanInfo.channel = chan; | ||
167 | if (ioctl(fd, VIDIOCGCHAN, &chanInfo) >= 0) { | ||
168 | if (chanInfo.type == VIDEO_TYPE_CAMERA) | ||
169 | qWarning(" %s (camera)", chanInfo.name); | ||
170 | else if (chanInfo.type == VIDEO_TYPE_TV) | ||
171 | qWarning(" %s (tv)", chanInfo.name); | ||
172 | else | ||
173 | qWarning(" %s (unknown)", chanInfo.name); | ||
174 | } | ||
175 | } | ||
176 | for (chan = 0; chan < caps.channels; ++chan) { | ||
177 | chanInfo.channel = chan; | ||
178 | if (ioctl(fd, VIDIOCGCHAN, &chanInfo) >= 0) { | ||
179 | if (chanInfo.type == VIDEO_TYPE_CAMERA) { | ||
180 | qWarning("selecting camera on input %s", chanInfo.name); | ||
181 | if (ioctl(fd, VIDIOCSCHAN, &chan) < 0) { | ||
182 | qWarning("%s: could not set the channel", VIDEO_DEVICE); | ||
183 | } | ||
184 | break; | ||
185 | } | ||
186 | } | ||
187 | } | ||
188 | |||
189 | // Set the desired picture mode to RGB32. | ||
190 | struct video_picture pict; | ||
191 | memset(&pict, 0, sizeof(pict)); | ||
192 | ioctl(fd, VIDIOCGPICT, &pict); | ||
193 | pict.palette = VIDEO_PALETTE_RGB32; | ||
194 | if (ioctl(fd, VIDIOCSPICT, &pict) < 0) { | ||
195 | qWarning("%s: could not set the picture mode", VIDEO_DEVICE); | ||
196 | close(fd); | ||
197 | fd = -1; | ||
198 | return; | ||
199 | } | ||
200 | |||
201 | // Determine the capture size to use. Zero indicates "preview mode". | ||
202 | if (size.width() == 0) { | ||
203 | size = QSize(caps.minwidth, caps.minheight); | ||
204 | } | ||
205 | |||
206 | // Get the current capture window. | ||
207 | struct video_window wind; | ||
208 | memset(&wind, 0, sizeof(wind)); | ||
209 | ioctl(fd, VIDIOCGWIN, &wind); | ||
210 | |||
211 | // Adjust the capture size to match the camera's aspect ratio. | ||
212 | if (caps.maxwidth > 0 && caps.maxheight > 0) { | ||
213 | if (size.width() > size.height()) { | ||
214 | size = QSize(size.height() * caps.maxwidth / caps.maxheight, size.height()); | ||
215 | } | ||
216 | else { | ||
217 | size = QSize(size.width(), size.width() * caps.maxheight / caps.maxwidth); | ||
218 | } | ||
219 | } | ||
220 | |||
221 | // Set the new capture window. | ||
222 | wind.x = 0; | ||
223 | wind.y = 0; | ||
224 | wind.width = size.width(); | ||
225 | wind.height = size.height(); | ||
226 | if (ioctl(fd, VIDIOCSWIN, &wind) < 0) { | ||
227 | qWarning("%s: could not set the capture window", VIDEO_DEVICE); | ||
228 | } | ||
229 | |||
230 | // Re-read the capture window, to see what it was adjusted to. | ||
231 | ioctl(fd, VIDIOCGWIN, &wind); | ||
232 | width = wind.width; | ||
233 | height = wind.height; | ||
234 | |||
235 | // Enable mmap-based access to the camera. | ||
236 | memset(&mbuf, 0, sizeof(mbuf)); | ||
237 | if (ioctl(fd, VIDIOCGMBUF, &mbuf) < 0) { | ||
238 | qWarning("%s: mmap-based camera access is not available", VIDEO_DEVICE); | ||
239 | close(fd); | ||
240 | fd = -1; | ||
241 | return; | ||
242 | } | ||
243 | |||
244 | // Mmap the designated memory region. | ||
245 | frames = (unsigned char *) mmap(0, mbuf.size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); | ||
246 | if (!frames || frames == (unsigned char *) (long) (-1)) { | ||
247 | qWarning("%s: could not mmap the device", VIDEO_DEVICE); | ||
248 | close(fd); | ||
249 | fd = -1; | ||
250 | return; | ||
251 | } | ||
252 | |||
253 | // Start capturing of the first frame. | ||
254 | struct video_mmap capture; | ||
255 | currentFrame = 0; | ||
256 | capture.frame = currentFrame; | ||
257 | capture.width = width; | ||
258 | capture.height = height; | ||
259 | capture.format = VIDEO_PALETTE_RGB32; | ||
260 | ioctl(fd, VIDIOCMCAPTURE, &capture); | ||
261 | } | ||
262 | |||
263 | void VideoCapture::shutdown() | ||
264 | { | ||
265 | if (frames != 0) { | ||
266 | munmap(frames, mbuf.size); | ||
267 | frames = 0; | ||
268 | } | ||
269 | if (fd != -1) { | ||
270 | int flag = 0; | ||
271 | ioctl(fd, VIDIOCSYNC, 0); | ||
272 | ioctl(fd, VIDIOCCAPTURE, &flag); | ||
273 | close(fd); | ||
274 | fd = -1; | ||
275 | } | ||
276 | } | ||
277 | |||
278 | void VideoCapture::getCameraImage(QImage & img, bool copy) | ||
279 | { | ||
280 | if (fd == -1) { | ||
281 | if (img.isNull()) { | ||
282 | img.create(width, height, 32); | ||
283 | } | ||
284 | return; | ||
285 | } | ||
286 | |||
287 | // Start capturing the next frame (we alternate between 0 and 1). | ||
288 | int frame = currentFrame; | ||
289 | struct video_mmap capture; | ||
290 | if (mbuf.frames > 1) { | ||
291 | currentFrame = !currentFrame; | ||
292 | capture.frame = currentFrame; | ||
293 | capture.width = width; | ||
294 | capture.height = height; | ||
295 | capture.format = VIDEO_PALETTE_RGB32; | ||
296 | ioctl(fd, VIDIOCMCAPTURE, &capture); | ||
297 | } | ||
298 | |||
299 | // Wait for the current frame to complete. | ||
300 | ioctl(fd, VIDIOCSYNC, &frame); | ||
301 | |||
302 | // Create an image that refers directly to the kernel's | ||
303 | // frame buffer, to avoid having to copy the data. | ||
304 | if (!copy) { | ||
305 | img = QImage(frames + mbuf.offsets[frame], width, height, 32, 0, 0, QImage::IgnoreEndian); | ||
306 | } | ||
307 | else { | ||
308 | img.create(width, height, 32); | ||
309 | memcpy(img.bits(), frames + mbuf.offsets[frame], width * height * 4); | ||
310 | } | ||
311 | |||
312 | // Queue up another frame if the device only supports one at a time. | ||
313 | if (mbuf.frames <= 1) { | ||
314 | capture.frame = currentFrame; | ||
315 | capture.width = width; | ||
316 | capture.height = height; | ||
317 | capture.format = VIDEO_PALETTE_RGB32; | ||
318 | ioctl(fd, VIDIOCMCAPTURE, &capture); | ||
319 | } | ||
320 | } | ||
321 | |||
322 | QValueList < QSize > VideoCapture::photoSizes() const | ||
323 | { | ||
324 | QValueList < QSize > list; | ||
325 | list.append(QSize(caps.maxwidth, caps.maxheight)); | ||
326 | if (caps.maxwidth != caps.minwidth || caps.maxheight != caps.minheight) | ||
327 | list.append(QSize(caps.minwidth, caps.minheight)); | ||
328 | return list; | ||
329 | } | ||
330 | |||
331 | QValueList < QSize > VideoCapture::videoSizes() const | ||
332 | { | ||
333 | // We use the same sizes for both. | ||
334 | return photoSizes(); | ||
335 | } | ||
336 | |||
337 | QSize VideoCapture::recommendedPhotoSize() const | ||
338 | { | ||
339 | return QSize(caps.maxwidth, caps.maxheight); | ||
340 | } | ||
341 | |||
342 | QSize VideoCapture::recommendedVideoSize() const | ||
343 | { | ||
344 | return QSize(caps.minwidth, caps.minheight); | ||
345 | } | ||
346 | |||
347 | QSize VideoCapture::recommendedPreviewSize() const | ||
348 | { | ||
349 | return QSize(caps.minwidth, caps.minheight); | ||
350 | } | ||
351 | |||
352 | void VideoCapture::setCaptureSize(QSize size) | ||
353 | { | ||
354 | if (size.width() != width || size.height() != height) { | ||
355 | shutdown(); | ||
356 | setupCamera(size); | ||
357 | } | ||
358 | } | ||
359 | |||
360 | #else /* !HAVE_VIDEO4LINUX */ | ||
361 | |||
362 | // Dummy implementation for systems without video. | ||
363 | |||
364 | VideoCapture::VideoCapture() | ||
365 | { | ||
366 | } | ||
367 | |||
368 | VideoCapture::~VideoCapture() | ||
369 | { | ||
370 | } | ||
371 | |||
372 | bool VideoCapture::hasCamera() const | ||
373 | { | ||
374 | return TRUE; | ||
375 | } | ||
376 | |||
377 | QSize VideoCapture::captureSize() const | ||
378 | { | ||
379 | return QSize(640, 480); | ||
380 | } | ||
381 | |||
382 | uint VideoCapture::refocusDelay() const | ||
383 | { | ||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | int VideoCapture::minimumFramePeriod() const | ||
388 | { | ||
389 | return 100; | ||
390 | } | ||
391 | |||
392 | static unsigned int nextrand() | ||
393 | { | ||
394 | #define A 16807 | ||
395 | #define M 2147483647 | ||
396 | #define Q 127773 | ||
397 | #define R 2836 | ||
398 | static unsigned int rnd = 1; | ||
399 | unsigned long hi = rnd / Q; | ||
400 | unsigned long lo = rnd % Q; | ||
401 | unsigned long test = A * lo - R * hi; | ||
402 | if (test > 0) | ||
403 | rnd = test; | ||
404 | else | ||
405 | rnd = test + M; | ||
406 | return rnd; | ||
407 | } | ||
408 | |||
409 | void VideoCapture::getCameraImage(QImage & img, bool) | ||
410 | { | ||
411 | // Just generate something dynamic (rectangles) | ||
412 | static QImage cimg; | ||
413 | int x, y, w, h; | ||
414 | if (cimg.isNull()) { | ||
415 | x = y = 0; | ||
416 | w = 640; | ||
417 | h = 480; | ||
418 | cimg.create(w, h, 32); | ||
419 | } | ||
420 | else { | ||
421 | w = nextrand() % (cimg.width() - 10) + 10; | ||
422 | h = nextrand() % (cimg.height() - 10) + 10; | ||
423 | x = nextrand() % (cimg.width() - w); | ||
424 | y = nextrand() % (cimg.height() - h); | ||
425 | } | ||
426 | QRgb c = qRgb(nextrand() % 255, nextrand() % 255, nextrand() % 255); | ||
427 | for (int j = 0; j < h; j++) { | ||
428 | QRgb *l = (QRgb *) cimg.scanLine(y + j) + x; | ||
429 | for (int i = 0; i < w; i++) | ||
430 | l[i] = c; | ||
431 | } | ||
432 | img = cimg; | ||
433 | } | ||
434 | |||
435 | QValueList < QSize > VideoCapture::photoSizes() constconst | ||
436 | { | ||
437 | QValueList < QSize > list; | ||
438 | list.append(QSize(640, 480)); | ||
439 | list.append(QSize(320, 240)); | ||
440 | return list; | ||
441 | } | ||
442 | |||
443 | QValueList < QSize > VideoCapture::videoSizes() constconst | ||
444 | { | ||
445 | QValueList < QSize > list; | ||
446 | list.append(QSize(640, 480)); | ||
447 | list.append(QSize(320, 240)); | ||
448 | return list; | ||
449 | } | ||
450 | |||
451 | QSize VideoCapture::recommendedPhotoSize() const | ||
452 | { | ||
453 | return QSize(640, 480); | ||
454 | } | ||
455 | |||
456 | QSize VideoCapture::recommendedVideoSize() const | ||
457 | { | ||
458 | return QSize(320, 240); | ||
459 | } | ||
460 | |||
461 | QSize VideoCapture::recommendedPreviewSize() const | ||
462 | { | ||
463 | return QSize(320, 240); | ||
464 | } | ||
465 | |||
466 | void VideoCapture::setCaptureSize(QSize size) | ||
467 | { | ||
468 | } | ||
469 | |||
470 | #endif /* !HAVE_VIDEO4LINUX */ | ||
471 | |||
472 | VideoCaptureView::VideoCaptureView(QWidget * parent, const char *name, WFlags fl):QWidget(parent, | ||
473 | name, fl) | ||
474 | { | ||
475 | capture = new VideoCapture(); | ||
476 | QSizePolicy sp(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||
477 | setSizePolicy(sp); | ||
478 | tid_update = 0; | ||
479 | setLive(); | ||
480 | } | ||
481 | |||
482 | VideoCaptureView::~VideoCaptureView() | ||
483 | { | ||
484 | delete capture; | ||
485 | } | ||
486 | |||
487 | void VideoCaptureView::setLive(int period) | ||
488 | { | ||
489 | if (tid_update) | ||
490 | killTimer(tid_update); | ||
491 | if (period == 0) | ||
492 | tid_update = startTimer(capture->minimumFramePeriod()); | ||
493 | else if (period > 0) | ||
494 | tid_update = startTimer(period); | ||
495 | else | ||
496 | tid_update = 0; | ||
497 | } | ||
498 | |||
499 | void VideoCaptureView::setStill(const QImage & i) | ||
500 | { | ||
501 | setLive(-1); | ||
502 | img = i; | ||
503 | repaint(TRUE); | ||
504 | } | ||
505 | |||
506 | QValueList < QSize > VideoCaptureView::photoSizes() const | ||
507 | { | ||
508 | return capture->photoSizes(); | ||
509 | } | ||
510 | |||
511 | QValueList < QSize > VideoCaptureView::videoSizes() const | ||
512 | { | ||
513 | return capture->videoSizes(); | ||
514 | } | ||
515 | |||
516 | QSize VideoCaptureView::recommendedPhotoSize() const | ||
517 | { | ||
518 | return capture->recommendedPhotoSize(); | ||
519 | } | ||
520 | |||
521 | QSize VideoCaptureView::recommendedVideoSize() const | ||
522 | { | ||
523 | return capture->recommendedVideoSize(); | ||
524 | } | ||
525 | |||
526 | QSize VideoCaptureView::recommendedPreviewSize() const | ||
527 | { | ||
528 | return capture->recommendedPreviewSize(); | ||
529 | } | ||
530 | |||
531 | QSize VideoCaptureView::captureSize() const | ||
532 | { | ||
533 | return capture->captureSize(); | ||
534 | } | ||
535 | |||
536 | void VideoCaptureView::setCaptureSize(QSize size) | ||
537 | { | ||
538 | capture->setCaptureSize(size); | ||
539 | } | ||
540 | |||
541 | uint VideoCaptureView::refocusDelay() const | ||
542 | { | ||
543 | return capture->refocusDelay(); | ||
544 | } | ||
545 | |||
546 | bool VideoCaptureView::available() const | ||
547 | { | ||
548 | return capture->hasCamera(); | ||
549 | } | ||
550 | |||
551 | void VideoCaptureView::paintEvent(QPaintEvent *) | ||
552 | { | ||
553 | if (tid_update && !capture->hasCamera()) { | ||
554 | QPainter p(this); | ||
555 | p.drawText(rect(), AlignCenter, tr("No Camera")); | ||
556 | return; | ||
557 | } | ||
558 | |||
559 | if (tid_update) | ||
560 | capture->getCameraImage(img); | ||
561 | int w = img.width(); | ||
562 | int h = img.height(); | ||
563 | |||
564 | if (!w || !h) | ||
565 | return; | ||
566 | |||
567 | if (width() * w > height() * h) { | ||
568 | w = w * height() / h; | ||
569 | h = height(); | ||
570 | } | ||
571 | else { | ||
572 | h = h * width() / w; | ||
573 | w = width(); | ||
574 | } | ||
575 | |||
576 | if (qt_screen->transformOrientation() == 0) { | ||
577 | // Stretch and draw the image. | ||
578 | QDirectPainter p(this); | ||
579 | QGfx *gfx = p.internalGfx(); | ||
580 | if (gfx) { | ||
581 | gfx->setSource(&img); | ||
582 | gfx->setAlphaType(QGfx::IgnoreAlpha); | ||
583 | gfx->stretchBlt((width() - w) / 2, (height() - h) / 2, w, h, img.width(), img.height()); | ||
584 | } | ||
585 | } | ||
586 | else { | ||
587 | // This code is nowhere near efficient enough (hence the above). | ||
588 | // TODO - handle rotations during direct painting. | ||
589 | QImage scimg = img.smoothScale(w, h); | ||
590 | QPainter p(this); | ||
591 | p.drawImage((width() - w) / 2, (height() - h) / 2, scimg); | ||
592 | } | ||
593 | } | ||
594 | |||
595 | void VideoCaptureView::timerEvent(QTimerEvent *) | ||
596 | { | ||
597 | repaint(FALSE); | ||
598 | } | ||
599 | |||
diff --git a/noncore/multimedia/camera2/videocaptureview.h b/noncore/multimedia/camera2/videocaptureview.h new file mode 100644 index 0000000..68c3b68 --- a/dev/null +++ b/noncore/multimedia/camera2/videocaptureview.h | |||
@@ -0,0 +1,82 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | #ifndef VIDEOVIEW_H | ||
36 | #define VIDEOVIEW_H | ||
37 | |||
38 | #include <qwidget.h> | ||
39 | #include <qimage.h> | ||
40 | #include <qvaluelist.h> | ||
41 | |||
42 | class VideoCapture; | ||
43 | |||
44 | |||
45 | class VideoCaptureView : public QWidget | ||
46 | { | ||
47 | Q_OBJECT | ||
48 | |||
49 | public: | ||
50 | VideoCaptureView( QWidget *parent=0, const char *name=0, WFlags fl=0 ); | ||
51 | ~VideoCaptureView(); | ||
52 | |||
53 | bool available() const; | ||
54 | |||
55 | QImage image() const { return img; } | ||
56 | void setLive(int period=0); | ||
57 | void setStill(const QImage&); | ||
58 | |||
59 | QValueList<QSize> photoSizes() const; | ||
60 | QValueList<QSize> videoSizes() const; | ||
61 | |||
62 | QSize recommendedPhotoSize() const; | ||
63 | QSize recommendedVideoSize() const; | ||
64 | QSize recommendedPreviewSize() const; | ||
65 | |||
66 | QSize captureSize() const; | ||
67 | void setCaptureSize( QSize size ); | ||
68 | |||
69 | uint refocusDelay() const; | ||
70 | |||
71 | protected: | ||
72 | void paintEvent(QPaintEvent*); | ||
73 | void timerEvent(QTimerEvent*); | ||
74 | |||
75 | private: | ||
76 | QImage img; | ||
77 | int tid_update; | ||
78 | VideoCapture *capture; | ||
79 | }; | ||
80 | |||
81 | #endif | ||
82 | |||
@@ -20,6 +20,7 @@ CONFIG_CALC2 noncore/tools/calc2 calc2.pro | |||
20 | CONFIG_CALCULATOR noncore/tools/calculatorcalculator.pro | 20 | CONFIG_CALCULATOR noncore/tools/calculatorcalculator.pro |
21 | CONFIG_CALIBRATE core/apps/calibratecalibrate.pro | 21 | CONFIG_CALIBRATE core/apps/calibratecalibrate.pro |
22 | CONFIG_CAMERA noncore/multimedia/cameracamera.pro | 22 | CONFIG_CAMERA noncore/multimedia/cameracamera.pro |
23 | CONFIG_CAMERA2 noncore/multimedia/camera2camera2.pro | ||
23 | CONFIG_CARDMON core/applets/cardmoncardmon.pro | 24 | CONFIG_CARDMON core/applets/cardmoncardmon.pro |
24 | CONFIG_CHECKBOOK noncore/apps/checkbookcheckbook.pro | 25 | CONFIG_CHECKBOOK noncore/apps/checkbookcheckbook.pro |
25 | CONFIG_CITYTIME core/settings/citytimecitytime.pro | 26 | CONFIG_CITYTIME core/settings/citytimecitytime.pro |
diff --git a/pics/camera2/Camera.png b/pics/camera2/Camera.png new file mode 100644 index 0000000..e619c11 --- a/dev/null +++ b/pics/camera2/Camera.png | |||
Binary files differ | |||
diff --git a/pics/camera2/Camera_48.png b/pics/camera2/Camera_48.png new file mode 100644 index 0000000..00b8585 --- a/dev/null +++ b/pics/camera2/Camera_48.png | |||
Binary files differ | |||
diff --git a/pics/camera2/Camera_48_anim.mng b/pics/camera2/Camera_48_anim.mng new file mode 100644 index 0000000..6b19394 --- a/dev/null +++ b/pics/camera2/Camera_48_anim.mng | |||
Binary files differ | |||
diff --git a/pics/camera2/settings.png b/pics/camera2/settings.png new file mode 100644 index 0000000..05bfdf7 --- a/dev/null +++ b/pics/camera2/settings.png | |||
Binary files differ | |||