From 36dece4760b1ac1799929221b49eb3bee98c2367 Mon Sep 17 00:00:00 2001 From: llornkcor Date: Sun, 09 Jul 2006 18:56:40 +0000 Subject: initial commit to add video4linux camera app from qtopia 2, needs more work --- (limited to 'library/locationcombo.cpp') 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 @@ +/********************************************************************** +** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. +** +** This file is part of the Qtopia Environment. +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** A copy of the GNU GPL license version 2 is included in this package as +** LICENSE.GPL. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +** See the GNU General Public License for more details. +** +** In addition, as a special exception Trolltech gives permission to link +** the code of this program with Qtopia applications copyrighted, developed +** and distributed by Trolltech under the terms of the Qtopia Personal Use +** License Agreement. You must comply with the GNU General Public License +** in all respects for all of the code used other than the applications +** licensed under the Qtopia Personal Use License Agreement. If you modify +** this file, you may extend this exception to your version of the file, +** but you are not obligated to do so. If you do not wish to do so, delete +** this exception statement from your version. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "locationcombo.h" + +#include +#include +#include +#include +#include +#ifdef QWS +#include +#endif +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +/*! + \class LocationCombo locationcombo.h + \brief The LocationCombo class displays a list of available storage + locations. + + First availability: Qtopia 1.6 + + \ingroup qtopiaemb + \sa DocPropertiesDialog + */ + + +class LocationComboPrivate +{ +public: + LocationComboPrivate() : homeLocation(-1), fileSize(0), listEmpty(TRUE) {} + QString originalPath; + int homeLocation; + int fileSize; + bool listEmpty; +}; + +/*! + Constructs a LocationCombo with parent \a parent and name \a name. + */ +LocationCombo::LocationCombo( QWidget *parent, const char *name ) + : QComboBox( FALSE, parent, name ) +{ + storage = new StorageInfo; + d = new LocationComboPrivate; + setLocation( 0 ); + connect( this, SIGNAL(activated(int)), this, SIGNAL(newPath()) ); + connect( storage, SIGNAL(disksChanged()), this, SLOT(updatePaths()) ); +} + +/*! + Constructs a LocationCombo with parent \a parent and name \a name. + \a lnk is pointer to an existing AppLnk. + */ +LocationCombo::LocationCombo( const AppLnk * lnk, QWidget *parent, const char *name ) + : QComboBox( FALSE, parent, name ) +{ + storage = new StorageInfo; + d = new LocationComboPrivate; + setLocation(lnk); + connect( this, SIGNAL(activated(int)), this, SIGNAL(newPath()) ); + connect( storage, SIGNAL(disksChanged()), this, SLOT(updatePaths()) ); +} + +/*! + Destroys the widget. + */ +LocationCombo::~LocationCombo() +{ + delete storage; + delete d; +} + +/*! + Sets the display of the LocationCombo to the location associated with the + AppLnk \a lnk. + */ +void LocationCombo::setLocation( const AppLnk * lnk ) +{ + // NB: setLocation(const QString) assumes only lnk->file() is used. + + if ( lnk ) { + QFileInfo fi( lnk->file() ); + d->fileSize = fi.size(); + const FileSystem *fs = storage->fileSystemOf( lnk->file() ); + d->originalPath = fs ? fs->path() : QString::null; + } else { + d->fileSize = 0; + d->originalPath = QString::null; + } + + setupCombo(); + + int currentLocation = -1; + if ( lnk ) { + int n = locations.count(); + for ( int i = 0; i < n; i++ ) { + if ( lnk->file().contains( locations[i] ) ) + currentLocation = i; + } + } + if ( currentLocation == -1 ) + currentLocation = 0; //default to the first one + + setCurrentItem( currentLocation ); +} + +/*! + \internal +*/ +void LocationCombo::setupCombo() +{ + clear(); + locations.clear(); + + const QList &fs = storage->fileSystems(); + QListIterator it ( fs ); + QString s; + QString homeDir = QDir::homeDirPath(); + QString homeFs; + QString homeFsPath; + int index = 0; + for ( ; it.current(); ++it ) { + // we add 10k to the file size so we are sure we can also save the desktop file + if ( !d->fileSize || (*it)->path() == d->originalPath || + (ulong)(*it)->availBlocks() * (ulong)(*it)->blockSize() + > (ulong)d->fileSize + 10000 ) + { + if ( (*it)->isRemovable() ) { + insertItem( (*it)->name(), index ); + locations.append( (*it)->path() ); + index++; + } else if ( homeDir.contains( (*it)->path() ) && + (*it)->path().length() > homeFsPath.length() ) { + homeFs = (*it)->name(); + homeFsPath = (*it)->path(); + } + } + } + + // $HOME is *somewhere*, but not shown in Storage::fileSystems(), + // eg. because it's mounted in some unexpected way. + if ( homeFsPath.isEmpty() ) { + homeFs = StorageInfo::tr("Internal Storage"); + homeFsPath = homeDir; + } + + if ( !homeFsPath.isEmpty() ) { + d->homeLocation = 0; + insertItem( homeFs, d->homeLocation ); + locations.prepend( homeDir ); + } else { + d->homeLocation = -1; + } + + d->listEmpty = locations.count() == 0; + if ( d->listEmpty ) { + insertItem( tr("No FileSystems Available!"), 0 ); + locations.append( "" ); + } +} + +/*! + \internal + */ +void LocationCombo::updatePaths() +{ + QString oldPath = locations[currentItem()]; + + setupCombo(); + + int currentLocation = 0; + int n = locations.count(); + for ( int i = 0; i < n; i++ ) { + if ( oldPath == locations[i] ) { + currentLocation = i; + } + } + setCurrentItem( currentLocation ); + if ( locations[currentItem()] != oldPath ) + emit newPath(); +} + +/*! + Returns TRUE to indicate that the user has changed the location displayed + by the LocationCombo. Most useful when the LocationCombo is part of a + dialog; when the dialog is accept()ed, LocationCombo::isChanged() can be + examined to check for a change of location. + */ +bool LocationCombo::isChanged() const +{ + if ( const FileSystem *fs = storage->fileSystemOf(locations[currentItem()]) ) + return fs->path() != d->originalPath; + + return TRUE; +} + +/*! + Returns the default (home) location for the file associated with this + LocationCombo. + */ +QString LocationCombo::installationPath() const +{ + return currentItem() == d->homeLocation ? + QString("/") : locations[ currentItem() ]+"/"; +} + +/*! + Returns the document path associated with this LocationCombo. This + will be "\/Documents". + */ +QString LocationCombo::documentPath() const +{ + return locations[ currentItem() ]+"/Documents/"; +} + +/*! + Returns a pointer to FileSystem object, associated with the current + selection of the LocationCombo. + */ +const FileSystem *LocationCombo::fileSystem() const +{ + if ( d->listEmpty ) + return 0; + return storage->fileSystemOf( locations[ currentItem() ] ); +} + +/*! + \fn LocationCombo::newPath() + Emitted when the LocationCombo changes to a new location. + */ + + +#if 0 +void LocationCombo::apply() +{ +} +#endif + -- cgit v0.9.0.2