Esempio n. 1
0
MainWindow::MainWindow(FileParser *parser_in):
		parser(parser_in)
{
	undoStack = new QUndoStack();
	drawingInfo = new DrawingInfo();
	canvas = new DrawingCanvas(drawingInfo, parser);

	createActions();
	createToolBox();
	createMenus();
	createToolbars();

	Atom::fillLabelToVdwRadiusMap();
	Atom::fillLabelToMassMap();

	QSettings settings;
	QMap<QString, QVariant> colorMap = settings.value("Default Atom Colors", QVariant(QMap<QString, QVariant>())).toMap();
	if(colorMap.isEmpty())
		Atom::fillLabelToColorMap();
	else
		Atom::labelToColor = colorMap;

	QHBoxLayout* layout = new QHBoxLayout;
	view = new DrawingDisplay(canvas, drawingInfo);
	view->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
	view->setGeometry(0, 0, static_cast<int>(DEFAULT_SCENE_SIZE_X), static_cast<int>(DEFAULT_SCENE_SIZE_Y));
	view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

	drawingInfo->setHeight(view->sceneRect().height());
	drawingInfo->setWidth(view->sceneRect().width());
	drawingInfo->determineScaleFactor();
	canvas->setSceneRect(view->sceneRect());
	canvas->refresh();

	QDesktopWidget qdw;
	int screenCenterX = qdw.width() / 2;
	int screenCenterY = qdw.height() / 2;
	this->setGeometry(screenCenterX - 600, screenCenterY - 350, 1200, 700);

	splitter = new QSplitter(Qt::Horizontal);
	splitter->addWidget(view);
	splitter->addWidget(toolBox);
	layout->addWidget(splitter);

	QWidget *widget = new QWidget;
	widget->setLayout(layout);
	setCentralWidget(widget);
	loadFile();

	// The undo/redo framework needs to update the buttons appropriately
	connect(undoStack, SIGNAL(canRedoChanged(bool)), redoAction, SLOT(setEnabled(bool)));
	connect(undoStack, SIGNAL(canUndoChanged(bool)), undoAction, SLOT(setEnabled(bool)));

	resetSignalsOnFileLoad();

	this->setWindowIconText("cheMVP");
	this->setWindowTitle("cheMVP");
}
Esempio n. 2
0
void MainWindow::openProject(QString filename, bool onNewMainWindow)
{
	if(filename.isEmpty())
		return;
	QFile file(filename);
	if(!file.exists())
	{
		// error
		return;
	}
	if(!file.open(QIODevice::ReadOnly))
	{
		// error
		return;
	}

	QXmlStreamReader reader(&file);
	reader.readNextStartElement();
	if(reader.attributes().value("version").toString() != CHEMVP_VERSION)
	{
		error("Invalid Version Number!");
		return;
	}

	DrawingCanvas* old_canvas = canvas;
	DrawingInfo* old_info = drawingInfo;
	QGraphicsView* old_view = view;
	FileParser* old_parser = parser;

	// Deserialize
	this->parser = FileParser::deserialize(&reader);
	this->drawingInfo = DrawingInfo::deserialize(&reader);
	this->canvas = DrawingCanvas::deserialize(&reader, drawingInfo, parser);

	setWindowTitle(tr("%1 - cheMVP").arg(filename));

	this->view = new DrawingDisplay(canvas, drawingInfo);
	view->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
	view->setGeometry(0, 0, static_cast<int>(DEFAULT_SCENE_SIZE_X), static_cast<int>(DEFAULT_SCENE_SIZE_Y));
	view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

	QMap<QString, QString>* options = new QMap<QString, QString>();

	// Appearance
	options->insert("FOGGING_ON", QString("%1").arg(drawingInfo->getUseFogging()));
	options->insert("FOGGING_SCALE", QString("%1").arg(drawingInfo->getFoggingScale()));
	options->insert("X_ROTATION", "0"); // Where are these stored?
	options->insert("Y_ROTATION", "0"); // They aren't.
	options->insert("Z_ROTATION", "0"); // Why not? // No idea.
	options->insert("BACKGROUND_OPACITY", QString("%1").arg(canvas->getBackgroundOpacity()));
	options->insert("ZOOM", QString("%1").arg(drawingInfo->getZoom()));

	// Bonds and Angles
	options->insert("BOND_LABEL_PRECISION", QString("%1").arg(drawingInfo->getBondPrecision()));
	options->insert("ANGLE_LABEL_PRECISION", QString("%1").arg(drawingInfo->getAnglePrecision()));

	// Atoms
	options->insert("ATOM_DRAWING_STYLE", QString("%1").arg(drawingInfo->getDrawingStyle()));
	options->insert("ATOM_LABEL_SIZE", QString("%1").arg(Atom::SmallLabel));

	resetToolBox(options);

	animationSlider->blockSignals(true);

	// Update toolbox widgets
	if (parser->numMolecules() <= 1)
		animationWidget->setEnabled(false);
	else
		animationWidget->setEnabled(true);
	animationSlider->setRange(0, parser->numMolecules() - 1);
	animationSlider->setValue(parser->current());

	animationSlider->blockSignals(false);

	// Refresh layout
	QHBoxLayout* layout = new QHBoxLayout;
	QByteArray state = splitter->saveState();
	QSplitter* old_splitter = splitter;
	splitter = new QSplitter(Qt::Horizontal);
	splitter->addWidget(view);
	splitter->addWidget(toolBox);
	if(!onNewMainWindow)
		splitter->restoreState(state);
	layout->addWidget(splitter);

	QWidget *widget = new QWidget;
	widget->setLayout(layout);
	this->setCentralWidget(widget);

	resetSignalsOnFileLoad();

	reader.readNextStartElement();
	if(reader.hasError())
		error("Reader: " + reader.errorString());
	else if(reader.name() != "cheMVP")
		error("Full document not parsed!");

	delete old_parser;
	delete old_info;
	delete old_view;
	delete old_splitter;
	delete old_canvas;

	activateToolBar();
}
Esempio n. 3
0
void MainWindow::loadFile()
{
	if (!parser->fileName().isEmpty()) {
		if(parser->fileName().endsWith(".chmvp"))
		{
			error("Project loading in MainWindow::loadFile()");
			return;
		}
		parser->readFile();
		canvas->clearAll();

		DrawingCanvas* old_canvas = canvas;
		DrawingInfo* old_info = drawingInfo;
		QGraphicsView* old_view = view;

		drawingInfo = new DrawingInfo();
		// Includes loading canvas from parser
		canvas = new DrawingCanvas(this->drawingInfo, this->parser);

		setWindowTitle(tr("%1 - cheMVP").arg(parser->fileName()));

		this->view = new DrawingDisplay(canvas, drawingInfo);
		view->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
		view->setGeometry(0, 0, static_cast<int>(DEFAULT_SCENE_SIZE_X), static_cast<int>(DEFAULT_SCENE_SIZE_Y));
//		view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Causes display issues on load
		view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
		view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

		resetToolBox(NULL);
		resetSignalsOnFileLoad();

		// Enable the widgets in the animation tab if there are multiple geometries
		if (parser->numMolecules() <= 1)
			animationWidget->setEnabled(false);
		else
			animationWidget->setEnabled(true);

		// Set the sliders range and current value.
		animationSlider->setRange(0, parser->numMolecules() - 1);
		animationSlider->setValue(parser->current());

		QHBoxLayout* layout = new QHBoxLayout;
		QByteArray state = splitter->saveState();
		QSplitter* old_splitter = splitter;
		splitter = new QSplitter(Qt::Horizontal);
		splitter->addWidget(view);
		splitter->addWidget(toolBox);
		splitter->restoreState(state);
		layout->addWidget(splitter);

		QWidget *widget = new QWidget;
		widget->setLayout(layout);
		this->setCentralWidget(widget);

		delete old_info;
		delete old_view;
		delete old_splitter;
		delete old_canvas;

		activateToolBar();
	}
}