src/dialogs/colortoolbareditor.cpp

changeset 1432
4cc687851fbb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dialogs/colortoolbareditor.cpp	Wed Dec 26 16:38:38 2018 +0200
@@ -0,0 +1,298 @@
+/*
+ *  LDForge: LDraw parts authoring CAD
+ *  Copyright (C) 2013 - 2018 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 <QListView>
+#include "colortoolbareditor.h"
+#include "ui_colortoolbareditor.h"
+#include "guiutilities.h"
+#include "colorselector.h"
+
+/*
+ * Constructs a new color toolbar editor widget.
+ */
+ColorToolbarEditor::ColorToolbarEditor(QWidget *parent) :
+	QWidget {parent},
+	colorToolbar {config::quickColorToolbar()},
+	model {colorToolbar},
+	ui {*new Ui_ColorToolbarEditor}
+{
+	ui.setupUi(this);
+	ui.colorToolbarView->setModel(&model);
+	connect(ui.quickColor_add, &QAbstractButton::clicked, this, &ColorToolbarEditor::addColor);
+	connect(ui.quickColor_remove, &QAbstractButton::clicked, this, &ColorToolbarEditor::removeColor);
+	connect(ui.quickColor_edit, &QAbstractButton::clicked, this, &ColorToolbarEditor::editColor);
+	connect(ui.quickColor_addSep, &QAbstractButton::clicked, this, &ColorToolbarEditor::addSeparator);
+	connect(ui.quickColor_moveUp, &QAbstractButton::clicked, this, &ColorToolbarEditor::moveColor);
+	connect(ui.quickColor_moveDown, &QAbstractButton::clicked, this, &ColorToolbarEditor::moveColor);
+	connect(ui.quickColor_clear, &QAbstractButton::clicked, this, &ColorToolbarEditor::clearColors);
+}
+
+/*
+ * Destroys the color toolbar editor widget.
+ */
+ColorToolbarEditor::~ColorToolbarEditor()
+{
+	delete &ui;
+}
+
+/*
+ * Returns where a new color toolbar entry should be inserted to.
+ * If the user has selected an entry, the new entry is placed below it.
+ * Otherwise it goes to the end of the toolbar.
+ */
+int ColorToolbarEditor::newItemPosition()
+{
+	QModelIndexList const indexes = ui.colorToolbarView->selectionModel()->selectedIndexes();
+
+	if (indexes.size() > 0)
+		return indexes.last().row() + 1;
+	else
+		return model.rowCount();
+}
+
+/*
+ * Adds a new color toolbar entry
+ */
+void ColorToolbarEditor::addColor()
+{
+	LDColor value;
+
+	if (not ColorSelector::selectColor (this, value, LDColor::nullColor))
+		return;
+
+	int const position = newItemPosition();
+	model.insertRow(position);
+	model.setColorAt(model.index(position), value);
+}
+
+/*
+ * Changes an existing color toolbar entry
+ */
+void ColorToolbarEditor::editColor()
+{
+	QModelIndexList const indexes = ui.colorToolbarView->selectionModel()->selectedIndexes();
+
+	if (indexes.size() > 0)
+	{
+		QModelIndex const& position = indexes[0];
+		LDColor const color = model.colorAt(position);
+
+		if (color == LDColor::nullColor)
+			return; // don't color separators
+
+		LDColor newColor;
+
+		if (ColorSelector::selectColor(this, newColor, color))
+			model.setColorAt(position, newColor);
+	}
+}
+
+//
+// Remove a quick color
+//
+void ColorToolbarEditor::removeColor()
+{
+	QModelIndexList const selection = ui.colorToolbarView->selectionModel()->selectedIndexes();
+
+	if (not selection.empty())
+		model.removeRow(selection[0].row());
+}
+
+//
+// Move a quick color up/down
+//
+void ColorToolbarEditor::moveColor()
+{
+	bool const up = (static_cast<QPushButton*>(sender()) == ui.quickColor_moveUp);
+	QModelIndexList const selection = ui.colorToolbarView->selectionModel()->selectedIndexes();
+
+	if (not selection.empty())
+		model.moveColor(selection[0], up);
+}
+
+/*
+ * Adds a new separator into the color toolbar.
+ */
+void ColorToolbarEditor::addSeparator()
+{
+	int const position = newItemPosition();
+	model.insertRow(position);
+	model.setColorAt(model.index(position), LDColor::nullColor);
+}
+
+/*
+ * Clears the color toolbar.
+ */
+void ColorToolbarEditor::clearColors()
+{
+	model.removeRows(0, model.rowCount());
+}
+
+/*
+ * Saves the changes done in the color toolbar editor
+ */
+void ColorToolbarEditor::saveChanges()
+{
+	config::setQuickColorToolbar(colorToolbar);
+}
+
+/*
+ * Constructs a new model for editing the color toolbar.
+ */
+ColorToolbarModel::ColorToolbarModel(QVector<LDColor> &colorToolbar) :
+	colorToolbar {colorToolbar} {}
+
+/*
+ * Returns the amount of entries in the color toolbar.
+ */
+int ColorToolbarModel::rowCount(QModelIndex const&) const
+{
+	return colorToolbar.size();
+}
+
+/*
+ * Returns data of the color toolbar.
+ */
+QVariant ColorToolbarModel::data(const QModelIndex& index, int role) const
+{
+	int const row = index.row();
+
+	if (row < 0 or row >= rowCount())
+		return {};
+
+	LDColor const color = colorToolbar[row];
+
+	switch(role)
+	{
+	case Qt::DecorationRole:
+		if (color == LDColor::nullColor)
+			return {};
+		else
+			return makeColorIcon(color, 16);
+
+	case Qt::DisplayRole:
+		if (color == LDColor::nullColor)
+			return "";
+		else
+			return color.name();
+
+	default:
+		return {};
+	}
+}
+
+/*
+ * Returns a color in the color toolbar.
+ */
+LDColor ColorToolbarModel::colorAt(QModelIndex const& index) const
+{
+	if (isValidIndex(index))
+		return colorToolbar[index.row()];
+	else
+		return {};
+}
+
+/*
+ * Changes a color in the color toolbar.
+ */
+void ColorToolbarModel::setColorAt(QModelIndex const& index, LDColor newColor)
+{
+	if (isValidIndex(index))
+	{
+		colorToolbar[index.row()] = newColor;
+		emit dataChanged(index, index);
+	}
+}
+
+/*
+ * Moves a color up or down in the color toolbar.
+ */
+void ColorToolbarModel::moveColor(const QModelIndex &index, bool const up)
+{
+	int const position = index.row();
+	int const destination = position + (up ? -1 : 1);
+	int const end = destination + (up ? 0 : 1);
+
+	if (isValidRow(position) and isValidRow(destination))
+	{
+		emit beginMoveRows({}, position, position, {}, end);
+		qSwap(colorToolbar[destination], colorToolbar[position]);
+		emit endMoveRows();
+	}
+}
+
+/*
+ * Inserts entries in the color toolbar.
+ */
+bool ColorToolbarModel::insertRows(int row, int count, QModelIndex const&)
+{
+	if (row >= 0 and row <= colorToolbar.size())
+	{
+		emit beginInsertRows({}, row, count);
+		while (count > 0)
+		{
+			colorToolbar.insert(row, {});
+			count -= 1;
+			row += 1;
+		}
+		emit endInsertRows();
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+/*
+ * Removes entries in the color toolbar.
+ */
+bool ColorToolbarModel::removeRows(int row, int count, QModelIndex const&)
+{
+	if (row >= 0 and row + count <= colorToolbar.size())
+	{
+		emit beginRemoveRows({}, row, row);
+		while (count > 0)
+		{
+			colorToolbar.removeAt(row);
+			count -= 1;
+		}
+		emit endRemoveRows();
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+/*
+ * Returns whether or not the specified index is valid in the color toolbar.
+ */
+bool ColorToolbarModel::isValidIndex(const QModelIndex &index) const
+{
+	return isValidRow(index.row());
+}
+
+/*
+ * Returns whether or not the specified row is valid in the color toolbar.
+ */
+bool ColorToolbarModel::isValidRow(int row) const
+{
+	return row >= 0 and row < colorToolbar.size();
+}

mercurial