kde-workspace/ksysguard/gui/Workspace.cpp
Ivailo Monev fe7f483647 generic: replace globs with MIME types in KFileDialog method calls
see the previous commit

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2023-08-27 00:40:03 +03:00

371 lines
10 KiB
C++

/*
KSysGuard, the KDE System Guard
Copyright (c) 1999 - 2002 Chris Schlaeger <cs@kde.org>
Copyright (c) 2006 John Tapsell <tapsell@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License version 2 or at your option version 3 as published by
the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <QLineEdit>
#include <QSpinBox>
#include <kfiledialog.h>
#include <kio/netaccess.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kstandarddirs.h>
#include <kacceleratormanager.h>
#include <kactioncollection.h>
#include <kmenu.h>
#include "WorkSheet.h"
#include "WorkSheetSettings.h"
#include "Workspace.h"
#include "ksysguard.h"
Workspace::Workspace( QWidget* parent)
: KTabWidget( parent )
{
KAcceleratorManager::setNoAccel(this);
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
setDocumentMode(true);
connect(&mDirWatch, SIGNAL(dirty(QString)), this, SLOT(maybeRemoveWorkSheet(QString)));
}
Workspace::~Workspace()
{
}
void Workspace::saveProperties( KConfigGroup& cfg )
{
QStringList list;
for(int i =0; i< mSheetList.size(); i++)
if ( !mSheetList.at(i)->fileName().isEmpty() )
list.append( mSheetList.at(i)->fileName() );
cfg.writePathEntry( "SelectedSheets", list );
cfg.writeEntry( "currentSheet", currentIndex() );
}
void Workspace::readProperties( const KConfigGroup& cfg )
{
QStringList selectedSheets = cfg.readPathEntry( "SelectedSheets", QStringList() );
if ( selectedSheets.isEmpty() ) {
/* If SelectedSheets config entry is not there, then it's
* probably the first time the user has started KSysGuard. We
* then "restore" a special default configuration. */
selectedSheets << "ProcessTable.sgrd";
selectedSheets << "SystemLoad2.sgrd";
} else if(selectedSheets[0] != "ProcessTable.sgrd") {
//We need to make sure that this is really is the process table on the first tab. No GUI way of changing this, but should make sure anyway.
//Plus this migrates users from the kde3 setup
selectedSheets.removeAll("ProcessTable.sgrd");
selectedSheets.prepend( "ProcessTable.sgrd");
}
int oldSystemLoad = selectedSheets.indexOf("SystemLoad.sgrd");
if(oldSystemLoad != -1) {
selectedSheets.replace(oldSystemLoad, "SystemLoad2.sgrd");
}
KStandardDirs* kstd = KGlobal::dirs();
QString filename;
for ( QStringList::Iterator it = selectedSheets.begin(); it != selectedSheets.end(); ++it ) {
filename = kstd->findResource( "data", "ksysguard/" + *it);
if(!filename.isEmpty()) {
restoreWorkSheet( filename, false);
}
}
int idx = cfg.readEntry( "currentSheet", 0 );
if (idx < 0 || idx > count() - 1) {
idx = 0;
}
setCurrentIndex(idx);
}
QString Workspace::makeNameForNewSheet() const
{
/* Find a name of the form "Sheet %d" that is not yet used by any
* of the existing worksheets. */
int i = 1;
bool found = false;
QString sheetName;
KStandardDirs* kstd = KGlobal::dirs();
do {
sheetName = i18n( "Sheet %1" , i++ );
//Check we don't have any existing files with this name
found = !(kstd->findResource( "data", "ksysguard/" + sheetName + ".sgrd").isEmpty());
//Check if we have any sheets with the same tab name or file name
for(int i = 0; !found && i < mSheetList.size(); i++)
if ( tabText(indexOf(mSheetList.at(i))) == sheetName || QString(sheetName+".sgrd") == mSheetList.at(i)->fileName())
found = true;
} while ( found );
return sheetName;
}
void Workspace::refreshActiveWorksheet()
{
WorkSheet* currentSheet = mSheetList.at(currentIndex());
currentSheet->refreshSheet();
}
void Workspace::newWorkSheet()
{
/* Find a name of the form "Sheet %d" that is not yet used by any
* of the existing worksheets. */
QString sheetName = makeNameForNewSheet();
WorkSheetSettings dlg( this, false /*not locked. New custom sheets aren't locked*/ );
dlg.setSheetTitle( sheetName );
if ( dlg.exec() ) {
WorkSheet* sheet = new WorkSheet( dlg.rows(), dlg.columns(), dlg.interval(), 0 );
sheet->setTitle( dlg.sheetTitle() );
sheet->setFileName( sheetName + ".sgrd" );
insertTab(-1, sheet, dlg.sheetTitle() );
mSheetList.append( sheet );
setCurrentIndex(indexOf( sheet ));
connect( sheet, SIGNAL(titleChanged(QWidget*)), SLOT(updateSheetTitle(QWidget*)));
}
}
void Workspace::contextMenu (int index, const QPoint &point)
{
// KMenu pm;
Q_UNUSED(index);
Q_UNUSED(point);
// QAction *new_worksheet = pm.addAction( Toplevel->actionCollection()->action("new_worksheet") );
// QAction *action = pm.exec( point );
}
void Workspace::maybeRemoveWorkSheet( const QString &fileName )
{
if (!QFile::exists(fileName)) {
removeWorkSheet(fileName);
}
}
void Workspace::updateSheetTitle( QWidget* wdg )
{
if ( wdg )
setTabText( indexOf(wdg), static_cast<WorkSheet*>( wdg )->translatedTitle() );
}
bool Workspace::saveOnQuit()
{
for(int i = 0; i < mSheetList.size(); i++) {
if ( mSheetList.at(i)->fileName().isEmpty() ) {
int res = KMessageBox::warningYesNoCancel( this,
i18n( "The tab '%1' contains unsaved data.\n"
"Do you want to save the tab?",
tabText(indexOf( mSheetList.at(i) )) ), QString(), KStandardGuiItem::save(), KStandardGuiItem::discard() );
if ( res == KMessageBox::Yes )
saveWorkSheet( mSheetList.at(i) );
else if ( res == KMessageBox::Cancel )
return false; // abort quit
} else
saveWorkSheet(mSheetList.at(i));
}
return true;
}
void Workspace::importWorkSheet()
{
KUrl url = KFileDialog::getOpenUrl( QString(), "application/x-ksysguard", this, i18n( "Select Tab File to Import" ) );
importWorkSheet( url );
}
void Workspace::importWorkSheet( const KUrl &url )
{
if ( url.isEmpty() )
return;
/* It's probably not worth the effort to make this really network
* transparent. Unless s/o beats me up I use this pseudo transparent
* code. */
QString tmpFile;
KIO::NetAccess::download( url, tmpFile, this );
// Import sheet from file.
if ( !restoreWorkSheet( tmpFile ) )
return;
mSheetList.last()->setFileName( makeNameForNewSheet() + ".sgrd");
KIO::NetAccess::removeTempFile( tmpFile );
}
bool Workspace::saveWorkSheet( WorkSheet *sheet )
{
if ( !sheet ) {
KMessageBox::sorry( this, i18n( "You do not have a tab that could be saved." ) );
return false;
}
KStandardDirs* kstd = KGlobal::dirs();
QString fileName = kstd->saveLocation( "data", "ksysguard") + sheet->fileName();
if ( !sheet->save( fileName ) ) {
return false;
}
return true;
}
void Workspace::exportWorkSheet()
{
exportWorkSheet( (WorkSheet*)currentWidget() );
}
void Workspace::exportWorkSheet( WorkSheet *sheet )
{
if ( !sheet ) {
KMessageBox::sorry( this, i18n( "You do not have a tab that could be saved." ) );
return;
}
QString fileName;
do {
fileName = KFileDialog::getSaveFileName( QString(tabText(indexOf( currentWidget() ))+ ".sgrd"),
QLatin1String("*.sgrd"), this, i18n("Export Tab") );
if ( fileName.isEmpty() )
return;
} while ( !sheet->exportWorkSheet( fileName ) );
}
void Workspace::removeWorkSheet()
{
WorkSheet *current = (WorkSheet*)currentWidget();
if ( current ) {
saveWorkSheet( current );
removeTab(indexOf( current ));
mSheetList.removeAll( current );
} else {
QString msg = i18n( "There are no tabs that could be deleted." );
KMessageBox::error( this, msg );
}
}
void Workspace::removeAllWorkSheets()
{
WorkSheet *sheet;
while ( ( sheet = (WorkSheet*)currentWidget() ) != 0 ) {
saveWorkSheet( sheet );
removeTab(indexOf( sheet ));
mSheetList.removeAll( sheet );
delete sheet;
}
}
void Workspace::removeWorkSheet( const QString &fileName )
{
QString baseName = fileName.right( fileName.length() - fileName.lastIndexOf( '/' ) - 1 );
for(int i = 0; i < mSheetList.size(); i++) {
WorkSheet *sheet = mSheetList.at(i);
if ( sheet->fileName() == baseName ) {
removeTab(indexOf( sheet ));
mSheetList.removeAt( i );
delete sheet;
return;
}
}
}
WorkSheet *Workspace::currentWorkSheet()
{
return (WorkSheet*)currentWidget();
}
bool Workspace::restoreWorkSheet( const QString &fileName, bool switchToTab)
{
// extract filename without path
QString baseName = fileName.right( fileName.length() - fileName.lastIndexOf( '/' ) - 1 );
foreach( WorkSheet *sheet, mSheetList ) {
if(sheet->fileName() == baseName)
return false; //Don't add the same sheet twice
}
WorkSheet *sheet = new WorkSheet( 0 );
sheet->setFileName( baseName );
if ( !sheet->load( fileName ) ) {
delete sheet;
return false;
}
mSheetList.append( sheet );
connect( sheet, SIGNAL(titleChanged(QWidget*)),
SLOT(updateSheetTitle(QWidget*)));
insertTab(-1, sheet, sheet->translatedTitle() );
if(switchToTab)
setCurrentIndex(indexOf(sheet));
//Watch the file incase it is deleted
mDirWatch.addFile(fileName);
return true;
}
void Workspace::cut()
{
WorkSheet *current = currentWorkSheet();
if ( current )
current->cut();
}
void Workspace::copy()
{
WorkSheet *current = currentWorkSheet();
if ( current )
current->copy();
}
void Workspace::paste()
{
WorkSheet *current = currentWorkSheet();
if ( current )
current->paste();
}
void Workspace::configure()
{
WorkSheet *current = currentWorkSheet();
if ( current )
current->settings();
}
void Workspace::applyStyle()
{
WorkSheet *current = currentWorkSheet();
if ( current )
current->applyStyle();
}
#include "moc_Workspace.cpp"