aboutsummaryrefslogtreecommitdiffstats
//=============================================================================
//
//   File : OptionsWidget_textIcons.cpp
//   Creation date : Fri May 24 2002 00:16:13 CEST by Szymon Stefanek
//
//   This file is part of the KVIrc IRC client distribution
//   Copyright (C) 2002-2010 Szymon Stefanek (pragma at kvirc dot net)
//
//   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.
//
//   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, write to the Free Software Foundation,
//   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================

#include "OptionsWidget_textIcons.h"

#include "KviIconManager.h"

#include "KviApplication.h"
#include "KviOptions.h"
#include "KviTextIconManager.h"
#include "KviLocale.h"
#include "KviFileDialog.h"
#include "kvi_fileextensions.h"
#include "KviTalHBox.h"
#include "KviFileUtils.h"

#include <QToolButton>
#include <QLayout>
#include <QCursor>
#include <QHeaderView>
#include <QWidgetAction>
#include <QMenu>

TextIconTableItem::TextIconTableItem(QTableWidget *, KviTextIcon * icon)
    : QTableWidgetItem(QString(), Qt::ItemIsEditable)
{
	if(icon)
		m_pIcon = icon;
	else
		m_pIcon = new KviTextIcon(KviIconManager::None);
	QPixmap * pix = m_pIcon->pixmap();
	if(pix)
		setIcon(QIcon(*pix));
}

TextIconTableItem::~TextIconTableItem()
{
	delete m_pIcon;
}

void TextIconTableItem::setId(int id)
{
	m_pIcon->setId(id);
	QPixmap * pix = m_pIcon->pixmap();
	if(pix)
		setIcon(QIcon(*pix));
}

OptionsWidget_textIcons::OptionsWidget_textIcons(QWidget * parent)
    : KviOptionsWidget(parent)
{
	m_pPopup = nullptr;
	m_iLastEditedRow = -1;
	m_pCurrentIconButton = nullptr;
	setObjectName("texticons_options_widget");
	createLayout();

	m_pTable = new QTableWidget(this);

	m_pTable->setColumnCount(2);
	m_pTable->setColumnWidth(0, 300);
	m_pTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
	m_pTable->horizontalHeader()->stretchLastSection();
	m_pTable->setSelectionBehavior(QAbstractItemView::SelectRows);
	m_pTable->setSelectionMode(QAbstractItemView::SingleSelection);
	m_pTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

	mergeTip(m_pTable->viewport(), __tr2qs_ctx("This table contains the text icon associations.<br>"
	                                           "KVIrc will use them to display the Alt+E escape sequences "
	                                           "and eventually the emoticons.", "options"));

	layout()->addWidget(m_pTable, 0, 0, 1, 3);

	m_pAdd = new QPushButton(__tr2qs_ctx("Add", "options"), this);
	layout()->addWidget(m_pAdd, 1, 0);
	connect(m_pAdd, SIGNAL(clicked()), this, SLOT(addClicked()));

	m_pDel = new QPushButton(__tr2qs_ctx("Delete", "options"), this);
	layout()->addWidget(m_pDel, 1, 1);
	connect(m_pDel, SIGNAL(clicked()), this, SLOT(delClicked()));

	m_pRestore = new QPushButton(__tr2qs_ctx("Restore", "options"), this);
	layout()->addWidget(m_pRestore, 1, 2);
	connect(m_pRestore, SIGNAL(clicked()), this, SLOT(restoreClicked()));

	connect(m_pTable, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged()));
	connect(m_pTable, SIGNAL(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)), this, SLOT(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)));

	fillTable();
}

OptionsWidget_textIcons::~OptionsWidget_textIcons()
    = default;

void OptionsWidget_textIcons::fillTable()
{
	KviPointerHashTableIterator<QString, KviTextIcon> it(*(g_pTextIconManager->textIconDict()));

	m_pTable->clear();
	QStringList header;
	header.append(__tr2qs("Text"));
	header.append(__tr2qs("Emoticon"));
	m_pTable->setHorizontalHeaderLabels(header);
	m_pTable->setRowCount(g_pTextIconManager->textIconDict()->count());

	int idx = 0;
	QTableWidgetItem * item0;
	TextIconTableItem * item1;
	while(KviTextIcon * i = it.current())
	{
		if(!m_pTable->item(idx, 0))
		{
			item0 = new QTableWidgetItem(it.currentKey());
			m_pTable->setItem(idx, 0, item0);
		}

		item1 = new TextIconTableItem(m_pTable, new KviTextIcon(i));
		//remove from the item the ability to be edited as text
		item1->setFlags(item1->flags() ^ Qt::ItemIsEditable);
		m_pTable->setItem(idx, 1, item1);

		++idx;
		++it;
	}

	// disable the delete button
	m_pDel->setEnabled(false);
}

void OptionsWidget_textIcons::doPopup()
{
	if(!m_pPopup)
	{
		m_pPopup = new QMenu(this);
		KviIconWidget * iw = new KviIconWidget(m_pPopup);
		connect(iw, SIGNAL(selected(KviIconManager::SmallIcon)), this, SLOT(iconSelected(KviIconManager::SmallIcon)));
		QWidgetAction * pWaction = new QWidgetAction(m_pPopup);
		pWaction->setDefaultWidget(iw);
		m_pPopup->addAction(pWaction);
	}
	m_pPopup->popup(QCursor::pos());
}

void OptionsWidget_textIcons::iconSelected(KviIconManager::SmallIcon eIcon)
{
	m_pCurrentItem->icon()->setId(eIcon);
	m_pCurrentItem->setIcon(QIcon(*m_pCurrentItem->icon()->pixmap()));

	KviTalHBox * pBox = new KviTalHBox(nullptr);
	pBox->setSpacing(0);
	pBox->setContentsMargins(0, 0, 0, 0);

	m_pCurrentIconButton = new QToolButton(pBox);
	m_pCurrentIconButton->setMinimumWidth(90);
	m_pCurrentIconButton->setIcon(QIcon(*m_pCurrentItem->icon()->pixmap()));

	connect(m_pCurrentIconButton, SIGNAL(clicked()), this, SLOT(doPopup()));

	QToolButton * pBrowseButton = new QToolButton(pBox);
	pBrowseButton->setText(__tr2qs("&Browse..."));
	connect(pBrowseButton, SIGNAL(clicked()), this, SLOT(chooseFromFile()));

	m_pTable->setCellWidget(m_pCurrentItem->row(), 1, pBox);
}

void OptionsWidget_textIcons::chooseFromFile()
{
	QString szFile;
	KviFileDialog::askForOpenFileName(szFile, __tr2qs_ctx("Select a File - KVIrc", "options"), QString(), KVI_FILTER_IMAGE, false, true, this);
	if(szFile.isEmpty())
		return;

	if(!g_pIconManager->getPixmap(szFile))
		return;

	QFileInfo info(szFile);

	QString szFileName = info.fileName();

	QString szCurrentThemePath;
	g_pApp->getLocalKvircDirectory(szCurrentThemePath, KviApplication::Themes, KVI_OPTION_STRING(KviOption_stringIconThemeSubdir));

	szCurrentThemePath += KVI_PATH_SEPARATOR_CHAR;

	if(!KviFileUtils::directoryExists(szCurrentThemePath))
		KviFileUtils::makeDir(szCurrentThemePath);

	KviFileUtils::copyFile(szFile, szCurrentThemePath + szFileName);

	m_pCurrentItem->icon()->setFilename(szFileName);

	QPixmap * p = m_pCurrentItem->icon()->pixmap();
	m_pCurrentItem->setIcon(QIcon(*p));

	if(m_pCurrentIconButton)
		m_pCurrentIconButton->setIcon(QIcon(*p));
}

void OptionsWidget_textIcons::itemSelectionChanged()
{
	int i = m_pTable->currentRow();
	m_pDel->setEnabled(i >= 0 && i < m_pTable->rowCount());
}

void OptionsWidget_textIcons::currentItemChanged(QTableWidgetItem * cur, QTableWidgetItem * prev)
{
	if(prev)
	{
		QWidget * pOldWidget = m_pTable->cellWidget(prev->row(), 1);
		if(pOldWidget)
			m_pTable->setCellWidget(prev->row(), 1, nullptr);
	}

	m_pCurrentItem = nullptr;

	if(!cur)
		return;
	if(cur->column() != 1)
		return;
	if(m_iLastEditedRow == cur->row() || cur == prev)
		return;

	m_pCurrentItem = (TextIconTableItem *)cur;

	KviTalHBox * pBox = new KviTalHBox(nullptr);
	pBox->setSpacing(0);
	pBox->setContentsMargins(0, 0, 0, 0);

	m_pCurrentIconButton = new QToolButton(pBox);
	m_pCurrentIconButton->setMinimumWidth(90);
	m_pCurrentIconButton->setIcon(QIcon(cur->icon()));
	m_pCurrentIconButton->setText(__tr2qs("&Select..."));
	connect(m_pCurrentIconButton, SIGNAL(clicked()), this, SLOT(doPopup()));

	QToolButton * pBrowseButton = new QToolButton(pBox);
	pBrowseButton->setText(__tr2qs("&Browse..."));
	connect(pBrowseButton, SIGNAL(clicked()), this, SLOT(chooseFromFile()));

	m_pTable->setCellWidget(cur->row(), 1, pBox);
	m_iLastEditedRow = cur->row();
}

void OptionsWidget_textIcons::addClicked()
{
	m_pTable->setRowCount(m_pTable->rowCount() + 1);
	m_pTable->setItem(m_pTable->rowCount() - 1, 0, new QTableWidgetItem(__tr2qs_ctx("unnamed", "options")));
	m_pTable->setItem(m_pTable->rowCount() - 1, 1, new TextIconTableItem(m_pTable, nullptr));
	m_pTable->scrollToBottom();
	m_pDel->setEnabled(true);
}

void OptionsWidget_textIcons::restoreClicked()
{
	g_pTextIconManager->checkDefaultAssociations();
	fillTable();
}

void OptionsWidget_textIcons::delClicked()
{
	int i = m_pTable->currentRow();

	if((i > -1) && (i < m_pTable->rowCount()))
	{
		m_pTable->removeRow(i);
		if(m_pTable->rowCount() == 0)
			m_pDel->setEnabled(false);
	}
}

void OptionsWidget_textIcons::commit()
{
	KviOptionsWidget::commit();
	g_pTextIconManager->clear();
	int n = m_pTable->rowCount();
	for(int i = 0; i < n; i++)
	{
		QString szVal = m_pTable->item(i, 0)->text();
		if(!szVal.isEmpty())
		{
			TextIconTableItem * it = (TextIconTableItem *)m_pTable->item(i, 1);
			if(it)
			{
				g_pTextIconManager->insert(szVal, *(it->icon()));
			}
		}
	}
	g_pTextIconManager->save();

	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m_pTable->columnCount(); j++)
		{
			if(m_pTable->item(i, j))
				m_pTable->takeItem(i, j);
		}
	}
}