src/toolsets/filetoolset.cpp

Sun, 04 Oct 2015 13:19:45 +0300

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Sun, 04 Oct 2015 13:19:45 +0300
changeset 1005
a88cf5a32246
parent 998
5be0ce31ce60
child 1010
969b48eddd6b
permissions
-rw-r--r--

Subject Bézier curve fineness to the grid. By default, the coarse grid uses 8 segments, medium 16 and fine 32. Moved rasterization from demoting to inlining, it feels more sensible for it to be there.

/*
 *  LDForge: LDraw parts authoring CAD
 *  Copyright (C) 2013 - 2015 Teemu Piippo
 *
 *  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 3 of the License, or
 *  (at your option) any later version.
 *
 *  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, see <http://www.gnu.org/licenses/>.
 */

#include <QFileDialog>
#include <QMessageBox>
#include "../dialogs.h"
#include "../glRenderer.h"
#include "../ldDocument.h"
#include "../mainwindow.h"
#include "../partdownloader.h"
#include "../primitives.h"
#include "../dialogs/configdialog.h"
#include "../dialogs/ldrawpathdialog.h"
#include "../dialogs/newpartdialog.h"
#include "../documentmanager.h"
#include "filetoolset.h"
#include "ui_makeprim.h"

FileToolset::FileToolset (MainWindow* parent) :
	Toolset (parent) {}

void FileToolset::newPart()
{
	NewPartDialog* dlg = new NewPartDialog (m_window);

	if (dlg->exec() == QDialog::Accepted)
	{
		m_window->createBlankDocument();
		dlg->fillHeader (currentDocument());
		m_window->doFullRefresh();
	}
}

void FileToolset::newFile()
{
	m_window->createBlankDocument();
}

void FileToolset::open()
{
	QString name = QFileDialog::getOpenFileName (m_window, "Open File", "", "LDraw files (*.dat *.ldr)");

	if (name.isEmpty())
		return;

	m_documents->openMainModel (name);
}

void FileToolset::save()
{
	m_window->save (currentDocument(), false);
}

void FileToolset::saveAs()
{
	m_window->save (currentDocument(), true);
}

void FileToolset::saveAll()
{
	for (LDDocument* file : m_documents->allDocuments())
		m_window->save (file, false);
}

void FileToolset::close()
{
	if (not currentDocument()->isSafeToClose())
		return;

	currentDocument()->close();
}

void FileToolset::closeAll()
{
	if (m_documents->isSafeToCloseAll())
		m_documents->clear();
}

void FileToolset::settings()
{
	(new ConfigDialog (m_window))->exec();
}

void FileToolset::setLDrawPath()
{
	LDrawPathDialog* dialog = new LDrawPathDialog (m_config->lDrawPath(), true);

	if (dialog->exec())
		m_config->setLDrawPath (dialog->path());
}

void FileToolset::exit()
{
	::exit (EXIT_SUCCESS);
}

void FileToolset::insertFrom()
{
	QString fname = QFileDialog::getOpenFileName();
	int idx = m_window->suggestInsertPoint();

	if (not fname.length())
		return;

	QFile f (fname);

	if (not f.open (QIODevice::ReadOnly))
	{
		Critical (format ("Couldn't open %1 (%2)", fname, f.errorString()));
		return;
	}

	// TODO: shouldn't need to go to the document manager to parse a file
	LDObjectList objs = m_documents->loadFileContents (&f, nullptr, nullptr);

	currentDocument()->clearSelection();

	for (LDObject* obj : objs)
	{
		currentDocument()->insertObj (idx, obj);
		obj->select();
		m_window->renderer()->compileObject (obj);

		idx++;
	}

	m_window->refresh();
	m_window->scrollToSelection();
}

void FileToolset::exportTo()
{
	if (selectedObjects().isEmpty())
		return;

	QString fname = QFileDialog::getSaveFileName();

	if (fname.length() == 0)
		return;

	QFile file (fname);

	if (not file.open (QIODevice::WriteOnly | QIODevice::Text))
	{
		Critical (format ("Unable to open %1 for writing (%2)", fname, file.errorString()));
		return;
	}

	for (LDObject* obj : selectedObjects())
	{
		QString contents = obj->asText();
		QByteArray data = contents.toUtf8();
		file.write (data, data.size());
		file.write ("\r\n", 2);
	}
}

void FileToolset::scanPrimitives()
{
	PrimitiveScanner::start();
}

void FileToolset::openSubfiles()
{
	for (LDObject* obj : selectedObjects())
	{
		LDSubfile* ref = dynamic_cast<LDSubfile*> (obj);

		if (ref and ref->fileInfo()->isCache())
			ref->fileInfo()->openForEditing();
	}
}

void FileToolset::downloadFrom()
{
	PartDownloader* dialog = new PartDownloader (m_window);
	connect (dialog, &PartDownloader::primaryFileDownloaded, [&]()
	{
		m_window->changeDocument (dialog->primaryFile());
		m_window->doFullRefresh();
		m_window->renderer()->resetAngles();
	});
	dialog->exec();
}

void FileToolset::makePrimitive()
{
	PrimitivePrompt* dlg = new PrimitivePrompt (g_win);

	if (not dlg->exec())
		return;

	int segs = dlg->ui->sb_segs->value();
	int divs = dlg->ui->cb_hires->isChecked() ? HighResolution : LowResolution;
	int num = dlg->ui->sb_ringnum->value();
	PrimitiveType type =
		dlg->ui->rb_circle->isChecked()   ? Circle :
		dlg->ui->rb_cylinder->isChecked() ? Cylinder :
		dlg->ui->rb_disc->isChecked()     ? Disc :
		dlg->ui->rb_ndisc->isChecked()    ? DiscNeg :
		dlg->ui->rb_ring->isChecked()     ? Ring : Cone;

	LDDocument* f = GeneratePrimitive (type, segs, divs, num);
	f->openForEditing();
	m_window->save (f, false);
}

// These are not exactly file tools but I don't want to make another toolset just for 3 very small actions
void FileToolset::help()
{
	// Not yet implemented
}

void FileToolset::about()
{
	AboutDialog().exec();
}

void FileToolset::aboutQt()
{
	QMessageBox::aboutQt (m_window);
}

mercurial