You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kpovmodeler/pmshell.cpp

677 lines
20 KiB

/*
**************************************************************************
description
--------------------
copyright : (C) 2000-2003 by Andreas Zehender
email : zehender@kde.org
**************************************************************************
**************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
**************************************************************************/
#include <klocale.h>
#include <khelpmenu.h>
#include <kstdaction.h>
#include <kaction.h>
#include <kstatusbar.h>
#include <kfiledialog.h>
#include <kmessagebox.h>
#include <kiconloader.h>
#include <kedittoolbar.h>
#include <kkeydialog.h>
#include <kaboutdialog.h>
#include <kpopupmenu.h>
#include <tqtimer.h>
#include "pmshell.h"
#include "pmpart.h"
#include "pmfactory.h"
#include "pmsettingsdialog.h"
#include "pmdefaults.h"
#include "pmdockwidget.h"
#include "pmviewfactory.h"
#include "pmviewbase.h"
#include "pmunknownview.h"
#include "pmviewlayoutmanager.h"
//#define KPM_WITH_OBJECT_LIBRARY
const int c_statusBarInfo = 0;
const int c_statusBarControlPoints = 1;
PMShell::PMShell( const KURL& url )
: PMDockMainWindow( 0, "mainwindow" )
{
setPluginLoadingMode( DoNotLoadPlugins );
setInstance( PMFactory::instance( ), false );
m_pPart = new PMPart( this, "part", TQT_TQOBJECT(this), "part", true, this );
m_pPart->setReadWrite( ); // read-write mode
m_viewNumber = 0;
m_objectsToDelete.setAutoDelete( true );
if (!initialGeometrySet())
resize(800,600);
setupActions( );
restoreOptions( );
setupView( );
setXMLFile( "kpovmodelershell.rc" );
createGUI( m_pPart );
//guiFactory( )->addClient( m_pPart );
m_pStatusBar = statusBar( );
m_pStatusBar->insertItem( " ", c_statusBarInfo, 1 );
m_pStatusBar->insertItem( "" , c_statusBarControlPoints );
KConfig* config = instance( )->config( );
config->setGroup( "Appearance" );
applyMainWindowSettings( config );
if( !url.isEmpty( ) )
openURL( url );
setCaption( url.prettyURL( ) );
connect( m_pPart, TQT_SIGNAL( modified( ) ), TQT_SLOT( slotModified( ) ) );
connect( m_pPart, TQT_SIGNAL( controlPointMessage( const TQString& ) ),
TQT_SLOT( slotControlPointMsg( const TQString& ) ) );
}
PMShell::~PMShell( )
{
}
void PMShell::setupActions( )
{
// m_helpMenu = new KHelpMenu( this, PMFactory::aboutData( ), true,
// actionCollection( ) );
KStdAction::openNew( TQT_TQOBJECT(this), TQT_SLOT( slotFileNew( ) ), actionCollection( ) );
KStdAction::open( TQT_TQOBJECT(this), TQT_SLOT( slotFileOpen( ) ), actionCollection( ) );
m_pRecent = KStdAction::openRecent( TQT_TQOBJECT(this), TQT_SLOT( slotOpenRecent( const KURL& ) ),
actionCollection( ) );
KStdAction::save( TQT_TQOBJECT(this), TQT_SLOT( slotFileSave( ) ), actionCollection( ) );
KStdAction::saveAs( TQT_TQOBJECT(this), TQT_SLOT( slotFileSaveAs( ) ), actionCollection( ) );
KStdAction::revert( TQT_TQOBJECT(this), TQT_SLOT( slotFileRevert( ) ), actionCollection( ) );
KStdAction::print( TQT_TQOBJECT(this), TQT_SLOT( slotFilePrint( ) ), actionCollection( ) );
KStdAction::close( TQT_TQOBJECT(this), TQT_SLOT( slotFileClose( ) ), actionCollection( ) );
KStdAction::quit( TQT_TQOBJECT(this), TQT_SLOT( close( ) ), actionCollection( ) );
m_pPathAction = new KToggleAction( i18n( "Show &Path" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotShowPath( ) ), actionCollection( ),
"options_show_path" );
m_pPathAction->setCheckedState(i18n("Hide &Path"));
m_pStatusbarAction = KStdAction::showStatusbar( TQT_TQOBJECT(this), TQT_SLOT( slotShowStatusbar( ) ),
actionCollection( ) );
KStdAction::saveOptions( TQT_TQOBJECT(this), TQT_SLOT( saveOptions( ) ), actionCollection( ) );
KStdAction::keyBindings( TQT_TQOBJECT(this), TQT_SLOT( slotConfigureKeys( ) ),
actionCollection( ) );
KStdAction::configureToolbars( TQT_TQOBJECT(this), TQT_SLOT( slotConfigureToolbars( ) ),
actionCollection( ) );
KStdAction::preferences( TQT_TQOBJECT(this), TQT_SLOT( slotSettings( ) ), actionCollection( ) );
m_pNewTopViewAction = new KAction( i18n( "New Top View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewTopView( ) ),
actionCollection( ), "view_new_topview" );
m_pNewBottomViewAction = new KAction( i18n( "New Bottom View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewBottomView( ) ),
actionCollection( ), "view_new_bottomview" );
m_pNewLeftViewAction = new KAction( i18n( "New Left View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewLeftView( ) ),
actionCollection( ), "view_new_leftview" );
m_pNewRightViewAction = new KAction( i18n( "New Right View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewRightView( ) ),
actionCollection( ), "view_new_rightview" );
m_pNewFrontViewAction = new KAction( i18n( "New Front View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewFrontView( ) ),
actionCollection( ), "view_new_frontview" );
m_pNewBackViewAction = new KAction( i18n( "New Back View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewBackView( ) ),
actionCollection( ), "view_new_back_view" );
m_pNewCameraViewAction = new KAction( i18n( "New Camera View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewCameraView( ) ),
actionCollection( ), "view_new_cameraview" );
m_pNewTreeViewAction = new KAction( i18n( "New Object Tree" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewTreeView( ) ), actionCollection( ),
"view_new_treeview" );
m_pNewDialogViewAction = new KAction( i18n( "New Properties View" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewDialogView( ) ), actionCollection( ),
"view_new_dialogview" );
#ifdef KPM_WITH_OBJECT_LIBRARY
m_pNewLibraryBrowserAction = new KAction( i18n( "New Library Browser" ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotNewLibraryBrowserView( ) ), actionCollection( ),
"view_new_librarybrowser" );
#endif
// Creating the view layouts menu
m_pViewLayoutsAction = new KActionMenu( i18n( "View Layouts" ),
actionCollection( ), "view_layouts_menu" );
KPopupMenu* menu = m_pViewLayoutsAction->popupMenu( );
connect( menu, TQT_SIGNAL( aboutToShow( ) ), TQT_SLOT( slotViewsMenuAboutToShow( ) ) );
PMViewLayoutManager::theManager( )->fillPopupMenu( menu );
connect( menu, TQT_SIGNAL( activated( int ) ), TQT_SLOT( slotSelectedLayout( int ) ) );
m_pSaveViewLayoutAction = new KAction( i18n( "Save View Layout..." ), 0, TQT_TQOBJECT(this),
TQT_SLOT( slotSaveViewLayout( ) ),
actionCollection( ), "save_view_layout" );
}
void PMShell::setupView( )
{
PMViewLayoutManager::theManager( )->displayDefaultLayout( this );
}
PMDockWidget* PMShell::createView( const TQString& t, PMViewOptions* o,
bool initPosition )
{
PMDockWidget* dock = 0;
PMViewBase* contents = 0;
PMViewTypeFactory* factory =
PMViewFactory::theFactory( )->viewFactory( t );
m_viewNumber++;
TQString name = TQString( "View (%1)" ).tqarg( m_viewNumber );
if( factory )
{
TQString desc;
// Create the appropriate dock widget
if( o )
desc = factory->description( o );
else
desc = factory->description( );
dock = createDockWidget( name, SmallIcon( factory->iconName( ) ), 0L,
desc, desc );
contents = factory->newInstance( dock, m_pPart );
if( o )
contents->restoreViewConfig( o );
}
else
{
// unknown view type
dock = createDockWidget( name, SmallIcon( "unknown" ), 0L,
i18n( "Unknown" ), i18n( "Unknown" ) );
contents = new PMUnknownView( t, dock );
}
dock->setWidget( contents );
connect( dock, TQT_SIGNAL( headerCloseButtonClicked( ) ),
TQT_SLOT( slotDockWidgetClosed( ) ) );
if( initPosition )
{
dock->resize( 300, 400 );
dock->manualDock( 0, PMDockWidget::DockDesktop, 50,
mapToGlobal( TQPoint( 50, 50 ) ) );
}
return dock;
}
/*
PMDockWidget* PMShell::createTreeView( )
{
PMDockWidget* dock = 0;
m_numTreeViews++;
TQString name = TQString( "Object Tree (%1)" ).tqarg( m_numTreeViews );
dock = createDockWidget( name, SmallIcon( "pmtreeview" ),
0L, i18n( "Object Tree" ), i18n( "Object Tree" ) );
dock->setDockSite( PMDockWidget::DockFullSite );
PMTreeView* tv = new PMTreeView( m_pPart, dock );
dock->setWidget( tv );
connect( dock, TQT_SIGNAL( headerCloseButtonClicked( ) ),
TQT_SLOT( slotDockWidgetClosed( ) ) );
return dock;
}
PMDockWidget* PMShell::createDialogView( )
{
PMDockWidget* dock = 0;
m_numDialogViews++;
TQString name = TQString( "Object Properties (%1)" ).tqarg( m_numDialogViews );
dock = createDockWidget( name, SmallIcon( "pmdialogview" ),
0L, i18n( "Object Properties" ), i18n( "Object Properties" ) );
dock->setDockSite( PMDockWidget::DockFullSite );
PMDialogView* dv = new PMDialogView( m_pPart, dock );
dock->setWidget( dv );
connect( dock, TQT_SIGNAL( headerCloseButtonClicked( ) ),
TQT_SLOT( slotDockWidgetClosed( ) ) );
return dock;
}
PMDockWidget* PMShell::create3DView( PMGLView::PMViewType t )
{
PMDockWidget* dock = 0;
m_numGLViews++;
TQString name = TQString( "3D View (%1)" ).tqarg( m_numGLViews );
dock = createDockWidget( name, SmallIcon( "pmglview" ),
0L, i18n( "3D View" ), i18n( "3D View" ) );
dock->setDockSite( PMDockWidget::DockFullSite );
PMGLView* vgl = new PMGLView( m_pPart, t, dock );
dock->setWidget( vgl );
connect( vgl, TQT_SIGNAL( viewTypeChanged( const TQString& ) ),
dock, TQT_SLOT( slotSetCaption( const TQString& ) ) );
dock->slotSetCaption( PMGLView::viewTypeAsString( t ) );
connect( dock, TQT_SIGNAL( headerCloseButtonClicked( ) ),
TQT_SLOT( slotDockWidgetClosed( ) ) );
return dock;
}
*/
void PMShell::slotNewGraphicalView( PMGLView::PMViewType t )
{
PMGLViewOptions* o = new PMGLViewOptions( t );
createView( "glview", o );
delete o;
}
void PMShell::slotNewTopView( )
{
slotNewGraphicalView( PMGLView::PMViewNegY );
}
void PMShell::slotNewBottomView( )
{
slotNewGraphicalView( PMGLView::PMViewPosY );
}
void PMShell::slotNewLeftView( )
{
slotNewGraphicalView( PMGLView::PMViewPosX );
}
void PMShell::slotNewRightView( )
{
slotNewGraphicalView( PMGLView::PMViewNegX );
}
void PMShell::slotNewFrontView( )
{
slotNewGraphicalView( PMGLView::PMViewPosZ );
}
void PMShell::slotNewBackView( )
{
slotNewGraphicalView( PMGLView::PMViewNegZ );
}
void PMShell::slotNewCameraView( )
{
slotNewGraphicalView( PMGLView::PMViewCamera );
}
void PMShell::slotNewDialogView( )
{
createView( "dialogview" );
}
void PMShell::slotNewTreeView( )
{
createView( "treeview" );
}
void PMShell::slotNewLibraryBrowserView( )
{
createView( "librarybrowserview" );
}
void PMShell::slotDockWidgetClosed( )
{
const TQObject* o = TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender( )));
if( o && o->inherits( "PMDockWidget" ) )
{
if( m_objectsToDelete.containsRef( o ) == 0 )
{
m_objectsToDelete.append( o );
TQTimer::singleShot( 0, TQT_TQOBJECT(this), TQT_SLOT( slotDeleteClosedObjects( ) ) );
}
}
}
void PMShell::slotDeleteClosedObjects( )
{
m_objectsToDelete.clear( );
}
void PMShell::openURL( const KURL& url )
{
m_pRecent->addURL( url );
if( !m_pPart->isModified( ) && m_pPart->url( ).isEmpty( ) )
{
m_pPart->openURL( url );
setCaption( m_pPart->url( ).prettyURL( ) );
}
else
{
PMShell *shell = new PMShell( );
shell->show( );
shell->openURL( url );
}
}
void PMShell::slotOpenRecent( const KURL& url )
{
m_openRecentURL = url;
TQTimer::singleShot( 0, TQT_TQOBJECT(this), TQT_SLOT( slotOpenRecentTimer( ) ) );
}
void PMShell::slotOpenRecentTimer( )
{
openURL( m_openRecentURL );
}
void PMShell::slotFileNew( )
{
if( !m_pPart->isModified( ) && m_pPart->url( ).isEmpty( ) )
{
m_pPart->newDocument( );
setCaption( );
}
else
{
PMShell *shell = new PMShell( );
shell->show( );
}
}
void PMShell::slotFileOpen( )
{
KURL url = KFileDialog::getOpenURL(
TQString(), TQString( "*.kpm|" ) + i18n( "Povray Modeler Files (*.kpm)" )
+ "\n*|" + i18n( "All Files" ) );
if( !url.isEmpty( ) )
openURL( url );
}
void PMShell::slotFileSave( )
{
m_pPart->slotAboutToSave( );
if( m_pPart->isModified( ) )
{
if( !m_pPart->url( ).isEmpty( ) &&
m_pPart->isReadWrite( ) )
m_pPart->saveAs( m_pPart->url( ) );
else
saveAs( );
setCaption( m_pPart->url( ).prettyURL( ) );
}
else
emit statusMsg( i18n( "No changes need to be saved" ) );
}
void PMShell::slotFileSaveAs( )
{
m_pPart->slotAboutToSave( );
saveAs( );
}
void PMShell::saveAs( )
{
KFileDialog dlg( TQString(),
TQString( "*.kpm|" ) + i18n( "Povray Modeler Files (*.kpm)" ) +
TQString( "\n*|" ) + i18n( "All Files" ),
0, "filedialog", true );
dlg.setCaption( i18n( "Save As" ) );
dlg.setOperationMode( KFileDialog::Saving );
dlg.exec( );
KURL url = dlg.selectedURL( );
if( !url.isEmpty( ) )
{
if( dlg.currentFilter( ) == TQString( "*.kpm" ) )
if( TQFileInfo( url.path( ) ).extension( ).isEmpty( ) )
url.setPath( url.path( ) + ".kpm" );
if( overwriteURL( url ) )
{
m_pRecent->addURL( url );
if( m_pPart->saveAs( url ) )
setCaption( url.prettyURL( ) );
else
KMessageBox::sorry( this, i18n( "Couldn't save the file." ) );
}
}
}
void PMShell::slotFileRevert( )
{
KURL url = m_pPart->url( );
if( !url.isEmpty( ) )
m_pPart->openURL( url );
// else
// slotFileNew( );
}
void PMShell::slotFilePrint( )
{
//TODO
// m_pPart->slotPrint( );
}
void PMShell::slotFileNewWindow( )
{
PMShell* shell = new PMShell;
shell->show( );
}
void PMShell::slotFileClose( )
{
if( m_pPart->closeURL( ) )
{
m_pPart->closeDocument( );
m_pPart->newDocument( );
setCaption( );
}
}
void PMShell::slotShowToolbar( )
{
if( toolBar( )->isVisible ( ) )
toolBar( )->hide( );
else
toolBar( )->show( );
}
void PMShell::slotShowStatusbar( )
{
if( statusBar( )->isVisible ( ) )
statusBar( )->hide( );
else
statusBar( )->show( );
}
void PMShell::slotShowPath( )
{
setCaption( m_pPart->url( ).prettyURL( ) );
}
void PMShell::slotConfigureKeys( )
{
KKeyDialog kd;
kd.insert( m_pPart->actionCollection( ) );
kd.insert( actionCollection( ) );
kd.configure( true );
//KKeyDialog::configure( actionCollection( ) );
}
void PMShell::slotSettings( )
{
PMSettingsDialog dlg( m_pPart );
dlg.exec( );
}
void PMShell::slotConfigureToolbars( )
{
saveMainWindowSettings( KGlobal::config( ), "Appearance" );
KEditToolbar dlg( factory( ) );
connect( &dlg, TQT_SIGNAL( newToolbarConfig( ) ),
this, TQT_SLOT( slotNewToolbarConfig( ) ) );
dlg.exec( );
}
void PMShell::slotNewToolbarConfig( )
{
createGUI( 0 );
createShellGUI( false );
createGUI( m_pPart );
applyMainWindowSettings( KGlobal::config( ), "Appearance" );
}
void PMShell::updateGUI( )
{
saveMainWindowSettings( KGlobal::config( ), "Appearance" );
createGUI( 0 );
createShellGUI( false );
createGUI( m_pPart );
applyMainWindowSettings( KGlobal::config( ), "Appearance" );
}
void PMShell::saveOptions( )
{
kdDebug( PMArea ) << "Saving configuration" << endl;
KConfig* config = KGlobal::config( );
// set group
config->setGroup( "Appearance" );
config->writeEntry( "ShowStatusbar", m_pStatusbarAction->isChecked( ) );
saveMainWindowSettings( config );
m_pRecent->saveEntries( config );
if( m_pPart )
m_pPart->saveConfig( config );
config->sync( );
}
void PMShell::restoreOptions( )
{
KConfig* config = instance( )->config( );
// set group
config->setGroup( "Appearance" );
bool showStatusbar = config->readBoolEntry( "ShowStatusbar", true );
m_pStatusbarAction->blockSignals( true );
m_pStatusbarAction->setChecked( showStatusbar );
m_pStatusbarAction->blockSignals( false );
if( showStatusbar )
statusBar( )->show( );
else
statusBar( )->hide( );
m_pRecent->loadEntries( config );
}
void PMShell::setCaption( const TQString& caption )
{
TQString tmp;
if( caption.isEmpty( ) )
tmp = i18n( "unknown" );
else
{
if( !m_pPathAction->isChecked( ) )
tmp = caption.right( caption.length( ) - caption.findRev( '/' ) - 1 );
else
tmp = caption;
}
KMainWindow::setCaption( tmp, m_pPart->isModified( ) );
}
void PMShell::statusMsg( const TQString& text )
{
m_pStatusBar->message( text, 5000 );
}
bool PMShell::queryClose( )
{
saveOptions( );
return m_pPart->closeURL( );
}
void PMShell::showEvent( TQShowEvent* ){
activateDock( );
}
void PMShell::slotModified( )
{
setCaption( m_pPart->url( ).prettyURL( ) );
}
void PMShell::slotControlPointMsg( const TQString& msg )
{
if( msg.isEmpty( ) )
m_pStatusBar->changeItem( msg, c_statusBarControlPoints );
else
m_pStatusBar->changeItem( TQString( " " ) + msg + TQString( " " ),
c_statusBarControlPoints );
}
bool PMShell::overwriteURL( const KURL& u )
{
int query = KMessageBox::Continue;
if( u.isLocalFile( ) )
{
TQFileInfo info;
TQString name( u.path( ) );
info.setFile( name );
if( info.exists( ) )
query = KMessageBox::warningContinueCancel( 0, i18n( "A file with this name already exists.\nDo you want to overwrite it?" ), TQString(), i18n("Overwrite") );
}
return ( query == KMessageBox::Continue );
}
void PMShell::slotSelectedLayout( int id )
{
TQMenuItem* menu = m_pViewLayoutsAction->popupMenu( )->findItem( id );
PMViewLayoutManager::theManager( )->displayLayout( menu->text( ), this );
}
void PMShell::slotSaveViewLayout( )
{
PMSaveViewLayoutDialog dlg( this );
dlg.exec( );
}
void PMShell::slotViewsMenuAboutToShow( )
{
KPopupMenu* menu = m_pViewLayoutsAction->popupMenu( );
PMViewLayoutManager::theManager( )->fillPopupMenu( menu );
}
#include "pmshell.moc"