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.
198 lines
5.2 KiB
198 lines
5.2 KiB
/***************************************************************************
|
|
* Copyright (C) 2004-2005 by David Saxton *
|
|
* david@bluehaze.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 "canvasmanipulator.h"
|
|
#include "documentiface.h"
|
|
#include "drawpart.h"
|
|
#include "itemlibrary.h"
|
|
#include "mechanicsdocument.h"
|
|
#include "mechanicsitem.h"
|
|
#include "mechanicsgroup.h"
|
|
#include "mechanicssimulation.h"
|
|
#include "mechanicsview.h"
|
|
|
|
#include <tdelocale.h>
|
|
|
|
MechanicsDocument::MechanicsDocument( const TQString &caption, KTechlab *ktechlab, const char *name )
|
|
: ItemDocument( caption, ktechlab, name )
|
|
{
|
|
m_type = Document::dt_mechanics;
|
|
m_pDocumentIface = new MechanicsDocumentIface(this);
|
|
m_fileExtensionInfo = i18n("*.mechanics|Mechanics (*.mechanics)\n*|All Files");
|
|
m_canvas->retune(128);
|
|
|
|
m_selectList = new MechanicsGroup(this);
|
|
|
|
m_cmManager->addManipulatorInfo( CMSelect::manipulatorInfo() );
|
|
m_cmManager->addManipulatorInfo( CMDraw::manipulatorInfo() );
|
|
m_cmManager->addManipulatorInfo( CMRightClick::manipulatorInfo() );
|
|
m_cmManager->addManipulatorInfo( CMRepeatedItemAdd::manipulatorInfo() );
|
|
m_cmManager->addManipulatorInfo( CMItemResize::manipulatorInfo() );
|
|
m_cmManager->addManipulatorInfo( CMMechItemMove::manipulatorInfo() );
|
|
m_mechanicsSimulation = new MechanicsSimulation(this);
|
|
requestStateSave();
|
|
}
|
|
|
|
|
|
MechanicsDocument::~MechanicsDocument()
|
|
{
|
|
m_bDeleted = true;
|
|
|
|
// Remove all items from the canvas
|
|
selectAll();
|
|
deleteSelection();
|
|
delete m_mechanicsSimulation;
|
|
}
|
|
|
|
View *MechanicsDocument::createView( ViewContainer *viewContainer, uint viewAreaId, const char *name )
|
|
{
|
|
ItemView *itemView = new MechanicsView( this, viewContainer, viewAreaId, name );
|
|
handleNewView(itemView);
|
|
return itemView;
|
|
}
|
|
|
|
|
|
ItemGroup *MechanicsDocument::selectList() const
|
|
{
|
|
return m_selectList;
|
|
}
|
|
|
|
|
|
|
|
|
|
bool MechanicsDocument::isValidItem( const TQString &itemId )
|
|
{
|
|
return itemId.startsWith("mech/") || itemId.startsWith("dp/");
|
|
}
|
|
|
|
|
|
bool MechanicsDocument::isValidItem( Item *item )
|
|
{
|
|
return item && ((dynamic_cast<MechanicsItem*>(item)) || (dynamic_cast<DrawPart*>(item)));
|
|
}
|
|
|
|
|
|
Item* MechanicsDocument::addItem( const TQString &id, const TQPoint &p, bool newItem )
|
|
{
|
|
if ( !isValidItem(id) )
|
|
return 0l;
|
|
|
|
Item *item = itemLibrary()->createItem( id, this, newItem );
|
|
if (!item)
|
|
return 0L;
|
|
|
|
TQRect rect = item->boundingRect();
|
|
|
|
int dx = (int)(p.x())-rect.width()/2;
|
|
int dy = (int)(p.y())-rect.height()/2;
|
|
|
|
if ( dx < 16 || dx > canvas()->width() ) dx = 16;
|
|
if ( dy < 16 || dy > canvas()->height() ) dy = 16;
|
|
|
|
item->move( dx, dy );
|
|
item->show();
|
|
|
|
registerItem(item);
|
|
// setModified(true);
|
|
requestStateSave();
|
|
return item;
|
|
}
|
|
|
|
|
|
void MechanicsDocument::deleteSelection()
|
|
{
|
|
// End whatever editing mode we are in, as we don't want to start editing
|
|
// something that is about to no longer exist...
|
|
m_cmManager->cancelCurrentManipulation();
|
|
|
|
if ( m_selectList->isEmpty() )
|
|
return;
|
|
|
|
// We nee to tell the selete items to remove themselves, and then
|
|
// pass the items that have add themselves to the delete list to the
|
|
// CommandAddItems command
|
|
|
|
m_selectList->deleteAllItems();
|
|
flushDeleteList();
|
|
setModified(true);
|
|
|
|
// We need to emit this so that property widgets etc...
|
|
// can clear themselves.
|
|
emit itemUnselected(0L);
|
|
requestStateSave();
|
|
}
|
|
|
|
|
|
bool MechanicsDocument::registerItem( TQCanvasItem *qcanvasItem )
|
|
{
|
|
return ItemDocument::registerItem(qcanvasItem);
|
|
}
|
|
|
|
|
|
void MechanicsDocument::appendDeleteList( TQCanvasItem *qcanvasItem )
|
|
{
|
|
MechanicsItem *mechItem = dynamic_cast<MechanicsItem*>(qcanvasItem);
|
|
if ( !mechItem || m_itemDeleteList.contains(mechItem) ) {
|
|
return;
|
|
}
|
|
|
|
m_itemDeleteList.append(mechItem);
|
|
m_itemList.remove(mechItem);
|
|
|
|
disconnect( mechItem, TQ_SIGNAL(selected(Item*,bool)), this, TQ_SIGNAL(itemSelected(Item*)) );
|
|
disconnect( mechItem, TQ_SIGNAL(unselected(Item*,bool)), this, TQ_SIGNAL(itemUnselected(Item*)) );
|
|
|
|
mechItem->removeItem();
|
|
}
|
|
|
|
|
|
void MechanicsDocument::flushDeleteList()
|
|
{
|
|
// Remove duplicate items in the delete list
|
|
ItemList::iterator end = m_itemDeleteList.end();
|
|
for ( ItemList::iterator it = m_itemDeleteList.begin(); it != end; ++it )
|
|
{
|
|
if ( *it && m_itemDeleteList.contains(*it) > 1 )
|
|
*it = 0l;
|
|
}
|
|
m_itemDeleteList.remove(TQGuardedPtr<Item>(0l));
|
|
|
|
end = m_itemDeleteList.end();
|
|
for ( ItemList::iterator it = m_itemDeleteList.begin(); it != end; ++it )
|
|
{
|
|
m_itemList.remove(*it);
|
|
(*it)->setCanvas(0l);
|
|
delete *it;
|
|
}
|
|
}
|
|
|
|
|
|
MechanicsItem* MechanicsDocument::mechanicsItemWithID( const TQString &id )
|
|
{
|
|
return dynamic_cast<MechanicsItem*>(itemWithID(id));
|
|
}
|
|
|
|
|
|
void MechanicsDocument::selectAll()
|
|
{
|
|
const ItemList::iterator end = m_itemList.end();
|
|
for ( ItemList::iterator it = m_itemList.begin(); it != end; ++it )
|
|
{
|
|
select(*it);
|
|
}
|
|
}
|
|
|
|
|
|
void MechanicsDocument::copy()
|
|
{
|
|
}
|
|
|
|
#include "mechanicsdocument.moc"
|