summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2006-07-09 18:56:40 (UTC)
committer llornkcor <llornkcor>2006-07-09 18:56:40 (UTC)
commit36dece4760b1ac1799929221b49eb3bee98c2367 (patch) (unidiff)
treea45f66d2d90bd9fbbff8e8903cd1cb9323c39f6e
parent604065c6e662cb3894acf03abadafacc3ab52913 (diff)
downloadopie-36dece4760b1ac1799929221b49eb3bee98c2367.zip
opie-36dece4760b1ac1799929221b49eb3bee98c2367.tar.gz
opie-36dece4760b1ac1799929221b49eb3bee98c2367.tar.bz2
initial commit to add video4linux camera app from qtopia 2, needs more work
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--apps/Applications/camera2.desktop26
-rw-r--r--library/backend/categories.h1
-rw-r--r--library/global.cpp49
-rw-r--r--library/global.h6
-rw-r--r--library/library.pro2
-rw-r--r--library/locationcombo.cpp295
-rw-r--r--library/locationcombo.h88
-rw-r--r--library/qlibrary_unix.cpp4
-rw-r--r--library/timestring.cpp255
-rw-r--r--library/timestring.h94
-rw-r--r--noncore/multimedia/camera2/camera2.pro27
-rw-r--r--noncore/multimedia/camera2/camerabase.cpp93
-rw-r--r--noncore/multimedia/camera2/camerabase.h47
-rw-r--r--noncore/multimedia/camera2/camerabase.ui209
-rw-r--r--noncore/multimedia/camera2/camerasettings.cpp166
-rw-r--r--noncore/multimedia/camera2/camerasettings.h59
-rw-r--r--noncore/multimedia/camera2/camerasettings.ui433
-rw-r--r--noncore/multimedia/camera2/config.in7
-rw-r--r--noncore/multimedia/camera2/image.cpp239
-rw-r--r--noncore/multimedia/camera2/image.h53
-rw-r--r--noncore/multimedia/camera2/main.cpp44
-rw-r--r--noncore/multimedia/camera2/mainwindow.cpp763
-rw-r--r--noncore/multimedia/camera2/mainwindow.h132
-rw-r--r--noncore/multimedia/camera2/opie-camera2.control10
-rw-r--r--noncore/multimedia/camera2/thumbbutton.h50
-rw-r--r--noncore/multimedia/camera2/videocaptureview.cpp599
-rw-r--r--noncore/multimedia/camera2/videocaptureview.h82
-rw-r--r--packages1
-rw-r--r--pics/camera2/Camera.pngbin0 -> 1668 bytes
-rw-r--r--pics/camera2/Camera_48.pngbin0 -> 3161 bytes
-rw-r--r--pics/camera2/Camera_48_anim.mngbin0 -> 13700 bytes
-rw-r--r--pics/camera2/settings.pngbin0 -> 745 bytes
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]
2Exec=camera2
3File=camera2
4Icon=camera2/Camera
5Type=Application
6Name=OpieCam2
7Comment=A Camera Program
8Name[de]=Kamera2
9Comment[de]=Ein Kamera-Programm
10Name[fr]=Photo2
11Comment[fr]=Gestionnaire de photos et images
12Name[it]=Telecamera2
13Comment[it]=Programma per telecamera
14Name[pt]=Câmera2
15Comment[pt]=Uma aplicação de câmera
16Name[pt_BR]=Câmera2
17Comment[pt_BR]=Uma aplicação de câmera
18Name[sl]=OpieKamera2
19Comment[sl]=Program za kamero
20Naam[nl]=Camera2
21Comment[nl]=Een camerabesturingsprogramma
22Name[ru]=Камера2
23Comment[ru]=Программа для управления (фото)камерой
24Name[lv]=OpieCam2
25Comment[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
@@ -1,161 +1,162 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free 7** GNU General Public License version 2 as published by the Free
8** Software Foundation and appearing in the file LICENSE.GPL included 8** Software Foundation and appearing in the file LICENSE.GPL included
9** in the packaging of this file. 9** in the packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
12** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A 12** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A
13** PARTICULAR PURPOSE. 13** PARTICULAR PURPOSE.
14** 14**
15** See http://www.trolltech.com/gpl/ for GPL licensing information. 15** See http://www.trolltech.com/gpl/ for GPL licensing information.
16** 16**
17** Contact info@trolltech.com if any conditions of this licensing are 17** Contact info@trolltech.com if any conditions of this licensing are
18** not clear to you. 18** not clear to you.
19** 19**
20**********************************************************************/ 20**********************************************************************/
21 21
22#ifndef QTPALMTOP_CATEGORIES_H 22#ifndef QTPALMTOP_CATEGORIES_H
23#define QTPALMTOP_CATEGORIES_H 23#define QTPALMTOP_CATEGORIES_H
24 24
25#include <qstring.h> 25#include <qstring.h>
26#include <qstringlist.h> 26#include <qstringlist.h>
27#include <qmap.h> 27#include <qmap.h>
28#include <qlistview.h> 28#include <qlistview.h>
29#include <qarray.h> 29#include <qarray.h>
30#include "qpcglobal.h" 30#include "qpcglobal.h"
31#include "palmtopuidgen.h" 31#include "palmtopuidgen.h"
32 32
33class CategoryGroup; 33class CategoryGroup;
34QString categoryFileName();
34 35
35#if defined(QPC_TEMPLATEDLL) 36#if defined(QPC_TEMPLATEDLL)
36// MOC_SKIP_BEGIN 37// MOC_SKIP_BEGIN
37template class QPC_EXPORT QMap<int, QString>; 38template class QPC_EXPORT QMap<int, QString>;
38template class QPC_EXPORT QMap<QString, int>; 39template class QPC_EXPORT QMap<QString, int>;
39template class QPC_EXPORT QMap< QString, CategoryGroup >; 40template class QPC_EXPORT QMap< QString, CategoryGroup >;
40// MOC_SKIP_END 41// MOC_SKIP_END
41#endif 42#endif
42 43
43class QPC_EXPORT CategoryGroup 44class QPC_EXPORT CategoryGroup
44{ 45{
45 friend class Categories; 46 friend class Categories;
46public: 47public:
47 CategoryGroup(): mIdLabelMap(), mLabelIdMap() { } 48 CategoryGroup(): mIdLabelMap(), mLabelIdMap() { }
48 CategoryGroup( const CategoryGroup &c ) : 49 CategoryGroup( const CategoryGroup &c ) :
49 mIdLabelMap( c.mIdLabelMap), mLabelIdMap( c.mLabelIdMap ) { } 50 mIdLabelMap( c.mIdLabelMap), mLabelIdMap( c.mLabelIdMap ) { }
50 51
51 void clear() { mIdLabelMap.clear(); mLabelIdMap.clear(); } 52 void clear() { mIdLabelMap.clear(); mLabelIdMap.clear(); }
52 53
53 int add( const QString &label ); 54 int add( const QString &label );
54 bool add( int uid, const QString &label ); 55 bool add( int uid, const QString &label );
55 56
56 bool remove( const QString &label ); 57 bool remove( const QString &label );
57 bool remove( int uid ); 58 bool remove( int uid );
58 59
59 bool rename( int uid, const QString &newLabel ); 60 bool rename( int uid, const QString &newLabel );
60 bool rename( const QString &oldLabel, const QString &newLabel ); 61 bool rename( const QString &oldLabel, const QString &newLabel );
61 62
62 bool contains(int id) const; 63 bool contains(int id) const;
63 bool contains(const QString &label) const; 64 bool contains(const QString &label) const;
64 65
65 /** Returns label associated with the uid or QString::null if 66 /** Returns label associated with the uid or QString::null if
66 * not found 67 * not found
67 */ 68 */
68 const QString &label(int id) const; 69 const QString &label(int id) const;
69 /** Returns the uid associated with label or 0 if not found */ 70 /** Returns the uid associated with label or 0 if not found */
70 int id(const QString &label) const; 71 int id(const QString &label) const;
71 72
72 /** Returns a sorted list of labels */ 73 /** Returns a sorted list of labels */
73 QStringList labels() const; 74 QStringList labels() const;
74 75
75 QStringList labels( const QArray<int> &catids ) const; 76 QStringList labels( const QArray<int> &catids ) const;
76 77
77 const QMap<int, QString> &idMap() const { return mIdLabelMap; } 78 const QMap<int, QString> &idMap() const { return mIdLabelMap; }
78 79
79private: 80private:
80 void insert( int uid, const QString &label ); 81 void insert( int uid, const QString &label );
81 QMap<int, QString> mIdLabelMap; 82 QMap<int, QString> mIdLabelMap;
82 QMap<QString, int> mLabelIdMap; 83 QMap<QString, int> mLabelIdMap;
83 84
84 static Qtopia::UidGen &uidGen() { return sUidGen; } 85 static Qtopia::UidGen &uidGen() { return sUidGen; }
85 static Qtopia::UidGen sUidGen; 86 static Qtopia::UidGen sUidGen;
86}; 87};
87 88
88/* Map from application name to categories */ 89/* Map from application name to categories */
89class QPC_EXPORT Categories : public QObject 90class QPC_EXPORT Categories : public QObject
90{ 91{
91 Q_OBJECT 92 Q_OBJECT
92public: 93public:
93 Categories( QObject *parent=0, const char *name = 0 ) 94 Categories( QObject *parent=0, const char *name = 0 )
94 : QObject( parent, name ), mGlobalCats(), mAppCats() { } 95 : QObject( parent, name ), mGlobalCats(), mAppCats() { }
95 Categories( const Categories &copyFrom ) : QObject( copyFrom.parent() ), 96 Categories( const Categories &copyFrom ) : QObject( copyFrom.parent() ),
96 mGlobalCats( copyFrom.mGlobalCats ), 97 mGlobalCats( copyFrom.mGlobalCats ),
97 mAppCats( copyFrom.mAppCats ) { } 98 mAppCats( copyFrom.mAppCats ) { }
98 virtual ~Categories() { } 99 virtual ~Categories() { }
99 100
100 Categories &operator= ( const Categories &c ) 101 Categories &operator= ( const Categories &c )
101{ mAppCats = c.mAppCats; mGlobalCats = c.mGlobalCats; return *this; } 102{ mAppCats = c.mAppCats; mGlobalCats = c.mGlobalCats; return *this; }
102 103
103 void clear(); 104 void clear();
104 105
105 /** Add the category name as long as it doesn't already exist 106 /** Add the category name as long as it doesn't already exist
106 * locally or globally. Return UID if added, 0 if conflicts 107 * locally or globally. Return UID if added, 0 if conflicts
107 * (error). 108 * (error).
108 */ 109 */
109 int addCategory( const QString &appname, const QString &catname); 110 int addCategory( const QString &appname, const QString &catname);
110 /** Add the category name as long as it doesn't already exist 111 /** Add the category name as long as it doesn't already exist
111 * locally or globally. Return UID if added, 0 if conflicts 112 * locally or globally. Return UID if added, 0 if conflicts
112 * (error). 113 * (error).
113 */ 114 */
114 int addCategory( const QString &appname, const QString &catname, int uid); 115 int addCategory( const QString &appname, const QString &catname, int uid);
115 /** Add the global category just checking that it doesn't 116 /** Add the global category just checking that it doesn't
116 * already exist globally. Return UID if added, 0 if conflicts. 117 * already exist globally. Return UID if added, 0 if conflicts.
117 */ 118 */
118 int addGlobalCategory( const QString &catname ); 119 int addGlobalCategory( const QString &catname );
119 /** Add the global category just checking that it doesn't 120 /** Add the global category just checking that it doesn't
120 * already exist globally. Return UID if added, 0 if conflicts. 121 * already exist globally. Return UID if added, 0 if conflicts.
121 */ 122 */
122 int addGlobalCategory( const QString &catname, int uid ); 123 int addGlobalCategory( const QString &catname, int uid );
123 /** Removes the category from the application; if it is not found 124 /** Removes the category from the application; if it is not found
124 * in the application, then it removes it from the global list 125 * in the application, then it removes it from the global list
125 */ 126 */
126 bool removeCategory( const QString &appName, const QString &catName, 127 bool removeCategory( const QString &appName, const QString &catName,
127 bool checkGlobal = TRUE); 128 bool checkGlobal = TRUE);
128 bool removeCategory( const QString &appName, int uid ); 129 bool removeCategory( const QString &appName, int uid );
129 bool removeGlobalCategory( const QString &catName ); 130 bool removeGlobalCategory( const QString &catName );
130 bool removeGlobalCategory( int uid ); 131 bool removeGlobalCategory( int uid );
131 132
132 QArray<int> ids( const QString &app, const QStringList &labels) const; 133 QArray<int> ids( const QString &app, const QStringList &labels) const;
133 134
134 /** Returns the id associated with the app */ 135 /** Returns the id associated with the app */
135 int id( const QString &app, const QString &cat ) const; 136 int id( const QString &app, const QString &cat ) const;
136 /** Returns the label associated with the id */ 137 /** Returns the label associated with the id */
137 QString label( const QString &app, int id ) const; 138 QString label( const QString &app, int id ) const;
138 139
139 enum ExtraLabels { NoExtra, AllUnfiled, AllLabel, UnfiledLabel }; 140 enum ExtraLabels { NoExtra, AllUnfiled, AllLabel, UnfiledLabel };
140 /** Returns the sorted list of all categories that are 141 /** Returns the sorted list of all categories that are
141 * associated with the app. 142 * associated with the app.
142 * If includeGlobal parameter is TRUE then the returned 143 * If includeGlobal parameter is TRUE then the returned
143 * categories will include the global category items. 144 * categories will include the global category items.
144 * If extra = NoExtra, then 145 * If extra = NoExtra, then
145 * If extra = AllUnfiled, then All and Unfiled will be prepended to 146 * If extra = AllUnfiled, then All and Unfiled will be prepended to
146 * the list 147 * the list
147 * If extra = AllLabel, then All is prepended 148 * If extra = AllLabel, then All is prepended
148 * If extra = UnfiledLabel, then Unfiled is prepended 149 * If extra = UnfiledLabel, then Unfiled is prepended
149 */ 150 */
150 QStringList labels( const QString &app, 151 QStringList labels( const QString &app,
151 bool includeGlobal = TRUE, 152 bool includeGlobal = TRUE,
152 ExtraLabels extra = NoExtra ) const; 153 ExtraLabels extra = NoExtra ) const;
153 154
154 QStringList labels( const QString &app, 155 QStringList labels( const QString &app,
155 const QArray<int> &catids ) const; 156 const QArray<int> &catids ) const;
156 157
157 enum DisplaySingle { ShowMulti, ShowAll, ShowFirst }; 158 enum DisplaySingle { ShowMulti, ShowAll, ShowFirst };
158 159
159 /** Returns a single string associated with the cat ids for display in 160 /** Returns a single string associated with the cat ids for display in
160 * a combobox or any area that requires one string. If catids are empty 161 * a combobox or any area that requires one string. If catids are empty
161 * then "Unfiled" will be returned. If multiple categories are assigned 162 * then "Unfiled" will be returned. If multiple categories are assigned
diff --git a/library/global.cpp b/library/global.cpp
index ec87555..f7a0767 100644
--- a/library/global.cpp
+++ b/library/global.cpp
@@ -683,130 +683,179 @@ void Global::execute( const QString &c, const QString& document )
683QString Global::shellQuote(const QString& s) 683QString Global::shellQuote(const QString& s)
684{ 684{
685 QString r="\""; 685 QString r="\"";
686 for (int i=0; i<(int)s.length(); i++) { 686 for (int i=0; i<(int)s.length(); i++) {
687 char c = s[i].latin1(); 687 char c = s[i].latin1();
688 switch (c) { 688 switch (c) {
689 case '\\': case '"': case '$': 689 case '\\': case '"': case '$':
690 r+="\\"; 690 r+="\\";
691 } 691 }
692 r += s[i]; 692 r += s[i];
693 } 693 }
694 r += "\""; 694 r += "\"";
695 return r; 695 return r;
696} 696}
697 697
698/*! 698/*!
699 Returns the string \a s with the characters '\' and '"' quoted by a 699 Returns the string \a s with the characters '\' and '"' quoted by a
700 preceeding '\'. 700 preceeding '\'.
701 701
702 \sa shellQuote() 702 \sa shellQuote()
703*/ 703*/
704QString Global::stringQuote(const QString& s) 704QString Global::stringQuote(const QString& s)
705{ 705{
706 QString r="\""; 706 QString r="\"";
707 for (int i=0; i<(int)s.length(); i++) { 707 for (int i=0; i<(int)s.length(); i++) {
708 char c = s[i].latin1(); 708 char c = s[i].latin1();
709 switch (c) { 709 switch (c) {
710 case '\\': case '"': 710 case '\\': case '"':
711 r+="\\"; 711 r+="\\";
712 } 712 }
713 r += s[i]; 713 r += s[i];
714 } 714 }
715 r += "\""; 715 r += "\"";
716 return r; 716 return r;
717} 717}
718 718
719/*! 719/*!
720 Finds all documents on the system's document directories which 720 Finds all documents on the system's document directories which
721 match the filter \a mimefilter, and appends the resulting DocLnk 721 match the filter \a mimefilter, and appends the resulting DocLnk
722 objects to \a folder. 722 objects to \a folder.
723*/ 723*/
724void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter) 724void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter)
725{ 725{
726 QString homedocs = QString(getenv("HOME")) + "/Documents"; 726 QString homedocs = QString(getenv("HOME")) + "/Documents";
727 DocLnkSet d(homedocs,mimefilter); 727 DocLnkSet d(homedocs,mimefilter);
728 folder->appendFrom(d); 728 folder->appendFrom(d);
729 /** let's do intellegint way of searching these files 729 /** let's do intellegint way of searching these files
730 * a) the user don't want to check mediums global 730 * a) the user don't want to check mediums global
731 * b) the user wants to check but use the global options for it 731 * b) the user wants to check but use the global options for it
732 * c) the user wants to check it but not this medium 732 * c) the user wants to check it but not this medium
733 * d) the user wants to check and this medium as well 733 * d) the user wants to check and this medium as well
734 * 734 *
735 * In all cases we need to apply a different mimefilter to 735 * In all cases we need to apply a different mimefilter to
736 * the medium. 736 * the medium.
737 * a) mimefilter.isEmpty() we need to apply the responding filter 737 * a) mimefilter.isEmpty() we need to apply the responding filter
738 * either the global or the one on the medium 738 * either the global or the one on the medium
739 * 739 *
740 * b) mimefilter is set to an application we need to find out if the 740 * b) mimefilter is set to an application we need to find out if the
741 * mimetypes are included in the mime mask of the medium 741 * mimetypes are included in the mime mask of the medium
742 */ 742 */
743 StorageInfo storage; 743 StorageInfo storage;
744 const QList<FileSystem> &fs = storage.fileSystems(); 744 const QList<FileSystem> &fs = storage.fileSystems();
745 QListIterator<FileSystem> it ( fs ); 745 QListIterator<FileSystem> it ( fs );
746 for ( ; it.current(); ++it ) { 746 for ( ; it.current(); ++it ) {
747 if ( (*it)->isRemovable() ) { // let's find out if we should search on it 747 if ( (*it)->isRemovable() ) { // let's find out if we should search on it
748 // this is a candidate look at the cf and see if we should search on it 748 // this is a candidate look at the cf and see if we should search on it
749 QString path = (*it)->path(); 749 QString path = (*it)->path();
750 Config conf((*it)->path() + "/.opiestorage.cf", Config::File ); 750 Config conf((*it)->path() + "/.opiestorage.cf", Config::File );
751 conf.setGroup("main"); 751 conf.setGroup("main");
752 if (!conf.readBoolEntry("check",true)) { 752 if (!conf.readBoolEntry("check",true)) {
753 continue; 753 continue;
754 } 754 }
755 conf.setGroup("subdirs"); 755 conf.setGroup("subdirs");
756 if (conf.readBoolEntry("wholemedia",true)) { 756 if (conf.readBoolEntry("wholemedia",true)) {
757 DocLnkSet ide( path,mimefilter); 757 DocLnkSet ide( path,mimefilter);
758 folder->appendFrom(ide); 758 folder->appendFrom(ide);
759 } else { 759 } else {
760 QStringList subDirs = conf.readListEntry("subdirs",':'); 760 QStringList subDirs = conf.readListEntry("subdirs",':');
761 if (subDirs.isEmpty()) { 761 if (subDirs.isEmpty()) {
762 subDirs.append("Documents"); 762 subDirs.append("Documents");
763 } 763 }
764 for (unsigned c = 0; c < subDirs.count();++c) { 764 for (unsigned c = 0; c < subDirs.count();++c) {
765 DocLnkSet ide( path+"/"+subDirs[c], mimefilter ); 765 DocLnkSet ide( path+"/"+subDirs[c], mimefilter );
766 folder->appendFrom(ide); 766 folder->appendFrom(ide);
767 } 767 }
768 } 768 }
769 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) { 769 } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) {
770 QString path = (*it)->path() + "/Documents"; 770 QString path = (*it)->path() + "/Documents";
771 DocLnkSet ide( path, mimefilter ); 771 DocLnkSet ide( path, mimefilter );
772 folder->appendFrom(ide); 772 folder->appendFrom(ide);
773 } 773 }
774 } 774 }
775} 775}
776 776
777QStringList Global::languageList() 777QStringList Global::languageList()
778{ 778{
779 QString lang = getenv("LANG"); 779 QString lang = getenv("LANG");
780 QStringList langs; 780 QStringList langs;
781 langs.append(lang); 781 langs.append(lang);
782 int i = lang.find("."); 782 int i = lang.find(".");
783 if ( i > 0 ) 783 if ( i > 0 )
784 lang = lang.left( i ); 784 lang = lang.left( i );
785 i = lang.find( "_" ); 785 i = lang.find( "_" );
786 if ( i > 0 ) 786 if ( i > 0 )
787 langs.append(lang.left(i)); 787 langs.append(lang.left(i));
788 return langs; 788 return langs;
789} 789}
790 790
791QStringList Global::helpPath() 791QStringList Global::helpPath()
792{ 792{
793 QString qpeDir = QPEApplication::qpeDir(); 793 QString qpeDir = QPEApplication::qpeDir();
794 QStringList path; 794 QStringList path;
795 QStringList langs = Global::languageList(); 795 QStringList langs = Global::languageList();
796 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) { 796 for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) {
797 QString lang = *it; 797 QString lang = *it;
798 if ( !lang.isEmpty() ) 798 if ( !lang.isEmpty() )
799 path += qpeDir + "/help/" + lang + "/html"; 799 path += qpeDir + "/help/" + lang + "/html";
800 } 800 }
801 path += qpeDir + "/pics"; 801 path += qpeDir + "/pics";
802 path += qpeDir + "/help/html"; 802 path += qpeDir + "/help/html";
803 /* we even put english into the en dir so try it as fallback as well for opie */ 803 /* we even put english into the en dir so try it as fallback as well for opie */
804 path += qpeDir + "/help/en/html"; 804 path += qpeDir + "/help/en/html";
805 path += qpeDir + "/docs"; 805 path += qpeDir + "/docs";
806 806
807 807
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 */
817bool 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*/
836QString 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
@@ -1,90 +1,94 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 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 file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 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. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#ifndef GLOBAL_H 20#ifndef GLOBAL_H
21#define GLOBAL_H 21#define GLOBAL_H
22 22
23#include <qstringlist.h> 23#include <qstringlist.h>
24#include <qguardedptr.h> 24#include <qguardedptr.h>
25class QDawg; 25class QDawg;
26class QLabel; 26class QLabel;
27class QWidget; 27class QWidget;
28class AppLnk; 28class AppLnk;
29class DocLnkSet; 29class DocLnkSet;
30 30class QFile;
31class Global 31class Global
32{ 32{
33public: 33public:
34 Global(); 34 Global();
35 35
36 // Dictionaries 36 // Dictionaries
37 static const QDawg& fixedDawg(); 37 static const QDawg& fixedDawg();
38 static const QDawg& addedDawg(); 38 static const QDawg& addedDawg();
39 static const QDawg& dawg(const QString& name); 39 static const QDawg& dawg(const QString& name);
40 40
41 static void addWords(const QStringList& word); 41 static void addWords(const QStringList& word);
42 static void addWords(const QString& dictname, const QStringList& word); 42 static void addWords(const QString& dictname, const QStringList& word);
43 // static void removeWords(const QStringList& word); -- if someone wants it 43 // static void removeWords(const QStringList& word); -- if someone wants it
44 44
45 static void createDocDir(); 45 static void createDocDir();
46 46
47 static void findDocuments(DocLnkSet* folder, const QString &mimefilter=QString::null); 47 static void findDocuments(DocLnkSet* folder, const QString &mimefilter=QString::null);
48 48
49 static QString applicationFileName(const QString& appname, const QString& filename); 49 static QString applicationFileName(const QString& appname, const QString& filename);
50 50
51 struct Command { 51 struct Command {
52 const char *file; 52 const char *file;
53 QWidget *(*func)( bool ); 53 QWidget *(*func)( bool );
54 bool maximized; 54 bool maximized;
55 bool documentary; 55 bool documentary;
56 }; 56 };
57 static void setBuiltinCommands( Command* ); 57 static void setBuiltinCommands( Command* );
58 58
59 static void execute( const QString &exec, const QString &document=QString::null ); 59 static void execute( const QString &exec, const QString &document=QString::null );
60 static void setDocument( QWidget* receiver, const QString& document ); 60 static void setDocument( QWidget* receiver, const QString& document );
61 static bool terminateBuiltin( const QString& ); 61 static bool terminateBuiltin( const QString& );
62 static void terminate( const AppLnk* ); 62 static void terminate( const AppLnk* );
63 63
64 static bool isBuiltinCommand( const QString &name ); 64 static bool isBuiltinCommand( const QString &name );
65 65
66 // system messaging 66 // system messaging
67 static void applyStyle(); 67 static void applyStyle();
68 static void statusMessage(const QString&); 68 static void statusMessage(const QString&);
69 static QWidget *shutdown( bool = FALSE ); 69 static QWidget *shutdown( bool = FALSE );
70 static QWidget *restart( bool = FALSE ); 70 static QWidget *restart( bool = FALSE );
71 static void hideInputMethod(); 71 static void hideInputMethod();
72 static void showInputMethod(); 72 static void showInputMethod();
73 73
74 static void writeHWClock(); 74 static void writeHWClock();
75 75
76 static QString shellQuote(const QString& s); 76 static QString shellQuote(const QString& s);
77 static QString stringQuote(const QString& s); 77 static QString stringQuote(const QString& s);
78 78
79#ifdef QTOPIA_INTERNAL_LANGLIST 79#ifdef QTOPIA_INTERNAL_LANGLIST
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
84private: 88private:
85 static void invoke( const QString &exec); 89 static void invoke( const QString &exec);
86 static Command* builtin; 90 static Command* builtin;
87 static QGuardedPtr<QWidget> *running; 91 static QGuardedPtr<QWidget> *running;
88}; 92};
89 93
90#endif 94#endif
diff --git a/library/library.pro b/library/library.pro
index 7143454..4142529 100644
--- a/library/library.pro
+++ b/library/library.pro
@@ -1,141 +1,143 @@
1 TEMPLATE= lib 1 TEMPLATE= lib
2 #CONFIG += qt warn_on release 2 #CONFIG += qt warn_on release
3 CONFIG += qt warn_on debug 3 CONFIG += qt warn_on debug
4 HEADERS= calendar.h \ 4 HEADERS= calendar.h \
5 global.h \ 5 global.h \
6 resource.h \ 6 resource.h \
7 xmlreader.h \ 7 xmlreader.h \
8 mimetype.h \ 8 mimetype.h \
9 menubutton.h \ 9 menubutton.h \
10 network.h \ 10 network.h \
11 networkinterface.h \ 11 networkinterface.h \
12 filemanager.h \ 12 filemanager.h \
13 fontmanager.h \ 13 fontmanager.h \
14 qdawg.h \ 14 qdawg.h \
15 datebookmonth.h \ 15 datebookmonth.h \
16 fileselector.h \ 16 fileselector.h \
17 fileselector_p.h \ 17 fileselector_p.h \
18 imageedit.h \ 18 imageedit.h \
19 qcopenvelope_qws.h \ 19 qcopenvelope_qws.h \
20 qpedecoration_qws.h \ 20 qpedecoration_qws.h \
21 qpeapplication.h \ 21 qpeapplication.h \
22 qpestyle.h \ 22 qpestyle.h \
23 qpedialog.h \ 23 qpedialog.h \
24 lightstyle.h \ 24 lightstyle.h \
25 config.h \ 25 config.h \
26 applnk.h \ 26 applnk.h \
27 sound.h \ 27 sound.h \
28 tzselect.h \ 28 tzselect.h \
29 qmath.h \ 29 qmath.h \
30 datebookdb.h \ 30 datebookdb.h \
31 alarmserver.h \ 31 alarmserver.h \
32 process.h \ 32 process.h \
33 password.h \ 33 password.h \
34 timestring.h \ 34 timestring.h \
35 fontfactoryinterface.h \ 35 fontfactoryinterface.h \
36 fontdatabase.h \ 36 fontdatabase.h \
37 power.h \ 37 power.h \
38 storage.h \ 38 storage.h \
39 qpemessagebox.h \ 39 qpemessagebox.h \
40 timeconversion.h \ 40 timeconversion.h \
41 qpedebug.h \ 41 qpedebug.h \
42 qpemenubar.h \ 42 qpemenubar.h \
43 qpetoolbar.h \ 43 qpetoolbar.h \
44 backend/categories.h \ 44 backend/categories.h \
45 stringutil.h \ 45 stringutil.h \
46 backend/palmtoprecord.h \ 46 backend/palmtoprecord.h \
47 backend/task.h \ 47 backend/task.h \
48 backend/event.h \ 48 backend/event.h \
49 backend/contact.h\ 49 backend/contact.h\
50 categorymenu.h \ 50 categorymenu.h \
51 categoryedit_p.h \ 51 categoryedit_p.h \
52 categoryselect.h \ 52 categoryselect.h \
53 categorywidget.h \ 53 categorywidget.h \
54 ir.h \ 54 ir.h \
55 backend/vobject_p.h \ 55 backend/vobject_p.h \
56 findwidget_p.h \ 56 findwidget_p.h \
57 finddialog.h \ 57 finddialog.h \
58 lnkproperties.h \ 58 lnkproperties.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 \
65 global.cpp \ 66 global.cpp \
66 xmlreader.cpp \ 67 xmlreader.cpp \
67 mimetype.cpp \ 68 mimetype.cpp \
68 menubutton.cpp \ 69 menubutton.cpp \
69 network.cpp \ 70 network.cpp \
70 networkinterface.cpp \ 71 networkinterface.cpp \
71 filemanager.cpp \ 72 filemanager.cpp \
72 fontmanager.cpp \ 73 fontmanager.cpp \
73 qdawg.cpp \ 74 qdawg.cpp \
74 datebookmonth.cpp \ 75 datebookmonth.cpp \
75 fileselector.cpp \ 76 fileselector.cpp \
76 imageedit.cpp \ 77 imageedit.cpp \
77 resource.cpp \ 78 resource.cpp \
78 qpedecoration_qws.cpp \ 79 qpedecoration_qws.cpp \
79 qcopenvelope_qws.cpp \ 80 qcopenvelope_qws.cpp \
80 qpeapplication.cpp \ 81 qpeapplication.cpp \
81 qpestyle.cpp \ 82 qpestyle.cpp \
82 qpedialog.cpp \ 83 qpedialog.cpp \
83 lightstyle.cpp \ 84 lightstyle.cpp \
84 config.cpp \ 85 config.cpp \
85 applnk.cpp \ 86 applnk.cpp \
86 sound.cpp \ 87 sound.cpp \
87 tzselect.cpp \ 88 tzselect.cpp \
88 qmath.c \ 89 qmath.c \
89 datebookdb.cpp \ 90 datebookdb.cpp \
90 alarmserver.cpp \ 91 alarmserver.cpp \
91 password.cpp \ 92 password.cpp \
92 process.cpp \ 93 process.cpp \
93 process_unix.cpp \ 94 process_unix.cpp \
94 timestring.cpp \ 95 timestring.cpp \
95 fontdatabase.cpp \ 96 fontdatabase.cpp \
96 power.cpp \ 97 power.cpp \
97 storage.cpp \ 98 storage.cpp \
98 qpemessagebox.cpp \ 99 qpemessagebox.cpp \
99 backend/timeconversion.cpp \ 100 backend/timeconversion.cpp \
100 qpedebug.cpp \ 101 qpedebug.cpp \
101 qpemenubar.cpp \ 102 qpemenubar.cpp \
102 qpetoolbar.cpp \ 103 qpetoolbar.cpp \
103 backend/categories.cpp \ 104 backend/categories.cpp \
104 backend/stringutil.cpp \ 105 backend/stringutil.cpp \
105 backend/palmtoprecord.cpp \ 106 backend/palmtoprecord.cpp \
106 backend/task.cpp \ 107 backend/task.cpp \
107 backend/event.cpp \ 108 backend/event.cpp \
108 backend/contact.cpp \ 109 backend/contact.cpp \
109 categorymenu.cpp \ 110 categorymenu.cpp \
110 categoryedit_p.cpp \ 111 categoryedit_p.cpp \
111 categoryselect.cpp \ 112 categoryselect.cpp \
112 categorywidget.cpp \ 113 categorywidget.cpp \
113 ir.cpp \ 114 ir.cpp \
114 backend/vcc_yacc.cpp \ 115 backend/vcc_yacc.cpp \
115 backend/vobject.cpp \ 116 backend/vobject.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
122 124
123# Qt 3 compatibility 125# Qt 3 compatibility
124HEADERS += quuid.h qcom.h qlibrary.h qlibrary_p.h 126HEADERS += quuid.h qcom.h qlibrary.h qlibrary_p.h
125SOURCES += quuid.cpp qlibrary.cpp qlibrary_unix.cpp 127SOURCES += quuid.cpp qlibrary.cpp qlibrary_unix.cpp
126 128
127DEFINES += OPIE_INTERNAL_LIBRARY_BUILD 129DEFINES += OPIE_INTERNAL_LIBRARY_BUILD
128INCLUDEPATH += $(OPIEDIR)/include backend 130INCLUDEPATH += $(OPIEDIR)/include backend
129 LIBS += -ldl -lcrypt -lm 131 LIBS += -ldl -lcrypt -lm
130INTERFACES = passwordbase_p.ui categoryeditbase_p.ui findwidgetbase_p.ui lnkpropertiesbase_p.ui 132INTERFACES = passwordbase_p.ui categoryeditbase_p.ui findwidgetbase_p.ui lnkpropertiesbase_p.ui
131 TARGET = qpe 133 TARGET = qpe
132 DESTDIR = $(OPIEDIR)/lib$(PROJMAK) 134 DESTDIR = $(OPIEDIR)/lib$(PROJMAK)
133 VERSION = 1.5.0.1 135 VERSION = 1.5.0.1
134 136
135include( $(OPIEDIR)/include.pro ) 137include( $(OPIEDIR)/include.pro )
136 138
137contains( CONFIG, LIBQPE_WITHROHFEEDBACK ){ 139contains( CONFIG, LIBQPE_WITHROHFEEDBACK ){
138 DEFINES += OPIE_WITHROHFEEDBACK 140 DEFINES += OPIE_WITHROHFEEDBACK
139 SOURCES += backend/rohfeedback.cpp 141 SOURCES += backend/rohfeedback.cpp
140 HEADERS += backend/rohfeedback.h 142 HEADERS += backend/rohfeedback.h
141} 143}
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
84class LocationComboPrivate
85{
86public:
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 */
97LocationCombo::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 */
111LocationCombo::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 */
124LocationCombo::~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 */
134void 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*/
167void 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 */
222void 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 */
246bool 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 */
258QString 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 */
268QString 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 */
277const 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
291void 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
46class AppLnk;
47class QListViewItem;
48class DocLnk;
49class FileSystem;
50class StorageInfo;
51
52
53class LocationComboPrivate;
54
55class LocationCombo : public QComboBox
56{
57 Q_OBJECT
58public:
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
73signals:
74 void newPath();
75
76private slots:
77 void updatePaths();
78
79private:
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
@@ -73,171 +73,171 @@ void* QLibraryPrivate::resolveSymbol( const char* symbol )
73#endif 73#endif
74 return 0; 74 return 0;
75 } 75 }
76 return address; 76 return address;
77} 77}
78 78
79#elif defined(_NULL_LIB_) 79#elif defined(_NULL_LIB_)
80 80
81bool QLibraryPrivate::loadLibrary() 81bool QLibraryPrivate::loadLibrary()
82{ 82{
83 //qDebug("QLibraryPrivate::loadLibrary\n"); 83 //qDebug("QLibraryPrivate::loadLibrary\n");
84 return FALSE; 84 return FALSE;
85} 85}
86bool QLibraryPrivate::freeLibrary() 86bool QLibraryPrivate::freeLibrary()
87{ 87{
88 //qDebug("QLibraryPrivate::freeLibrary\n"); 88 //qDebug("QLibraryPrivate::freeLibrary\n");
89 return FALSE; 89 return FALSE;
90} 90}
91void* QLibraryPrivate::resolveSymbol( const char* symbol ) 91void* QLibraryPrivate::resolveSymbol( const char* symbol )
92{ 92{
93 //qDebug("QLibraryPrivate::resolveSymbol\n"); 93 //qDebug("QLibraryPrivate::resolveSymbol\n");
94 return FALSE; 94 return FALSE;
95} 95}
96 96
97#elif defined(Q_OS_MACX) 97#elif defined(Q_OS_MACX)
98 98
99#define ENUM_DYLD_BOOL 99#define ENUM_DYLD_BOOL
100enum DYLD_BOOL { 100enum DYLD_BOOL {
101 DYLD_FALSE, 101 DYLD_FALSE,
102 DYLD_TRUE 102 DYLD_TRUE
103}; 103};
104#include <mach-o/dyld.h> 104#include <mach-o/dyld.h>
105typedef struct { 105typedef struct {
106 NSObjectFileImage img; 106 NSObjectFileImage img;
107 NSModule mod; 107 NSModule mod;
108} DyldLibDesc; 108} DyldLibDesc;
109 109
110bool QLibraryPrivate::loadLibrary() 110bool QLibraryPrivate::loadLibrary()
111{ 111{
112 // qDebug("QLibraryPrivate::loadLibrary\n"); 112 // qDebug("QLibraryPrivate::loadLibrary\n");
113 // return FALSE; 113 // return FALSE;
114 if ( pHnd ) 114 if ( pHnd )
115 return TRUE; 115 return TRUE;
116 116
117 QString filename = library->library(); 117 QString filename = library->library();
118 118
119 NSObjectFileImage img = 0; 119 NSObjectFileImage img = 0;
120 NSModule mod = 0; 120 NSModule mod = 0;
121 NSObjectFileImageReturnCode ret = NSCreateObjectFileImageFromFile( filename.latin1() , &img ); 121 NSObjectFileImageReturnCode ret = NSCreateObjectFileImageFromFile( filename.latin1() , &img );
122 if ( ret != NSObjectFileImageSuccess ) { 122 if ( ret != NSObjectFileImageSuccess ) {
123 qWarning( "Error in NSCreateObjectFileImageFromFile(): %d; Filename: %s", ret, filename.latin1() ); 123 qWarning( "Error in NSCreateObjectFileImageFromFile(): %d; Filename: %s", ret, filename.latin1() );
124 if (ret == NSObjectFileImageAccess) { 124 if (ret == NSObjectFileImageAccess) {
125 qWarning ("(NSObjectFileImageAccess)" ); 125 qWarning ("(NSObjectFileImageAccess)" );
126 } 126 }
127 } else { 127 } else {
128 mod = NSLinkModule(img, filename.latin1(), NSLINKMODULE_OPTION_BINDNOW | 128 mod = NSLinkModule(img, filename.latin1(), NSLINKMODULE_OPTION_BINDNOW |
129 NSLINKMODULE_OPTION_PRIVATE | 129 NSLINKMODULE_OPTION_PRIVATE |
130 NSLINKMODULE_OPTION_RETURN_ON_ERROR); 130 NSLINKMODULE_OPTION_RETURN_ON_ERROR);
131 if (mod == 0) { 131 if (mod == 0) {
132 qWarning( "Error in NSLinkModule()" ); 132 qWarning( "Error in NSLinkModule()" );
133 NSDestroyObjectFileImage(img); 133 NSDestroyObjectFileImage(img);
134 } 134 }
135 } 135 }
136 DyldLibDesc* desc = 0; 136 DyldLibDesc* desc = 0;
137 if (img != 0 && mod != 0) { 137 if (img != 0 && mod != 0) {
138 desc = new DyldLibDesc; 138 desc = new DyldLibDesc;
139 desc->img = img; 139 desc->img = img;
140 desc->mod = mod; 140 desc->mod = mod;
141 } 141 }
142 pHnd = desc; 142 pHnd = desc;
143 return pHnd != 0; 143 return pHnd != 0;
144} 144}
145 145
146bool QLibraryPrivate::freeLibrary() 146bool QLibraryPrivate::freeLibrary()
147{ 147{
148 //qDebug("QLibraryPrivate::freeLibrary\n"); 148 //qDebug("QLibraryPrivate::freeLibrary\n");
149 //return FALSE; 149 //return FALSE;
150 if ( !pHnd ) 150 if ( !pHnd )
151 return TRUE; 151 return TRUE;
152 152
153 DyldLibDesc* desc = (DyldLibDesc*) pHnd; 153 DyldLibDesc* desc = (DyldLibDesc*) pHnd;
154 NSModule mod = desc->mod; 154 NSModule mod = desc->mod;
155 NSObjectFileImage img = desc->img; 155 NSObjectFileImage img = desc->img;
156 bool success = NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE); 156 bool success = NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE);
157 if ( success ) { 157 if ( success ) {
158 NSDestroyObjectFileImage(img); 158 NSDestroyObjectFileImage(img);
159 delete desc; 159 delete desc;
160 pHnd = 0; 160 pHnd = 0;
161 } 161 }
162#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) 162#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
163 else { 163 else {
164 qWarning( "Error in NSUnLinkModule()" ); 164 qWarning( "Error in NSUnLinkModule()" );
165 } 165 }
166#endif 166#endif
167 return pHnd == 0; 167 return pHnd == 0;
168} 168}
169 169
170void* QLibraryPrivate::resolveSymbol( const char* symbol ) 170void* QLibraryPrivate::resolveSymbol( const char* symbol )
171{ 171{
172 //qDebug("QLibraryPrivate::resolveSymbol\n"); 172 //qDebug("QLibraryPrivate::resolveSymbol\n");
173 //return FALSE; 173 //return FALSE;
174 if ( !pHnd ) 174 if ( !pHnd )
175 return 0; 175 return 0;
176 176
177 DyldLibDesc* desc = (DyldLibDesc*) pHnd; 177 DyldLibDesc* desc = (DyldLibDesc*) pHnd;
178 NSSymbol sym = NSLookupSymbolInModule(desc->mod, symbol); 178 NSSymbol sym = NSLookupSymbolInModule(desc->mod, symbol);
179 void* address = 0; 179 void* address = 0;
180 if (sym != 0) { 180 if (sym != 0) {
181 address = NSAddressOfSymbol(sym); 181 address = NSAddressOfSymbol(sym);
182 } 182 }
183#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) 183#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
184 if ( address == 0 ) 184 if ( address == 0 )
185 qWarning( "Cannot find symbol: %s", symbol ); 185 qWarning( "Cannot find symbol: %s", symbol );
186#endif 186#endif
187 return address; 187 return address;
188} 188}
189 189
190#else 190#else
191// Something else, assuming POSIX 191// Something else, assuming POSIX
192#include <dlfcn.h> 192#include <dlfcn.h>
193 193
194bool QLibraryPrivate::loadLibrary() 194bool QLibraryPrivate::loadLibrary()
195{ 195{
196 if ( pHnd ) 196 if ( pHnd )
197 return TRUE; 197 return TRUE;
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() );
205// #endif 205// #endif
206 return pHnd != 0; 206 return pHnd != 0;
207} 207}
208 208
209bool QLibraryPrivate::freeLibrary() 209bool QLibraryPrivate::freeLibrary()
210{ 210{
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)
218 else { 218 else {
219 const char* error = dlerror(); 219 const char* error = dlerror();
220 if ( error ) 220 if ( error )
221 qWarning( "%s", error ); 221 qWarning( "%s", error );
222 } 222 }
223#endif 223#endif
224 return pHnd == 0; 224 return pHnd == 0;
225} 225}
226 226
227void* QLibraryPrivate::resolveSymbol( const char* f ) 227void* QLibraryPrivate::resolveSymbol( const char* f )
228{ 228{
229 if ( !pHnd ) 229 if ( !pHnd )
230 return 0; 230 return 0;
231 231
232 void* address = dlsym( pHnd, f ); 232 void* address = dlsym( pHnd, f );
233#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) 233#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
234 const char* error = dlerror(); 234 const char* error = dlerror();
235 if ( error ) 235 if ( error )
236 qWarning( "%s", error ); 236 qWarning( "%s", error );
237#endif 237#endif
238 return address; 238 return address;
239} 239}
240 240
241#endif // POSIX 241#endif // POSIX
242 242
243#endif // QT_NO_COMPONENT 243#endif // QT_NO_COMPONENT
diff --git a/library/timestring.cpp b/library/timestring.cpp
index 91c29ae..afd162d 100644
--- a/library/timestring.cpp
+++ b/library/timestring.cpp
@@ -1,365 +1,466 @@
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**
16** Contact info@trolltech.com if any conditions of this licensing are 31** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 32** not clear to you.
18** 33**
19**********************************************************************/ 34**********************************************************************/
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
27class TimeStringFormatKeeper : public QObject 45class TimeStringFormat : public QObject
28{ 46{
29 Q_OBJECT 47 Q_OBJECT
30public: 48public:
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 }
37private slots: 55private slots:
38 void formatChanged( DateFormat f ) 56 void formatChanged( DateFormat f )
39 { 57 {
40 format = f; 58 format = f;
41 } 59 }
42private: 60private:
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
60TimeStringFormatKeeper *TimeStringFormatKeeper::self = 0; 78TimeStringFormat *TimeStringFormat::self = 0;
61 79
62QString DateFormat::toNumberString() const 80QString DateFormat::toNumberString() const
63{ 81{
64 QString buf = ""; 82 QString buf = "";
65 // for each part of the order 83 // for each part of the order
66 for (int i = 0; i < 3; i++) { 84 for (int i = 0; i < 3; i++) {
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)
80 buf += _shortSeparator; 98 buf += _shortSeparator;
81 } 99 }
82 return buf; 100 return buf;
83} 101}
84 102
85QString DateFormat::toWordString() const 103QString DateFormat::toWordString() const
86{ 104{
87 QString buf = ""; 105 QString buf = "";
88 // for each part of the order 106 // for each part of the order
89 for (int i = 0; i < 3; i++) { 107 for (int i = 0; i < 3; i++) {
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 += ", ";
97 else 115 else
98 buf += " "; 116 buf += " ";
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;
111 } 129 }
112 } 130 }
113 return buf; 131 return buf;
114} 132}
115 133
116QString DateFormat::numberDate(const QDate &d, int v) const 134QString DateFormat::numberDate(const QDate &d, int v) const
117{ 135{
118 QString buf = ""; 136 QString buf = "";
119 137
120 int pad = 2; 138 int pad = 2;
121 139
122 // for each part of the order 140 // for each part of the order
123 for (int i = 0; i < 3; i++) { 141 for (int i = 0; i < 3; i++) {
124 // switch on the relavent 3 bits. 142 // switch on the relavent 3 bits.
125 switch((_shortOrder >> (i * 3)) & 0x0007) { 143 switch((_shortOrder >> (i * 3)) & 0x0007) {
126 case 0x0001: 144 case 0x0001:
127 if (pad==2) buf += QString().sprintf("%02d",d.day()); 145 if (pad==2) buf += QString().sprintf("%02d",d.day());
128 else buf += QString().sprintf("%d",d.day()); 146 else buf += QString().sprintf("%d",d.day());
129 break; 147 break;
130 case 0x0002: 148 case 0x0002:
131 if (i==0) { // no padding with only MM/DD/YY format 149 if (i==0) { // no padding with only MM/DD/YY format
132 pad=0; 150 pad=0;
133 } 151 }
134 if (pad==2) buf += QString().sprintf("%02d",d.month()); 152 if (pad==2) buf += QString().sprintf("%02d",d.month());
135 else buf += QString().sprintf("%d",d.month()); 153 else buf += QString().sprintf("%d",d.month());
136 break; 154 break;
137 case 0x0004: 155 case 0x0004:
138 { 156 {
139 int year = d.year(); 157 int year = d.year();
140 if (!(v & longNumber)) 158 if (!(v & longNumber))
141 year = year % 100; 159 year = year % 100;
142 buf += QString().sprintf("%02d",year); 160 buf += QString().sprintf("%02d",year);
143 } 161 }
144 break; 162 break;
145 } 163 }
146 if (i < 2) 164 if (i < 2)
147 buf += _shortSeparator; 165 buf += _shortSeparator;
148 } 166 }
149 return buf; 167 return buf;
150} 168}
151 169
170static 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
185static 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
197static const char* unTranslatedMediumDayNames[] = {
198 "Mon" , "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
199};
200
201static const char* unTranslatedMediumMonthNames[] = {
202 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
203 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
204};
205#endif
206
207static 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
152QString DateFormat::wordDate(const QDate &d, int v) const 220QString 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
213void DateFormat::save(QDataStream &d) const 307void DateFormat::save(QDataStream &d) const
214{ 308{
215 d << _shortSeparator.unicode(); 309 d << _shortSeparator.unicode();
216 uint v= _shortOrder; 310 uint v= _shortOrder;
217 d << v; 311 d << v;
218 v = _longOrder; 312 v = _longOrder;
219 d << v; 313 d << v;
220} 314}
221 315
222void DateFormat::load(QDataStream &d) 316void DateFormat::load(QDataStream &d)
223{ 317{
224 ushort value; 318 ushort value;
225 d >> value; 319 d >> value;
226 _shortSeparator = QChar(value); 320 _shortSeparator = QChar(value);
227 uint v = 0; 321 uint v = 0;
228 d >> v; 322 d >> v;
229 _shortOrder = (Order)v; 323 _shortOrder = (Order)v;
230 v = 0; 324 v = 0;
231 d >> v; 325 d >> v;
232 _longOrder = (Order)v; 326 _longOrder = (Order)v;
233} 327}
234 328
235QDataStream &operator<<(QDataStream &s, const DateFormat&df) 329QDataStream &operator<<(QDataStream &s, const DateFormat&df)
236{ 330{
237 df.save(s); 331 df.save(s);
238 return s; 332 return s;
239} 333}
240QDataStream &operator>>(QDataStream &s, DateFormat&df) 334QDataStream &operator>>(QDataStream &s, DateFormat&df)
241{ 335{
242 df.load(s); 336 df.load(s);
243 return s; 337 return s;
244} 338}
245#endif 339#endif
246 340
247QString TimeString::shortDate( const QDate &d, DateFormat dtf ) 341QString TimeString::shortDate( const QDate &d, DateFormat dtf )
248{ 342{
249 return dtf.wordDate(d); 343 return dtf.wordDate(d);
250} 344}
251 345
252QString TimeString::dateString( const QDate &d, DateFormat dtf ) 346QString 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
258QString TimeString::longDateString( const QDate &d, DateFormat dtf ) 352QString 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
264DateFormat TimeString::currentDateFormat() 358DateFormat TimeString::currentDateFormat()
265{ 359{
266 return TimeStringFormatKeeper::currentFormat(); 360 return TimeStringFormat::currentFormat();
267} 361}
268 362
269 363
270QString TimeString::dateString( const QDateTime &dt, bool ampm, bool seconds, DateFormat dtf ) 364QString TimeString::dateString( const QDateTime &dt, bool ampm, bool seconds, DateFormat dtf )
271{ 365{
272 const QDate& d = dt.date(); 366 const QDate& d = dt.date();
273 const QTime& t = dt.time(); 367 const QTime& t = dt.time();
274 368
275 // based on QDateTime::toString() 369 // based on QDateTime::toString()
276 QString buf = timeString(t,ampm,seconds); 370 QString buf = timeString(t,ampm,seconds);
277 buf += " "; 371 buf += " ";
278 buf += longDateString( d, dtf ); 372 buf += longDateString( d, dtf );
279 373
280 return buf; 374 return buf;
281} 375}
282 376
283QString TimeString::timeString( const QTime &t, bool ampm, bool seconds ) 377QString TimeString::timeString( const QTime &t, bool ampm, bool seconds )
284{ 378{
285 if ( !ampm ) { 379 if ( !ampm ) {
286 if ( seconds ) 380 if ( seconds )
287 return t.toString(); 381 return t.toString();
288 QString r = QString::number(t.hour()); 382 QString r = QString::number(t.hour());
289 if ( t.hour() < 10 ) r.prepend( "0" ); 383 if ( t.hour() < 10 ) r.prepend( "0" );
290 r.append( ":" ); 384 r.append( ":" );
291 if ( t.minute() < 10 ) r.append( "0" ); 385 if ( t.minute() < 10 ) r.append( "0" );
292 r.append(QString::number(t.minute())); 386 r.append(QString::number(t.minute()));
293 return r; 387 return r;
294 } 388 }
295 // ### else the hard case that should disappear in Qt 3.0 389 // ### else the hard case that should disappear in Qt 3.0
296 QString argString = seconds ? "%4:%5:%6 %7" : "%4:%5 %7"; 390 QString argString = seconds ? "%4:%5:%6 %7" : "%4:%5 %7";
297 int hour = t.hour(); 391 int hour = t.hour();
298 QString strMin = QString::number( t.minute() ); 392 QString strMin = QString::number( t.minute() );
299 QString strSec = QString::number( t.second() ); 393 QString strSec = QString::number( t.second() );
300 if ( hour > 12 ) 394 if ( hour > 12 )
301 argString = argString.arg( hour - 12, 2 ); 395 argString = argString.arg( hour - 12, 2 );
302 else { 396 else {
303 if ( hour == 0 ) 397 if ( hour == 0 )
304 argString = argString.arg( 12 ); 398 argString = argString.arg( 12 );
305 else 399 else
306 argString = argString.arg( hour, 2 ); 400 argString = argString.arg( hour, 2 );
307 } 401 }
308 if ( t.minute() < 10 ) 402 if ( t.minute() < 10 )
309 strMin.prepend( "0" ); 403 strMin.prepend( "0" );
310 if ( t.second() < 10 ) 404 if ( t.second() < 10 )
311 strSec.prepend( "0" ); 405 strSec.prepend( "0" );
312 argString = argString.arg( strMin ); 406 argString = argString.arg( strMin );
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
322QString TimeString::shortTime( bool ampm, bool seconds ) 416QString 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
341QString TimeString::dateString( const QDateTime &t, bool ampm ) 426QString TimeString::dateString( const QDateTime &t, bool ampm )
342{ 427{
343 return dateString(t,ampm,FALSE); 428 return dateString(t,ampm,FALSE);
344} 429}
345 430
346QString TimeString::timeString( const QTime &t, bool ampm) 431QString TimeString::timeString( const QTime &t, bool ampm)
347{ 432{
348 return timeString(t,ampm,FALSE); 433 return timeString(t,ampm,FALSE);
349} 434}
350 435
351QString TimeString::shortTime( bool ampm ) 436QString TimeString::shortTime( bool ampm )
352{ 437{
353 return shortTime(ampm,FALSE); 438 return shortTime(ampm,FALSE);
354} 439}
355 440
356QString TimeString::numberDateString( const QDate &d, DateFormat dtf ) 441QString TimeString::numberDateString( const QDate &d, DateFormat dtf )
357{ 442{
358 return dtf.numberDate(d); 443 return dtf.numberDate(d);
359} 444}
360QString TimeString::longNumberDateString( const QDate &d, DateFormat dtf ) 445QString 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,150 +1,182 @@
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
17** not clear to you. 32** not clear to you.
18** 33**
19**********************************************************************/ 34**********************************************************************/
20 35
21#ifndef _TIMESTRING_H_ 36#ifndef _TIMESTRING_H_
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
48class 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)
34class DateFormat 54class DateFormat
35{ 55{
36public: 56public:
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),
45 _longOrder(so), _shortSeparator(s) { } 65 _longOrder(so), _shortSeparator(s) { }
46 DateFormat(QChar s, Order so, Order lo) : _shortOrder(so), 66 DateFormat(QChar s, Order so, Order lo) : _shortOrder(so),
47 _longOrder(lo), _shortSeparator(s) { } 67 _longOrder(lo), _shortSeparator(s) { }
48 DateFormat(const DateFormat &o) : _shortOrder(o._shortOrder), 68 DateFormat(const DateFormat &o) : _shortOrder(o._shortOrder),
49 _longOrder(o._longOrder), _shortSeparator(o._shortSeparator) { } 69 _longOrder(o._longOrder), _shortSeparator(o._shortSeparator) { }
50 70
51 bool operator==(const DateFormat &o) 71 bool operator==(const DateFormat &o)
52 { 72 {
53 if (o._shortOrder == _shortOrder && o._longOrder == _longOrder && 73 if (o._shortOrder == _shortOrder && o._longOrder == _longOrder &&
54 o._shortSeparator == _shortSeparator) 74 o._shortSeparator == _shortSeparator)
55 return TRUE; 75 return TRUE;
56 return FALSE; 76 return FALSE;
57 } 77 }
58 78
59 // verbosity specifiers 79 // verbosity specifiers
60 enum Verbosity { 80 enum Verbosity {
61 shortNumber = 0x01, // default 81 shortNumber = 0x01, // default
62 longNumber = 0x02, 82 longNumber = 0x02,
63 83
64 padNumber = 0x04, 84 padNumber = 0x04,
65 85
66 shortWord = 0x08, // default 86 shortWord = 0x08, // default
67 longWord = 0x10, 87 longWord = 0x10,
68 88
69 showWeekDay = 0x20 89 showWeekDay = 0x20
70 }; 90 };
71 91
72 QString toNumberString() const; // the M/D/Y string. 92 QString toNumberString() const; // the M/D/Y string.
73 QString toWordString() const; // the Month day, year string. 93 QString toWordString() const; // the Month day, year string.
74 94
75 QString numberDate(const QDate &d, int v = 0) const; 95 QString numberDate(const QDate &d, int v = 0) const;
76 QString wordDate(const QDate &d, int v = 0) const; 96 QString wordDate(const QDate &d, int v = 0) const;
77 97
78#ifndef QT_NO_DATASTREAM 98#ifndef QT_NO_DATASTREAM
79 void load(QDataStream&); 99 void load(QDataStream&);
80 void save(QDataStream&) const; 100 void save(QDataStream&) const;
81#endif 101#endif
82 102
83 QChar separator() const { return _shortSeparator; }; 103 QChar separator() const { return _shortSeparator; };
84 Order shortOrder() const { return _shortOrder; }; 104 Order shortOrder() const { return _shortOrder; };
85 Order longOrder() const { return _longOrder; }; 105 Order longOrder() const { return _longOrder; };
86 106
87private: 107private:
88 Order _shortOrder; 108 Order _shortOrder;
89 Order _longOrder; 109 Order _longOrder;
90 QChar _shortSeparator; 110 QChar _shortSeparator;
91}; 111};
92 112
93#ifndef QT_NO_DATASTREAM 113#ifndef QT_NO_DATASTREAM
94QDataStream &operator<<(QDataStream &s, const DateFormat&df); 114QDataStream &operator<<(QDataStream &s, const DateFormat&df);
95QDataStream &operator>>(QDataStream &s, DateFormat&df); 115QDataStream &operator>>(QDataStream &s, DateFormat&df);
96#endif 116#endif
97 117
98class TimeString 118class TimeString
99{ 119{
100public: 120public:
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
136public:
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 )
133 { return numberDateString( d, currentDateFormat() ); } 167 { return numberDateString( d, currentDateFormat() ); }
134 static QString longNumberDateString( const QDate &d, DateFormat ); 168 static QString longNumberDateString( const QDate &d, DateFormat );
135 static QString longNumberDateString( const QDate &d ) 169 static QString longNumberDateString( const QDate &d )
136 { return longNumberDateString( d, currentDateFormat() ); } 170 { return longNumberDateString( d, currentDateFormat() ); }
137 171
138 static QString shortDate( const QDate &, DateFormat ); 172 static QString shortDate( const QDate &, DateFormat );
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
144private: 176private:
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
150#endif 182#endif
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 @@
1DESTDIR = $(OPIEDIR)/bin
2TEMPLATE = app
3CONFIG += qte warn_on quick_app
4INTERFACES=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
15DEFINES += HAVE_VIDEO4LINUX
16
17LIBS += -lopiecore2 -lopieui2
18INCLUDEPATH += $(OPIEDIR)/include
19DEPENDPATH += $(OPIEDIR)/include
20contains(CONFIG,quick-app) {
21 DESTDIR = $(OPIEDIR)/bin
22 DEFINES += NOQUICKLAUNCH
23}
24
25
26include( $(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 */
24CameraBase::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 */
89CameraBase::~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>
14class QVBoxLayout;
15class QHBoxLayout;
16class QGridLayout;
17class QFrame;
18class QPushButton;
19class ThumbButton;
20class VideoCaptureView;
21
22class CameraBase : public QWidget
23{
24 Q_OBJECT
25
26public:
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
41protected:
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 */
29CameraSettings::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 */
162CameraSettings::~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>
14class QVBoxLayout;
15class QHBoxLayout;
16class QGridLayout;
17class LocationCombo;
18class QComboBox;
19class QGroupBox;
20class QLabel;
21class QSlider;
22
23class CameraSettings : public QDialog
24{
25 Q_OBJECT
26
27public:
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
48protected:
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*/
49QImage 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//
123QSize 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
147QImage 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
194QImage 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//
210QSize
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
42class Image {
43public:
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
40using namespace Opie::Core;
41OPIE_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>
47using 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
77static const int thmarg = 2;
78static const bool video_supported = FALSE;
79
80CameraMainWindow::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
240CameraMainWindow::~CameraMainWindow()
241{
242}
243
244void 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
252bool 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
264bool 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
334void 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
366void CameraMainWindow::viewPictures()
367{
368#warning fixme
369// ServiceRequest req("PhotoEdit","showCategory(int)");
370// req << camcat;
371// req.send();
372}
373
374void CameraMainWindow::viewVideos()
375{
376#warning fixme
377// Service::appLnk("Open/video/mpeg").execute();
378}
379
380void 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
413void 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
439static 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
448void 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
499void 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
523void 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
546void 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
569void 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
599bool CameraMainWindow::inSnapMode() const
600{
601 return !snap_ch.isEmpty();
602}
603
604void 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
620void 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
633void CameraMainWindow::startVideo()
634{
635 // XXX eg. MJPG
636}
637void CameraMainWindow::stopVideo()
638{
639}
640
641void CameraMainWindow::thumbClicked(int i)
642{
643 selectThumb(i);
644}
645
646void CameraMainWindow::editThumb()
647{
648 picturefile[cur_thumb].execute();
649}
650
651void 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
668void 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
679void 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
689void CameraMainWindow::linkChanged(const QString &)
690{
691 loadThumbs();
692}
693
694void 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
704void 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
715void 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
751void 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
760ThumbButton::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
43class LocationCombo;
44class QAction;
45class QTimer;
46class CameraSettings;
47
48
49class CameraMainWindow : public QMainWindow
50{
51 Q_OBJECT
52public:
53 static QString appName() { return QString::fromLatin1("camera2"); }
54
55 CameraMainWindow( QWidget *parent=0, const char *name=0, WFlags fl=0 );
56 ~CameraMainWindow();
57
58public slots:
59 void takePhoto();
60 void toggleVideo();
61 void selectThumb(int i);
62 void thumbClicked(int i);
63
64private 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
76private:
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 @@
1Package: opie-camera2
2Files: bin/camerapics/camera2 apps/Applications/camera2.desktop
3Priority: optional
4Section: opie/multimedia
5Maintainer: Lorn "ljp" Potter <lorn.potter@trolltech.com>
6Architecture: arm
7Version: 1.0.1$EXTRAVERSION
8Depends: libqpe1, libopiecore2, libopieui2
9Description: 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
40class ThumbButton : public QToolButton
41{
42 Q_OBJECT
43public:
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
62class 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
101bool VideoCapture::hasCamera() const
102{
103 return (fd != -1);
104}
105
106QSize VideoCapture::captureSize() const
107{
108 return QSize(width, height);
109}
110
111uint VideoCapture::refocusDelay() const
112{
113 return 250;
114}
115
116int VideoCapture::minimumFramePeriod() const
117{
118 return 40; // milliseconds
119}
120
121VideoCapture::VideoCapture()
122{
123 setupCamera(QSize(0, 0));
124}
125
126VideoCapture::~VideoCapture()
127{
128 shutdown();
129}
130
131void 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
263void 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
278void 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
322QValueList < 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
331QValueList < QSize > VideoCapture::videoSizes() const
332{
333 // We use the same sizes for both.
334 return photoSizes();
335}
336
337QSize VideoCapture::recommendedPhotoSize() const
338{
339 return QSize(caps.maxwidth, caps.maxheight);
340}
341
342QSize VideoCapture::recommendedVideoSize() const
343{
344 return QSize(caps.minwidth, caps.minheight);
345}
346
347QSize VideoCapture::recommendedPreviewSize() const
348{
349 return QSize(caps.minwidth, caps.minheight);
350}
351
352void 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
364VideoCapture::VideoCapture()
365{
366}
367
368VideoCapture::~VideoCapture()
369{
370}
371
372bool VideoCapture::hasCamera() const
373{
374 return TRUE;
375}
376
377QSize VideoCapture::captureSize() const
378{
379 return QSize(640, 480);
380}
381
382uint VideoCapture::refocusDelay() const
383{
384 return 0;
385}
386
387int VideoCapture::minimumFramePeriod() const
388{
389 return 100;
390}
391
392static 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
409void 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
435QValueList < 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
443QValueList < 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
451QSize VideoCapture::recommendedPhotoSize() const
452{
453 return QSize(640, 480);
454}
455
456QSize VideoCapture::recommendedVideoSize() const
457{
458 return QSize(320, 240);
459}
460
461QSize VideoCapture::recommendedPreviewSize() const
462{
463 return QSize(320, 240);
464}
465
466void VideoCapture::setCaptureSize(QSize size)
467{
468}
469
470#endif /* !HAVE_VIDEO4LINUX */
471
472VideoCaptureView::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
482VideoCaptureView::~VideoCaptureView()
483{
484 delete capture;
485}
486
487void 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
499void VideoCaptureView::setStill(const QImage & i)
500{
501 setLive(-1);
502 img = i;
503 repaint(TRUE);
504}
505
506QValueList < QSize > VideoCaptureView::photoSizes() const
507{
508 return capture->photoSizes();
509}
510
511QValueList < QSize > VideoCaptureView::videoSizes() const
512{
513 return capture->videoSizes();
514}
515
516QSize VideoCaptureView::recommendedPhotoSize() const
517{
518 return capture->recommendedPhotoSize();
519}
520
521QSize VideoCaptureView::recommendedVideoSize() const
522{
523 return capture->recommendedVideoSize();
524}
525
526QSize VideoCaptureView::recommendedPreviewSize() const
527{
528 return capture->recommendedPreviewSize();
529}
530
531QSize VideoCaptureView::captureSize() const
532{
533 return capture->captureSize();
534}
535
536void VideoCaptureView::setCaptureSize(QSize size)
537{
538 capture->setCaptureSize(size);
539}
540
541uint VideoCaptureView::refocusDelay() const
542{
543 return capture->refocusDelay();
544}
545
546bool VideoCaptureView::available() const
547{
548 return capture->hasCamera();
549}
550
551void 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
595void 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
42class VideoCapture;
43
44
45class VideoCaptureView : public QWidget
46{
47 Q_OBJECT
48
49public:
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
71protected:
72 void paintEvent(QPaintEvent*);
73 void timerEvent(QTimerEvent*);
74
75private:
76 QImage img;
77 int tid_update;
78 VideoCapture *capture;
79};
80
81#endif
82
diff --git a/packages b/packages
index 08e1ea9..d45dbf7 100644
--- a/packages
+++ b/packages
@@ -1,150 +1,151 @@
1 CONFIG_ABOUTAPPLET core/applets/aboutappletaboutapplet.pro 1 CONFIG_ABOUTAPPLET core/applets/aboutappletaboutapplet.pro
2 CONFIG_ADDRESSBOOK core/pim/addressbookaddressbook.pro 2 CONFIG_ADDRESSBOOK core/pim/addressbookaddressbook.pro
3 CONFIG_ADVANCEDFM noncore/apps/advancedfmadvancedfm.pro 3 CONFIG_ADVANCEDFM noncore/apps/advancedfmadvancedfm.pro
4 CONFIG_APPEARANCE2 noncore/settings/appearance2appearance2.pro 4 CONFIG_APPEARANCE2 noncore/settings/appearance2appearance2.pro
5 CONFIG_APPSKEY noncore/settings/appskeyappskey.pro 5 CONFIG_APPSKEY noncore/settings/appskeyappskey.pro
6 CONFIG_AQPKG noncore/settings/aqpkgaqpkg.pro 6 CONFIG_AQPKG noncore/settings/aqpkgaqpkg.pro
7 CONFIG_AUTOROTATEAPPLET noncore/applets/autorotateappletautorotateapplet.pro 7 CONFIG_AUTOROTATEAPPLET noncore/applets/autorotateappletautorotateapplet.pro
8 CONFIG_BACKGAMMONnoncore/games/backgammon backgammon.pro 8 CONFIG_BACKGAMMONnoncore/games/backgammon backgammon.pro
9 CONFIG_BACKUP noncore/settings/backupbackup.pro 9 CONFIG_BACKUP noncore/settings/backupbackup.pro
10 CONFIG_BARTENDER noncore/apps/opie-bartenderbartender.pro 10 CONFIG_BARTENDER noncore/apps/opie-bartenderbartender.pro
11 CONFIG_BATTERYAPPLET core/applets/batteryappletbatteryapplet.pro 11 CONFIG_BATTERYAPPLET core/applets/batteryappletbatteryapplet.pro
12 CONFIG_BEND noncore/unsupported/mail2/bendbend.pro 12 CONFIG_BEND noncore/unsupported/mail2/bendbend.pro
13CONFIG_BIGSCREEN_EXAMPLE unsupported/libopie/big-screen/example osplitter_mail.pro 13CONFIG_BIGSCREEN_EXAMPLE unsupported/libopie/big-screen/example osplitter_mail.pro
14 CONFIG_BLUE-PIN noncore/net/opietooth/blue-pinblue-pin.pro 14 CONFIG_BLUE-PIN noncore/net/opietooth/blue-pinblue-pin.pro
15 CONFIG_BOUNCE noncore/games/bouncebounce.pro 15 CONFIG_BOUNCE noncore/games/bouncebounce.pro
16 CONFIG_BRIGHTNESSAPPLET noncore/applets/brightnessappletbrightnessapplet.pro 16 CONFIG_BRIGHTNESSAPPLET noncore/applets/brightnessappletbrightnessapplet.pro
17 CONFIG_BUTTON-SETTINGS core/settings/buttonbutton.pro 17 CONFIG_BUTTON-SETTINGS core/settings/buttonbutton.pro
18 CONFIG_BUZZWORD noncore/games/buzzwordbuzzword.pro 18 CONFIG_BUZZWORD noncore/games/buzzwordbuzzword.pro
19 CONFIG_CALC2 noncore/tools/calc2calc2.pro 19 CONFIG_CALC2 noncore/tools/calc2calc2.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
26 CONFIG_CLIPBOARDAPPLET core/applets/clipboardappletclipboardapplet.pro 27 CONFIG_CLIPBOARDAPPLET core/applets/clipboardappletclipboardapplet.pro
27 CONFIG_CLOCKAPPLET core/applets/clockappletclockapplet.pro 28 CONFIG_CLOCKAPPLET core/applets/clockappletclockapplet.pro
28 CONFIG_CLOCK noncore/tools/clockclock.pro 29 CONFIG_CLOCK noncore/tools/clockclock.pro
29 CONFIG_CONFEDIT noncore/apps/confeditconfedit.pro 30 CONFIG_CONFEDIT noncore/apps/confeditconfedit.pro
30CONFIG_DAGGER noncore/apps/dagger dagger.pro 31CONFIG_DAGGER noncore/apps/dagger dagger.pro
31 CONFIG_DASHER inputmethods/dasherdasher.pro 32 CONFIG_DASHER inputmethods/dasherdasher.pro
32 CONFIG_DATEBOOK2 core/pim/datebook2datebook2.pro 33 CONFIG_DATEBOOK2 core/pim/datebook2datebook2.pro
33 CONFIG_DATEBOOK core/pim/datebookdatebook.pro 34 CONFIG_DATEBOOK core/pim/datebookdatebook.pro
34CONFIG_DATEBOOK_BIRTHDAYS_HOLIDAY core/pim/datebook/holiday/birthday birthdays.pro 35CONFIG_DATEBOOK_BIRTHDAYS_HOLIDAY core/pim/datebook/holiday/birthday birthdays.pro
35CONFIG_DATEBOOK_CHRISTIAN_HOLIDAY core/pim/datebook/holiday/christian christian-holidays.pro 36CONFIG_DATEBOOK_CHRISTIAN_HOLIDAY core/pim/datebook/holiday/christian christian-holidays.pro
36CONFIG_DATEBOOK_NATIONAL_HOLIDAY core/pim/datebook/holiday/national national-holidays.pro 37CONFIG_DATEBOOK_NATIONAL_HOLIDAY core/pim/datebook/holiday/national national-holidays.pro
37 CONFIG_DECO_FLAT noncore/decorations/flatflat.pro 38 CONFIG_DECO_FLAT noncore/decorations/flatflat.pro
38 CONFIG_DECO_LIQUID noncore/decorations/liquidliquid.pro 39 CONFIG_DECO_LIQUID noncore/decorations/liquidliquid.pro
39 CONFIG_DECO_POLISHED noncore/decorations/polishedpolished.pro 40 CONFIG_DECO_POLISHED noncore/decorations/polishedpolished.pro
40 CONFIG_DICTIONARY noncore/apps/dictionarydictionary.pro 41 CONFIG_DICTIONARY noncore/apps/dictionarydictionary.pro
41CONFIG_DOCTAB noncore/settings/doctab doctab.pro 42CONFIG_DOCTAB noncore/settings/doctab doctab.pro
42 CONFIG_DRAWPAD noncore/graphics/drawpaddrawpad.pro 43 CONFIG_DRAWPAD noncore/graphics/drawpaddrawpad.pro
43 CONFIG_DVORAK inputmethods/dvorakdvorak.pro 44 CONFIG_DVORAK inputmethods/dvorakdvorak.pro
44 CONFIG_EMBEDDEDKONSOLE core/apps/embeddedkonsoleembeddedkonsole.pro 45 CONFIG_EMBEDDEDKONSOLE core/apps/embeddedkonsoleembeddedkonsole.pro
45 CONFIG_EUROCONV noncore/tools/euroconv/ euroconv.pro 46 CONFIG_EUROCONV noncore/tools/euroconv/ euroconv.pro
46 CONFIG_EXAMPLE_APPLET examples/appletapplet.pro 47 CONFIG_EXAMPLE_APPLET examples/appletapplet.pro
47CONFIG_EXAMPLE_BOARD examples/inputmethod inputmethod.pro 48CONFIG_EXAMPLE_BOARD examples/inputmethod inputmethod.pro
48 CONFIG_EXAMPLE_LIBOPIE2BLUEZ examples/opiebluezopiebluez.pro 49 CONFIG_EXAMPLE_LIBOPIE2BLUEZ examples/opiebluezopiebluez.pro
49 CONFIG_EXAMPLE_LIBOPIE2COREexamples/opiecore opiecore.pro 50 CONFIG_EXAMPLE_LIBOPIE2COREexamples/opiecore opiecore.pro
50 CONFIG_EXAMPLE_LIBOPIE2DBexamples/opiedb opiedb.pro 51 CONFIG_EXAMPLE_LIBOPIE2DBexamples/opiedb opiedb.pro
51 CONFIG_EXAMPLE_LIBOPIE2MMexamples/opiemm opiemm.pro 52 CONFIG_EXAMPLE_LIBOPIE2MMexamples/opiemm opiemm.pro
52 CONFIG_EXAMPLE_LIBOPIE2NETexamples/opienet opienet.pro 53 CONFIG_EXAMPLE_LIBOPIE2NETexamples/opienet opienet.pro
53 CONFIG_EXAMPLE_LIBOPIE2PIMexamples/opiepim opiepim.pro 54 CONFIG_EXAMPLE_LIBOPIE2PIMexamples/opiepim opiepim.pro
54 CONFIG_EXAMPLE_LIBOPIE2SECURITYexamples/opiesecurity opiesecurity.pro 55 CONFIG_EXAMPLE_LIBOPIE2SECURITYexamples/opiesecurity opiesecurity.pro
55 CONFIG_EXAMPLE_LIBOPIE2UI examples/opieuiopieui.pro 56 CONFIG_EXAMPLE_LIBOPIE2UI examples/opieuiopieui.pro
56CONFIG_EXAMPLE_MENU examples/menuapplet menuapplet.pro 57CONFIG_EXAMPLE_MENU examples/menuapplet menuapplet.pro
57CONFIG_EXAMPLE_VPN examples/networksettings networksettings.pro 58CONFIG_EXAMPLE_VPN examples/networksettings networksettings.pro
58 CONFIG_FIFTEEN noncore/games/fifteenfifteen.pro 59 CONFIG_FIFTEEN noncore/games/fifteenfifteen.pro
59 CONFIG_FILEBROWSER noncore/unsupported/filebrowserfilebrowser.pro 60 CONFIG_FILEBROWSER noncore/unsupported/filebrowserfilebrowser.pro
60 CONFIG_FLAT noncore/styles/flatflat.pro 61 CONFIG_FLAT noncore/styles/flatflat.pro
61 CONFIG_FORMATTER noncore/tools/formatterformatter.pro 62 CONFIG_FORMATTER noncore/tools/formatterformatter.pro
62 CONFIG_FREETYPE freetypefreetype.pro 63 CONFIG_FREETYPE freetypefreetype.pro
63 CONFIG_FRESH noncore/styles/freshfresh.pro 64 CONFIG_FRESH noncore/styles/freshfresh.pro
64 CONFIG_FTPLIB noncore/net/ftplibftplib.pro 65 CONFIG_FTPLIB noncore/net/ftplibftplib.pro
65 CONFIG_GO noncore/games/gogo.pro 66 CONFIG_GO noncore/games/gogo.pro
66 CONFIG_GSMTOOL noncore/unsupported/gsmtoolgsmtool.pro 67 CONFIG_GSMTOOL noncore/unsupported/gsmtoolgsmtool.pro
67 CONFIG_GUTENBROWSER noncore/apps/opie-gutenbrowseropie-gutenbrowser.pro 68 CONFIG_GUTENBROWSER noncore/apps/opie-gutenbrowseropie-gutenbrowser.pro
68 CONFIG_HANDWRITING inputmethods/handwritinghandwriting.pro 69 CONFIG_HANDWRITING inputmethods/handwritinghandwriting.pro
69 CONFIG_HELPBROWSER core/apps/helpbrowserhelpbrowser.pro 70 CONFIG_HELPBROWSER core/apps/helpbrowserhelpbrowser.pro
70 CONFIG_HOMEAPPLET core/applets/homeapplethomeapplet.pro 71 CONFIG_HOMEAPPLET core/applets/homeapplethomeapplet.pro
71 CONFIG_HOTPLUG_QCOP core/tools/hotplug-qcophotplug-qcop.pro 72 CONFIG_HOTPLUG_QCOP core/tools/hotplug-qcophotplug-qcop.pro
72 CONFIG_INTERFACES noncore/settings/networksettings/interfacesinterfaces.pro 73 CONFIG_INTERFACES noncore/settings/networksettings/interfacesinterfaces.pro
73 CONFIG_IRDAAPPLET core/applets/irdaappletirdaapplet.pro 74 CONFIG_IRDAAPPLET core/applets/irdaappletirdaapplet.pro
74 CONFIG_JUMPX inputmethods/jumpxjumpx.pro 75 CONFIG_JUMPX inputmethods/jumpxjumpx.pro
75 CONFIG_KBILL noncore/games/kbillkbill.pro 76 CONFIG_KBILL noncore/games/kbillkbill.pro
76 CONFIG_KCHECKERS noncore/games/kcheckerskcheckers.pro 77 CONFIG_KCHECKERS noncore/games/kcheckerskcheckers.pro
77 CONFIG_KEYBOARD inputmethods/keyboardkeyboard.pro 78 CONFIG_KEYBOARD inputmethods/keyboardkeyboard.pro
78CONFIG_KEYHELPER noncore/applets/keyhelper keyhelper.pro 79CONFIG_KEYHELPER noncore/applets/keyhelper keyhelper.pro
79 CONFIG_KEYPEBBLE noncore/comm/keypebblekeypebble.pro 80 CONFIG_KEYPEBBLE noncore/comm/keypebblekeypebble.pro
80 CONFIG_KEYVIEW development/keyviewkeyview.pro 81 CONFIG_KEYVIEW development/keyviewkeyview.pro
81 CONFIG_KJUMPX inputmethods/kjumpxkjumpx.pro 82 CONFIG_KJUMPX inputmethods/kjumpxkjumpx.pro
82 CONFIG_KPACMAN noncore/games/kpacmankpacman.pro 83 CONFIG_KPACMAN noncore/games/kpacmankpacman.pro
83 CONFIG_LANGUAGE noncore/settings/languagelanguage.pro 84 CONFIG_LANGUAGE noncore/settings/languagelanguage.pro
84 CONFIG_LAUNCHER core/launcherserver.pro 85 CONFIG_LAUNCHER core/launcherserver.pro
85 CONFIG_LAUNCHER-SETTINGS core/settings/launcherlauncher.pro 86 CONFIG_LAUNCHER-SETTINGS core/settings/launcherlauncher.pro
86 CONFIG_LIBFFMPEG core/multimedia/opieplayer/libffmpeglibffmpeg.pro 87 CONFIG_LIBFFMPEG core/multimedia/opieplayer/libffmpeglibffmpeg.pro
87 CONFIG_LIBFLASH core/multimedia/opieplayer/libflashlibflash.pro 88 CONFIG_LIBFLASH core/multimedia/opieplayer/libflashlibflash.pro
88 CONFIG_LIBMAD core/multimedia/opieplayer/libmadlibmad.pro 89 CONFIG_LIBMAD core/multimedia/opieplayer/libmadlibmad.pro
89 CONFIG_LIBMAIL noncore/unsupported/mail2/libmaillibmail.pro 90 CONFIG_LIBMAIL noncore/unsupported/mail2/libmaillibmail.pro
90CONFIG_LIBMAILWRAPPER noncore/net/mail/libmailwrapper libmailwrapper.pro 91CONFIG_LIBMAILWRAPPER noncore/net/mail/libmailwrapper libmailwrapper.pro
91 CONFIG_LIBMPEG3 core/multimedia/opieplayer/libmpeg3libmpeg3.pro 92 CONFIG_LIBMPEG3 core/multimedia/opieplayer/libmpeg3libmpeg3.pro
92 CONFIG_LIBOPIE2BLUEZ libopie2/opiebluezopiebluez.pro 93 CONFIG_LIBOPIE2BLUEZ libopie2/opiebluezopiebluez.pro
93 CONFIG_LIBOPIE2CORE libopie2/opiecoreopiecore.pro 94 CONFIG_LIBOPIE2CORE libopie2/opiecoreopiecore.pro
94 CONFIG_LIBOPIE2DB libopie2/opiedbopiedb.pro 95 CONFIG_LIBOPIE2DB libopie2/opiedbopiedb.pro
95 CONFIG_LIBOPIE2EXAMPLES libopie2/examplesexamples.pro 96 CONFIG_LIBOPIE2EXAMPLES libopie2/examplesexamples.pro
96 CONFIG_LIBOPIE2MM libopie2/opiemmopiemm.pro 97 CONFIG_LIBOPIE2MM libopie2/opiemmopiemm.pro
97 CONFIG_LIBOPIE2NET libopie2/opienetopienet.pro 98 CONFIG_LIBOPIE2NET libopie2/opienetopienet.pro
98 CONFIG_LIBOPIE2PIM libopie2/opiepimopiepim.pro 99 CONFIG_LIBOPIE2PIM libopie2/opiepimopiepim.pro
99 CONFIG_LIBOPIE2SECURITYlibopie2/opiesecurity opiesecurity.pro 100 CONFIG_LIBOPIE2SECURITYlibopie2/opiesecurity opiesecurity.pro
100 CONFIG_LIBOPIE2UI libopie2/opieuiopieui.pro 101 CONFIG_LIBOPIE2UI libopie2/opieuiopieui.pro
101 CONFIG_LIBOPIETOOTH noncore/net/opietooth/liblib.pro 102 CONFIG_LIBOPIETOOTH noncore/net/opietooth/liblib.pro
102 CONFIG_LIBOPIEnoncore/unsupported/libopie libopie.pro 103 CONFIG_LIBOPIEnoncore/unsupported/libopie libopie.pro
103 CONFIG_LIBQPE librarylibrary.pro 104 CONFIG_LIBQPE librarylibrary.pro
104 CONFIG_LIBQPE-X11 x11/libqpe-x11libqpe-x11.pro 105 CONFIG_LIBQPE-X11 x11/libqpe-x11libqpe-x11.pro
105CONFIG_LIBQRSYNC rsync rsync.pro 106CONFIG_LIBQRSYNC rsync rsync.pro
106 CONFIG_LIBQTAUX libqtauxlibqtaux.pro 107 CONFIG_LIBQTAUX libqtauxlibqtaux.pro
107 CONFIG_LIBSQL libsqllibsql.pro 108 CONFIG_LIBSQL libsqllibsql.pro
108CONFIG_LIBTREMOR core/multimedia/opieplayer/vorbis/tremor tremor.pro 109CONFIG_LIBTREMOR core/multimedia/opieplayer/vorbis/tremor tremor.pro
109CONFIG_LIBTREMORPLUGIN core/multimedia/opieplayer/vorbis libtremor.pro 110CONFIG_LIBTREMORPLUGIN core/multimedia/opieplayer/vorbis libtremor.pro
110 CONFIG_LIGHT-AND-POWER core/settings/light-and-powerlight-and-power.pro 111 CONFIG_LIGHT-AND-POWER core/settings/light-and-powerlight-and-power.pro
111 CONFIG_LIQUID noncore/styles/liquidliquid.pro 112 CONFIG_LIQUID noncore/styles/liquidliquid.pro
112 CONFIG_LOCKAPPLET core/applets/lockappletlockapplet.pro 113 CONFIG_LOCKAPPLET core/applets/lockappletlockapplet.pro
113 CONFIG_LOGOUTAPPLET core/applets/logoutappletlogoutapplet.pro 114 CONFIG_LOGOUTAPPLET core/applets/logoutappletlogoutapplet.pro
114 CONFIG_MAIL3 noncore/net/mail mail.pro 115 CONFIG_MAIL3 noncore/net/mail mail.pro
115CONFIG_MAILAPPLET noncore/net/mail/taskbarapplet taskbarapplet.pro 116CONFIG_MAILAPPLET noncore/net/mail/taskbarapplet taskbarapplet.pro
116 CONFIG_MAILIT noncore/unsupported/mailit mailit.pro 117 CONFIG_MAILIT noncore/unsupported/mailit mailit.pro
117CONFIG_MAIN_TAB_EXAMPLE examples/main-tab main-tab.pro 118CONFIG_MAIN_TAB_EXAMPLE examples/main-tab main-tab.pro
118 CONFIG_MEDIUMMOUNT noncore/settings/mediummountmediummount.pro 119 CONFIG_MEDIUMMOUNT noncore/settings/mediummountmediummount.pro
119 CONFIG_MEMORYAPPLET noncore/applets/memoryappletmemoryapplet.pro 120 CONFIG_MEMORYAPPLET noncore/applets/memoryappletmemoryapplet.pro
120 CONFIG_METAL noncore/styles/metalmetal.pro 121 CONFIG_METAL noncore/styles/metalmetal.pro
121 CONFIG_MINDBREAKER noncore/games/mindbreakermindbreaker.pro 122 CONFIG_MINDBREAKER noncore/games/mindbreakermindbreaker.pro
122 CONFIG_MINESWEEP noncore/games/minesweepminesweep.pro 123 CONFIG_MINESWEEP noncore/games/minesweepminesweep.pro
123 CONFIG_MOBILEMSG noncore/unsupported/mobilemsgmobilemsg.pro 124 CONFIG_MOBILEMSG noncore/unsupported/mobilemsgmobilemsg.pro
124 CONFIG_MODPLUG core/multimedia/opieplayer/modplugmodplug.pro 125 CONFIG_MODPLUG core/multimedia/opieplayer/modplugmodplug.pro
125CONFIG_MULTIAUTH_BLUEPING noncore/securityplugins/blueping bluepingplugin.pro 126CONFIG_MULTIAUTH_BLUEPING noncore/securityplugins/blueping bluepingplugin.pro
126CONFIG_MULTIAUTH_DUMMY noncore/securityplugins/dummy dummyplugin.pro 127CONFIG_MULTIAUTH_DUMMY noncore/securityplugins/dummy dummyplugin.pro
127CONFIG_MULTIAUTH_NOTICE noncore/securityplugins/notice noticeplugin.pro 128CONFIG_MULTIAUTH_NOTICE noncore/securityplugins/notice noticeplugin.pro
128CONFIG_MULTIAUTH_PIN noncore/securityplugins/pin pinplugin.pro 129CONFIG_MULTIAUTH_PIN noncore/securityplugins/pin pinplugin.pro
129 CONFIG_MULTIKEYAPPLET core/applets/multikeyappletmultikeyapplet.pro 130 CONFIG_MULTIKEYAPPLET core/applets/multikeyappletmultikeyapplet.pro
130 CONFIG_MULTIKEY inputmethods/multikeymultikey.pro 131 CONFIG_MULTIKEY inputmethods/multikeymultikey.pro
131 CONFIG_NETSYSTEMTIME noncore/settings/netsystemtimenetsystemtime.pro 132 CONFIG_NETSYSTEMTIME noncore/settings/netsystemtimenetsystemtime.pro
132 CONFIG_NETWORKAPPLET noncore/applets/networkappletnetworkapplet.pro 133 CONFIG_NETWORKAPPLET noncore/applets/networkappletnetworkapplet.pro
133 CONFIG_NETWORKSETUP noncore/settings/networksettingsnetworksettings.pro 134 CONFIG_NETWORKSETUP noncore/settings/networksettingsnetworksettings.pro
134 CONFIG_NOTES core/pim/notesopie-notes.pro 135 CONFIG_NOTES core/pim/notesopie-notes.pro
135 CONFIG_NOTESAPPLET noncore/applets/notesappletnotesapplet.pro 136 CONFIG_NOTESAPPLET noncore/applets/notesappletnotesapplet.pro
136 CONFIG_NS2BT noncore/settings/networksettings2/bluetoothbluetooth.pro 137 CONFIG_NS2BT noncore/settings/networksettings2/bluetoothbluetooth.pro
137 CONFIG_NS2GPRS noncore/settings/networksettings2/gprsGPRS.pro 138 CONFIG_NS2GPRS noncore/settings/networksettings2/gprsGPRS.pro
138 CONFIG_NS2CABLE noncore/settings/networksettings2/cablecable.pro 139 CONFIG_NS2CABLE noncore/settings/networksettings2/cablecable.pro
139 CONFIG_NS2CORE noncore/settings/networksettings2/networksettings2networksettings2.pro 140 CONFIG_NS2CORE noncore/settings/networksettings2/networksettings2networksettings2.pro
140 CONFIG_NS2OPIETOOTH noncore/settings/networksettings2/opietooth2opietooth2.pro 141 CONFIG_NS2OPIETOOTH noncore/settings/networksettings2/opietooth2opietooth2.pro
141 CONFIG_NS2OPIETOOTHAPPLET noncore/settings/networksettings2/opietooth2_appletopietooth2_applet.pro 142 CONFIG_NS2OPIETOOTHAPPLET noncore/settings/networksettings2/opietooth2_appletopietooth2_applet.pro
142 CONFIG_NS2IRDA noncore/settings/networksettings2/irdairda.pro 143 CONFIG_NS2IRDA noncore/settings/networksettings2/irdairda.pro
143 CONFIG_NS2LANCARD noncore/settings/networksettings2/lancardlancard.pro 144 CONFIG_NS2LANCARD noncore/settings/networksettings2/lancardlancard.pro
144 CONFIG_NS2MODEM noncore/settings/networksettings2/modemmodem.pro 145 CONFIG_NS2MODEM noncore/settings/networksettings2/modemmodem.pro
145 CONFIG_NS2NETWORK noncore/settings/networksettings2/networknetwork.pro 146 CONFIG_NS2NETWORK noncore/settings/networksettings2/networknetwork.pro
146 CONFIG_NS2 noncore/settings/networksettings2networksettings.pro 147 CONFIG_NS2 noncore/settings/networksettings2networksettings.pro
147 CONFIG_NS2PPP noncore/settings/networksettings2/pppppp.pro 148 CONFIG_NS2PPP noncore/settings/networksettings2/pppppp.pro
148 CONFIG_NS2PROFILE noncore/settings/networksettings2/profileprofile.pro 149 CONFIG_NS2PROFILE noncore/settings/networksettings2/profileprofile.pro
149 CONFIG_NS2USB noncore/settings/networksettings2/usbusb.pro 150 CONFIG_NS2USB noncore/settings/networksettings2/usbusb.pro
150 CONFIG_NS2VPN noncore/settings/networksettings2/vpnvpn.pro 151 CONFIG_NS2VPN noncore/settings/networksettings2/vpnvpn.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