src/aboutDialog.cpp

changeset 183
f1b8cb53d2a2
child 198
f246725199dc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/aboutDialog.cpp	Wed May 08 15:19:06 2013 +0300
@@ -0,0 +1,156 @@
+/*
+ *  LDForge: LDraw parts authoring CAD
+ *  Copyright (C) 2013 Santeri 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 <stdlib.h>
+#include <qlabel.h>
+#include <qboxlayout.h>
+#include <qdialogbuttonbox.h>
+#include <qdesktopservices.h>
+#include <qurl.h>
+#include "common.h"
+#include "aboutDialog.h"
+
+AboutDialog::AboutDialog (QWidget* parent, Qt::WindowFlags f) : QDialog (parent, f) {
+	QWidget* mainTab, *licenseTab;
+	QTabWidget* tabs = new QTabWidget;
+	
+	{
+		mainTab = new QWidget;
+		
+		// Application icon - in full 64 x 64 glory.
+		QLabel* icon = new QLabel;
+		icon->setPixmap (getIcon ("ldforge"));
+		
+		// Heading - application label and copyright information
+		QLabel* title = new QLabel (fmt ("<b>" APPNAME " v%d.%d</b><br />"
+			"Copyright (C) 2013 Santeri Piippo",
+			VERSION_MAJOR, VERSION_MINOR));
+		
+		// Body text
+		QLabel* info = new QLabel (
+			"<p>This software is intended for usage as a parts<br />"
+			"authoring tool for the <a href=\"http://ldraw.org/\">LDraw</a> parts library.</p>"
+			
+			"<p>" APPNAME " is free software, and you are welcome<br />"
+			"to redistribute it under the terms of GPL v3. See the LICENSE<br />"
+			"text file or the license tab in this dialog for details. If the<br />"
+			"license text is not available for some reason, see<br />"
+			"<a href=\"http://www.gnu.org/licenses/\">http://www.gnu.org/licenses/</a>"
+			"for the license terms.</p>"
+			
+			"<p>The application icon is derived from "
+			"<a href=\"http://en.wikipedia.org/wiki/File:Anvil,_labelled_en.svg\">this image</a>.</p>"
+		);
+		
+		// Rest in peace, James.
+		QLabel* memorial = new QLabel ("In living memory of James Jessiman.");
+		
+		QVBoxLayout* layout = new QVBoxLayout;
+		layout->addWidget (icon);
+		layout->addWidget (title);
+		layout->addWidget (info);
+		layout->addWidget (memorial);
+		
+		// Align everything to the center.
+		for (QLabel* label : vector<QLabel*> ({icon, title, info, memorial}))
+			label->setAlignment (Qt::AlignCenter);
+		
+		mainTab->setLayout (layout);
+		tabs->addTab (mainTab, "About " APPNAME);
+	}
+	
+	{
+		licenseTab = new QWidget;
+		
+		QTextEdit* license = new QTextEdit;
+		license->setReadOnly (true);
+		
+		QFont font ("Monospace");
+		font.setStyleHint (QFont::TypeWriter);
+		font.setPixelSize (10);
+		
+		license->setFont (font);
+		
+		// Make the text view wide enough to display the license text.
+		// Why isn't 80 sufficient here?
+		license->setMinimumWidth (license->fontMetrics ().width ('a') * 85);
+		
+		// Try open the license text
+		FILE* fp = fopen ("LICENSE", "r");
+		
+		if (fp == null) {
+			// Failed; tell the user how to get the license text instead.
+			setlocale (LC_ALL, "C");
+			char const* text = "Couldn't open LICENSE: %s.<br />"
+				"See <a href=\"http://www.gnu.org/licenses/\">http://www.gnu.org/licenses/</a> for the GPLv3 text.";
+			
+			license->setHtml (fmt (text, strerror (errno)));
+		} else {
+			// Figure out file size
+			fseek (fp, 0, SEEK_END);
+			const size_t length = ftell (fp);
+			rewind (fp);
+			
+			// Init text buffer and write pointer
+			char* licenseText = new char[length];
+			char* writePtr = &licenseText[0];
+			
+			// Read in the license text
+			while (true) {
+				*writePtr = fgetc (fp);
+				
+				if (feof (fp))
+					break;
+				
+				writePtr++;
+			}
+			
+			// Add terminating null character and add the license text to the
+			// license dialog text view.
+			*writePtr = '\0';
+			license->setText (licenseText);
+			
+			// And dump the trash on the way out.
+			delete[] licenseText;
+		}
+		
+		QVBoxLayout* layout = new QVBoxLayout;
+		layout->addWidget (license);
+		licenseTab->setLayout (layout);
+		tabs->addTab (licenseTab, "License");
+	}
+	
+	QDialogButtonBox* buttons = new QDialogButtonBox (QDialogButtonBox::Close);
+	QPushButton* helpButton = new QPushButton;
+	
+	helpButton->setText ("Mail Author");
+	helpButton->setIcon (getIcon ("mail"));
+	buttons->addButton (static_cast<QAbstractButton*> (helpButton), QDialogButtonBox::HelpRole);
+	connect (buttons, SIGNAL (helpRequested ()), this, SLOT (slot_mail ()));
+	connect (buttons, SIGNAL (rejected ()), this, SLOT (reject ()));
+	
+	QVBoxLayout* layout = new QVBoxLayout;
+	layout->addWidget (tabs);
+	layout->addWidget (buttons);
+	setLayout (layout);
+	setWindowTitle ("About " APPNAME);
+}
+
+void AboutDialog::slot_mail () {
+	QDesktopServices::openUrl (QUrl ("mailto:Santeri Piippo <arezey@gmail.com>?subject=LDForge"));
+}
\ No newline at end of file

mercurial