From 4617ef389426b5b6d37a5fd878147abb916367fe Mon Sep 17 00:00:00 2001 From: drw Date: Tue, 13 Jan 2004 17:29:39 +0000 Subject: Initial upload of new package manager --- (limited to 'noncore/settings/packagemanager/mainwindow.cpp') diff --git a/noncore/settings/packagemanager/mainwindow.cpp b/noncore/settings/packagemanager/mainwindow.cpp new file mode 100644 index 0000000..311b5fc --- a/dev/null +++ b/noncore/settings/packagemanager/mainwindow.cpp @@ -0,0 +1,667 @@ +/* +                This file is part of the OPIE Project + + =. Copyright (c) 2003 Dan Williams +             .=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_,=:_.      -`: 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "mainwindow.h" +#include "installdlg.h" +#include "filterdlg.h" +#include "promptdlg.h" + +MainWindow::MainWindow( QWidget *parent, const char *name, WFlags fl ) + : QMainWindow( parent, name, fl || WStyle_ContextHelp ) + , m_config( "packman" ) + , m_packman( &m_config, this ) + , m_menuBar( this ) + , m_toolBar( this ) + , m_findBar( this ) + , m_widgetStack( this ) + , m_packageList( this ) + , m_statusWidget( this ) + , m_statusText( &m_statusWidget ) + , m_statusBar( &m_statusWidget ) + , m_iconUpdated( Resource::loadPixmap( "packagemanager/updated" ) ) + , m_iconInstalled( Resource::loadPixmap( "installed" ) ) + , m_iconNull( m_iconUpdated.size() ) + , m_filterName( QString::null ) + , m_filterServer( QString::null ) + , m_filterDest( QString::null ) + , m_filterStatus( OPackageManager::NotDefined ) + , m_filterCategory( QString::null ) + +{ +// setCaption( tr( "Package Manager" ) ); + + m_iconNull.fill( colorGroup().base() ); + + connect( &m_widgetStack, SIGNAL(aboutToShow(QWidget*)), this, SLOT(slotWidgetStackShow(QWidget*)) ); + + // Initialize widget stack, package list and status widget + initStatusWidget(); + initPackageList(); + + m_widgetStack.addWidget( &m_statusWidget, 2 ); + m_widgetStack.addWidget( &m_packageList, 1 ); + setCentralWidget( &m_widgetStack ); + + // Initialize remaining user interface items + initUI(); + + // Initialize package information + QTimer::singleShot( 100, this, SLOT( initPackageInfo() ) ); +} + +void MainWindow::closeEvent( QCloseEvent *event ) +{ + // Close app only if either the package or status widgets are currently active + bool close = m_widgetStack.visibleWidget() == &m_packageList || + m_widgetStack.visibleWidget() == &m_statusWidget; + if ( close ) + { + // TODO - write out application configuration settings + + // Write out package manager configuration settings + m_packman.saveSettings(); + event->accept(); + } + else + { + delete m_widgetStack.visibleWidget(); + m_widgetStack.raiseWidget( &m_packageList ); + event->ignore(); + } +} + +void MainWindow::initPackageList() +{ + m_packageList.addColumn( tr( "Packages" ) ); + QWhatsThis::add( &m_packageList, tr( "This is a listing of all packages.\n\nA blue dot next to the package name indicates that the package is currently installed.\n\nA blue dot with a star indicates that a newer version of the package is available from the server feed.\n\nClick inside the box at the left to select a package." ) ); + QPEApplication::setStylusOperation( m_packageList.viewport(), QPEApplication::RightOnHold ); +} + +void MainWindow::initStatusWidget() +{ + QVBoxLayout *layout = new QVBoxLayout( &m_statusWidget, 4, 4 ); + + m_statusText.setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + layout->addWidget( &m_statusText ); + + connect( &m_packman, SIGNAL(initStatus(int)), this, SLOT(slotInitStatusBar(int)) ); + connect( &m_packman, SIGNAL(statusText(const QString &)), this, SLOT(slotStatusText(const QString &)) ); + connect( &m_packman, SIGNAL(statusBar(int)), this, SLOT(slotStatusBar(int)) ); + + layout->addWidget( &m_statusBar ); +} + +void MainWindow::initUI() +{ + // Build menu and tool bars + setToolBarsMovable( false ); + + m_menuBar.setHorizontalStretchable( true ); + QMenuBar *mb = new QMenuBar( &m_menuBar ); + mb->setMargin( 0 ); + + // Find toolbar + addToolBar( &m_findBar, QMainWindow::Top, true ); + m_findBar.setHorizontalStretchable( true ); + m_findEdit = new QLineEdit( &m_findBar ); + QWhatsThis::add( m_findEdit, tr( "Type the text to search for here." ) ); + m_findBar.setStretchableWidget( m_findEdit ); + connect( m_findEdit, SIGNAL(textChanged(const QString &)), this, SLOT(slotFindChanged(const QString &)) ); + + // Packages menu + QPopupMenu *popup = new QPopupMenu( this ); + + QAction *a = new QAction( tr( "Update lists" ), Resource::loadPixmap( "packagemanager/update" ), QString::null, 0, this, 0 ); + a->setWhatsThis( tr( "Click here to update package lists from servers." ) ); + connect( a, SIGNAL(activated()), this, SLOT(slotUpdate()) ); + a->addTo( popup ); + a->addTo( &m_toolBar ); + + QAction *actionUpgrade = new QAction( tr( "Upgrade" ), Resource::loadPixmap( "packagemanager/upgrade" ), QString::null, 0, this, 0 ); + actionUpgrade->setWhatsThis( tr( "Click here to upgrade all installed packages if a newer version is available." ) ); + connect( actionUpgrade, SIGNAL(activated()), this, SLOT(slotUpgrade()) ); + actionUpgrade->addTo( popup ); + actionUpgrade->addTo( &m_toolBar ); + + // Ipkg implementation does not seem to work currently? (not working in aqpkg either) + /* + QPixmap iconDownload = Resource::loadPixmap( "packagemanager/download" ); + QPixmap iconRemove = Resource::loadPixmap( "packagemanager/remove" ); + QAction *actionDownload = new QAction( tr( "Download" ), iconDownload, QString::null, 0, this, 0 ); + actionDownload->setWhatsThis( tr( "Click here to download the currently selected package(s)." ) ); + connect( actionDownload, SIGNAL(activated()), this, SLOT(slotDownload()) ); + actionDownload->addTo( popup ); + actionDownload->addTo( &m_toolBar ); + */ + + a = new QAction( tr( "Apply changes" ), Resource::loadPixmap( "packagemanager/apply" ), QString::null, 0, this, 0 ); + a->setWhatsThis( tr( "Click here to install, remove or upgrade currently selected package(s)." ) ); + connect( a, SIGNAL(activated()), this, SLOT(slotApply()) ); + a->addTo( popup ); + a->addTo( &m_toolBar ); + + popup->insertSeparator(); + + a = new QAction( tr( "Configure" ), Resource::loadPixmap( "SettingsIcon" ), QString::null, 0, this, 0 ); + a->setWhatsThis( tr( "Click here to configure this application." ) ); + connect( a, SIGNAL(activated()), this, SLOT(slotConfigure()) ); + a->addTo( popup ); + mb->insertItem( tr( "Actions" ), popup ); + + // View menu + popup = new QPopupMenu( this ); + + m_actionShowNotInstalled = new QAction( tr( "Show packages not installed" ), QString::null, 0, this, 0 ); + m_actionShowNotInstalled->setToggleAction( true ); + m_actionShowNotInstalled->setWhatsThis( tr( "Click here to show packages available which have not been installed." ) ); + connect( m_actionShowNotInstalled, SIGNAL(activated()), this, SLOT(slotShowNotInstalled()) ); + m_actionShowNotInstalled->addTo( popup ); + + m_actionShowInstalled = new QAction( tr( "Show installed packages" ), QString::null, 0, this, 0 ); + m_actionShowInstalled->setToggleAction( true ); + m_actionShowInstalled->setWhatsThis( tr( "Click here to show packages currently installed on this device." ) ); + connect( m_actionShowInstalled, SIGNAL(activated()), this, SLOT(slotShowInstalled()) ); + m_actionShowInstalled->addTo( popup ); + + m_actionShowUpdated = new QAction( tr( "Show updated packages" ), QString::null, 0, this, 0 ); + m_actionShowUpdated->setToggleAction( true ); + m_actionShowUpdated->setWhatsThis( tr( "Click here to show packages currently installed on this device which have a newer version available." ) ); + connect( m_actionShowUpdated, SIGNAL(activated()), this, SLOT(slotShowUpdated()) ); + m_actionShowUpdated->addTo( popup ); + + popup->insertSeparator(); + + a = new QAction( tr( "Configure filter" ), QString::null, 0, this, 0 ); + a->setWhatsThis( tr( "Click here to change package filter criteria." ) ); + connect( a, SIGNAL(activated()), this, SLOT(slotFilterChange()) ); + a->addTo( popup ); + + m_actionFilter = new QAction( tr( "Filter" ), Resource::loadPixmap( "packagemanager/filter" ), + QString::null, 0, this, 0 ); + m_actionFilter->setToggleAction( true ); + m_actionFilter->setWhatsThis( tr( "Click here to apply current filter." ) ); + connect( m_actionFilter, SIGNAL(toggled(bool)), this, SLOT(slotFilter(bool)) ); + m_actionFilter->addTo( popup ); + + popup->insertSeparator(); + + a = new QAction( tr( "Find" ), Resource::loadPixmap( "find" ), QString::null, 0, this, 0 ); + a->setWhatsThis( tr( "Click here to search for text in package names." ) ); + connect( a, SIGNAL(activated()), this, SLOT(slotFindShowToolbar()) ); + a->addTo( popup ); + + m_actionFindNext = new QAction( tr( "Find next" ), Resource::loadIconSet( "next" ), QString::null, 0, this, 0 ); + m_actionFindNext->setEnabled( false ); + m_actionFindNext->setWhatsThis( tr( "Click here to find the next package name containing the text you are searching for." ) ); + connect( m_actionFindNext, SIGNAL(activated()), this, SLOT(slotFindNext()) ); + m_actionFindNext->addTo( popup ); + m_actionFindNext->addTo( &m_findBar ); + + mb->insertItem( tr( "View" ), popup ); + + // Finish find toolbar creation + a = new QAction( QString::null, Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); + a->setWhatsThis( tr( "Click here to hide the find toolbar." ) ); + connect( a, SIGNAL(activated()), this, SLOT(slotFindHideToolbar()) ); + a->addTo( &m_findBar ); + m_findBar.hide(); +} + +void MainWindow::loadPackageList( OPackageList *packages, bool clearList ) +{ + if ( clearList ) + m_packageList.clear(); + + if ( packages ) + { + for ( OPackageListIterator packageIt( *packages ); packageIt.current(); ++packageIt ) + { + OPackage *package = packageIt.current(); + QCheckListItem *item = new QCheckListItem( &m_packageList, package->name(), + QCheckListItem::CheckBox ); + m_packageList.insertItem( item ); + + // If a different version of package is available, show update available icon + // Otherwise, show installed icon + if ( !package->versionInstalled().isNull() ) + { + if ( m_packman.compareVersions( package->version(), package->versionInstalled() ) == 1 ) + item->setPixmap( 0, m_iconUpdated ); + else + item->setPixmap( 0, m_iconInstalled ); + } + else + item->setPixmap( 0, m_iconNull ); + } + } +} + +void MainWindow::searchForPackage( const QString &text ) +{ + if ( !text.isEmpty() ) + { + // look through package list for text startng at current position + QCheckListItem *start = static_cast(m_packageList.currentItem()); + if ( start == 0 ) + start = static_cast(m_packageList.firstChild()); + +// for ( QCheckListItem *item = static_cast(start->nextSibling()); item != 0 ; + for ( QCheckListItem *item = static_cast(start); item != 0 ; + item = static_cast(item->nextSibling()) ) + { + if ( item->text().lower().find( text ) != -1 ) + { + m_packageList.ensureItemVisible( item ); + m_packageList.setCurrentItem( item ); + break; + } + } + } +} + +void MainWindow::initPackageInfo() +{ + m_widgetStack.raiseWidget( &m_statusWidget ); + + // Load package list + m_packman.loadAvailablePackages(); + m_packman.loadInstalledPackages(); + + OPackageList *packageList = m_packman.packages(); + if ( packageList ) + { + loadPackageList( packageList, true ); + delete packageList; + } + + m_widgetStack.raiseWidget( &m_packageList ); +} + +void MainWindow::slotWidgetStackShow( QWidget *widget ) +{ + if ( widget == &m_packageList ) + { + setCaption( tr( "Package Manager" ) ); + + m_menuBar.show(); + m_toolBar.show(); + } + else + { + m_menuBar.hide(); + m_toolBar.hide(); + } +} + +void MainWindow::slotInitStatusBar( int numSteps ) +{ + m_statusBar.setTotalSteps( numSteps ); +} + +void MainWindow::slotStatusText( const QString &status ) +{ + m_statusText.setText( status ); +} + +void MainWindow::slotStatusBar( int currStep ) +{ + m_statusBar.setProgress( currStep ); +} + +void MainWindow::slotUpdate() +{ + // Create package manager output widget + InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Update package information" ), false, + OPackage::Update ); + connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseInstallDlg()) ); + + // Display widget + m_widgetStack.addWidget( dlg, 3 ); + m_widgetStack.raiseWidget( dlg ); +} + +void MainWindow::slotUpgrade() +{ + // Create package manager output widget + InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Upgrade installed packages" ), false, + OPackage::Upgrade ); + connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseInstallDlg()) ); + + // Display widget + m_widgetStack.addWidget( dlg, 3 ); + m_widgetStack.raiseWidget( dlg ); +} + + // Ipkg implementation does not seem to work currently? (not working in aqpkg either) +/* +void MainWindow::slotDownload() +{ + // Retrieve list of packages selected for download (if any) + QStringList *workingPackages = new QStringList(); + + for ( QCheckListItem *item = static_cast(m_packageList.firstChild()); + item != 0 ; + item = static_cast(item->nextSibling()) ) + { + if ( item->isOn() ) + workingPackages->append( item->text() ); + } + + if ( workingPackages->isEmpty() ) + { + // No packages were selected, prompt for URL of package to download + } + else + { + // Download selected packages + m_config.setGroup( "settings" ); + QString workingDir = m_config.readEntry( "DownloadDir", "/tmp" ); + +// QString text = InputDialog::getText( tr( "Download to where" ), tr( "Enter path to download to" ), workingDir, &ok, this ); +// if ( ok && !text.isEmpty() ) +// workingDir = text; // user entered something and pressed ok +// else +// return; // user entered nothing or pressed cancel + +// // Store download directory in config file +// m_config.writeEntry( "DownloadDir", workingDir ); + + // Get starting directory +// char initDir[PATH_MAX]; +// getcwd( initDir, PATH_MAX ); + + // Download packages + + } + + // Create package manager output widget + InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Download packages" ), false, + OPackage::Download, workingPackages ); + connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseInstallDlg()) ); + + // Display widget + m_widgetStack.addWidget( dlg, 3 ); + m_widgetStack.raiseWidget( dlg ); +} +*/ + +void MainWindow::slotApply() +{ + QStringList *removeList = 0x0; + QStringList *installList = 0x0; + QStringList *upgradeList = 0x0; + + for ( QCheckListItem *item = static_cast(m_packageList.firstChild()); + item != 0 ; + item = static_cast(item->nextSibling()) ) + { + if ( item->isOn() ) + { + OPackage *package = m_packman.findPackage( item->text() ); + if ( package ) + { + if ( !package->versionInstalled().isNull() ) + { + if ( m_packman.compareVersions( package->version(), package->versionInstalled() ) == 1 ) + { + // Remove/upgrade package + int answer = PromptDlg::ask( tr( "Remove or upgrade" ), + tr( QString( "Do you wish to remove or upgrade\n%1?" ).arg( item->text() ) ), + tr( "Remove" ), tr( "Upgrade" ), this ); + if ( answer == 1 ) // Remove + { + if ( !removeList ) + removeList = new QStringList(); + removeList->append( item->text() ); + } + else if ( answer == 2 ) // Upgrade + { + if ( !upgradeList ) + upgradeList = new QStringList(); + 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 + { + if ( !removeList ) + removeList = new QStringList(); + removeList->append( item->text() ); + } + else if ( answer == 2 ) // Reinstall + { + if ( !installList ) + installList = new QStringList(); + installList->append( item->text() ); + } + } + } + else + { + // Install package + if ( !installList ) + installList = new QStringList(); + installList->append( item->text() ); + } + } + } + } + + // If nothing is selected, display message and exit + if ( !removeList && !installList && !upgradeList ) + { + 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 && !removeList->isEmpty() ) + removeCmd = OPackage::Remove; + OPackage::Command installCmd = OPackage::NotDefined; + if ( installList && !installList->isEmpty() ) + installCmd = OPackage::Install; + OPackage::Command upgradeCmd = OPackage::NotDefined; + if ( upgradeList && !upgradeList->isEmpty() ) + upgradeCmd = OPackage::Upgrade; + + // Create package manager output widget + InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Apply changes" ), true, + removeCmd, removeList, + installCmd, installList, + upgradeCmd, upgradeList ); + connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseInstallDlg()) ); + + // Display widget + m_widgetStack.addWidget( dlg, 3 ); + m_widgetStack.raiseWidget( dlg ); +} + +void MainWindow::slotCloseInstallDlg() +{ + // Close install dialog + delete m_widgetStack.visibleWidget(); + + // Reload package list + initPackageInfo(); +} + +void MainWindow::slotConfigure() +{ + if ( m_packman.configureDlg( false ) ) + { + if ( PromptDlg::ask( tr( "Config updated" ), + tr( "The configuration has been updated. Do you want to update server and package information now?" ), + tr( "Yes" ), tr( "No" ), this ) == 1 ) + { + // Update package list and reload package info + slotUpdate(); + } + } +} + +void MainWindow::slotShowNotInstalled() +{ + OPackageList *packageList; + if ( m_actionShowNotInstalled->isOn() ) + { + m_actionShowInstalled->setOn( false ); + m_actionShowUpdated->setOn( false ); + packageList = m_packman.filterPackages( QString::null, QString::null, QString::null, + OPackageManager::NotInstalled, QString::null ); + } + else + packageList = m_packman.packages(); + + if ( packageList ) + { + loadPackageList( packageList, true ); + delete packageList; + } +} + +void MainWindow::slotShowInstalled() +{ + OPackageList *packageList; + if ( m_actionShowInstalled->isOn() ) + { + m_actionShowNotInstalled->setOn( false ); + m_actionShowUpdated->setOn( false ); + packageList = m_packman.filterPackages( QString::null, QString::null, QString::null, + OPackageManager::Installed, QString::null ); + } + else + packageList = m_packman.packages(); + + if ( packageList ) + { + loadPackageList( packageList, true ); + delete packageList; + } +} + +void MainWindow::slotShowUpdated() +{ + OPackageList *packageList; + if ( m_actionShowUpdated->isOn() ) + { + m_actionShowInstalled->setOn( false ); + m_actionShowNotInstalled->setOn( false ); + packageList = m_packman.filterPackages( QString::null, QString::null, QString::null, + OPackageManager::Updated, QString::null ); + } + else + packageList = m_packman.packages(); + + if ( packageList ) + { + loadPackageList( packageList, true ); + delete packageList; + } +} + +void MainWindow::slotFilterChange() +{ + FilterDlg dlg( this, &m_packman, m_filterName, m_filterServer, m_filterDest, m_filterStatus, + m_filterCategory ); + if ( dlg.exec() == QDialog::Accepted ) + { + m_filterName = dlg.name(); + m_filterServer = dlg.server(); + m_filterDest = dlg.destination(); + m_filterStatus = dlg.status(); + m_filterCategory = dlg.category(); + m_actionFilter->setOn( true ); + slotFilter( true ); + } + else + { + m_actionFilter->setOn( false ); + slotFilter( false ); + } +} + +void MainWindow::slotFilter( bool isOn ) +{ + OPackageList *packageList; + if ( isOn ) + { + packageList = m_packman.filterPackages( m_filterName, m_filterServer, m_filterDest, + m_filterStatus, m_filterCategory ); + } + else + packageList = m_packman.packages(); + + if ( packageList ) + { + loadPackageList( packageList, true ); + delete packageList; + } +} + +void MainWindow::slotFindShowToolbar() +{ + m_findBar.show(); + m_findEdit->setFocus(); +} + +void MainWindow::slotFindHideToolbar() +{ + m_findBar.hide(); +} + +void MainWindow::slotFindChanged( const QString &findText ) +{ + + m_actionFindNext->setEnabled( !findText.isEmpty() ); + searchForPackage( findText ); +} + +void MainWindow::slotFindNext() +{ + searchForPackage( m_findEdit->text() ); +} -- cgit v0.9.0.2