From e21101f3bfe7af2692313c6ad1e402b6c549e1a6 Mon Sep 17 00:00:00 2001 From: Heikki Holstila Date: Mon, 3 Jan 2011 18:50:26 +0200 Subject: [PATCH] 0.7 changes --- Makefile | 18 +- TODO.txt | 34 +- aaptinterface.cpp | 7 - aaptinterface.h | 2 - debian/changelog | 13 +- fapman.pro | 6 +- icons/commit.png | Bin 2694 -> 1548 bytes icons/fapman.png | Bin 3395 -> 3531 bytes icons/filter_cat.png | Bin 4239 -> 2859 bytes icons/filter_stat.png | Bin 4107 -> 2885 bytes icons/sort.png | Bin 3230 -> 3274 bytes installfile.cpp | 114 +++ installfile.h | 35 + mainwindow.cpp | 1160 ++++++++++++++------------- mainwindow.ui | 2 +- packageselector.cpp | 3 +- packageselector.ui | 5 +- packageview.cpp | 2099 ++++++++++++++++++++++++------------------------- packageview.h | 220 +++--- repository.cpp | 24 +- repository.h | 7 +- 21 files changed, 1978 insertions(+), 1771 deletions(-) create mode 100644 installfile.cpp create mode 100644 installfile.h diff --git a/Makefile b/Makefile index da40232..c31abee 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: fapman -# Generated by qmake (2.01a) (Qt 4.7.0) on: Thu Nov 25 19:13:35 2010 +# Generated by qmake (2.01a) (Qt 4.7.0) on: Mon Jan 3 18:43:44 2011 # Project: fapman.pro # Template: app # Command: /opt/NokiaQtSDK/Maemo/4.6.2/targets/fremantle-pr13/bin/qmake -spec /opt/NokiaQtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/share/qt4/mkspecs/linux-g++-maemo5 -o Makefile fapman.pro @@ -64,7 +64,8 @@ SOURCES = main.cpp \ blacklistselect.cpp \ rotatingbackground.cpp \ searchoptions.cpp \ - dpkginterface.cpp moc_mainwindow.cpp \ + dpkginterface.cpp \ + installfile.cpp moc_mainwindow.cpp \ moc_packageview.cpp \ moc_filterselect.cpp \ moc_confirmdialog.cpp \ @@ -104,6 +105,7 @@ OBJECTS = main.o \ rotatingbackground.o \ searchoptions.o \ dpkginterface.o \ + installfile.o \ moc_mainwindow.o \ moc_packageview.o \ moc_filterselect.o \ @@ -237,7 +239,7 @@ qmake: FORCE dist: @$(CHK_DIR_EXISTS) .tmp/fapman1.0.0 || $(MKDIR) .tmp/fapman1.0.0 - $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/fapman1.0.0/ && $(COPY_FILE) --parents mainwindow.h package.h packageview.h filterselect.h confirmdialog.h dimmer.h repoview.h packageselector.h help.h settings.h aaptinterface.h repository.h repoedit.h logview.h apt-src/version.h apt-src/strutl.h apt-src/pkgcache.h apt-src/mmap.h apt-src/debversion.h apt-src/fileutl.h apt-src/cacheiterators.h sortselector.h blacklistselect.h rotatingbackground.h searchoptions.h dpkginterface.h .tmp/fapman1.0.0/ && $(COPY_FILE) --parents resources.qrc .tmp/fapman1.0.0/ && $(COPY_FILE) --parents main.cpp mainwindow.cpp package.cpp packageview.cpp filterselect.cpp confirmdialog.cpp dimmer.cpp repoview.cpp packageselector.cpp help.cpp settings.cpp aaptinterface.cpp repository.cpp repoedit.cpp logview.cpp apt-src/debversion.cc apt-src/version.cc sortselector.cpp blacklistselect.cpp rotatingbackground.cpp searchoptions.cpp dpkginterface.cpp .tmp/fapman1.0.0/ && $(COPY_FILE) --parents mainwindow.ui packageview.ui filterselect.ui confirmdialog.ui repoview.ui packageselector.ui help.ui settings.ui repoedit.ui logview.ui sortselector.ui blacklistselect.ui searchoptions.ui .tmp/fapman1.0.0/ && (cd `dirname .tmp/fapman1.0.0` && $(TAR) fapman1.0.0.tar fapman1.0.0 && $(COMPRESS) fapman1.0.0.tar) && $(MOVE) `dirname .tmp/fapman1.0.0`/fapman1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/fapman1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/fapman1.0.0/ && $(COPY_FILE) --parents mainwindow.h package.h packageview.h filterselect.h confirmdialog.h dimmer.h repoview.h packageselector.h help.h settings.h aaptinterface.h repository.h repoedit.h logview.h apt-src/version.h apt-src/strutl.h apt-src/pkgcache.h apt-src/mmap.h apt-src/debversion.h apt-src/fileutl.h apt-src/cacheiterators.h sortselector.h blacklistselect.h rotatingbackground.h searchoptions.h dpkginterface.h installfile.h .tmp/fapman1.0.0/ && $(COPY_FILE) --parents resources.qrc .tmp/fapman1.0.0/ && $(COPY_FILE) --parents main.cpp mainwindow.cpp package.cpp packageview.cpp filterselect.cpp confirmdialog.cpp dimmer.cpp repoview.cpp packageselector.cpp help.cpp settings.cpp aaptinterface.cpp repository.cpp repoedit.cpp logview.cpp apt-src/debversion.cc apt-src/version.cc sortselector.cpp blacklistselect.cpp rotatingbackground.cpp searchoptions.cpp dpkginterface.cpp installfile.cpp .tmp/fapman1.0.0/ && $(COPY_FILE) --parents mainwindow.ui packageview.ui filterselect.ui confirmdialog.ui repoview.ui packageselector.ui help.ui settings.ui repoedit.ui logview.ui sortselector.ui blacklistselect.ui searchoptions.ui .tmp/fapman1.0.0/ && (cd `dirname .tmp/fapman1.0.0` && $(TAR) fapman1.0.0.tar fapman1.0.0 && $(COMPRESS) fapman1.0.0.tar) && $(MOVE) `dirname .tmp/fapman1.0.0`/fapman1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/fapman1.0.0 clean:compiler_clean @@ -433,6 +435,7 @@ mainwindow.o: mainwindow.cpp mainwindow.h \ blacklistselect.h \ version.h \ ui_mainwindow.h \ + rotatingbackground.h \ packageview.h \ package.h \ confirmdialog.h \ @@ -441,8 +444,9 @@ mainwindow.o: mainwindow.cpp mainwindow.h \ help.h \ settings.h \ logview.h \ - rotatingbackground.h \ - dpkginterface.h + dpkginterface.h \ + installfile.h \ + repository.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mainwindow.o mainwindow.cpp package.o: package.cpp package.h \ @@ -585,6 +589,10 @@ searchoptions.o: searchoptions.cpp searchoptions.h \ dpkginterface.o: dpkginterface.cpp dpkginterface.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o dpkginterface.o dpkginterface.cpp +installfile.o: installfile.cpp installfile.h \ + repository.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o installfile.o installfile.cpp + moc_mainwindow.o: moc_mainwindow.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_mainwindow.o moc_mainwindow.cpp diff --git a/TODO.txt b/TODO.txt index e2d2f7d..55dd749 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,4 +1,4 @@ -------------------------------------------------------------------------------------- +s------------------------------------------------------------------------------------- TODO for Faster Application Manager Note that many of these are just random ideas, not all of them will get implemented @@ -7,38 +7,32 @@ 0.7: * prompt for filename when storing/loading selections -* ability to save all installed user-category packages as a selection list -* added command line scripts to use apt-get with FAM's cache (fapt-get, fapt-cache) -- possibility to force reinstall of an already installed package -- improve package dialog UI in portrait mode +* ability to save all installed user-category packages as selections +* added command line helper scripts (fapt-get, fapt-cache) +* UI tweaks (package list view patch by MohammadAG, icons by joppu) + + +later/uncertain: + - better blacklist editor - ability to import/export blacklist? +- possibility to force reinstall of an already installed package +- fetch dates from other repositories than maemo.org? +- support translations - -0.8: - support loading .install files - support installing local .debs -- dbus interface for installing packages by name - mime type handling for .install and .deb (can it be done without conflicting HAM?) -- support translations - -later/any/uncertain: -- fetch dates from other repositories than maemo.org? -- fetch dates for other than user categories? -- add an option to start fetching changelogs automatically for all upgradeable packages? -- how to handle package names that end in '-'? (theoretically they are valid but nonexistent?) -- ability to easily add extras-devel and extras-testing to repos if they don't exist -- load package lists in the background when the main menu is visible? -- warn about unauthenticated packages / option to disable installing unauthenticated packages - show download speed and current repo for apt-get update (very hard to do since apt-get update output does not show all the information needed to get the current list file names?) -- "problem solver" feature (find broken packages, handle recovery from broken packages better) -known bugs: + +known bugs/shortcomings: - no window menu indicator in stacked windows (probably a Qt bug) - updating menu icons after installation does not work or works only sometimes (currently disabled) - does not warn about system upgrade? - date fetching is quite slow with qt4.7 +- no way to edit the blacklist status of packages that are currently unknown diff --git a/aaptinterface.cpp b/aaptinterface.cpp index 73bee4b..bda25dc 100644 --- a/aaptinterface.cpp +++ b/aaptinterface.cpp @@ -1954,10 +1954,3 @@ void AAptInterface::readPinnedPackages() "remove such settings as they can result in unexpected behavior of Faster Application Manager."); } } - -bool AAptInterface::loadInstallFiles(QStringList files_) -{ - qDebug() << files_; - - return false; -} diff --git a/aaptinterface.h b/aaptinterface.h index 23efd1f..7925c55 100644 --- a/aaptinterface.h +++ b/aaptinterface.h @@ -104,8 +104,6 @@ public: void setSkipListAndDates() { iSkipRefreshListAndDates=true; } bool needListOrDateRefresh(); - bool loadInstallFiles(QStringList files_); - QDateTime lastListUpdate() { return iLastListUpdate; } QDateTime lastDpkgUpdate() { return iLastDpkgUpdate; } diff --git a/debian/changelog b/debian/changelog index 701b626..bdd2dbf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,17 @@ fapman (0.7-1) unstable; urgency=low - * + * prompt for filename when storing/loading selections + * ability to save all installed user-category packages as selections + * added command line helper scripts (fapt-get, fapt-cache) + * UI tweaks (package list view patch by MohammadAG, icons by joppu) - -- Heikki Holstila Thu, 25 Nov 2010 19:16:17 +0200 + -- Heikki Holstila Mon, 3 Jan 2011 18:40:14 +0200 + +fapman (0.6.8.1-1) unstable; urgency=low + + * fix a problem with changelog fetching + + -- Heikki Holstila Thu, 25 Nov 2010 20:12:00 +0200 fapman (0.6.8-1) unstable; urgency=low diff --git a/fapman.pro b/fapman.pro index b641b80..9d34c7a 100644 --- a/fapman.pro +++ b/fapman.pro @@ -31,7 +31,8 @@ SOURCES += main.cpp\ blacklistselect.cpp \ rotatingbackground.cpp \ searchoptions.cpp \ - dpkginterface.cpp + dpkginterface.cpp \ + installfile.cpp HEADERS += mainwindow.h \ package.h \ @@ -58,7 +59,8 @@ HEADERS += mainwindow.h \ blacklistselect.h \ rotatingbackground.h \ searchoptions.h \ - dpkginterface.h + dpkginterface.h \ + installfile.h FORMS += mainwindow.ui \ packageview.ui \ diff --git a/icons/commit.png b/icons/commit.png index 7c5e21f33e71eb02c9ed56c33b06c8bd3758821f..9188c0d9889af47e9a60a549e0e06f6adcb3f618 100644 GIT binary patch literal 1548 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 Ze*sG1QkCzXwLuu diff --git a/icons/filter_cat.png b/icons/filter_cat.png index 2fd783254ce09abf36c1be370b380b1d2d5e4731..eb826c8906b7af8196c1ec5a94243ad8b4d56d5d 100644 GIT binary patch literal 2859 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 diff --git a/icons/filter_stat.png b/icons/filter_stat.png index 945907212a3d97b3ead8ebed6cf0a263d33ad429..4a2b3cb65af94a920f46eaf751d524cb786ab97e 100644 GIT binary patch literal 2885 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 literal 4107 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 IM6N<$f-3qySO5S3 literal 3230 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 QtpET307*qoM6N<$f)x!4(EtDd diff --git a/installfile.cpp b/installfile.cpp new file mode 100644 index 0000000..159f3f6 --- /dev/null +++ b/installfile.cpp @@ -0,0 +1,114 @@ +#include +#include "installfile.h" +#include "repository.h" + + +InstallFile::InstallFile(QString filename): iIsValid(true) +{ + sections sect = sectNone; + QStringList catalogues; + Repository* newrepo = 0; + QString currentRepoSect; + + qDebug() << "--reading install file" << filename; + + QFile f(filename); + if( f.open(QIODevice::ReadOnly | QIODevice::Text) ) + { + while( !f.atEnd() && iIsValid ) + { + QString line = f.readLine().simplified(); + //qDebug() << ">" << line; + + if( line == "[install]" ) { + sect = sectInstall; + qDebug() << "install section"; + } else if( line == "[catalogues]" ) { + sect = sectCatalogues; + qDebug() << "catalogues section"; + } else if( line.startsWith('[') && line.endsWith(']') ) { + sect = sectRepo; + currentRepoSect = line.mid(1,line.length()-2); + if( !catalogues.contains( currentRepoSect ) ) + { + iIsValid = false; + iErrorString = "File contains an unknown section"; + sect = sectInvalid; + qDebug() << "unknown section" << currentRepoSect; + } else { + qDebug() << "repo section" << currentRepoSect; + newrepo = new Repository(); + if( !newrepo ) { + qDebug() << "FATAL ERROR"; + iIsValid = false; + return; + } + iRepos.append(newrepo); + } + } + + if( sect == sectCatalogues || sect == sectInstall ) { + if( line.startsWith("catalogues") ) + { + catalogues.append( TrimList( line.mid( line.indexOf('=')+1 ).split(';') ) ); + qDebug() << catalogues; + } + } + if( sect == sectInstall ) { + if( line.startsWith("package") ) { + iInstallPackages.append( TrimList( line.mid( line.indexOf('=')+1 ).split(';') ) ); + qDebug() << iInstallPackages; + } + } + if( sect == sectRepo ) { + if( line.startsWith("name") ) { + newrepo->setName( line.mid( line.indexOf('=')+1 ).trimmed() ); + } + if( line.startsWith("uri") ) { + newrepo->setEnabled(true); + newrepo->setUrlDir( line.mid( line.indexOf('=')+1 ).trimmed() ); + } + if( line.startsWith("components") ) { + newrepo->setComponents( line.mid( line.indexOf('=')+1 ).trimmed() ); + } + if( line.startsWith("dist") ) { + newrepo->setDist( line.mid( line.indexOf('=')+1 ).trimmed() ); + } + } + + } + f.close(); + } else { + iIsValid = false; + iErrorString = "Could not open file"; + qDebug() << "could not open file"; + } + + qDebug() << "--done" << filename; + + for(int i=0; idist().isEmpty() ) + iRepos.at(i)->setDist("fremantle-1.3"); // this is not exactly the right way... + } + } +} + +InstallFile::~InstallFile() +{ + for(int i=0; i + +class Repository; + +class InstallFile +{ +public: + enum sections { sectNone, sectInstall, sectCatalogues, sectRepo, sectInvalid }; + + explicit InstallFile(QString filename); + virtual ~InstallFile(); + + bool isValid() { return iIsValid; } + QString errorString() { return iErrorString; } + QList repositories() { return iRepos; } + QStringList installPackages() { return iInstallPackages; } + +private: + InstallFile(const InstallFile& old); + InstallFile operator= (const InstallFile& old); + + QStringList TrimList(QStringList l); + + bool iIsValid; + QString iErrorString; + + QStringList iInstallPackages; + QList iRepos; + +}; + +#endif // INSTALLFILE_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 844f065..24a61a5 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,27 +1,8 @@ -/* - This file is part of Faster Application Manager. - - Faster Application Manager 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 3 of the License, or - (at your option) any later version. - - Faster Application Manager 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 Faster Application Manager. If not, see . - - (C) Heikki Holstila 2010 -*/ - #ifdef MYDEF_GTK_EXISTS extern "C" { - #include - #include + #include + #include } #endif @@ -38,7 +19,7 @@ extern "C" extern "C" { - #include + #include } #include "mainwindow.h" @@ -54,6 +35,8 @@ extern "C" #include "logview.h" #include "rotatingbackground.h" #include "dpkginterface.h" +#include "installfile.h" +#include "repository.h" MainWindow::MainWindow(QWidget *parent) : @@ -62,127 +45,127 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); - iAptInterface = new AAptInterface(this); - iWinPackageView = new PackageView(this); - iWinPackageView->setAptInterface(iAptInterface); - iWinRepoView = new RepoView(this); - iWinRepoView->setAptInterface(iAptInterface); - iSettings = new Settings(this); - iSettings->setAptInterface(iAptInterface); - iSettings->setPackageView(iWinPackageView); - iWinPackageView->setSettings(iSettings); - iAptInterface->setSettings(iSettings); - iDpkgInterface = new DpkgInterface(this); - - iWinPackageView->setSortOrder( (PackageView::sortOrder)iSettings->qsettings()->value("default_sort_order",0).toInt() ); - - iWinPackageView->setSearchOptions( iSettings->qsettings()->value("search_pkgnames",true).toBool(), - iSettings->qsettings()->value("search_displaynames",true).toBool(), - iSettings->qsettings()->value("search_descshort",true).toBool(), - iSettings->qsettings()->value("search_desclong",false).toBool() ); + iAptInterface = new AAptInterface(this); + iWinPackageView = new PackageView(this); + iWinPackageView->setAptInterface(iAptInterface); + iWinRepoView = new RepoView(this); + iWinRepoView->setAptInterface(iAptInterface); + iSettings = new Settings(this); + iSettings->setAptInterface(iAptInterface); + iSettings->setPackageView(iWinPackageView); + iWinPackageView->setSettings(iSettings); + iAptInterface->setSettings(iSettings); + iDpkgInterface = new DpkgInterface(this); + + iWinPackageView->setSortOrder( (PackageView::sortOrder)iSettings->qsettings()->value("default_sort_order",0).toInt() ); + + iWinPackageView->setSearchOptions( iSettings->qsettings()->value("search_pkgnames",true).toBool(), + iSettings->qsettings()->value("search_displaynames",true).toBool(), + iSettings->qsettings()->value("search_descshort",true).toBool(), + iSettings->qsettings()->value("search_desclong",false).toBool() ); #ifdef Q_WS_MAEMO_5 - if( !iSettings->qsettings()->value("disable_autorotation",false).toBool() ) { - this->setAttribute(Qt::WA_Maemo5AutoOrientation); - } else { - this->setAttribute(Qt::WA_Maemo5LandscapeOrientation); - } - this->setAttribute(Qt::WA_Maemo5StackedWindow); + if( !iSettings->qsettings()->value("disable_autorotation",false).toBool() ) { + this->setAttribute(Qt::WA_Maemo5AutoOrientation); + } else { + this->setAttribute(Qt::WA_Maemo5LandscapeOrientation); + } + this->setAttribute(Qt::WA_Maemo5StackedWindow); #endif - iDimmer = new dimmer(this); - - iReposAutoUpdating = false; - iUpgradeAutoUpdate = true; - iNextOperation = OpNone; - - connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged())); - - ui->centralWidget->loadWallpaper(); - - /* - QString stylesheet_mainscreen = - "QPushButton {" - "border-radius: 16px;" - "border-width: 1px;" - "border-color: palette(light);" - "border-style: outset;" - "padding-right: 10px;" - "padding-left: 10px;" - "color: palette(buttontext);" - "background: rgba(255,255,255,80);" - "}" - "QPushButton:pressed {" - "border-style: inset;" - "background-color: rgba(255,255,255,150);" - "}"; - */ - - if( ((QApplication*)QApplication::instance())->styleSheet().isEmpty() ) - { - QString stylesheet_file; - QFile f("/root/.fapman/style.css"); - if( f.open(QIODevice::ReadOnly | QIODevice::Text ) ) - { - while(!f.atEnd()) { - stylesheet_file += f.readLine().trimmed(); - } - f.close(); - } - - if( stylesheet_file.isEmpty() ) { - //ui->centralWidget->setStyleSheet(stylesheet_mainscreen); - } else { - ((QApplication*)QApplication::instance())->setStyleSheet(stylesheet_file); - } - } - - - iMediaObject = new Phonon::MediaObject(this); - Phonon::AudioOutput* aout = new Phonon::AudioOutput(Phonon::NotificationCategory, this); - Phonon::createPath(iMediaObject, aout); - - showFreeSpace(); - - iNetworkConfigurationManager = new QNetworkConfigurationManager(this); - iNetworkSession = new QNetworkSession(iNetworkConfigurationManager->defaultConfiguration(),this); - - show(); - rescaleMenuView(); + iDimmer = new dimmer(this); + + iReposAutoUpdating = false; + iUpgradeAutoUpdate = true; + iNextOperation = OpNone; + + connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged())); + + ui->centralWidget->loadWallpaper(); + + /* + QString stylesheet_mainscreen = + "QPushButton {" + "border-radius: 16px;" + "border-width: 1px;" + "border-color: palette(light);" + "border-style: outset;" + "padding-right: 10px;" + "padding-left: 10px;" + "color: palette(buttontext);" + "background: rgba(255,255,255,80);" + "}" + "QPushButton:pressed {" + "border-style: inset;" + "background-color: rgba(255,255,255,150);" + "}"; + */ + + if( ((QApplication*)QApplication::instance())->styleSheet().isEmpty() ) + { + QString stylesheet_file; + QFile f("/root/.fapman/style.css"); + if( f.open(QIODevice::ReadOnly | QIODevice::Text ) ) + { + while(!f.atEnd()) { + stylesheet_file += f.readLine().trimmed(); + } + f.close(); + } + + if( stylesheet_file.isEmpty() ) { + //ui->centralWidget->setStyleSheet(stylesheet_mainscreen); + } else { + ((QApplication*)QApplication::instance())->setStyleSheet(stylesheet_file); + } + } + + + iMediaObject = new Phonon::MediaObject(this); + Phonon::AudioOutput* aout = new Phonon::AudioOutput(Phonon::NotificationCategory, this); + Phonon::createPath(iMediaObject, aout); + + showFreeSpace(); + + iNetworkConfigurationManager = new QNetworkConfigurationManager(this); + iNetworkSession = new QNetworkSession(iNetworkConfigurationManager->defaultConfiguration(),this); + + show(); + rescaleMenuView(); } MainWindow::~MainWindow() { - // save "need repo refresh" status - iSettings->qsettings()->setValue("need_repo_refresh", iAptInterface->needRepoRefresh()); - - if( iNetworkSession && iNetworkSession->isOpen() ) { - iNetworkSession->close(); - } - // iNetworkSession automatically deleted by parent - - delete iWinPackageView; iWinPackageView=0; - delete iWinRepoView; iWinRepoView=0; - delete iAptInterface; iAptInterface=0; - delete iDpkgInterface; iDpkgInterface=0; - delete iDimmer; iDimmer=0; - delete iSettings; iSettings=0; - delete ui; ui=0; - //iMediaObject and aout automatically deleted by their parent + // save "need repo refresh" status + iSettings->qsettings()->setValue("need_repo_refresh", iAptInterface->needRepoRefresh()); + + if( iNetworkSession && iNetworkSession->isOpen() ) { + iNetworkSession->close(); + } + // iNetworkSession automatically deleted by parent + + delete iWinPackageView; iWinPackageView=0; + delete iWinRepoView; iWinRepoView=0; + delete iAptInterface; iAptInterface=0; + delete iDpkgInterface; iDpkgInterface=0; + delete iDimmer; iDimmer=0; + delete iSettings; iSettings=0; + delete ui; ui=0; + //iMediaObject and aout automatically deleted by their parent } void MainWindow::openNetworkConnection() { - if( iNetworkSession->isOpen() ) - return; - - iNetworkSession->open(); - if( !iNetworkSession->waitForOpened(20000) ) - { - ConfirmDialog d(false, this); - d.setText("Network error","Unable to open a network connection"); - d.exec(); - } + if( iNetworkSession->isOpen() ) + return; + + iNetworkSession->open(); + if( !iNetworkSession->waitForOpened(20000) ) + { + ConfirmDialog d(false, this); + d.setText("Network error","Unable to open a network connection"); + d.exec(); + } } void MainWindow::changeEvent(QEvent *e) @@ -199,500 +182,555 @@ void MainWindow::changeEvent(QEvent *e) void MainWindow::on_btnRepos_clicked() { - iWinRepoView->openWin(); + iWinRepoView->openWin(); } void MainWindow::on_btnUpdate_clicked() -{ - // update catalogs +{ + // update catalogs - openNetworkConnection(); + openNetworkConnection(); - busyDialog(true, tr("Operation in progress"), tr("Updating catalogs")); + busyDialog(true, tr("Operation in progress"), tr("Updating catalogs")); - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); - iAptInterface->run(iDimmer); + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); + iAptInterface->run(iDimmer); } #ifdef Q_WS_MAEMO_5 int MainWindow::top_application() { - show(); - activateWindow(); - raise(); - return 0; + show(); + activateWindow(); + raise(); + return 0; } #endif void MainWindow::dateFetchAsk() { - if( !iSettings->qsettings()->value("firstrun_asked_fetch_dates",false).toBool() && - !iSettings->qsettings()->value("fetch_dates",false).toBool() ) - { - iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true); - ConfirmDialog d(true, this); - d.setText("Fetch date information?","Enable date information fetching for packages? You have to enable it in order to be " - "able to sort packages by date. The first fetch can be slow but the dates are cached for later use. You can later " - "change this selection from the options menu."); - if( d.exec() ) - iSettings->qsettings()->setValue("fetch_dates", true); - } - if( iSettings->qsettings()->value("fetch_dates",false).toBool() ) - { - iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true); // don't ask if the option has already been enabled - if( !iAptInterface->dateCacheExists() ) - { - ConfirmDialog d(false, this); - d.setText("Notice","Date information will be fetched only for packages from maemo.org and only for user categories."); - d.exec(); - } - iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates); - } + if( !iSettings->qsettings()->value("firstrun_asked_fetch_dates",false).toBool() && + !iSettings->qsettings()->value("fetch_dates",false).toBool() ) + { + iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true); + ConfirmDialog d(true, this); + d.setText("Fetch date information?","Enable date information fetching for packages? You have to enable it in order to be " + "able to sort packages by date. The first fetch can be slow but the dates are cached for later use. You can later " + "change this selection from the options menu."); + if( d.exec() ) + iSettings->qsettings()->setValue("fetch_dates", true); + } + if( iSettings->qsettings()->value("fetch_dates",false).toBool() ) + { + iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true); // don't ask if the option has already been enabled + if( !iAptInterface->dateCacheExists() ) + { + ConfirmDialog d(false, this); + d.setText("Notice","Date information will be fetched only for packages from maemo.org and only for user categories."); + d.exec(); + } + iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates); + } } void MainWindow::on_btnListInstallable_clicked() { - //install + //install - openNetworkConnection(); + openNetworkConnection(); - int listupd = -1; - int dpkgupd = -1; - if( iAptInterface->lastListUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) - listupd = 1; - if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) - dpkgupd = 1; - iAptInterface->setNeedRefresh(-1,listupd,dpkgupd,listupd); + int listupd = -1; + int dpkgupd = -1; + if( iAptInterface->lastListUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) + listupd = 1; + if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) + dpkgupd = 1; + iAptInterface->setNeedRefresh(-1,listupd,dpkgupd,listupd); - iWinPackageView->setStatFilter( Package::PkgStatNotInstalled ); + iWinPackageView->setStatFilter( Package::PkgStatNotInstalled ); - if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() ) - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); + if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() ) + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); - busyDialog(true, tr("Operation in progress"), tr("Reading package lists")); + busyDialog(true, tr("Operation in progress"), tr("Reading package lists")); - iNextOperation = OpOpenPkgView; - iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); + iNextOperation = OpOpenPkgView; + iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); - dateFetchAsk(); + dateFetchAsk(); - iAptInterface->run(iDimmer); + iAptInterface->run(iDimmer); } void MainWindow::on_btnUpgrade_clicked() { - // upgrade + // upgrade - openNetworkConnection(); + openNetworkConnection(); - int listupd = -1; - int dpkgupd = -1; - if( iAptInterface->lastListUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) - listupd = 1; - if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) - dpkgupd = 1; - iAptInterface->setNeedRefresh(-1,listupd,dpkgupd,listupd); + int listupd = -1; + int dpkgupd = -1; + if( iAptInterface->lastListUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) + listupd = 1; + if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) + dpkgupd = 1; + iAptInterface->setNeedRefresh(-1,listupd,dpkgupd,listupd); - iWinPackageView->setStatFilter( Package::PkgStatUpgradeable ); + iWinPackageView->setStatFilter( Package::PkgStatUpgradeable ); - if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() ) - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); + if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() ) + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); - busyDialog(true, tr("Operation in progress"), tr("Reading package lists")); + busyDialog(true, tr("Operation in progress"), tr("Reading package lists")); - iNextOperation = OpOpenPkgView; - iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); + iNextOperation = OpOpenPkgView; + iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); - dateFetchAsk(); + dateFetchAsk(); - iAptInterface->run(iDimmer); + iAptInterface->run(iDimmer); } void MainWindow::on_btnListInstalled_clicked() { - //remove + //remove - if( !iSettings->qsettings()->value("remove_readfull",false).toBool() ) - iAptInterface->setSkipListAndDates(); + if( !iSettings->qsettings()->value("remove_readfull",false).toBool() ) + iAptInterface->setSkipListAndDates(); - int dpkgupd = -1; - if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) - dpkgupd = 1; - iAptInterface->setNeedRefresh(-1,-1,dpkgupd,-1); + int dpkgupd = -1; + if( iAptInterface->lastDpkgUpdate() < QDateTime::currentDateTime().addSecs(-KListExpireTime) ) + dpkgupd = 1; + iAptInterface->setNeedRefresh(-1,-1,dpkgupd,-1); - iWinPackageView->setStatFilter( Package::PkgStatInstalled ); + iWinPackageView->setStatFilter( Package::PkgStatInstalled ); - busyDialog(true, tr("Operation in progress"), tr("Reading package lists")); + busyDialog(true, tr("Operation in progress"), tr("Reading package lists")); - iNextOperation = OpOpenPkgView; - iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); + iNextOperation = OpOpenPkgView; + iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); - dateFetchAsk(); + dateFetchAsk(); - iAptInterface->run(iDimmer); + iAptInterface->run(iDimmer); } void MainWindow::operationQueueFinished(QList lastModes, bool success, QString title, QStringList msgs) { - if( lastModes.contains(AAptInterface::ModeAptGetSimulate) && success ) { - iNextOperation = OpPromptSimulated; - } - if( lastModes.contains(AAptInterface::ModeAptGetInstall) && success ) { - iWinPackageView->clearSelections(); - busyDialog(false); - iWinPackageView->close(); - iNextOperation = OpNone; - - GdkEventIconThemeReload(); - } - - QWidget* dialogParent = this; - if( iWinPackageView->isVisible() ) - dialogParent = iWinPackageView; - - if( iNextOperation == OpOpenPkgView && success ) - { - iWinPackageView->openWin(); - busyDialog(false); - iNextOperation = OpNone; - } else if( iNextOperation == OpPromptSimulated && success ) - { - QStringList inst,remv,instver,remvver; - QStringList all = iAptInterface->processPackages(); - QStringList vers = iAptInterface->processPackageVersions(); - for(int zyx=0; zyxzyx ) - remvver.append( vers.at(zyx) ); - } else { - inst.append( all.at(zyx) ); - if( vers.count()>zyx ) - instver.append( vers.at(zyx) ); - } - } - - int total_dl_size = 0; - for( int i=0; ipackagesAvailable()->value(inst.at(i),0); - if( pkg ) { - total_dl_size += pkg->size()/1024; - } - } - - QString pkglist; - pkglist = QString("The following operations will be performed:
" - "%1 to install/upgrade, %2 to remove
").arg(inst.count()).arg(remv.count()); - if( inst.count()>0 ) - pkglist += QString("Total download size: %L1 kB
").arg(total_dl_size); - bool mismatch = false; - bool warn_system_package_remove = false; - bool warn_system_package_install = false; - - if( remv.count()>0 ) { - pkglist += "
REMOVE:
"; - for( int i=0; i"; - Package* pkg = iAptInterface->packagesInstalled()->value(remv.at(i),0); - if( !pkg ) { - qDebug() << "Warning: unknown package" << remv.at(i); - pkglist += "***UNKNOWN***"; - mismatch = true; - } + if( lastModes.contains(AAptInterface::ModeAptGetSimulate) && success ) { + iNextOperation = OpPromptSimulated; + } + if( lastModes.contains(AAptInterface::ModeAptGetInstall) && success ) { + iWinPackageView->clearSelections(); + busyDialog(false); + iWinPackageView->close(); + iNextOperation = OpNone; + + GdkEventIconThemeReload(); + } + + QWidget* dialogParent = this; + if( iWinPackageView->isVisible() ) + dialogParent = iWinPackageView; + + if( iNextOperation == OpOpenPkgView && success ) + { + iWinPackageView->openWin(); + busyDialog(false); + iNextOperation = OpNone; + } else if( iNextOperation == OpPromptSimulated && success ) + { + QStringList inst,remv,instver,remvver; + QStringList all = iAptInterface->processPackages(); + QStringList vers = iAptInterface->processPackageVersions(); + for(int zyx=0; zyxzyx ) + remvver.append( vers.at(zyx) ); + } else { + inst.append( all.at(zyx) ); + if( vers.count()>zyx ) + instver.append( vers.at(zyx) ); + } + } + + int total_dl_size = 0; + for( int i=0; ipackagesAvailable()->value(inst.at(i),0); + if( pkg ) { + total_dl_size += pkg->size()/1024; + } + } + + QString pkglist; + pkglist = QString("The following operations will be performed:
" + "%1 to install/upgrade, %2 to remove
").arg(inst.count()).arg(remv.count()); + if( inst.count()>0 ) + pkglist += QString("Total download size: %L1 kB
").arg(total_dl_size); + bool mismatch = false; + bool warn_system_package_remove = false; + bool warn_system_package_install = false; + + if( remv.count()>0 ) { + pkglist += "
REMOVE:
"; + for( int i=0; i"; + Package* pkg = iAptInterface->packagesInstalled()->value(remv.at(i),0); + if( !pkg ) { + qDebug() << "Warning: unknown package" << remv.at(i); + pkglist += "***UNKNOWN***"; + mismatch = true; + } #ifdef Q_WS_MAEMO_5 - if( pkg && pkg->maemoDisplayName()=="Maemo 5" ) { - warn_system_package_remove = true; - } + if( pkg && pkg->maemoDisplayName()=="Maemo 5" ) { + warn_system_package_remove = true; + } #endif - if( remvver.count()>i ) { - pkglist += " " + remvver.at(i); - if( pkg && remvver.at(i) != pkg->version() ) { - qDebug() << "Version mismatch, database version is" << pkg->version() << "but removing" << remvver.at(i); - mismatch = true; - pkglist += " ***TRYING TO REMOVE " + pkg->version() + "*** "; - } - } - if( pkg && pkg->installedSize()>0 ) - pkglist += QString(" (%L1 kB)").arg(pkg->installedSize()); - pkglist += "
"; - } - } - pkglist += "
"; - - bool installing_blacklisted = false; - if( inst.count()>0 ) { - pkglist += "
INSTALL/UPGRADE:
"; - for( int i=0; i"; - Package* pkg = iAptInterface->packagesAvailable()->value(inst.at(i),0); - if( !pkg ) { - qDebug() << "Warning: unknown package" << inst.at(i); - pkglist += "***NEW/UNKNOWN***"; - mismatch = true; - } - if( pkg && pkg->isBlacklisted() ) { - qDebug() << "Warning: installing blacklisted package" << inst.at(i); - pkglist += "***BLACKLISTED***"; - installing_blacklisted = true; - } + if( remvver.count()>i ) { + pkglist += " " + remvver.at(i); + if( pkg && remvver.at(i) != pkg->version() ) { + qDebug() << "Version mismatch, database version is" << pkg->version() << "but removing" << remvver.at(i); + mismatch = true; + pkglist += " ***TRYING TO REMOVE " + pkg->version() + "*** "; + } + } + if( pkg && pkg->installedSize()>0 ) + pkglist += QString(" (%L1 kB)").arg(pkg->installedSize()); + pkglist += "
"; + } + } + pkglist += "
"; + + bool installing_blacklisted = false; + if( inst.count()>0 ) { + pkglist += "
INSTALL/UPGRADE:
"; + for( int i=0; i"; + Package* pkg = iAptInterface->packagesAvailable()->value(inst.at(i),0); + if( !pkg ) { + qDebug() << "Warning: unknown package" << inst.at(i); + pkglist += "***NEW/UNKNOWN***"; + mismatch = true; + } + if( pkg && pkg->isBlacklisted() ) { + qDebug() << "Warning: installing blacklisted package" << inst.at(i); + pkglist += "***BLACKLISTED***"; + installing_blacklisted = true; + } #ifdef Q_WS_MAEMO_5 - if( pkg && pkg->maemoDisplayName()=="Maemo 5" ) { // unreliable? - warn_system_package_install = true; - } + if( pkg && pkg->maemoDisplayName()=="Maemo 5" ) { // unreliable? + warn_system_package_install = true; + } #endif - if( instver.count()>i ) { - pkglist += " " + instver.at(i); - if( pkg && instver.at(i) != pkg->version() ) { - qDebug() << "Version mismatch, database version is" << pkg->version() << "but installing" << instver.at(i); - mismatch = true; - pkglist += " ***TRYING TO INSTALL " + pkg->version() + "*** "; - } - } - if( pkg && pkg->size()>0 ) { - pkglist += QString(" (%L1 kB)").arg(pkg->size()/1024); - } - pkglist += "
"; - } - } - pkglist += "
"; - - if( mismatch ) { - ConfirmDialog m(false, dialogParent); - m.setText("Warning", "There is a version mismatch between your original package selections and some of the packages being installed " \ - "from the repositories. This could be due to your application catalogs being out of date."); - m.exec(); - } - if( installing_blacklisted ) { - ConfirmDialog b(false, dialogParent); - b.setText("Warning","Blacklisted package(s) will be installed"); - b.exec(); - } - if( warn_system_package_remove ) { - ConfirmDialog s(false, dialogParent); - s.setText("Warning","You are about to remove a critical system package."); - s.exec(); - } - if( warn_system_package_install ) { - ConfirmDialog s(false, dialogParent); - s.setText("Warning","You are trying to perform an install/upgrade operation on a critical system package. Doing a system upgrade with " \ - "Faster Application Manager has not been tested and it could result in a horrible failure. You have been warned."); - s.exec(); - } - - busyDialog(false); - ConfirmDialog d(true, dialogParent); - if( inst.count()==0 && remv.count()==0 ) - { - pkglist = "None of the packages can be installed"; - d.disableButton(); - } - d.setText("Confirmation",pkglist); - if( d.exec() ) { - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetInstall); - - if( iSettings->qsettings()->value("enable_autoclean",true).toBool() && inst.count()>0 ) - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean); - - QString busytext; - if( remv.count() > 0 ) - busytext += QString("Remove %1 package(s)
").arg(remv.count()); - if( inst.count() > 0 ) - busytext += QString("Install %1 package(s)
").arg(inst.count()); - busytext += "Preparing..."; - busyDialog(true, "Operation in progress", busytext); - - // "run" really does nothing here since the previous item should still be running - if( iWinPackageView->isVisible() ) { - iAptInterface->run(iWinPackageView->mydimmer()); - } else { - iAptInterface->run(iDimmer); - } - } - iNextOperation = OpNone; - return; - } else { - busyDialog(false); - iNextOperation = OpNone; - - if( iSettings->qsettings()->value("sound_notify",false).toBool() ) - { - qDebug() << "playing sound"; - iMediaObject->setCurrentSource( Phonon::MediaSource(iSettings->qsettings()->value("sound_file","/usr/share/sounds/ui-operation_ready.wav").toString()) ); - iMediaObject->play(); - } - - QString text = "
Faster Application Manager
" - ""+title+"
" + msgs.join("
") + "
"; - - QRect r = QApplication::desktop()->rect(); - if(r.width() < r.height()) { - ConfirmDialog d(false, dialogParent); - d.setText(title,msgs.join("
")); - d.exec(); - } else { + if( instver.count()>i ) { + pkglist += " " + instver.at(i); + if( pkg && instver.at(i) != pkg->version() ) { + qDebug() << "Version mismatch, database version is" << pkg->version() << "but installing" << instver.at(i); + mismatch = true; + pkglist += " ***TRYING TO INSTALL " + pkg->version() + "*** "; + } + } + if( pkg && pkg->size()>0 ) { + pkglist += QString(" (%L1 kB)").arg(pkg->size()/1024); + } + pkglist += "
"; + } + } + pkglist += "
"; + + if( mismatch ) { + ConfirmDialog m(false, dialogParent); + m.setText("Warning", "There is a version mismatch between your original package selections and some of the packages being installed " \ + "from the repositories. This could be due to your application catalogs being out of date."); + m.exec(); + } + if( installing_blacklisted ) { + ConfirmDialog b(false, dialogParent); + b.setText("Warning","Blacklisted package(s) will be installed"); + b.exec(); + } + if( warn_system_package_remove ) { + ConfirmDialog s(false, dialogParent); + s.setText("Warning","You are about to remove a critical system package."); + s.exec(); + } + if( warn_system_package_install ) { + ConfirmDialog s(false, dialogParent); + s.setText("Warning","You are trying to perform an install/upgrade operation on a critical system package. Doing a system upgrade with " \ + "Faster Application Manager has not been tested and it could result in a horrible failure. You have been warned."); + s.exec(); + } + + busyDialog(false); + ConfirmDialog d(true, dialogParent); + if( inst.count()==0 && remv.count()==0 ) + { + pkglist = "None of the packages can be installed"; + d.disableButton(); + } + d.setText("Confirmation",pkglist); + if( d.exec() ) { + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetInstall); + + if( iSettings->qsettings()->value("enable_autoclean",true).toBool() && inst.count()>0 ) + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean); + + QString busytext; + if( remv.count() > 0 ) + busytext += QString("Remove %1 package(s)
").arg(remv.count()); + if( inst.count() > 0 ) + busytext += QString("Install %1 package(s)
").arg(inst.count()); + busytext += "Preparing..."; + busyDialog(true, "Operation in progress", busytext); + + // "run" really does nothing here since the previous item should still be running + if( iWinPackageView->isVisible() ) { + iAptInterface->run(iWinPackageView->mydimmer()); + } else { + iAptInterface->run(iDimmer); + } + } + iNextOperation = OpNone; + return; + } else { + busyDialog(false); + iNextOperation = OpNone; + + if( iSettings->qsettings()->value("sound_notify",false).toBool() ) + { + qDebug() << "playing sound"; + iMediaObject->setCurrentSource( Phonon::MediaSource(iSettings->qsettings()->value("sound_file","/usr/share/sounds/ui-operation_ready.wav").toString()) ); + iMediaObject->play(); + } + + QString text = "
Faster Application Manager
" + ""+title+"
" + msgs.join("
") + "
"; + + QRect r = QApplication::desktop()->rect(); + if(r.width() < r.height()) { + ConfirmDialog d(false, dialogParent); + d.setText(title,msgs.join("
")); + d.exec(); + } else { #ifdef Q_WS_MAEMO_5 - QMaemo5InformationBox::information(0, text, QMaemo5InformationBox::NoTimeout); + QMaemo5InformationBox::information(0, text, QMaemo5InformationBox::NoTimeout); #else - ConfirmDialog d(false, dialogParent); - d.setText(title,msgs.join("
")); - d.exec(); + ConfirmDialog d(false, dialogParent); + d.setText(title,msgs.join("
")); + d.exec(); #endif - } + } - showFreeSpace(); - } + showFreeSpace(); + } } void MainWindow::busyDialog(bool show_, QString title, QString text) { - if( show_ ) { - iDimmer->setProgress(-1); - ui->menuMenu->setEnabled(false); - ui->centralWidget->setEnabled(false); - iWinPackageView->disableMenu(); - iDimmer->resizeEvent(0); - iDimmer->dim(title, text); - iWinPackageView->mydimmer()->resizeEvent(0); - iWinPackageView->mydimmer()->dim(title, text); - } else { - iDimmer->undim(); - iWinPackageView->mydimmer()->undim(); - ui->menuMenu->setEnabled(true); - ui->centralWidget->setEnabled(true); - iWinPackageView->enableMenu(); - } + if( show_ ) { + iDimmer->setProgress(-1); + ui->menuMenu->setEnabled(false); + ui->centralWidget->setEnabled(false); + iWinPackageView->disableMenu(); + iDimmer->resizeEvent(0); + iDimmer->dim(title, text); + iWinPackageView->mydimmer()->resizeEvent(0); + iWinPackageView->mydimmer()->dim(title, text); + } else { + iDimmer->undim(); + iWinPackageView->mydimmer()->undim(); + ui->menuMenu->setEnabled(true); + ui->centralWidget->setEnabled(true); + iWinPackageView->enableMenu(); + } } void MainWindow::on_actionAbout_triggered() { - ConfirmDialog d(false, this); - d.setText("About","Faster Application Manager
" - "Version " + PROGRAM_VERSION + "

" - "(C) Heikki Holstila 2010
Donate using " - "PayPal"); - d.exec(); + ConfirmDialog d(false, this); + d.setText("About","Faster Application Manager
" + "Version " + PROGRAM_VERSION + "

" + "(C) Heikki Holstila 2010
Donate using " + "PayPal"); + d.exec(); } void MainWindow::on_actionClean_triggered() { - //if( iOperation != OpNone ) return; - //iOperation = OpClean; - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean); - iAptInterface->run(iDimmer); + //if( iOperation != OpNone ) return; + //iOperation = OpClean; + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean); + iAptInterface->run(iDimmer); } void MainWindow::closeEvent(QCloseEvent *event) { - if( iDimmer->busy() ) { - iAptInterface->cancel(); - event->ignore(); - } else { - event->accept(); - } + if( iDimmer->busy() ) { + iAptInterface->cancel(); + event->ignore(); + } else { + event->accept(); + } } void MainWindow::on_actionView_log_triggered() { - QByteArray log = iAptInterface->readLogFile(); - LogView l(log, this); - l.exec(); + QByteArray log = iAptInterface->readLogFile(); + LogView l(log, this); + l.exec(); } void MainWindow::on_actionOptions_triggered() { - iSettings->openWin(); + iSettings->openWin(); } void MainWindow::notifyDialog(QString title, QString msg) { - QWidget* dialogParent = this; - if( iWinPackageView->isVisible() ) - dialogParent = iWinPackageView; + QWidget* dialogParent = this; + if( iWinPackageView->isVisible() ) + dialogParent = iWinPackageView; - ConfirmDialog d(false, dialogParent); - d.setText(title, msg); - d.exec(); + ConfirmDialog d(false, dialogParent); + d.setText(title, msg); + d.exec(); } bool MainWindow::confirmDialog(QString title, QString msg) { - QWidget* dialogParent = this; - if( iWinPackageView->isVisible() ) - dialogParent = iWinPackageView; + QWidget* dialogParent = this; + if( iWinPackageView->isVisible() ) + dialogParent = iWinPackageView; - ConfirmDialog d(true, dialogParent); - d.setText(title, msg); - return d.exec(); + ConfirmDialog d(true, dialogParent); + d.setText(title, msg); + return d.exec(); } void MainWindow::GdkEventIconThemeReload() { - // DOES NOT EVEN WORK (at least not reliably) - disabled from the project file + // DOES NOT EVEN WORK (at least not reliably) - disabled from the project file #ifdef MYDEF_GTK_EXISTS - qDebug() << "Sending GDK icon theme reload event"; + qDebug() << "Sending GDK icon theme reload event"; - gdk_init((int*)QApplication::argc(),(gchar***)QApplication::argv()); + gdk_init((int*)QApplication::argc(),(gchar***)QApplication::argv()); - // taken from hildon application manager - GdkEventClient ev; - ev.type = GDK_CLIENT_EVENT; - ev.window = NULL; - ev.send_event = TRUE; - ev.message_type = gdk_atom_intern_static_string("_GTK_LOAD_ICONTHEMES"); - ev.data_format = 32; - gdk_event_send_clientmessage_toall((GdkEvent*)&ev); + // taken from hildon application manager + GdkEventClient ev; + ev.type = GDK_CLIENT_EVENT; + ev.window = NULL; + ev.send_event = TRUE; + ev.message_type = gdk_atom_intern_static_string("_GTK_LOAD_ICONTHEMES"); + ev.data_format = 32; + gdk_event_send_clientmessage_toall((GdkEvent*)&ev); - while(gdk_events_pending()) { - g_main_context_iteration(NULL, true); - } + while(gdk_events_pending()) { + g_main_context_iteration(NULL, true); + } #endif } void MainWindow::on_actionLoad_file_triggered() { - QStringList files = QFileDialog::getOpenFileNames(this, "Open files", "/", "Files (*.deb *.install)"); - if( files.count() > 0 ) { - QStringList debs = files.filter(QRegExp(".*\\.deb$")); - QStringList installs = files.filter(QRegExp(".*\\.install$")); - if( debs.count()>0 && installs.count()>0 ) { - ConfirmDialog d(false, this); - d.setText("Error", "You can't mix different file types in your selection"); - d.exec(); - return; - } - if( debs.count()>0 ) - iDpkgInterface->loadDebFiles(debs); - else if( installs.count()>0 ) - iAptInterface->loadInstallFiles(installs); - } + /* + QStringList files = QFileDialog::getOpenFileNames(this, "Open files", "/", "Files (*.deb *.install)"); + QStringList debs; + QStringList installs; + if( files.count() > 0 ) { + debs = files.filter(QRegExp(".*\\.deb$")); + installs = files.filter(QRegExp(".*\\.install$")); + if( debs.count()>0 && installs.count()>0 ) { + ConfirmDialog d(false, this); + d.setText("Error", "You can't mix different file types in your selection"); + d.exec(); + return; + } else if( installs.count() != 1 ) { + ConfirmDialog d(false, this); + d.setText("Error","Select only one install file"); + d.exec(); + return; + } + if( debs.count()>0 ) + iDpkgInterface->loadDebFiles(debs); + else if( installs.count()==1 ) + InstallFile instf(installs.at(0)); + } + */ + + QString file = QFileDialog::getOpenFileName(this, "Open file", "/", "Install files (*.install)"); + if( !file.isEmpty() ) { + InstallFile instf( file ); + bool reposchanged = false; + if( instf.isValid() ) { + qDebug() << "SUCCESS"; + for(int i=0; itoString(); + bool found=false; + for(int j=0; jrepositories()->count(); j++) { + if( instf.repositories().at(i) && iAptInterface->repositories()->at(j) && + instf.repositories().at(i)->toString(true) == iAptInterface->repositories()->at(j)->toString(true) ) + { + found = true; + qDebug() << "found"; + if( !iAptInterface->repositories()->at(j)->enabled() ) { + iAptInterface->repositories()->at(j)->setEnabled(true); + reposchanged = true; + qDebug() << "not enabled, enabling"; + } + } + } + if( !found ) { + qDebug() << "repo not found, adding"; + Repository* r = new Repository(); + r->setFromString( instf.repositories().at(i)->toString(true) ); + iAptInterface->repositories()->append(r); + reposchanged = true; + } + } + + + if( reposchanged ) { + iAptInterface->writeRepositories(); + } + iAptInterface->setNeedRefresh(1,1,-1,1); + this->on_btnUpdate_clicked(); + + } else { + qDebug() << "FAIL"; + ConfirmDialog d(false, this); + d.setText("Error",instf.errorString()); + d.exec(); + } + } } void MainWindow::resizeEvent(QResizeEvent* event) { - rescaleMenuView(); + rescaleMenuView(); - if( iDimmer ) { - iDimmer->resize( this->size() ); - } + if( iDimmer ) { + iDimmer->resize( this->size() ); + } - QMainWindow::resizeEvent(event); + QMainWindow::resizeEvent(event); } void MainWindow::rescaleMenuView() { - QRect sg = ui->listWidget->rect(); + QRect sg = ui->listWidget->rect(); - if( sg.width() > sg.height() ) { - ui->listWidget->setGridSize( QSize((sg.width()-12)/5, (sg.height()-12)/2) ); - } else { - ui->listWidget->setGridSize( QSize((sg.width()-12)/3, (sg.height()-12)/3) ); - } + if( sg.width() > sg.height() ) { + ui->listWidget->setGridSize( QSize((sg.width()-12)/5, (sg.height()-12)/2) ); + } else { + ui->listWidget->setGridSize( QSize((sg.width()-12)/3, (sg.height()-12)/3) ); + } } void MainWindow::orientationChanged() @@ -702,68 +740,68 @@ void MainWindow::orientationChanged() void MainWindow::showFreeSpace() { - quint64 warn_limit_root = 5120; - quint64 warn_limit_opt = 51200; - struct statfs root_stat; - struct statfs opt_stat; - statfs("/",&root_stat); - statfs("/opt",&opt_stat); - quint64 free_root = static_cast(root_stat.f_bavail) * static_cast(root_stat.f_bsize) / 1024; - quint64 free_opt = static_cast(opt_stat.f_bavail) * static_cast(opt_stat.f_bsize) / 1024; - quint64 total_root = static_cast(root_stat.f_blocks) * static_cast(root_stat.f_bsize) / 1024; - quint64 total_opt = static_cast(opt_stat.f_blocks) * static_cast(opt_stat.f_bsize) / 1024; - qDebug() << "rootfs" << free_root << "/" << total_root << "kB free"; - qDebug() << "opt fs" << free_opt << "/" << total_opt << "kB free"; - - QString rootstr = QString("rootfs: %L1 / %L2 MB free").arg(free_root/1024).arg(total_root/1024); - QString optstr = QString("opt: %L1 / %L2 MB free").arg(free_opt/1024).arg(total_opt/1024); - - ui->label->setText("" + rootstr + "
" + optstr + "
"); - - /* - ui->progressBarRoot->setFormat(rootstr); - ui->progressBarRoot->setMaximum(total_root/1024); - ui->progressBarRoot->setValue(free_root/1024); - ui->progressBarOpt->setFormat(optstr); - ui->progressBarOpt->setMaximum(total_opt/1024); - ui->progressBarOpt->setValue(free_opt/1024); - */ - - if( free_root < warn_limit_root || free_opt < warn_limit_opt ) - { - ConfirmDialog d(false, this); - QString t; - if( free_root < warn_limit_root ) - t += QString("Root filesystem has %L1 kB available
").arg(free_root); - if( free_opt < warn_limit_opt ) - t += QString("Opt (home) filesystem has %L1 kB available
").arg(free_opt); - t += "
You may proceed, but consider freeing up space to prevent problems in the future"; - d.setText("Warning: Low disk space",t); - d.exec(); - } + quint64 warn_limit_root = 5120; + quint64 warn_limit_opt = 51200; + struct statfs root_stat; + struct statfs opt_stat; + statfs("/",&root_stat); + statfs("/opt",&opt_stat); + quint64 free_root = static_cast(root_stat.f_bavail) * static_cast(root_stat.f_bsize) / 1024; + quint64 free_opt = static_cast(opt_stat.f_bavail) * static_cast(opt_stat.f_bsize) / 1024; + quint64 total_root = static_cast(root_stat.f_blocks) * static_cast(root_stat.f_bsize) / 1024; + quint64 total_opt = static_cast(opt_stat.f_blocks) * static_cast(opt_stat.f_bsize) / 1024; + qDebug() << "rootfs" << free_root << "/" << total_root << "kB free"; + qDebug() << "opt fs" << free_opt << "/" << total_opt << "kB free"; + + QString rootstr = QString("rootfs: %L1 / %L2 MB free").arg(free_root/1024).arg(total_root/1024); + QString optstr = QString("opt: %L1 / %L2 MB free").arg(free_opt/1024).arg(total_opt/1024); + + ui->label->setText("" + rootstr + "
" + optstr + "
"); + + /* + ui->progressBarRoot->setFormat(rootstr); + ui->progressBarRoot->setMaximum(total_root/1024); + ui->progressBarRoot->setValue(free_root/1024); + ui->progressBarOpt->setFormat(optstr); + ui->progressBarOpt->setMaximum(total_opt/1024); + ui->progressBarOpt->setValue(free_opt/1024); + */ + + if( free_root < warn_limit_root || free_opt < warn_limit_opt ) + { + ConfirmDialog d(false, this); + QString t; + if( free_root < warn_limit_root ) + t += QString("Root filesystem has %L1 kB available
").arg(free_root); + if( free_opt < warn_limit_opt ) + t += QString("Opt (home) filesystem has %L1 kB available
").arg(free_opt); + t += "
You may proceed, but consider freeing up space to prevent problems in the future"; + d.setText("Warning: Low disk space",t); + d.exec(); + } } void MainWindow::on_listWidget_itemClicked(QListWidgetItem* item) { - qDebug() << "main menu:" << item->statusTip(); - - if( item->statusTip() == "manage_repos" ) { - on_btnRepos_clicked(); - } - else if( item->statusTip() == "update_catalogs" ) { - on_btnUpdate_clicked(); - } - else if( item->statusTip() == "install_apps" ) { - on_btnListInstallable_clicked(); - } - else if( item->statusTip() == "remove_apps" ) { - on_btnListInstalled_clicked(); - } - else if( item->statusTip() == "upgrade_apps" ) { - on_btnUpgrade_clicked(); - } - else { - qDebug() << "Warning: Unhandled main menu item"; - } - item->setSelected(false); + qDebug() << "main menu:" << item->statusTip(); + + if( item->statusTip() == "manage_repos" ) { + on_btnRepos_clicked(); + } + else if( item->statusTip() == "update_catalogs" ) { + on_btnUpdate_clicked(); + } + else if( item->statusTip() == "install_apps" ) { + on_btnListInstallable_clicked(); + } + else if( item->statusTip() == "remove_apps" ) { + on_btnListInstalled_clicked(); + } + else if( item->statusTip() == "upgrade_apps" ) { + on_btnUpgrade_clicked(); + } + else { + qDebug() << "Warning: Unhandled main menu item"; + } + item->setSelected(false); } diff --git a/mainwindow.ui b/mainwindow.ui index 3c8ed0a..97e5418 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -227,7 +227,7 @@ false - Install local files + Load .install file diff --git a/packageselector.cpp b/packageselector.cpp index 41e2a0e..fbc5bcc 100644 --- a/packageselector.cpp +++ b/packageselector.cpp @@ -71,6 +71,7 @@ PackageSelector::PackageSelector(Package* pkg, AAptInterface* apt, Settings* set ui->radioTabBasic->setText("Info"); ui->radioTabChanges->setText("Chgs"); ui->radioTabDepends->setText("Deps"); + ui->scrollAreaWidgetContents->setMaximumWidth( QApplication::desktop()->width() - 15 ); } Package* upg_pkg = iPkg->availablePackage(); @@ -223,7 +224,7 @@ void PackageSelector::updateInfo() if( iPkg->isInstalled() && !iPkg->isUpgradeable() ) { ui->radioInstall->setEnabled(false); - ui->radioInstall->hide(); + ui->radioInstall->hide(); } else if( !iPkg->isInstalled() ) { ui->radioRemove->setEnabled(false); ui->radioRemove->hide(); diff --git a/packageselector.ui b/packageselector.ui index 17c7dcd..5961620 100644 --- a/packageselector.ui +++ b/packageselector.ui @@ -31,7 +31,7 @@ 0 0 694 - 670 + 669 @@ -178,6 +178,9 @@ + + true + diff --git a/packageview.cpp b/packageview.cpp index 3ff9002..f334694 100644 --- a/packageview.cpp +++ b/packageview.cpp @@ -1,20 +1,20 @@ /* - This file is part of Faster Application Manager. + This file is part of Faster Application Manager. - Faster Application Manager 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 3 of the License, or - (at your option) any later version. + Faster Application Manager 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 3 of the License, or + (at your option) any later version. - Faster Application Manager 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. + Faster Application Manager 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 Faster Application Manager. If not, see . + You should have received a copy of the GNU General Public License + along with Faster Application Manager. If not, see . - (C) Heikki Holstila 2010 + (C) Heikki Holstila 2010 */ #include "packageview.h" @@ -34,535 +34,522 @@ PackageListWidgetItem::PackageListWidgetItem(Package* p_, QString name_) : QListWidgetItem(name_) { - iPackage = p_; + iPackage = p_; } void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - //QTime t; - //t.start(); - - QString name = index.data(UserRoleName).toString(); - QString version = index.data(UserRoleVersion).toString(); - QString desc = index.data(UserRoleDescShort).toString(); - Package::operation marked = (Package::operation) index.data(UserRoleMarked).toInt(); - bool installed = index.data(UserRoleInstalled).toBool(); - bool upgradeable = index.data(UserRoleUpgradeable).toBool(); - int statfilter = index.data(UserRoleCurrentStatFilter).toInt(); - int catfilter = index.data(UserRoleCurrentCatFilter).toInt(); - QString upg_version = index.data(UserRoleAvailVersion).toString(); - BlacklistSelect::blackList blacklisted = static_cast( index.data(UserRoleBlacklisted).toInt() ); - - painter->save(); - QRect r = option.rect; - - QLinearGradient gradientBase(r.topLeft(), r.bottomLeft()); - QColor base = option.palette.color(QPalette::Window); - QColor base2 = base; - int r1=base.red()+15; - int g1=base.green()+15; - int b1=base.blue()+15; - if( r1>255 ) r1=255; - if( g1>255 ) g1=255; - if( b1>255 ) b1=255; - int r2=base2.red()-20; - int g2=base2.green()-20; - int b2=base2.blue()-20; - if( r2<0 ) r2=0; - if( g2<0 ) g2=0; - if( b2<0 ) b2=0; - base.setRgb( r1, g1, b1 ); - base2.setRgb( r2, g2, b2 ); - gradientBase.setColorAt(0, base); - gradientBase.setColorAt(1, base2); - - painter->fillRect(r, gradientBase); - painter->drawLine(QPoint(r.left(),r.bottom()), QPoint(r.right(),r.bottom())); - - QPixmap icon = index.data(Qt::DecorationRole).value(); - if( icon.isNull() ) { - // use default icon - painter->drawPixmap( r.left(), r.top()+4, 48, 48, iDefaultIcon ); - } else { - painter->drawPixmap( r.left(), r.top()+4, 48, 48, icon ); - } - - QPixmap statusicon; - if( marked == Package::PkgOpNone ) - { - if( installed && upgradeable ) - statusicon = iIconPkgNoOpInstalledUpgradeable; - else if( installed ) - statusicon = iIconPkgNoOpInstalled; - else if( !installed ) - statusicon = iIconPkgNoOpNotInstalled; - } else if( marked == Package::PkgOpInstallUpgrade ) { - if( upgradeable ) - statusicon = iIconPkgUpgrade; - else - statusicon = iIconPkgInstall; - } else if( marked == Package::PkgOpRemove ) { - statusicon = iIconPkgRemove; - } - - QString showVer; - if( upgradeable && (statfilter==Package::PkgStatUpgradeable || - (statfilter==Package::PkgStatUnknown && marked==Package::PkgOpInstallUpgrade) || - (catfilter==PackageView::CatFilterAllMarked && marked==Package::PkgOpInstallUpgrade) )) - { - showVer = upg_version; - } else { - showVer = version; - } - - int ver_w = 0; - if( QApplication::desktop()->width() > QApplication::desktop()->height() ) - { - r = option.rect; - r.setRight( r.right()-statusicon.width()-4 ); - - if( catfilter != PackageView::CatFilterBlacklisted ) { - painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r); - ver_w = r.width(); - } else if( blacklisted==BlacklistSelect::BlacklistThis ) { - if( upgradeable && !upg_version.isEmpty() ) { - showVer = upg_version; - } else { - showVer = version; - } - painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r); - ver_w = r.width(); - } - } - - r = option.rect; - r.setRight( r.right()-statusicon.width()-4-ver_w ); //does not work as it should? - QFont f = painter->font(); - f.setBold(true); - painter->setFont(f); - painter->drawText(r.left()+iDefaultIcon.width()+2, r.top(), r.width(), r.height(), Qt::AlignTop|Qt::AlignLeft, name, &r); - f.setBold(false); - painter->setFont(f); - - f.setPointSize( f.pointSize()-4 ); - painter->setFont(f); - r = option.rect; - painter->drawText(r.left()+iDefaultIcon.width()+2, r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, desc, &r); - - r = option.rect; - painter->drawPixmap(r.right()-statusicon.width()-2, r.top()+4, 24, 24, statusicon); - - painter->restore(); - - //if( t.elapsed()>=100 ) - //qDebug() << name << t.elapsed(); + //QTime t; + //t.start(); + + QString name = index.data(UserRoleName).toString(); + QString version = index.data(UserRoleVersion).toString(); + QString desc = index.data(UserRoleDescShort).toString(); + Package::operation marked = (Package::operation) index.data(UserRoleMarked).toInt(); + bool installed = index.data(UserRoleInstalled).toBool(); + bool upgradeable = index.data(UserRoleUpgradeable).toBool(); + int statfilter = index.data(UserRoleCurrentStatFilter).toInt(); + int catfilter = index.data(UserRoleCurrentCatFilter).toInt(); + QString upg_version = index.data(UserRoleAvailVersion).toString(); + BlacklistSelect::blackList blacklisted = static_cast( index.data(UserRoleBlacklisted).toInt() ); + + painter->save(); + QRect r = option.rect; + + QPixmap icon = index.data(Qt::DecorationRole).value(); + if( icon.isNull() ) { + // use default icon + painter->drawPixmap( r.left()+6, r.top()+10, 48, 48, iDefaultIcon ); + } else { + painter->drawPixmap( r.left()+6, r.top()+10, 48, 48, icon ); + } + + QPixmap statusicon; + if( marked == Package::PkgOpNone ) + { + if( installed && upgradeable ) + statusicon = iIconPkgNoOpInstalledUpgradeable; + else if( installed ) + statusicon = iIconPkgNoOpInstalled; + else if( !installed ) + statusicon = iIconPkgNoOpNotInstalled; + } else if( marked == Package::PkgOpInstallUpgrade ) { + if( upgradeable ) + statusicon = iIconPkgUpgrade; + else + statusicon = iIconPkgInstall; + } else if( marked == Package::PkgOpRemove ) { + statusicon = iIconPkgRemove; + } + + QString showVer; + if( upgradeable && (statfilter==Package::PkgStatUpgradeable || + (statfilter==Package::PkgStatUnknown && marked==Package::PkgOpInstallUpgrade) || + (catfilter==PackageView::CatFilterAllMarked && marked==Package::PkgOpInstallUpgrade) )) + { + showVer = upg_version; + } else { + showVer = version; + } + + int ver_w = 0; + if( QApplication::desktop()->width() > QApplication::desktop()->height() ) + { + r = option.rect; + r.setTop( r.top()+6 ); + r.setRight( r.right()-statusicon.width()-6 ); + + if( catfilter != PackageView::CatFilterBlacklisted ) { + painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r); + ver_w = r.width(); + } else if( blacklisted==BlacklistSelect::BlacklistThis ) { + if( upgradeable && !upg_version.isEmpty() ) { + showVer = upg_version; + } else { + showVer = version; + } + painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r); + ver_w = r.width(); + } + } + + r = option.rect; + r.setRight( r.right()-statusicon.width()-4-ver_w ); //does not work as it should? + QFont f = painter->font(); + painter->setFont(f); + painter->drawText(r.left()+iDefaultIcon.width()+2, r.top()+5, r.width(), r.height(), Qt::AlignTop|Qt::AlignLeft, name, &r); + + f.setPointSize( f.pointSize()-4 ); + painter->setFont(f); + r = option.rect; + QColor gray; + gray = QColor(156, 154, 156); + painter->save(); + f.setPointSize(13); + painter->setFont(f); + painter->setPen(gray); + r.setBottom(r.bottom()-10); + painter->drawText(r.left()+iDefaultIcon.width()+2, r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, desc, &r); + painter->restore(); + + r = option.rect; + painter->drawPixmap(r.right()-statusicon.width()-2, r.top()+10, 24, 24, statusicon); + + painter->restore(); + + //if( t.elapsed()>=100 ) + //qDebug() << name << t.elapsed(); } void ListItemDelegate::loadIcons() { - iDefaultIcon = QPixmap(":/icons/icons/appdefault.png"); - iIconPkgInstall = QPixmap(":/icons/icons/pkg_install.png"); - iIconPkgUpgrade = QPixmap(":/icons/icons/pkg_upgrade.png"); - iIconPkgRemove = QPixmap(":/icons/icons/pkg_remove.png"); - iIconPkgNoOpInstalled = QPixmap(":/icons/icons/pkg_nop_installed.png"); - iIconPkgNoOpNotInstalled = QPixmap(":/icons/icons/pkg_nop_notinstalled.png"); - iIconPkgNoOpInstalledUpgradeable = QPixmap(":/icons/icons/pkg_nop_instupgr.png"); +#ifdef Q_WS_MAEMO_5 + iDefaultIcon = QPixmap("/usr/share/icons/hicolor/64x64/hildon/tasklaunch_default_application.png"); +#else + iDefaultIcon = QPixmap(":/icons/icons/appdefault.png"); +#endif + iIconPkgInstall = QPixmap(":/icons/icons/pkg_install.png"); + iIconPkgUpgrade = QPixmap(":/icons/icons/pkg_upgrade.png"); + iIconPkgRemove = QPixmap(":/icons/icons/pkg_remove.png"); + iIconPkgNoOpInstalled = QPixmap(":/icons/icons/pkg_nop_installed.png"); + iIconPkgNoOpNotInstalled = QPixmap(":/icons/icons/pkg_nop_notinstalled.png"); + iIconPkgNoOpInstalledUpgradeable = QPixmap(":/icons/icons/pkg_nop_instupgr.png"); } QSize ListItemDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const { - return QSize(400, 58); + return QSize(400, 70); } PackageView::PackageView(QWidget *parent) : QMainWindow(parent), ui(new Ui::PackageView) { - iMainWindow = dynamic_cast(parent); - ui->setupUi(this); + iMainWindow = dynamic_cast(parent); + ui->setupUi(this); #ifdef Q_WS_MAEMO_5 - this->setAttribute(Qt::WA_Maemo5StackedWindow); - this->setWindowFlags(Qt::Window); - this->setAttribute(Qt::WA_Maemo5AutoOrientation); + this->setAttribute(Qt::WA_Maemo5StackedWindow); + this->setWindowFlags(Qt::Window); + this->setAttribute(Qt::WA_Maemo5AutoOrientation); #endif - iSettings = 0; - iAptInterface = 0; - - connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged())); - - iCatFilterLabels - << tr("All marked packages") // a special case - << tr("All user categories") - << tr("\tDesktop") - << tr("\tEducation") - << tr("\tGames") - << tr("\tGraphics") - << tr("\tInternet & Networking") - << tr("\tLocation & Navigation") - << tr("\tMultimedia") - << tr("\tOffice") - << tr("\tOther") - << tr("\tProgramming") - << tr("\tScience") - << tr("\tSystem") - << tr("\tUtilities") - << tr("All packages (ADVANCED)") - << tr("Blacklisted packages"); // a special case - - iCatFilterStrings - << "" - << "user/" - << "user/desktop" - << "user/education" - << "user/games" - << "user/graphics" - << "user/network" - << "user/navigation" - << "user/multimedia" - << "user/office" - << "user/other" - << "user/development" - << "user/science" - << "user/system" - << "user/utilities" - << "" - << ""; - - iDefaultCatFilter = CatFilterAllUser; - iSelectedCatFilter = iDefaultCatFilter; - - iStatFilterLabels - << tr("All") - << tr("Not installed") - << tr("Upgradeable") - << tr("Installed"); - - iSelectedStatFilter = Package::PkgStatUnknown; - iSortOrder = SortAlpha; - - iDimmer = new dimmer(this); - - ui->searchBar->hide(); - - iListCoverLabel = new QLabel(ui->listWidget); - iListCoverLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - iListCoverLabel->setAlignment(Qt::AlignCenter); - - iKeyFilter = new KeyEventGrabber(this); - ui->listWidget->installEventFilter(iKeyFilter); - - iSortNoticeShown = false; - - iSearchPkgName = true; - iSearchDisplayName = true; - iSearchDescShort = true; - iSearchDescLong = false; - - // fine-tune kinetic scrolling parameters + iSettings = 0; + iAptInterface = 0; + + connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged())); + + iCatFilterLabels + << tr("All marked packages") // a special case + << tr("All user categories") + << tr("\tDesktop") + << tr("\tEducation") + << tr("\tGames") + << tr("\tGraphics") + << tr("\tInternet & Networking") + << tr("\tLocation & Navigation") + << tr("\tMultimedia") + << tr("\tOffice") + << tr("\tOther") + << tr("\tProgramming") + << tr("\tScience") + << tr("\tSystem") + << tr("\tUtilities") + << tr("All packages (ADVANCED)") + << tr("Blacklisted packages"); // a special case + + iCatFilterStrings + << "" + << "user/" + << "user/desktop" + << "user/education" + << "user/games" + << "user/graphics" + << "user/network" + << "user/navigation" + << "user/multimedia" + << "user/office" + << "user/other" + << "user/development" + << "user/science" + << "user/system" + << "user/utilities" + << "" + << ""; + + iDefaultCatFilter = CatFilterAllUser; + iSelectedCatFilter = iDefaultCatFilter; + + iStatFilterLabels + << tr("All") + << tr("Not installed") + << tr("Upgradeable") + << tr("Installed"); + + iSelectedStatFilter = Package::PkgStatUnknown; + iSortOrder = SortAlpha; + + iDimmer = new dimmer(this); + + ui->searchBar->hide(); + + iListCoverLabel = new QLabel(ui->listWidget); + iListCoverLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + iListCoverLabel->setAlignment(Qt::AlignCenter); + + iKeyFilter = new KeyEventGrabber(this); + ui->listWidget->installEventFilter(iKeyFilter); + + iSortNoticeShown = false; + + iSearchPkgName = true; + iSearchDisplayName = true; + iSearchDescShort = true; + iSearchDescLong = false; + + // fine-tune kinetic scrolling parameters #ifdef Q_WS_MAEMO_5 - QAbstractKineticScroller* listscroller = ui->listWidget->property("kineticScroller").value(); - if( listscroller ) - { - //qDebug() << listscroller->dragInertia() << listscroller->decelerationFactor() - // << listscroller->minimumVelocity() << listscroller->maximumVelocity(); - listscroller->setDecelerationFactor(0.75); // default is 0.85 - listscroller->setDragInertia(0.60); // default is 0.85 - listscroller->setMaximumVelocity(1800); // default is 3500 - - // not good because it alse sets horizontal overshoot: - //listscroller->setOvershootPolicy( QAbstractKineticScroller::OvershootAlwaysOn ); - } + QAbstractKineticScroller* listscroller = ui->listWidget->property("kineticScroller").value(); + if( listscroller ) + { + //qDebug() << listscroller->dragInertia() << listscroller->decelerationFactor() + // << listscroller->minimumVelocity() << listscroller->maximumVelocity(); + listscroller->setDecelerationFactor(0.75); // default is 0.85 + listscroller->setDragInertia(0.60); // default is 0.85 + listscroller->setMaximumVelocity(1800); // default is 3500 + + // not good because it alse sets horizontal overshoot: + //listscroller->setOvershootPolicy( QAbstractKineticScroller::OvershootAlwaysOn ); + } #endif } PackageView::~PackageView() { - delete iListCoverLabel; iListCoverLabel=0; - delete iKeyFilter; iKeyFilter=0; - delete iDimmer; iDimmer=0; - delete ui; ui=0; + delete iListCoverLabel; iListCoverLabel=0; + delete iKeyFilter; iKeyFilter=0; + delete iDimmer; iDimmer=0; + delete ui; ui=0; } void PackageView::orientationChanged() { - ui->listWidget->scroll(1,1); // this causes all items to be repainted - iListCoverLabel->setGeometry( ui->listWidget->rect() ); + ui->listWidget->scroll(1,1); // this causes all items to be repainted + iListCoverLabel->setGeometry( ui->listWidget->rect() ); } void PackageView::resizeEvent(QResizeEvent* event) { - if( iDimmer ) { - iDimmer->resize( this->size() ); - } + if( iDimmer ) { + iDimmer->resize( this->size() ); + } - iListCoverLabel->setGeometry( ui->listWidget->rect() ); - QWidget::resizeEvent(event); + iListCoverLabel->setGeometry( ui->listWidget->rect() ); + QWidget::resizeEvent(event); } bool PackageView::doFilterCategory(Package* pkg) { - if( pkg->section()=="user/hidden" && iSelectedStatFilter!=Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatUnknown ) - return false; - if( pkg->section()=="user/hidden" && !pkg->isInstalled() ) - return false; - - Package* upg_pkg = pkg->availablePackage(); - - if( iSelectedStatFilter==Package::PkgStatUpgradeable && iSelectedCatFilter!=CatFilterBlacklisted && - pkg->isUpgradeable() && upg_pkg && upg_pkg->isBlacklisted() ) - return false; - - if( pkg->isBlacklisted() || (upg_pkg && upg_pkg->isBlacklisted()) ) - { - if( iSelectedCatFilter == CatFilterBlacklisted ) - return true; - if( pkg->isInstalled() && (iSelectedStatFilter==Package::PkgStatInstalled || iSelectedStatFilter==Package::PkgStatUnknown) ) - return true; - if( pkg->isBlacklisted() && iSelectedCatFilter != CatFilterBlacklisted ) - return false; - } else if( !pkg->isBlacklisted() && iSelectedCatFilter == CatFilterBlacklisted ) - return false; - - if( iSelectedCatFilter==CatFilterAllMarked ) { - if( pkg->isMarkedForOperation() ) - return true; - else - return false; - } - if( pkg->section().startsWith( iCatFilterStrings.at(iSelectedCatFilter) ) ) - return true; - - return false; + if( pkg->section()=="user/hidden" && iSelectedStatFilter!=Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatUnknown ) + return false; + if( pkg->section()=="user/hidden" && !pkg->isInstalled() ) + return false; + + Package* upg_pkg = pkg->availablePackage(); + + if( iSelectedStatFilter==Package::PkgStatUpgradeable && iSelectedCatFilter!=CatFilterBlacklisted && + pkg->isUpgradeable() && upg_pkg && upg_pkg->isBlacklisted() ) + return false; + + if( pkg->isBlacklisted() || (upg_pkg && upg_pkg->isBlacklisted()) ) + { + if( iSelectedCatFilter == CatFilterBlacklisted ) + return true; + if( pkg->isInstalled() && (iSelectedStatFilter==Package::PkgStatInstalled || iSelectedStatFilter==Package::PkgStatUnknown) ) + return true; + if( pkg->isBlacklisted() && iSelectedCatFilter != CatFilterBlacklisted ) + return false; + } else if( !pkg->isBlacklisted() && iSelectedCatFilter == CatFilterBlacklisted ) + return false; + + if( iSelectedCatFilter==CatFilterAllMarked ) { + if( pkg->isMarkedForOperation() ) + return true; + else + return false; + } + if( pkg->section().startsWith( iCatFilterStrings.at(iSelectedCatFilter) ) ) + return true; + + return false; } QString PackageView::generateSortString(Package* pkg) { - QString sortstr; - - if( iSortOrder==SortAlpha ) { - sortstr = pkg->displayName(); - } - else if( iSortOrder==SortDateDesc ) { - Package* upg = 0; - if( pkg->isUpgradeable() ) - upg = pkg->availablePackage(); - - if( (!upg && pkg->date().isValid()) || iSelectedStatFilter==Package::PkgStatInstalled ) - sortstr = pkg->date().toString("yyyy-MM-dd hh:mm:ss"); - else if( upg && upg->date().isValid() ) { - sortstr = upg->date().toString("yyyy-MM-dd hh:mm:ss"); - } else { - sortstr = ""; - iPackagesEmptySort++; - } - } - else if( iSortOrder==SortSizeDesc ) { - if( pkg->isInstalled() ) - sortstr = QString("%1").arg(pkg->installedSize()*1024, 12 ); - else - sortstr = QString("%1").arg(pkg->size(), 12 ); - } - - //qDebug() << sortstr; - - return sortstr; + QString sortstr; + + if( iSortOrder==SortAlpha ) { + sortstr = pkg->displayName(); + } + else if( iSortOrder==SortDateDesc ) { + Package* upg = 0; + if( pkg->isUpgradeable() ) + upg = pkg->availablePackage(); + + if( (!upg && pkg->date().isValid()) || iSelectedStatFilter==Package::PkgStatInstalled ) + sortstr = pkg->date().toString("yyyy-MM-dd hh:mm:ss"); + else if( upg && upg->date().isValid() ) { + sortstr = upg->date().toString("yyyy-MM-dd hh:mm:ss"); + } else { + sortstr = ""; + iPackagesEmptySort++; + } + } + else if( iSortOrder==SortSizeDesc ) { + if( pkg->isInstalled() ) + sortstr = QString("%1").arg(pkg->installedSize()*1024, 12 ); + else + sortstr = QString("%1").arg(pkg->size(), 12 ); + } + + //qDebug() << sortstr; + + return sortstr; } void PackageView::openWin() { - ui->listWidget->clear(); - ui->listWidget->setSortingEnabled(true); - iPackagesEmptySort = 0; - - if( !isVisible() ) { - iMainWindow->busyDialog(false); - iListCoverLabel->setText("Loading..."); - iListCoverLabel->setAutoFillBackground(true); - iListCoverLabel->show(); - show(); - QApplication::processEvents(); - } - - if( iSortOrder==SortDateDesc || iSortOrder==SortSizeDesc ) - ui->listWidget->sortItems(Qt::DescendingOrder); - else - ui->listWidget->sortItems(Qt::AscendingOrder); - - delete ui->listWidget->itemDelegate(); - ListItemDelegate* delegate = new ListItemDelegate(ui->listWidget); - delegate->loadIcons(); - ui->listWidget->setItemDelegate( delegate ); - - if( !ui->searchBar->isVisible() ) - { - if( iSelectedStatFilter == Package::PkgStatNotInstalled || iSelectedStatFilter == Package::PkgStatUnknown || - iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) - { - QHashIterator i( *iAptInterface->packagesAvailable() ); - while (i.hasNext()) - { - i.next(); - Package* inst = iAptInterface->packagesInstalled()->value(i.value()->name(),0); - if( doFilterCategory(i.value()) && !inst ) - addListItem(i.value(), generateSortString(i.value())); - } - } - if( iSelectedStatFilter == Package::PkgStatInstalled || iSelectedStatFilter == Package::PkgStatUpgradeable || - iSelectedStatFilter == Package::PkgStatUnknown || iSelectedCatFilter == CatFilterAllMarked || - iSelectedCatFilter == CatFilterBlacklisted ) - { - QHashIterator i( *iAptInterface->packagesInstalled() ); - while (i.hasNext()) - { - i.next(); - if( iSelectedStatFilter == Package::PkgStatUpgradeable && iSelectedCatFilter != CatFilterBlacklisted ) { - if( i.value()->isUpgradeable() && doFilterCategory(i.value()) ) - addListItem(i.value(), generateSortString(i.value())); - } else { - if( doFilterCategory(i.value()) ) - addListItem(i.value(), generateSortString(i.value())); - } - } - } - } else { - for( int j=0; jhide(); - iListCoverLabel->setAutoFillBackground(false); - - updateLabel(); - - if( iSelectedStatFilter==Package::PkgStatUpgradeable && ui->listWidget->count()>0 && - iSelectedCatFilter != CatFilterAllMarked && iSelectedCatFilter != CatFilterBlacklisted ) - { - ui->actionUpgrade_all->setVisible(true); - } else { - ui->actionUpgrade_all->setVisible(false); - } - - if( iSelectedCatFilter == CatFilterBlacklisted && ui->listWidget->count()>0 ) { - ui->actionRestore_all->setVisible(true); - } else { - ui->actionRestore_all->setVisible(false); - } - - if( iSelectedStatFilter==Package::PkgStatInstalled ) { - ui->actionStore_list->setVisible(true); - } else { - ui->actionStore_list->setVisible(false); - } - - show(); - - if( !ui->searchBar->isVisible() ) { - ui->listWidget->setFocusPolicy(Qt::StrongFocus); - ui->listWidget->setFocus(); - } else { - ui->listWidget->setFocusPolicy(Qt::NoFocus); - ui->lineEdit->setFocus(); - } - - if( ui->listWidget->count() == 0 ) - { - iListCoverLabel->setGeometry( ui->listWidget->rect() ); - iListCoverLabel->setText("No packages"); - iListCoverLabel->show(); - } - - if( ui->listWidget->count()>1 && iPackagesEmptySort == ui->listWidget->count() && !iSortNoticeShown ) { - ConfirmDialog d(false, this); - QString msg = "No shown packages currently have the required information for sorting by this criterion. The list is unsorted."; - if( iSortOrder == SortDateDesc && !iSettings->qsettings()->value("fetch_dates",false).toBool() ) - msg += " You can enable date fetching in the options menu."; - d.setText("Notice", msg); - d.exec(); - iSortNoticeShown = true; - } + ui->listWidget->clear(); + ui->listWidget->setSortingEnabled(true); + iPackagesEmptySort = 0; + + if( !isVisible() ) { + iMainWindow->busyDialog(false); + iListCoverLabel->setText("Loading..."); + iListCoverLabel->setAutoFillBackground(true); + iListCoverLabel->show(); + show(); + QApplication::processEvents(); + } + + if( iSortOrder==SortDateDesc || iSortOrder==SortSizeDesc ) + ui->listWidget->sortItems(Qt::DescendingOrder); + else + ui->listWidget->sortItems(Qt::AscendingOrder); + + delete ui->listWidget->itemDelegate(); + ListItemDelegate* delegate = new ListItemDelegate(ui->listWidget); + delegate->loadIcons(); + ui->listWidget->setItemDelegate( delegate ); + + if( !ui->searchBar->isVisible() ) + { + if( iSelectedStatFilter == Package::PkgStatNotInstalled || iSelectedStatFilter == Package::PkgStatUnknown || + iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) + { + QHashIterator i( *iAptInterface->packagesAvailable() ); + while (i.hasNext()) + { + i.next(); + Package* inst = iAptInterface->packagesInstalled()->value(i.value()->name(),0); + if( doFilterCategory(i.value()) && !inst ) + addListItem(i.value(), generateSortString(i.value())); + } + } + if( iSelectedStatFilter == Package::PkgStatInstalled || iSelectedStatFilter == Package::PkgStatUpgradeable || + iSelectedStatFilter == Package::PkgStatUnknown || iSelectedCatFilter == CatFilterAllMarked || + iSelectedCatFilter == CatFilterBlacklisted ) + { + QHashIterator i( *iAptInterface->packagesInstalled() ); + while (i.hasNext()) + { + i.next(); + if( iSelectedStatFilter == Package::PkgStatUpgradeable && iSelectedCatFilter != CatFilterBlacklisted ) { + if( i.value()->isUpgradeable() && doFilterCategory(i.value()) ) + addListItem(i.value(), generateSortString(i.value())); + } else { + if( doFilterCategory(i.value()) ) + addListItem(i.value(), generateSortString(i.value())); + } + } + } + } else { + for( int j=0; jhide(); + iListCoverLabel->setAutoFillBackground(false); + + updateLabel(); + + if( iSelectedStatFilter==Package::PkgStatUpgradeable && ui->listWidget->count()>0 && + iSelectedCatFilter != CatFilterAllMarked && iSelectedCatFilter != CatFilterBlacklisted ) + { + ui->actionUpgrade_all->setVisible(true); + } else { + ui->actionUpgrade_all->setVisible(false); + } + + if( iSelectedCatFilter == CatFilterBlacklisted && ui->listWidget->count()>0 ) { + ui->actionRestore_all->setVisible(true); + } else { + ui->actionRestore_all->setVisible(false); + } + + if( iSelectedStatFilter==Package::PkgStatInstalled ) { + ui->actionStore_list->setVisible(true); + } else { + ui->actionStore_list->setVisible(false); + } + + show(); + + if( !ui->searchBar->isVisible() ) { + ui->listWidget->setFocusPolicy(Qt::StrongFocus); + ui->listWidget->setFocus(); + } else { + ui->listWidget->setFocusPolicy(Qt::NoFocus); + ui->lineEdit->setFocus(); + } + + if( ui->listWidget->count() == 0 ) + { + iListCoverLabel->setGeometry( ui->listWidget->rect() ); + iListCoverLabel->setText("No packages"); + iListCoverLabel->show(); + } + + if( ui->listWidget->count()>1 && iPackagesEmptySort == ui->listWidget->count() && !iSortNoticeShown ) { + ConfirmDialog d(false, this); + QString msg = "No shown packages currently have the required information for sorting by this criterion. The list is unsorted."; + if( iSortOrder == SortDateDesc && !iSettings->qsettings()->value("fetch_dates",false).toBool() ) + msg += " You can enable date fetching in the options menu."; + d.setText("Notice", msg); + d.exec(); + iSortNoticeShown = true; + } } void PackageView::enableMenu() { - ui->menuMenu->setEnabled(true); + ui->menuMenu->setEnabled(true); } void PackageView::disableMenu() { - ui->menuMenu->setEnabled(false); + ui->menuMenu->setEnabled(false); } void PackageView::addListItem(Package* pkg_, QString listname_) { - PackageListWidgetItem* p = new PackageListWidgetItem( pkg_, listname_ ); - - if( pkg_ != 0 ) - { - QString name = pkg_->name(); - if( !pkg_->maemoDisplayName().isEmpty() ) - name = pkg_->maemoDisplayName(); - p->setData(UserRoleName, name); - } else { - p->setData(UserRoleName, listname_); - } - - if( pkg_ != 0 ) - { - p->setData(UserRoleDescShort, pkg_->descShort()); - p->setData(UserRoleVersion, pkg_->version()); - p->setData(UserRoleMarked, static_cast(pkg_->markedOperation()) ); - p->setData(UserRoleInstalled, pkg_->isInstalled()); - p->setData(UserRoleUpgradeable, pkg_->isUpgradeable()); - p->setData(UserRoleAvailVersion, pkg_->upgradeableVersion()); - p->setData(UserRoleCurrentStatFilter, iSelectedStatFilter); - p->setData(UserRoleCurrentCatFilter, iSelectedCatFilter); - - if( pkg_->availablePackage() ) - p->setData(UserRoleBlacklisted, static_cast(pkg_->availablePackage()->blacklisted()) ); - else - p->setData(UserRoleBlacklisted, static_cast(pkg_->blacklisted()) ); - - //qDebug() << pkg_->name(); - - pkg_->convertIcon(); - p->setData(Qt::DecorationRole, *pkg_->icon()); - } - ui->listWidget->addItem( p ); + PackageListWidgetItem* p = new PackageListWidgetItem( pkg_, listname_ ); + + if( pkg_ != 0 ) + { + QString name = pkg_->name(); + if( !pkg_->maemoDisplayName().isEmpty() ) + name = pkg_->maemoDisplayName(); + p->setData(UserRoleName, name); + } else { + p->setData(UserRoleName, listname_); + } + + if( pkg_ != 0 ) + { + p->setData(UserRoleDescShort, pkg_->descShort()); + p->setData(UserRoleVersion, pkg_->version()); + p->setData(UserRoleMarked, static_cast(pkg_->markedOperation()) ); + p->setData(UserRoleInstalled, pkg_->isInstalled()); + p->setData(UserRoleUpgradeable, pkg_->isUpgradeable()); + p->setData(UserRoleAvailVersion, pkg_->upgradeableVersion()); + p->setData(UserRoleCurrentStatFilter, iSelectedStatFilter); + p->setData(UserRoleCurrentCatFilter, iSelectedCatFilter); + + if( pkg_->availablePackage() ) + p->setData(UserRoleBlacklisted, static_cast(pkg_->availablePackage()->blacklisted()) ); + else + p->setData(UserRoleBlacklisted, static_cast(pkg_->blacklisted()) ); + + //qDebug() << pkg_->name(); + + pkg_->convertIcon(); + p->setData(Qt::DecorationRole, *pkg_->icon()); + } + ui->listWidget->addItem( p ); } void PackageView::closeEvent(QCloseEvent *event) { - if( !iAptInterface ) { - resetWindow(); - event->accept(); - } - - if( iDimmer->busy() ) - { - iAptInterface->cancel(); - event->ignore(); - return; - } - - if( iAptInterface->numSelectedPackages() == 0 ) - { - resetWindow(); - event->accept(); - } else { - QString c; - c.setNum( iAptInterface->numSelectedPackages() ); - ConfirmDialog d(true, this); - d.setText("Returning to main menu", QString("Clear %1 package selection(s) and lose all the pending changes?").arg(iAptInterface->numSelectedPackages())); - if( d.exec() ) { - resetWindow(); - event->accept(); - } else { - event->ignore(); - } - } + if( !iAptInterface ) { + resetWindow(); + event->accept(); + } + + if( iDimmer->busy() ) + { + iAptInterface->cancel(); + event->ignore(); + return; + } + + if( iAptInterface->numSelectedPackages() == 0 ) + { + resetWindow(); + event->accept(); + } else { + QString c; + c.setNum( iAptInterface->numSelectedPackages() ); + ConfirmDialog d(true, this); + d.setText("Returning to main menu", QString("Clear %1 package selection(s) and lose all the pending changes?").arg(iAptInterface->numSelectedPackages())); + if( d.exec() ) { + resetWindow(); + event->accept(); + } else { + event->ignore(); + } + } } void PackageView::changeEvent(QEvent *e) @@ -579,341 +566,341 @@ void PackageView::changeEvent(QEvent *e) void PackageView::on_btn_Commit_clicked() { - QStringList pkgnames; - - QHashIterator i( *iAptInterface->packagesAvailable() ); - while (i.hasNext()) - { - i.next(); - - if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade ) - pkgnames << i.value()->name(); - if( i.value()->markedOperation() == Package::PkgOpRemove ) { - qDebug() << "warning: trying to add package marked from the wrong list"; - //pkgnames << i.value()->name() + "-"; - } - } - - QHashIterator r( *iAptInterface->packagesInstalled() ); - while (r.hasNext()) - { - r.next(); - - if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade ) - pkgnames << r.value()->name(); - if( r.value()->markedOperation() == Package::PkgOpRemove ) - pkgnames << r.value()->name() + "-"; - } - - iMainWindow->busyDialog(true, "Operation in progress", "Reading dependencies"); - - iAptInterface->setProcessPackages(pkgnames); - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetSimulate); - iAptInterface->run(iDimmer); + QStringList pkgnames; + + QHashIterator i( *iAptInterface->packagesAvailable() ); + while (i.hasNext()) + { + i.next(); + + if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade ) + pkgnames << i.value()->name(); + if( i.value()->markedOperation() == Package::PkgOpRemove ) { + qDebug() << "warning: trying to add package marked from the wrong list"; + //pkgnames << i.value()->name() + "-"; + } + } + + QHashIterator r( *iAptInterface->packagesInstalled() ); + while (r.hasNext()) + { + r.next(); + + if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade ) + pkgnames << r.value()->name(); + if( r.value()->markedOperation() == Package::PkgOpRemove ) + pkgnames << r.value()->name() + "-"; + } + + iMainWindow->busyDialog(true, "Operation in progress", "Reading dependencies"); + + iAptInterface->setProcessPackages(pkgnames); + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetSimulate); + iAptInterface->run(iDimmer); } void PackageView::on_actionClear_selections_triggered() { - QString c; - c.setNum( iAptInterface->numSelectedPackages() ); - ConfirmDialog d(true, this); - d.setText(tr("Confirmation"), tr("Clear ") + c + tr(" package selection(s) and lose all the pending changes?")); - if( d.exec() ) - { - clearSelections(); - openWin(); - } + QString c; + c.setNum( iAptInterface->numSelectedPackages() ); + ConfirmDialog d(true, this); + d.setText(tr("Confirmation"), tr("Clear ") + c + tr(" package selection(s) and lose all the pending changes?")); + if( d.exec() ) + { + clearSelections(); + openWin(); + } } void PackageView::clearSelections() { - QHashIterator i( *iAptInterface->packagesInstalled() ); - while (i.hasNext()) - { - i.next(); - i.value()->setMarkedForOperation(Package::PkgOpNone); - } - QHashIterator a( *iAptInterface->packagesAvailable() ); - while (a.hasNext()) - { - a.next(); - a.value()->setMarkedForOperation(Package::PkgOpNone); - } - iAptInterface->setNumSelectedPackages(0); + QHashIterator i( *iAptInterface->packagesInstalled() ); + while (i.hasNext()) + { + i.next(); + i.value()->setMarkedForOperation(Package::PkgOpNone); + } + QHashIterator a( *iAptInterface->packagesAvailable() ); + while (a.hasNext()) + { + a.next(); + a.value()->setMarkedForOperation(Package::PkgOpNone); + } + iAptInterface->setNumSelectedPackages(0); } void PackageView::on_listWidget_itemClicked(QListWidgetItem* item) { - Package* pkg = dynamic_cast(item)->package(); - if( !pkg ) - return; - - bool bl = pkg->isBlacklisted(); - bool bl_u = false; - - Package* upg_pkg = pkg->availablePackage(); - if( upg_pkg ) - bl_u = upg_pkg->isBlacklisted(); - - PackageSelector s(pkg, iAptInterface, iSettings, iMainWindow, this); - s.exec(); - Package::operation op = s.selectedOperation(); - - QStringList confl = pkg->checkConflicts_RichText(); - if( confl.count() > 0 && op != Package::PkgOpNone ) { - ConfirmDialog d(true, this); - QString t = "Package " + pkg->name() + " conflicts with another installed or marked package. Mark anyway?"; - t += "

Conflicts: "; - t += confl.join(", "); - t += "
"; - d.setText("Conflicting packages", t); - if( !d.exec() ) - op = Package::PkgOpNone; - } - - if( pkg->isPinned() && op != Package::PkgOpNone ) { - ConfirmDialog d(true, this); - d.setText("Warning","Package has been pinned in apt preferences. Operation might not go as expected. Mark anyway?"); - if( !d.exec() ) - op = Package::PkgOpNone; - } - - pkg->setMarkedForOperation( op ); - item->setData( UserRoleMarked, (int)op ); - updateLabel(); - - if( pkg->isBlacklisted() != bl ) { - openWin(); - } - else if( upg_pkg && upg_pkg->isBlacklisted() != bl_u ) { - openWin(); - } + Package* pkg = dynamic_cast(item)->package(); + if( !pkg ) + return; + + bool bl = pkg->isBlacklisted(); + bool bl_u = false; + + Package* upg_pkg = pkg->availablePackage(); + if( upg_pkg ) + bl_u = upg_pkg->isBlacklisted(); + + PackageSelector s(pkg, iAptInterface, iSettings, iMainWindow, this); + s.exec(); + Package::operation op = s.selectedOperation(); + + QStringList confl = pkg->checkConflicts_RichText(); + if( confl.count() > 0 && op != Package::PkgOpNone ) { + ConfirmDialog d(true, this); + QString t = "Package " + pkg->name() + " conflicts with another installed or marked package. Mark anyway?"; + t += "

Conflicts: "; + t += confl.join(", "); + t += "
"; + d.setText("Conflicting packages", t); + if( !d.exec() ) + op = Package::PkgOpNone; + } + + if( pkg->isPinned() && op != Package::PkgOpNone ) { + ConfirmDialog d(true, this); + d.setText("Warning","Package has been pinned in apt preferences. Operation might not go as expected. Mark anyway?"); + if( !d.exec() ) + op = Package::PkgOpNone; + } + + pkg->setMarkedForOperation( op ); + item->setData( UserRoleMarked, (int)op ); + updateLabel(); + + if( pkg->isBlacklisted() != bl ) { + openWin(); + } + else if( upg_pkg && upg_pkg->isBlacklisted() != bl_u ) { + openWin(); + } } void PackageView::updateLabel() { - QString s; - s.setNum( iAptInterface->numSelectedPackages() ); - QString s2; - s2.setNum( ui->listWidget->count() ); - QString statlabel = iStatFilterLabels.at(iSelectedStatFilter); - if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) - statlabel = "All"; - ui->label->setText("" + s + " package(s) marked
" - + "Showing: " + statlabel + "
" - + "Filter: " + iCatFilterLabels.at(iSelectedCatFilter) + " - " + s2 + " package(s)
"); - - if( iAptInterface->numSelectedPackages()==0 ) { - ui->btn_Commit->setEnabled(false); - ui->actionClear_selections->setVisible(false); - ui->actionSave_selections->setVisible(false); - } else { - ui->btn_Commit->setEnabled(true); - ui->actionClear_selections->setVisible(true); - ui->actionSave_selections->setVisible(true); - } + QString s; + s.setNum( iAptInterface->numSelectedPackages() ); + QString s2; + s2.setNum( ui->listWidget->count() ); + QString statlabel = iStatFilterLabels.at(iSelectedStatFilter); + if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) + statlabel = "All"; + ui->label->setText("" + s + " package(s) marked
" + + "Showing: " + statlabel + "
" + + "Filter: " + iCatFilterLabels.at(iSelectedCatFilter) + " - " + s2 + " package(s)
"); + + if( iAptInterface->numSelectedPackages()==0 ) { + ui->btn_Commit->setEnabled(false); + ui->actionClear_selections->setVisible(false); + ui->actionSave_selections->setVisible(false); + } else { + ui->btn_Commit->setEnabled(true); + ui->actionClear_selections->setVisible(true); + ui->actionSave_selections->setVisible(true); + } } void PackageView::on_btn_CategoryFilter_clicked() { - FilterSelect f("Category filter", this); - f.setList( iCatFilterLabels, iSelectedCatFilter ); - - bool s = f.exec(); - - if( s ) - iSelectedCatFilter = f.selection(); - - if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) { - ui->btn_StatusFilter->setEnabled(false); - } else { - ui->btn_StatusFilter->setEnabled(true); - } - - if( s ) { - iListCoverLabel->setText("Loading..."); - iListCoverLabel->setAutoFillBackground(true); - iListCoverLabel->show(); - QApplication::processEvents(); - iSortNoticeShown = false; - - openWin(); - - if( iSelectedCatFilter==CatFilterBlacklisted && iAptInterface->needListOrDateRefresh() ) - { - ConfirmDialog d(false, this); - d.setText("Notice","Since you don't have all package lists currently loaded, not all blacklisted " - "packages are necessarily shown"); - d.exec(); - } - } + FilterSelect f("Category filter", this); + f.setList( iCatFilterLabels, iSelectedCatFilter ); + + bool s = f.exec(); + + if( s ) + iSelectedCatFilter = f.selection(); + + if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) { + ui->btn_StatusFilter->setEnabled(false); + } else { + ui->btn_StatusFilter->setEnabled(true); + } + + if( s ) { + iListCoverLabel->setText("Loading..."); + iListCoverLabel->setAutoFillBackground(true); + iListCoverLabel->show(); + QApplication::processEvents(); + iSortNoticeShown = false; + + openWin(); + + if( iSelectedCatFilter==CatFilterBlacklisted && iAptInterface->needListOrDateRefresh() ) + { + ConfirmDialog d(false, this); + d.setText("Notice","Since you don't have all package lists currently loaded, not all blacklisted " + "packages are necessarily shown"); + d.exec(); + } + } } void PackageView::setStatFilter(Package::packageStatus f_) { - iSelectedStatFilter = f_; + iSelectedStatFilter = f_; } void PackageView::on_btn_StatusFilter_clicked() { - FilterSelect f("Status filter", this); - f.setList( iStatFilterLabels, iSelectedStatFilter ); + FilterSelect f("Status filter", this); + f.setList( iStatFilterLabels, iSelectedStatFilter ); - int oldfilter = iSelectedStatFilter; + int oldfilter = iSelectedStatFilter; - bool s = f.exec(); + bool s = f.exec(); - if( s ) { - iSelectedStatFilter = (Package::packageStatus)f.selection(); + if( s ) { + iSelectedStatFilter = (Package::packageStatus)f.selection(); - iListCoverLabel->setText("Loading..."); - iListCoverLabel->setAutoFillBackground(true); - iListCoverLabel->show(); - QApplication::processEvents(); - iSortNoticeShown = false; + iListCoverLabel->setText("Loading..."); + iListCoverLabel->setAutoFillBackground(true); + iListCoverLabel->show(); + QApplication::processEvents(); + iSortNoticeShown = false; - openWin(); + openWin(); - if( oldfilter==Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatInstalled && - iAptInterface->needListOrDateRefresh() ) - { - iMainWindow->openNetworkConnection(); + if( oldfilter==Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatInstalled && + iAptInterface->needListOrDateRefresh() ) + { + iMainWindow->openNetworkConnection(); - iMainWindow->setNextOperation(MainWindow::OpOpenPkgView); - iMainWindow->busyDialog(true,"Operation in progress","Reading the rest of the package lists"); + iMainWindow->setNextOperation(MainWindow::OpOpenPkgView); + iMainWindow->busyDialog(true,"Operation in progress","Reading the rest of the package lists"); - if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() ) - iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); + if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() ) + iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate); - iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); - iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates); - iAptInterface->run(iDimmer); - } - } + iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages); + iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates); + iAptInterface->run(iDimmer); + } + } } void PackageView::resetWindow() { - iAptInterface->writeBlacklist(); + iAptInterface->writeBlacklist(); - ui->btn_StatusFilter->setEnabled(true); - iSelectedCatFilter = iDefaultCatFilter; - //iSortOrder = SortAlpha; - iSortNoticeShown = false; + ui->btn_StatusFilter->setEnabled(true); + iSelectedCatFilter = iDefaultCatFilter; + //iSortOrder = SortAlpha; + iSortNoticeShown = false; - clearSelections(); - clearSearch(); + clearSelections(); + clearSearch(); } void PackageView::on_actionHelp_triggered() { - Help h(this); - h.exec(); + Help h(this); + h.exec(); } void PackageView::on_btn_searchClose_clicked() { - clearSearch(); + clearSearch(); - iListCoverLabel->setText("Loading..."); - iListCoverLabel->setAutoFillBackground(true); - iListCoverLabel->show(); - QApplication::processEvents(); + iListCoverLabel->setText("Loading..."); + iListCoverLabel->setAutoFillBackground(true); + iListCoverLabel->show(); + QApplication::processEvents(); - openWin(); + openWin(); } void PackageView::clearSearch() { - ui->lineEdit->clear(); - ui->searchBar->hide(); - ui->toolBar->show(); - ui->listWidget->setFocusPolicy(Qt::StrongFocus); + ui->lineEdit->clear(); + ui->searchBar->hide(); + ui->toolBar->show(); + ui->listWidget->setFocusPolicy(Qt::StrongFocus); - iSearchResults.clear(); + iSearchResults.clear(); } void PackageView::on_actionSearch_triggered() { - if( ui->searchBar->isVisible() ) - return; - - ui->listWidget->setFocusPolicy(Qt::NoFocus); - ui->searchLabel->setText( QString("%1 results").arg(ui->listWidget->count()) ); - ui->toolBar->hide(); - ui->searchBar->show(); - ui->lineEdit->setFocus(); - iPrevSearchText = ""; + if( ui->searchBar->isVisible() ) + return; + + ui->listWidget->setFocusPolicy(Qt::NoFocus); + ui->searchLabel->setText( QString("%1 results").arg(ui->listWidget->count()) ); + ui->toolBar->hide(); + ui->searchBar->show(); + ui->lineEdit->setFocus(); + iPrevSearchText = ""; } void PackageView::on_lineEdit_textEdited(QString text) { - if( !ui->searchBar->isVisible() ) - return; - - if( text.isEmpty() ) { - on_btn_searchClose_clicked(); - return; - } - - if( iPrevSearchText.length() > text.length() ) - { - iListCoverLabel->setText("Loading..."); - iListCoverLabel->setAutoFillBackground(true); - iListCoverLabel->show(); - QApplication::processEvents(); - - ui->searchBar->hide(); - openWin(); - ui->searchBar->show(); - ui->toolBar->hide(); // ensure it stays hidden - ui->lineEdit->setFocus(); - } - - iPrevSearchText = text; - - QList packages; - iSearchResults.clear(); - - for( int i=0; i<(ui->listWidget->count()); i++ ) { - packages.append( dynamic_cast( ui->listWidget->item(i) )->package() ); - } - - if( text.startsWith(":") ) { - for( int i=0; iname().startsWith(text.mid(1), Qt::CaseInsensitive)) || - (iSearchDisplayName && packages.at(i)->displayName().startsWith(text.mid(1), Qt::CaseInsensitive)) || - (iSearchDescShort && packages.at(i)->descShort().startsWith(text.mid(1), Qt::CaseInsensitive)) || - (iSearchDescLong && packages.at(i)->descLong().startsWith(text.mid(1), Qt::CaseInsensitive)) ) - { - iSearchResults.append( packages.at(i) ); - } - } - } - } else { - for( int i=0; iname().contains(text, Qt::CaseInsensitive)) || - (iSearchDisplayName && packages.at(i)->displayName().contains(text, Qt::CaseInsensitive)) || - (iSearchDescShort && packages.at(i)->descShort().contains(text, Qt::CaseInsensitive)) || - (iSearchDescLong && packages.at(i)->descLong().contains(text, Qt::CaseInsensitive)) ) - { - iSearchResults.append( packages.at(i) ); - } - } - } - } - - ui->searchLabel->setText( QString("%1 results").arg( iSearchResults.count()) ); - - openWin(); + if( !ui->searchBar->isVisible() ) + return; + + if( text.isEmpty() ) { + on_btn_searchClose_clicked(); + return; + } + + if( iPrevSearchText.length() > text.length() ) + { + iListCoverLabel->setText("Loading..."); + iListCoverLabel->setAutoFillBackground(true); + iListCoverLabel->show(); + QApplication::processEvents(); + + ui->searchBar->hide(); + openWin(); + ui->searchBar->show(); + ui->toolBar->hide(); // ensure it stays hidden + ui->lineEdit->setFocus(); + } + + iPrevSearchText = text; + + QList packages; + iSearchResults.clear(); + + for( int i=0; i<(ui->listWidget->count()); i++ ) { + packages.append( dynamic_cast( ui->listWidget->item(i) )->package() ); + } + + if( text.startsWith(":") ) { + for( int i=0; iname().startsWith(text.mid(1), Qt::CaseInsensitive)) || + (iSearchDisplayName && packages.at(i)->displayName().startsWith(text.mid(1), Qt::CaseInsensitive)) || + (iSearchDescShort && packages.at(i)->descShort().startsWith(text.mid(1), Qt::CaseInsensitive)) || + (iSearchDescLong && packages.at(i)->descLong().startsWith(text.mid(1), Qt::CaseInsensitive)) ) + { + iSearchResults.append( packages.at(i) ); + } + } + } + } else { + for( int i=0; iname().contains(text, Qt::CaseInsensitive)) || + (iSearchDisplayName && packages.at(i)->displayName().contains(text, Qt::CaseInsensitive)) || + (iSearchDescShort && packages.at(i)->descShort().contains(text, Qt::CaseInsensitive)) || + (iSearchDescLong && packages.at(i)->descLong().contains(text, Qt::CaseInsensitive)) ) + { + iSearchResults.append( packages.at(i) ); + } + } + } + } + + ui->searchLabel->setText( QString("%1 results").arg( iSearchResults.count()) ); + + openWin(); } void PackageView::setSearchText(QString text) { - ui->lineEdit->setText(text); - on_lineEdit_textEdited(text); + ui->lineEdit->setText(text); + on_lineEdit_textEdited(text); } KeyEventGrabber::KeyEventGrabber(QObject* parent) : QObject(parent) @@ -922,354 +909,354 @@ KeyEventGrabber::KeyEventGrabber(QObject* parent) : QObject(parent) bool KeyEventGrabber::eventFilter(QObject *obj, QEvent *event) { - if( event->type() == QEvent::KeyPress ) { - QString text = dynamic_cast(event)->text(); - int key = dynamic_cast(event)->key(); - if( (text.trimmed() != "" || text==" ") && key!=Qt::Key_Backspace ) { - dynamic_cast(this->parent())->on_actionSearch_triggered(); - dynamic_cast(this->parent())->setSearchText( text ); - return true; - } - } - return QObject::eventFilter(obj, event); + if( event->type() == QEvent::KeyPress ) { + QString text = dynamic_cast(event)->text(); + int key = dynamic_cast(event)->key(); + if( (text.trimmed() != "" || text==" ") && key!=Qt::Key_Backspace ) { + dynamic_cast(this->parent())->on_actionSearch_triggered(); + dynamic_cast(this->parent())->setSearchText( text ); + return true; + } + } + return QObject::eventFilter(obj, event); } void PackageView::on_pushButton_searchOptions_clicked() { - SearchOptions s(this); - s.setSelections(iSearchPkgName, iSearchDisplayName, iSearchDescShort, iSearchDescLong); - if( s.exec() ) - { - iSearchPkgName = s.searchPkgName(); - iSearchDisplayName = s.searchDisplayName(); - iSearchDescShort = s.searchDescShort(); - iSearchDescLong = s.searchDescLong(); - - iPrevSearchText += " "; - on_lineEdit_textEdited( ui->lineEdit->text() ); - } + SearchOptions s(this); + s.setSelections(iSearchPkgName, iSearchDisplayName, iSearchDescShort, iSearchDescLong); + if( s.exec() ) + { + iSearchPkgName = s.searchPkgName(); + iSearchDisplayName = s.searchDisplayName(); + iSearchDescShort = s.searchDescShort(); + iSearchDescLong = s.searchDescLong(); + + iPrevSearchText += " "; + on_lineEdit_textEdited( ui->lineEdit->text() ); + } } void PackageView::setSearchOptions(bool pkgname, bool dispname, bool dshort, bool dlong) { - iSearchPkgName = pkgname; - iSearchDisplayName = dispname; - iSearchDescShort = dshort; - iSearchDescLong = dlong; + iSearchPkgName = pkgname; + iSearchDisplayName = dispname; + iSearchDescShort = dshort; + iSearchDescLong = dlong; } void PackageView::on_actionUpgrade_all_triggered() { - for( int i=0; ilistWidget->count(); i++ ) - { - Package* pkg = dynamic_cast(ui->listWidget->item(i))->package(); - if( pkg && pkg->isUpgradeable() ) { - pkg->setMarkedForOperation( Package::PkgOpInstallUpgrade ); - ui->listWidget->item(i)->setData(UserRoleMarked, (int)Package::PkgOpInstallUpgrade); - } - } - updateLabel(); + for( int i=0; ilistWidget->count(); i++ ) + { + Package* pkg = dynamic_cast(ui->listWidget->item(i))->package(); + if( pkg && pkg->isUpgradeable() ) { + pkg->setMarkedForOperation( Package::PkgOpInstallUpgrade ); + ui->listWidget->item(i)->setData(UserRoleMarked, (int)Package::PkgOpInstallUpgrade); + } + } + updateLabel(); } void PackageView::on_actionView_log_triggered() { - QByteArray log = iAptInterface->readLogFile(); - LogView l(log, this); - l.exec(); + QByteArray log = iAptInterface->readLogFile(); + LogView l(log, this); + l.exec(); } void PackageView::on_btn_Sort_clicked() { - SortSelector s(iSortOrder, this); - if( s.exec() ) { - iSortOrder = s.selectedOperation(); - iSortNoticeShown = false; - openWin(); - } + SortSelector s(iSortOrder, this); + if( s.exec() ) { + iSortOrder = s.selectedOperation(); + iSortNoticeShown = false; + openWin(); + } } void PackageView::on_actionLoad_selections_triggered() { - if( iAptInterface->numSelectedPackages() > 0 ) { - ConfirmDialog d(true, this); - d.setText("Confirmation", "Proceed loading selections? All current selections will be cleared."); - if( !d.exec() ) - return; - } - - QString filename = QFileDialog::getOpenFileName(this, "Open selections list", KDefaultUserOpenSaveDir, "Selection lists (*.slist)"); - if( filename.isNull() || filename.isEmpty() ) - return; - - clearSelections(); - - QStringList unknownList; - QStringList wrongverList; - QStringList wrongstatusList; - int success=0; - int errors=0; - - QFile f( filename ); - if( f.open(QIODevice::ReadOnly | QIODevice::Text ) ) - { - while(!f.atEnd()) { - QString line = f.readLine().trimmed(); - QStringList parts = line.split(' '); - if( parts.count()==3 ) { - Package* pkgAv = iAptInterface->packagesAvailable()->value(parts.at(0),0); - Package* pkgIn = iAptInterface->packagesInstalled()->value(parts.at(0),0); - if( parts.at(2)=="install" ) { - if( !pkgAv && !pkgIn ) { - unknownList << parts.at(0); - } - else if( pkgIn ) { - wrongstatusList << parts.at(0); - } - else if( pkgAv ) { - if( !pkgAv->isInstalled() ) - { - pkgAv->setMarkedForOperation(Package::PkgOpInstallUpgrade); - success++; - if( pkgAv->version() != parts.at(1) ) { - wrongverList << parts.at(0); - } - } else { - wrongstatusList << parts.at(0); - } - } - - } else if( parts.at(2)=="upgrade" ) { - if( !pkgAv && !pkgIn ) { - unknownList << parts.at(0); - } - else if( (pkgAv && !pkgIn) || (pkgIn && !pkgAv) ) { - wrongstatusList << parts.at(0); - } - else if( pkgIn && pkgAv ) { - if( pkgIn->isInstalled() && pkgIn->isUpgradeable() ) - { - pkgIn->setMarkedForOperation(Package::PkgOpInstallUpgrade); - success++; - if( pkgIn->version() != parts.at(1) ) { - wrongverList << parts.at(0); - } - } else { - wrongstatusList << parts.at(0); - } - } - - } else if( parts.at(2)=="remove" ) { - if( !pkgAv && !pkgIn ) { - unknownList << parts.at(0); - } - else if( pkgAv && !pkgIn ) { - wrongstatusList << parts.at(0); - } - else if( pkgIn ) { - if( pkgIn->isInstalled() ) - { - pkgIn->setMarkedForOperation(Package::PkgOpRemove); - success++; - if( pkgIn->version() != parts.at(1) ) { - wrongverList << parts.at(0); - } - } else { - wrongstatusList << parts.at(0); - } - } - } else { - errors++; - } - } else if( !line.isEmpty() ){ - errors++; - } - } - f.close(); - } - - ConfirmDialog d(false, this); - QString msg; - msg += QString("%1 successful
").arg(success); - - if( wrongverList.count() > 0 ) { - msg += QString("%1 version mismatches (selected anyway):
").arg(wrongverList.count()); - msg += ""; - for( int i=0; i 0 ) { - msg += QString("%1 status mismatches (packages ignored):
").arg(wrongstatusList.count()); - msg += ""; - for( int i=0; i 0 ) { - msg += QString("%1 unknown packages:
").arg(unknownList.count()); - msg += ""; - for( int i=0; i0 || (wrongstatusList.count()==0 && unknownList.count()==0) ) { - msg += QString("%1 errors
").arg(errors); - } - if( success==0 && wrongstatusList.count()==0 && unknownList.count()==0 ) - msg = "No stored selections"; - QString title; - if( success > 0 ) - title = "Selections loaded"; - else - title = "No selections loaded"; - d.setText(title, msg); - d.exec(); - - if( unknownList.count()>0 && iAptInterface->needListOrDateRefresh() ) - { - ConfirmDialog f(false, this); - f.setText("About Unknown packages","You encountered unknown packages. You might want to try " - "loading the selections again after loading the full package lists (by selecting install or upgrade view)"); - f.exec(); - } - - if( success > 0 ) { - ui->btn_StatusFilter->setEnabled(false); - iSelectedCatFilter = CatFilterAllMarked; - } - openWin(); + if( iAptInterface->numSelectedPackages() > 0 ) { + ConfirmDialog d(true, this); + d.setText("Confirmation", "Proceed loading selections? All current selections will be cleared."); + if( !d.exec() ) + return; + } + + QString filename = QFileDialog::getOpenFileName(this, "Open selections list", KDefaultUserOpenSaveDir, "Selection lists (*.slist)"); + if( filename.isNull() || filename.isEmpty() ) + return; + + clearSelections(); + + QStringList unknownList; + QStringList wrongverList; + QStringList wrongstatusList; + int success=0; + int errors=0; + + QFile f( filename ); + if( f.open(QIODevice::ReadOnly | QIODevice::Text ) ) + { + while(!f.atEnd()) { + QString line = f.readLine().trimmed(); + QStringList parts = line.split(' '); + if( parts.count()==3 ) { + Package* pkgAv = iAptInterface->packagesAvailable()->value(parts.at(0),0); + Package* pkgIn = iAptInterface->packagesInstalled()->value(parts.at(0),0); + if( parts.at(2)=="install" ) { + if( !pkgAv && !pkgIn ) { + unknownList << parts.at(0); + } + else if( pkgIn ) { + wrongstatusList << parts.at(0); + } + else if( pkgAv ) { + if( !pkgAv->isInstalled() ) + { + pkgAv->setMarkedForOperation(Package::PkgOpInstallUpgrade); + success++; + if( pkgAv->version() != parts.at(1) ) { + wrongverList << parts.at(0); + } + } else { + wrongstatusList << parts.at(0); + } + } + + } else if( parts.at(2)=="upgrade" ) { + if( !pkgAv && !pkgIn ) { + unknownList << parts.at(0); + } + else if( (pkgAv && !pkgIn) || (pkgIn && !pkgAv) ) { + wrongstatusList << parts.at(0); + } + else if( pkgIn && pkgAv ) { + if( pkgIn->isInstalled() && pkgIn->isUpgradeable() ) + { + pkgIn->setMarkedForOperation(Package::PkgOpInstallUpgrade); + success++; + if( pkgIn->version() != parts.at(1) ) { + wrongverList << parts.at(0); + } + } else { + wrongstatusList << parts.at(0); + } + } + + } else if( parts.at(2)=="remove" ) { + if( !pkgAv && !pkgIn ) { + unknownList << parts.at(0); + } + else if( pkgAv && !pkgIn ) { + wrongstatusList << parts.at(0); + } + else if( pkgIn ) { + if( pkgIn->isInstalled() ) + { + pkgIn->setMarkedForOperation(Package::PkgOpRemove); + success++; + if( pkgIn->version() != parts.at(1) ) { + wrongverList << parts.at(0); + } + } else { + wrongstatusList << parts.at(0); + } + } + } else { + errors++; + } + } else if( !line.isEmpty() ){ + errors++; + } + } + f.close(); + } + + ConfirmDialog d(false, this); + QString msg; + msg += QString("%1 successful
").arg(success); + + if( wrongverList.count() > 0 ) { + msg += QString("%1 version mismatches (selected anyway):
").arg(wrongverList.count()); + msg += ""; + for( int i=0; i 0 ) { + msg += QString("%1 status mismatches (packages ignored):
").arg(wrongstatusList.count()); + msg += ""; + for( int i=0; i 0 ) { + msg += QString("%1 unknown packages:
").arg(unknownList.count()); + msg += ""; + for( int i=0; i0 || (wrongstatusList.count()==0 && unknownList.count()==0) ) { + msg += QString("%1 errors
").arg(errors); + } + if( success==0 && wrongstatusList.count()==0 && unknownList.count()==0 ) + msg = "No stored selections"; + QString title; + if( success > 0 ) + title = "Selections loaded"; + else + title = "No selections loaded"; + d.setText(title, msg); + d.exec(); + + if( unknownList.count()>0 && iAptInterface->needListOrDateRefresh() ) + { + ConfirmDialog f(false, this); + f.setText("About Unknown packages","You encountered unknown packages. You might want to try " + "loading the selections again after loading the full package lists (by selecting install or upgrade view)"); + f.exec(); + } + + if( success > 0 ) { + ui->btn_StatusFilter->setEnabled(false); + iSelectedCatFilter = CatFilterAllMarked; + } + openWin(); } void PackageView::on_actionSave_selections_triggered() { - if( iAptInterface->numSelectedPackages() == 0 ) - return; - - QString filename = QFileDialog::getSaveFileName(this, "Save selections to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)"); - if( filename.isNull() || filename.isEmpty() ) - return; - - if( !filename.endsWith(".slist") ) - filename.append(".slist"); - - QFile f( filename ); - bool fail = false; - int count = 0; - if( f.open(QIODevice::WriteOnly | QIODevice::Text) ) - { - QTextStream out(&f); - - QHashIterator i( *iAptInterface->packagesAvailable() ); - while (i.hasNext()) - { - i.next(); - - if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade ) { - out << i.value()->name() << " " << i.value()->version() << " install\n"; - count++; - } - if( i.value()->markedOperation() == Package::PkgOpRemove ) - qDebug() << "Warning: package is marked for removal in the wrong list"; - } - - QHashIterator r( *iAptInterface->packagesInstalled() ); - while (r.hasNext()) - { - r.next(); - - if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade ) { - out << r.value()->name() << " " << r.value()->version() << " upgrade\n"; - count++; - } - if( r.value()->markedOperation() == Package::PkgOpRemove ) { - out << r.value()->name() << " " << r.value()->version() << " remove\n"; - count++; - } - } - - f.close(); - } else { - fail = true; - } - - ConfirmDialog d(false, this); - if( fail ) - d.setText( "Error", "Failed to write package selections" ); - else - d.setText( "Selections stored", QString("Stored %1 selections").arg(count) ); - d.exec(); + if( iAptInterface->numSelectedPackages() == 0 ) + return; + + QString filename = QFileDialog::getSaveFileName(this, "Save selections to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)"); + if( filename.isNull() || filename.isEmpty() ) + return; + + if( !filename.endsWith(".slist") ) + filename.append(".slist"); + + QFile f( filename ); + bool fail = false; + int count = 0; + if( f.open(QIODevice::WriteOnly | QIODevice::Text) ) + { + QTextStream out(&f); + + QHashIterator i( *iAptInterface->packagesAvailable() ); + while (i.hasNext()) + { + i.next(); + + if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade ) { + out << i.value()->name() << " " << i.value()->version() << " install\n"; + count++; + } + if( i.value()->markedOperation() == Package::PkgOpRemove ) + qDebug() << "Warning: package is marked for removal in the wrong list"; + } + + QHashIterator r( *iAptInterface->packagesInstalled() ); + while (r.hasNext()) + { + r.next(); + + if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade ) { + out << r.value()->name() << " " << r.value()->version() << " upgrade\n"; + count++; + } + if( r.value()->markedOperation() == Package::PkgOpRemove ) { + out << r.value()->name() << " " << r.value()->version() << " remove\n"; + count++; + } + } + + f.close(); + } else { + fail = true; + } + + ConfirmDialog d(false, this); + if( fail ) + d.setText( "Error", "Failed to write package selections" ); + else + d.setText( "Selections stored", QString("Stored %1 selections").arg(count) ); + d.exec(); } void PackageView::on_actionRestore_all_triggered() { - ConfirmDialog d(true, this); - d.setText("Confirmation","Restore all shown blacklisted packages?"); - if( !d.exec() ) - return; - - for( int i=0; ilistWidget->count(); i++ ) - { - Package* pkg = dynamic_cast(ui->listWidget->item(i))->package(); - Package* p1 = iAptInterface->packagesInstalled()->value(pkg->name(),0); - Package* p2 = iAptInterface->packagesAvailable()->value(pkg->name(),0); - if( p1 && p1->isBlacklisted() ) { - BlacklistSelect::blackList old = p1->blacklisted(); - p1->setBlacklisted(BlacklistSelect::BlacklistNone); - iAptInterface->removeFromBlacklist(p1, old); - } - if( p2 && p2->isBlacklisted() ) { - BlacklistSelect::blackList old = p2->blacklisted(); - p2->setBlacklisted(BlacklistSelect::BlacklistNone); - iAptInterface->removeFromBlacklist(p2, old); - } - } - iAptInterface->writeBlacklist(); - openWin(); + ConfirmDialog d(true, this); + d.setText("Confirmation","Restore all shown blacklisted packages?"); + if( !d.exec() ) + return; + + for( int i=0; ilistWidget->count(); i++ ) + { + Package* pkg = dynamic_cast(ui->listWidget->item(i))->package(); + Package* p1 = iAptInterface->packagesInstalled()->value(pkg->name(),0); + Package* p2 = iAptInterface->packagesAvailable()->value(pkg->name(),0); + if( p1 && p1->isBlacklisted() ) { + BlacklistSelect::blackList old = p1->blacklisted(); + p1->setBlacklisted(BlacklistSelect::BlacklistNone); + iAptInterface->removeFromBlacklist(p1, old); + } + if( p2 && p2->isBlacklisted() ) { + BlacklistSelect::blackList old = p2->blacklisted(); + p2->setBlacklisted(BlacklistSelect::BlacklistNone); + iAptInterface->removeFromBlacklist(p2, old); + } + } + iAptInterface->writeBlacklist(); + openWin(); } void PackageView::on_actionStore_list_triggered() { - QString filename = QFileDialog::getSaveFileName(this, "Save application list to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)"); - if( filename.isNull() || filename.isEmpty() ) - return; - - if( !filename.endsWith(".slist") ) - filename.append(".slist"); - - QFile f( filename ); - bool fail = false; - int count = 0; - if( f.open(QIODevice::WriteOnly | QIODevice::Text) ) - { - QTextStream out(&f); - - QHashIterator r( *iAptInterface->packagesInstalled() ); - while (r.hasNext()) - { - r.next(); - - if( r.value()->isInstalled() && r.value()->section().startsWith("user/") ) { - out << r.value()->name() << " " << r.value()->version() << " install\n"; - count++; - } - } - - f.close(); - } else { - fail = true; - } - - ConfirmDialog d(false, this); - if( fail ) - d.setText( "Error", "Failed to write application list" ); - else - d.setText( "List stored", QString("Stored %1 selections.").arg(count) + "
" - "The list can be used to restore removed applications later." ); - d.exec(); + QString filename = QFileDialog::getSaveFileName(this, "Save application list to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)"); + if( filename.isNull() || filename.isEmpty() ) + return; + + if( !filename.endsWith(".slist") ) + filename.append(".slist"); + + QFile f( filename ); + bool fail = false; + int count = 0; + if( f.open(QIODevice::WriteOnly | QIODevice::Text) ) + { + QTextStream out(&f); + + QHashIterator r( *iAptInterface->packagesInstalled() ); + while (r.hasNext()) + { + r.next(); + + if( r.value()->isInstalled() && r.value()->section().startsWith("user/") ) { + out << r.value()->name() << " " << r.value()->version() << " install\n"; + count++; + } + } + + f.close(); + } else { + fail = true; + } + + ConfirmDialog d(false, this); + if( fail ) + d.setText( "Error", "Failed to write application list" ); + else + d.setText( "List stored", QString("Stored %1 selections.").arg(count) + "
" + "The list can be used to restore removed applications later." ); + d.exec(); } diff --git a/packageview.h b/packageview.h index ceee151..88131dd 100644 --- a/packageview.h +++ b/packageview.h @@ -1,20 +1,20 @@ /* - This file is part of Faster Application Manager. + This file is part of Faster Application Manager. - Faster Application Manager 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 3 of the License, or - (at your option) any later version. + Faster Application Manager 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 3 of the License, or + (at your option) any later version. - Faster Application Manager 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. + Faster Application Manager 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 Faster Application Manager. If not, see . + You should have received a copy of the GNU General Public License + along with Faster Application Manager. If not, see . - (C) Heikki Holstila 2010 + (C) Heikki Holstila 2010 */ #ifndef PACKAGEVIEW_H @@ -37,43 +37,43 @@ class KeyEventGrabber; class Settings; enum UserRoles { UserRoleName=Qt::UserRole, UserRoleVersion, UserRoleDescShort, - UserRoleMarked, UserRoleInstalled, UserRoleUpgradeable, UserRoleAvailVersion, - UserRoleCurrentStatFilter, UserRoleCurrentCatFilter, UserRoleBlacklisted }; + UserRoleMarked, UserRoleInstalled, UserRoleUpgradeable, UserRoleAvailVersion, + UserRoleCurrentStatFilter, UserRoleCurrentCatFilter, UserRoleBlacklisted }; class PackageListWidgetItem : public QListWidgetItem { public: - PackageListWidgetItem(Package* p_, QString name_); + PackageListWidgetItem(Package* p_, QString name_); - Package* package() { return iPackage; } + Package* package() { return iPackage; } private: - Package* iPackage; + Package* iPackage; }; class ListItemDelegate : public QStyledItemDelegate { public: - explicit ListItemDelegate(QObject *parent=0) : QStyledItemDelegate(parent) {} - virtual ~ListItemDelegate() {} + explicit ListItemDelegate(QObject *parent=0) : QStyledItemDelegate(parent) {} + virtual ~ListItemDelegate() {} - void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; - QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; - void loadIcons(); + void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; + QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; + void loadIcons(); private: - ListItemDelegate(const ListItemDelegate& old); - ListItemDelegate operator= (const ListItemDelegate& old); - - QPixmap iDefaultIcon; - QPixmap iIconPkgInstall; - QPixmap iIconPkgUpgrade; - QPixmap iIconPkgRemove; - QPixmap iIconPkgNoOpInstalled; - QPixmap iIconPkgNoOpNotInstalled; - QPixmap iIconPkgNoOpInstalledUpgradeable; + ListItemDelegate(const ListItemDelegate& old); + ListItemDelegate operator= (const ListItemDelegate& old); + + QPixmap iDefaultIcon; + QPixmap iIconPkgInstall; + QPixmap iIconPkgUpgrade; + QPixmap iIconPkgRemove; + QPixmap iIconPkgNoOpInstalled; + QPixmap iIconPkgNoOpNotInstalled; + QPixmap iIconPkgNoOpInstalledUpgradeable; }; @@ -83,120 +83,120 @@ class PackageView : public QMainWindow public: - enum sortOrder { SortAlpha, SortDateDesc, SortSizeDesc }; - - explicit PackageView(QWidget *parent); - virtual ~PackageView(); - - void openWin(); - void resizeEvent(QResizeEvent* event); - void setAptInterface(AAptInterface* a_) { iAptInterface=a_; } - void setSettings(Settings* s_) { iSettings=s_; } - dimmer* mydimmer() { return iDimmer; } - void disableMenu(); - void enableMenu(); - void setStatFilter(Package::packageStatus f_); - void setSortOrder(sortOrder s_) { iSortOrder = s_; } - void clearSelections(); - void setSearchText(QString text); - void setSearchOptions(bool pkgname, bool dispname, bool dshort, bool dlong); - - void show() { - if( !isVisible() ) { + enum sortOrder { SortAlpha, SortDateDesc, SortSizeDesc }; + + explicit PackageView(QWidget *parent); + virtual ~PackageView(); + + void openWin(); + void resizeEvent(QResizeEvent* event); + void setAptInterface(AAptInterface* a_) { iAptInterface=a_; } + void setSettings(Settings* s_) { iSettings=s_; } + dimmer* mydimmer() { return iDimmer; } + void disableMenu(); + void enableMenu(); + void setStatFilter(Package::packageStatus f_); + void setSortOrder(sortOrder s_) { iSortOrder = s_; } + void clearSelections(); + void setSearchText(QString text); + void setSearchOptions(bool pkgname, bool dispname, bool dshort, bool dlong); + + void show() { + if( !isVisible() ) { #ifdef Q_WS_MAEMO_5 if( dynamic_cast(this->parent())->testAttribute( Qt::WA_Maemo5AutoOrientation ) ) { this->setAttribute( Qt::WA_Maemo5AutoOrientation ); } else { this->setAttribute( Qt::WA_Maemo5LandscapeOrientation ); } - this->setAttribute(Qt::WA_Maemo5StackedWindow); - this->setWindowFlags( Qt::Window ); + this->setAttribute(Qt::WA_Maemo5StackedWindow); + this->setWindowFlags( Qt::Window ); #endif - } - QMainWindow::show(); - } + } + QMainWindow::show(); + } - static const int CatFilterAllMarked = 0; - static const int CatFilterAllUser = 1; - static const int CatFilterBlacklisted = 16; + static const int CatFilterAllMarked = 0; + static const int CatFilterAllUser = 1; + static const int CatFilterBlacklisted = 16; public slots: - void orientationChanged(); - void on_actionSearch_triggered(); + void orientationChanged(); + void on_actionSearch_triggered(); protected: void changeEvent(QEvent *e); - AAptInterface* iAptInterface; - //MainWindow::operation iOperation; - void closeEvent(QCloseEvent *event); + AAptInterface* iAptInterface; + //MainWindow::operation iOperation; + void closeEvent(QCloseEvent *event); private: - PackageView(const PackageView& old); - PackageView operator= (const PackageView& old); + PackageView(const PackageView& old); + PackageView operator= (const PackageView& old); - bool doFilterCategory(Package* pkg); - QString generateSortString(Package* pkg); - void addListItem(Package* pkg_, QString listname_); - void updateLabel(void); - void resetWindow(); - void clearSearch(); + bool doFilterCategory(Package* pkg); + QString generateSortString(Package* pkg); + void addListItem(Package* pkg_, QString listname_); + void updateLabel(void); + void resetWindow(); + void clearSearch(); Ui::PackageView *ui; - MainWindow* iMainWindow; - QBoxLayout* iPkgLayout; - dimmer* iDimmer; - QLabel* iListCoverLabel; - Settings* iSettings; + MainWindow* iMainWindow; + QBoxLayout* iPkgLayout; + dimmer* iDimmer; + QLabel* iListCoverLabel; + Settings* iSettings; - QStringList iCatFilterLabels; - QStringList iCatFilterStrings; - int iSelectedCatFilter; - int iDefaultCatFilter; + QStringList iCatFilterLabels; + QStringList iCatFilterStrings; + int iSelectedCatFilter; + int iDefaultCatFilter; - QStringList iStatFilterLabels; - int iSelectedStatFilter; - sortOrder iSortOrder; - bool iSortNoticeShown; + QStringList iStatFilterLabels; + int iSelectedStatFilter; + sortOrder iSortOrder; + bool iSortNoticeShown; - QList iSearchResults; - QString iPrevSearchText; - KeyEventGrabber* iKeyFilter; + QList iSearchResults; + QString iPrevSearchText; + KeyEventGrabber* iKeyFilter; - bool iSearchPkgName; - bool iSearchDisplayName; - bool iSearchDescShort; - bool iSearchDescLong; + bool iSearchPkgName; + bool iSearchDisplayName; + bool iSearchDescShort; + bool iSearchDescLong; - int iPackagesEmptySort; + int iPackagesEmptySort; private slots: - void on_actionStore_list_triggered(); + void on_actionStore_list_triggered(); void on_pushButton_searchOptions_clicked(); void on_actionRestore_all_triggered(); void on_actionSave_selections_triggered(); - void on_actionLoad_selections_triggered(); - void on_btn_Sort_clicked(); - void on_actionView_log_triggered(); - void on_actionUpgrade_all_triggered(); - void on_lineEdit_textEdited(QString ); - void on_btn_searchClose_clicked(); - void on_actionHelp_triggered(); - void on_btn_StatusFilter_clicked(); - void on_btn_CategoryFilter_clicked(); - void on_listWidget_itemClicked(QListWidgetItem* item); - void on_actionClear_selections_triggered(); - void on_btn_Commit_clicked(); + void on_actionLoad_selections_triggered(); + void on_btn_Sort_clicked(); + void on_actionView_log_triggered(); + void on_actionUpgrade_all_triggered(); + void on_lineEdit_textEdited(QString ); + void on_btn_searchClose_clicked(); + void on_actionHelp_triggered(); + void on_btn_StatusFilter_clicked(); + void on_btn_CategoryFilter_clicked(); + void on_listWidget_itemClicked(QListWidgetItem* item); + void on_actionClear_selections_triggered(); + void on_btn_Commit_clicked(); }; class KeyEventGrabber : public QObject { - Q_OBJECT + Q_OBJECT public: - KeyEventGrabber(QObject* parent = 0); + KeyEventGrabber(QObject* parent = 0); protected: - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event); }; diff --git a/repository.cpp b/repository.cpp index 96a3b91..0b143d4 100644 --- a/repository.cpp +++ b/repository.cpp @@ -30,10 +30,10 @@ Repository::~Repository() { } -QString Repository::toString() const +QString Repository::toString(bool noDisable) const { QString str; - if( iEnabled ) + if( iEnabled || noDisable ) str = "deb "; else str = "#deb "; @@ -135,6 +135,26 @@ bool Repository::setFromString(QString repo) return true; } +void Repository::setUrlDir(QString url_dir) +{ + QString url; + QString dir; + + if( url_dir.indexOf("://") == -1 ) + return; + int d = url_dir.indexOf('/', url_dir.indexOf("://")+3 ); + if( d==-1 ) { + url = url_dir; + dir = ""; + } else { + url = url_dir.left(d+1); + dir = url_dir.right( url_dir.length()-d-1 ); + } + + iUrl = url; + iDir = dir; +} + void Repository::set(QString name, QString url_dir, QString dist, QString components, bool enabled) { QString url; diff --git a/repository.h b/repository.h index e67c968..82c280c 100644 --- a/repository.h +++ b/repository.h @@ -32,6 +32,11 @@ public: void setName(QString n_) { iName=n_; } void setEnabled(bool e_) { iEnabled=e_; } + void setUrl(QString url_) { iUrl = url_; } + void setDir(QString dir_) { iDir = dir_; } + void setComponents(QString cmp_) { iComponents = cmp_; } + void setDist(QString d_) { iDist = d_; } + void setUrlDir(QString url_dir); QString name() const { return iName; } QString url() const { return iUrl; } @@ -39,7 +44,7 @@ public: QString dist() const { return iDist; } QString components() const { return iComponents; } bool enabled() const { return iEnabled; } - QString toString() const; + QString toString(bool noDisable=false) const; QStringList toListFileNames() const; bool setFromString(QString repo); void set(QString name, QString url, QString dir_dist, QString components, bool enabled); -- 1.7.9.5