summaryrefslogtreecommitdiff
authordrw <drw>2004-11-18 15:49:02 (UTC)
committer drw <drw>2004-11-18 15:49:02 (UTC)
commit7ac32658ba09d8456cc75e5cf80707caa616848b (patch) (side-by-side diff)
tree56bae9b9c75eae7a9096013830fe98d28a4de0ed
parent718a7a8ba68e10faa1a22fcc6bdc26e1723b2a40 (diff)
downloadopie-7ac32658ba09d8456cc75e5cf80707caa616848b.zip
opie-7ac32658ba09d8456cc75e5cf80707caa616848b.tar.gz
opie-7ac32658ba09d8456cc75e5cf80707caa616848b.tar.bz2
UI tweaks for Installation dialog - 1. Show destination selection only when installing apps, 2. Update available disk space after each package is processed, 3. Disable destination selection once start button has been clicked
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/packagemanager/installdlg.cpp61
-rw-r--r--noncore/settings/packagemanager/installdlg.h14
-rw-r--r--noncore/settings/packagemanager/mainwindow.cpp2
3 files changed, 63 insertions, 14 deletions
diff --git a/noncore/settings/packagemanager/installdlg.cpp b/noncore/settings/packagemanager/installdlg.cpp
index 945dfed..781f8f5 100644
--- a/noncore/settings/packagemanager/installdlg.cpp
+++ b/noncore/settings/packagemanager/installdlg.cpp
@@ -1,107 +1,109 @@
/*
This file is part of the OPIE Project
=. Copyright (c) 2003 Dan Williams <drw@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This file is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This file is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General
..}^=.= = ; Public License for more details.
++= -. .` .:
: = ...= . :.=- You should have received a copy of the GNU
-. .:....=;==+<; General Public License along with this file;
-_. . . )=. = see the file COPYING. If not, write to the
-- :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "installdlg.h"
#include <opie2/ofiledialog.h>
+#include <opie2/oprocess.h>
#include <qpe/fileselector.h>
#include <qpe/resource.h>
#include <qpe/storage.h>
#include <qapplication.h>
#include <qcombobox.h>
#include <qfileinfo.h>
#include <qgroupbox.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qmap.h>
#include <qmultilineedit.h>
#include <qpushbutton.h>
#include <sys/vfs.h>
#include "opackagemanager.h"
InstallDlg::InstallDlg( QWidget *parent, OPackageManager *pm, const QString &caption, bool showDestInfo,
OPackage::Command command1, const QStringList &packages1,
OPackage::Command command2, const QStringList &packages2,
OPackage::Command command3, const QStringList &packages3 )
: QWidget( 0x0 )
, m_packman( pm )
, m_numCommands( 0 )
, m_currCommand( 0 )
+ , m_destItem( 0x0 )
{
// Save command/package list information
if ( command1 != OPackage::NotDefined )
{
m_command[ m_numCommands ] = command1;
m_packages[ m_numCommands ] = packages1;
++m_numCommands;
}
if ( command2 != OPackage::NotDefined )
{
m_command[ m_numCommands ] = command2;
m_packages[ m_numCommands ] = packages2;
++m_numCommands;
}
if ( command3 != OPackage::NotDefined )
{
m_command[ m_numCommands ] = command3;
m_packages[ m_numCommands ] = packages3;
++m_numCommands;
}
// Initialize UI
if ( parent )
parent->setCaption( caption );
QGridLayout *layout = new QGridLayout( this, 4, 2, 2, 4 );
if ( showDestInfo )
{
QLabel *label = new QLabel( tr( "Destination" ), this );
layout->addWidget( label, 0, 0 );
m_destination = new QComboBox( this );
m_destination->insertStringList( m_packman->destinations() );
layout->addWidget( m_destination, 0, 1 );
connect( m_destination, SIGNAL(highlighted(const QString&)),
this, SLOT(slotDisplayAvailSpace(const QString&)) );
label = new QLabel( tr( "Space Avail" ), this );
layout->addWidget( label, 1, 0 );
m_availSpace = new QLabel( this );
layout->addWidget( m_availSpace, 1, 1 );
// TODO - select correct destination
slotDisplayAvailSpace( m_destination->currentText() );
}
else
{
m_destination = 0x0;
@@ -118,180 +120,217 @@ InstallDlg::InstallDlg( QWidget *parent, OPackageManager *pm, const QString &cap
groupBoxLayout->addWidget( m_output );
layout->addMultiCellWidget( groupBox, 2, 2, 0, 1 );
m_btnStart = new QPushButton( Resource::loadPixmap( "packagemanager/apply" ), tr( "Start" ), this );
layout->addWidget( m_btnStart, 3, 0 );
connect( m_btnStart, SIGNAL(clicked()), this, SLOT(slotBtnStart()) );
m_btnOptions = new QPushButton( Resource::loadPixmap( "SettingsIcon" ), tr( "Options" ), this );
layout->addWidget( m_btnOptions, 3, 1 );
connect( m_btnOptions, SIGNAL( clicked() ), this, SLOT(slotBtnOptions()) );
// Display packages being acted upon in output widget
for( int i = 0; i < m_numCommands; i++ )
{
if ( !m_packages[ i ].isEmpty() )
{
QString lineStr = tr( "Packages to " );
switch( m_command[ i ] )
{
case OPackage::Install : lineStr.append( tr( "install" ) );
break;
case OPackage::Remove : lineStr.append( tr( "remove" ) );
break;
case OPackage::Upgrade : lineStr.append( tr( "upgrade" ) );
break;
case OPackage::Download : lineStr.append( tr( "download" ) );
break;
default :
break;
};
lineStr.append( ":\n" );
QStringList tmpPackage = m_packages[ i ];
for ( QStringList::Iterator it = tmpPackage.begin(); it != tmpPackage.end(); ++it )
{
lineStr.append( QString( "\t%1\n" ).arg( ( *it ) ) );
}
m_output->append( lineStr );
}
}
m_output->append( tr( "Press the start button to begin.\n" ) );
m_output->setCursorPosition( m_output->numLines(), 0 );
}
-InstallDlg::~InstallDlg()
-{
-}
-
void InstallDlg::slotDisplayAvailSpace( const QString &destination )
{
// If available space is not displayed, exit
if ( !m_availSpace )
return;
QString space = tr( "Unknown" );
// Get destination
- OConfItem *dest = m_packman->findConfItem( OConfItem::Destination, destination );
+ if ( !destination.isNull() )
+ m_destItem = m_packman->findConfItem( OConfItem::Destination, destination );
- if ( dest )
+ if ( m_destItem )
{
// Calculate available space
struct statfs fs;
- if ( !statfs( dest->value(), &fs ) )
+ if ( !statfs( m_destItem->value(), &fs ) )
{
long mult = fs.f_bsize / 1024;
long div = 1024 / fs.f_bsize;
if ( !mult ) mult = 1;
if ( !div ) div = 1;
long avail = fs.f_bavail * mult / div;
space = tr( "%1 Kb" ).arg( avail );
}
}
// Display available space
m_availSpace->setText( space );
}
void InstallDlg::slotBtnStart()
{
QString btnText = m_btnStart->text();
if ( btnText == tr( "Abort" ) )
{
// Prevent unexecuted commands from executing
m_currCommand = 999;
// Allow user to close dialog
m_btnStart->setText( tr( "Close" ) );
m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) );
return;
}
else if ( btnText == tr( "Close" ) )
{
// TODO - force reload of package data
emit closeInstallDlg();
return;
}
// Start was clicked, start executing
+ QString dest;
+ if ( m_destination )
+ {
+ dest = m_destination->currentText();
+ m_destination->setEnabled( false );
+ }
+
m_btnOptions->setEnabled( false );
if ( m_numCommands > 1 )
{
m_btnStart->setText( tr( "Abort" ) );
m_btnStart->setIconSet( Resource::loadPixmap( "close" ) );
}
else
{
m_btnStart->setEnabled( false );
}
- QString dest;
- if ( m_destination )
- dest = m_destination->currentText();
-
for ( m_currCommand = 0; m_currCommand < m_numCommands; m_currCommand++ )
{
// Execute next command
m_packman->executeCommand( m_command[ m_currCommand ], m_packages[ m_currCommand ], dest,
this, SLOT(slotOutput(char*)), true );
}
+ slotProcessDone(0l);
+
+ // Get destination
+/*
+ if ( dest == "root" )
+ {
+ slotProcessDone(0l);
+ return;
+ }
+
+ m_destItem = m_packman->findConfItem( OConfItem::Destination, dest );
+ if ( m_destItem )
+ {
+ QString path = m_destItem->value();
+ Opie::Core::OProcess *process = new Opie::Core::OProcess( this, "ipkg-link process" );
+ connect( process, SIGNAL(processExited(Opie::Core::OProcess*)),
+ this, SLOT(slotProcessDone(Opie::Core::OProcess*)) );
+
+ *process << "ipkg-link" << "mount" << path;
+ if ( !process->start( Opie::Core::OProcess::NotifyOnExit,
+ Opie::Core::OProcess::NoCommunication ) )
+ slotProcessDone( 0l );
+ m_output->append( tr( "Starting ipkg-link to link installed applications." ) );
+ m_output->setCursorPosition( m_output->numLines(), 0 );
+ }
+*/
+}
+
+void InstallDlg::slotProcessDone( Opie::Core::OProcess *proc )
+{
+ delete proc;
+
+ m_output->append( tr( "The package linking is done." ) );
+ m_output->setCursorPosition( m_output->numLines(), 0 );
// All commands executed, allow user to close dialog
m_btnStart->setEnabled( true );
m_btnStart->setText( tr( "Close" ) );
m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) );
m_btnOptions->setEnabled( true );
m_btnOptions->setText( tr( "Save output" ) );
m_btnOptions->setIconSet( Resource::loadPixmap( "save" ) );
}
void InstallDlg::slotBtnOptions()
{
QString btnText = m_btnOptions->text();
if ( btnText == tr( "Options" ) )
{
// Display configuration dialog (only options tab is enabled)
m_packman->configureDlg( true );
return;
}
// Save output was clicked
QMap<QString, QStringList> map;
map.insert( tr( "All" ), QStringList() );
QStringList text;
text << "text/*";
map.insert(tr( "Text" ), text );
text << "*";
map.insert( tr( "All" ), text );
QString filename = Opie::Ui::OFileDialog::getSaveFileName( 2, "/", "ipkg-output", map );
if( !filename.isEmpty() )
{
QString currentFileName = QFileInfo( filename ).fileName();
DocLnk doc;
doc.setType( "text/plain" );
doc.setFile( filename );
doc.setName( currentFileName );
FileManager fm;
fm.saveFile( doc, m_output->text() );
}
}
void InstallDlg::slotOutput( char *msg )
{
// Allow processing of other events
qApp->processEvents();
QString lineStr = msg;
if ( lineStr[lineStr.length()-1] == '\n' )
lineStr.truncate( lineStr.length() - 1 );
m_output->append( lineStr );
m_output->setCursorPosition( m_output->numLines(), 0 );
+
+ // Update available space
+ slotDisplayAvailSpace( QString::null );
}
diff --git a/noncore/settings/packagemanager/installdlg.h b/noncore/settings/packagemanager/installdlg.h
index cddc911..f45c17c 100644
--- a/noncore/settings/packagemanager/installdlg.h
+++ b/noncore/settings/packagemanager/installdlg.h
@@ -1,88 +1,98 @@
/*
This file is part of the OPIE Project
=. Copyright (c) 2003 Dan Williams <drw@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This file is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This file is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General
..}^=.= = ; Public License for more details.
++= -. .` .:
: = ...= . :.=- You should have received a copy of the GNU
-. .:....=;==+<; General Public License along with this file;
-_. . . )=. = see the file COPYING. If not, write to the
-- :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef INSTALLDLG_H
#define INSTALLDLG_H
#include <qwidget.h>
#include "opackage.h"
class QComboBox;
class QLabel;
class QMultiLineEdit;
class QPushButton;
+class OConfItem;
class OPackageManager;
+namespace Opie
+{
+ namespace Core
+ {
+ class OProcess;
+ }
+}
+
class InstallDlg : public QWidget
{
Q_OBJECT
public:
InstallDlg( QWidget *parent = 0x0, OPackageManager *pm = 0x0, const QString &caption = QString::null,
bool showDestInfo = true,
OPackage::Command command1 = OPackage::NotDefined,
const QStringList &packages1 = QStringList(),
OPackage::Command command2 = OPackage::NotDefined,
const QStringList &packages2 = QStringList(),
OPackage::Command command3 = OPackage::NotDefined,
const QStringList &packages3 = QStringList() );
- ~InstallDlg();
private:
OPackageManager *m_packman; // Pointer to application instance of package manager
// UI controls
QComboBox *m_destination; // Destination selection list
QLabel *m_availSpace; // Text label to display available space on selected destination
QMultiLineEdit *m_output; // Multi-line edit to display status
QPushButton *m_btnStart; // Start/abort/close button
QPushButton *m_btnOptions; // Installation options button
// Commands and packages to execute
int m_numCommands; // Number of commands to be executed
int m_currCommand; // Number of currently executing command
OPackage::Command m_command[3]; // List of commands to be executed
QStringList m_packages[3]; // Lists of package names associated to commands (m_command[])
+ OConfItem *m_destItem; // Pointer to destination for package installation
private slots:
// UI control slots
void slotDisplayAvailSpace( const QString &destination );
void slotBtnStart();
void slotBtnOptions();
-
+ void slotProcessDone( Opie::Core::OProcess *proc );
+
// Execution slots
void slotOutput( char *msg );
signals:
void closeInstallDlg();
};
#endif
diff --git a/noncore/settings/packagemanager/mainwindow.cpp b/noncore/settings/packagemanager/mainwindow.cpp
index 5e15874..459a75b 100644
--- a/noncore/settings/packagemanager/mainwindow.cpp
+++ b/noncore/settings/packagemanager/mainwindow.cpp
@@ -486,97 +486,97 @@ void MainWindow::slotApply()
{
upgradeList.append( item->text() );
}
}
else
{
// Remove/reinstall package
int answer = PromptDlg::ask( tr( "Remove or reinstall" ),
tr( QString( "Do you wish to remove or reinstall\n%1?" ).arg( item->text() ) ),
tr( "Remove" ), tr( "Reinstall" ), this );
if ( answer == 1 ) // Remove
{
removeList.append( item->text() );
}
else if ( answer == 2 ) // Reinstall
{
installList.append( item->text() );
}
}
}
else
{
// Install package
installList.append( item->text() );
}
}
}
}
// If nothing is selected, display message and exit
if ( removeList.isEmpty() && installList.isEmpty() && upgradeList.isEmpty() )
{
QMessageBox::information( this, tr( "Nothing to do" ), tr( "No packages selected" ), tr( "OK" ) );
return;
}
// Send command only if there are packages to process
OPackage::Command removeCmd = OPackage::NotDefined;
if ( !removeList.isEmpty() )
removeCmd = OPackage::Remove;
OPackage::Command installCmd = OPackage::NotDefined;
if ( !installList.isEmpty() )
installCmd = OPackage::Install;
OPackage::Command upgradeCmd = OPackage::NotDefined;
if ( !upgradeList.isEmpty() )
upgradeCmd = OPackage::Upgrade;
// Create package manager output widget
- InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Apply changes" ), true,
+ InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Apply changes" ), !installList.isEmpty(),
removeCmd, removeList,
installCmd, installList,
upgradeCmd, upgradeList );
connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) );
// Display widget
m_widgetStack.addWidget( dlg, 3 );
m_widgetStack.raiseWidget( dlg );
}
void MainWindow::slotInstallLocal()
{
// Display file open dialog with only package files
MimeTypes type;
QStringList packages;
packages << "application/ipkg";
type.insert( tr( "Application Packages" ), packages );
QString package = Opie::Ui::OFileDialog::getOpenFileName( Opie::Ui::OFileSelector::NORMAL,
"/", QString::null, type );
if ( !package.isNull() )
installLocalPackage( package );
}
void MainWindow::slotCloseDlg()
{
// Close install dialog
delete m_widgetStack.visibleWidget();
// Reload package list
initPackageInfo();
// Update Opie launcher links
QCopEnvelope e("QPE/System", "linkChanged(QString)");
QString lf = QString::null;
e << lf;
// Reapply any filters previously set
if ( m_actionShowNotInstalled->isOn() )
slotShowNotInstalled();
else if ( m_actionShowInstalled->isOn() )
slotShowInstalled();
else if ( m_actionShowUpdated->isOn() )
slotShowUpdated();
else if ( m_actionFilter->isOn() )
slotFilter( true );
}
void MainWindow::slotConfigure()