//============================================================================= // // 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 #include #include #include #include #include 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.
" "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 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); } } }