From dde87e29bcb1fbebfee90e2ce6eb9e54cf3a549e Mon Sep 17 00:00:00 2001 From: Noldor Date: Sat, 12 Apr 2008 18:16:43 +0000 Subject: fixed texticons table (no need of "delegate") (wip) git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@1470 17fca916-40b9-46aa-a4ea-0a15b648b75c --- src/modules/options/optw_texticons.cpp | 224 +++++++++------------------------ src/modules/options/optw_texticons.h | 60 ++------- 2 files changed, 68 insertions(+), 216 deletions(-) (limited to 'src/modules/options') diff --git a/src/modules/options/optw_texticons.cpp b/src/modules/options/optw_texticons.cpp index bf9b7aa27..eb6a53bc1 100644 --- a/src/modules/options/optw_texticons.cpp +++ b/src/modules/options/optw_texticons.cpp @@ -35,154 +35,6 @@ -QWidget * KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate::createEditor(QWidget * parent,const QStyleOptionViewItem & option,const QModelIndex & index) const -{ - if(index.column() != 1) - return QItemDelegate::createEditor(parent,option,index); - return new KviTextIconEditor(parent); -} - -void KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate::setEditorData(QWidget * editor,const QModelIndex & index) const -{ - if(index.column() != 1) - { - QItemDelegate::setEditorData(editor,index); - return; - } - - if(!editor) - return; - if(!editor->inherits("KviTextIconEditor")) - return; - - KviTextIconEditor * pEditor = (KviTextIconEditor *)editor; - - - // FIXME: Should use dynamic_cast<> here (once we know it's really safe to use it on all the platforms) - KviTextIconTableItem * pItem = static_cast(m_pTableWidget->item(index.row(),index.column())); - if(!pItem) - return; - - pEditor->setIcon(pItem->icon()); - pEditor->updateIcon(); -} - -void KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate::setModelData(QWidget * editor,QAbstractItemModel * model,const QModelIndex & index) const -{ - if(index.column() != 1) - { - QItemDelegate::setModelData(editor,model,index); - return; - } - - if(!editor) - return; - if(!editor->inherits("KviTextIconEditor")) - return; - - KviTextIconEditor * pEditor = (KviTextIconEditor *)editor; - - // FIXME: Should use dynamic_cast<> here (once we know it's really safe to use it on all the platforms) - KviTextIconTableItem * pItem = static_cast(m_pTableWidget->item(index.row(),index.column())); - if(!pItem) - return; - - pItem->setContentFromEditor(pEditor); -} - -void KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate::updateEditorGeometry(QWidget * editor,const QStyleOptionViewItem & option,const QModelIndex & index) const -{ - if(index.column() != 1) - { - QItemDelegate::updateEditorGeometry(editor,option,index); - return; - } - - if(!editor) - return; - if(!editor->inherits("KviTextIconEditor")) - return; - - KviTextIconEditor * pEditor = (KviTextIconEditor *)editor; - - // FIXME: Should use dynamic_cast<> here (once we know it's really safe to use it on all the platforms) - KviTextIconTableItem * pItem = static_cast(m_pTableWidget->item(index.row(),index.column())); - if(!pItem) - return; - - pEditor->setGeometry(m_pTableWidget->visualItemRect(pItem)); -} - -KviTextIconEditor::KviTextIconEditor(QWidget * par) -: KviTalHBox(par) -{ - m_pIconButton=new QToolButton(this); - m_pBrowseButton=new QToolButton(this); - m_pBrowseButton->setSizePolicy(QSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum)); - m_pBrowseButton->setText("..."); - m_pIcon = NULL; - m_pPopup = 0; - updateIcon(); - connect(m_pIconButton,SIGNAL(clicked()),this,SLOT(doPopup())); - connect(m_pBrowseButton,SIGNAL(clicked()),this,SLOT(chooseFromFile())); - setMargin(0); - setSpacing(0); - - // I've spend more than 1 hour to find out the following line. - // Without this the editor disappears on the first click and no clicked() events are forwarded to the buttons. - // It's very ugly. - setFocusPolicy(Qt::ClickFocus); -} - - -KviTextIconEditor::~KviTextIconEditor() -{ - -} - -void KviTextIconEditor::doPopup() -{ - if(!m_pPopup) - { - m_pPopup = new KviTalPopupMenu(this); - KviIconWidget * iw = new KviIconWidget(m_pPopup); - connect(iw,SIGNAL(selected(int)),this,SLOT(iconSelected(int))); - m_pPopup->insertItem(iw); - } - m_pPopup->popup(QCursor::pos()); -} - -void KviTextIconEditor::iconSelected(int id) -{ - if(!m_pIcon) - return; - m_pIcon->setId(id); - updateIcon(); -} - -void KviTextIconEditor::chooseFromFile() -{ - QString szFile; - KviFileDialog::askForOpenFileName(szFile,"Choose icon filename",QString::null,"*.png","options"); - if(!szFile.isEmpty()) - { - if(g_pIconManager->getPixmap(szFile)) - { - m_pIcon->setFilename(szFile); -// qDebug("%s %s %i |%s| %p",__FILE__,__FUNCTION__,__LINE__,m_pIcon->filename().utf8().data(),m_pIcon); - updateIcon(); - } - } -} - -void KviTextIconEditor::updateIcon() -{ - if(!m_pIcon) - return; - QPixmap* pix=m_pIcon->pixmap(); - if(pix) m_pIconButton->setPixmap(*pix); -} - KviTextIconTableItem::KviTextIconTableItem(QTableWidget * t,KviTextIcon * icon) : QTableWidgetItem(QString::null,Qt::ItemIsEditable) { @@ -206,23 +58,14 @@ void KviTextIconTableItem::setId(int id) if(pix) setIcon(QIcon(*pix)); } -/*QWidget * KviTextIconTableItem::createEditor() const -{ - return new KviTextIconEditor(tableWidget()->viewport(),m_pIcon,(KviTextIconTableItem*)this); -}*/ - -void KviTextIconTableItem::setContentFromEditor(QWidget * w) -{ - if(w->inherits("KviTextIconEditor")) - { - QPixmap* pix=m_pIcon->pixmap(); - if(pix) setIcon(QIcon(*pix)); - } -} KviTextIconsOptionsWidget::KviTextIconsOptionsWidget(QWidget * parent) : KviOptionsWidget(parent) { + m_pBox=0; + m_pPopup=0; + m_iLastEditedRow=-1; + setObjectName("texticons_options_widget"); createLayout(2,2); @@ -234,9 +77,6 @@ KviTextIconsOptionsWidget::KviTextIconsOptionsWidget(QWidget * parent) "KVirc will use them to display the CTRL+I escape sequences and eventually the " \ "emoticons.","options")); - - m_pTable->setItemDelegateForColumn(1,new KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate(m_pTable)); - int idx = 0; while(KviTextIcon * i = it.current()) { @@ -262,23 +102,75 @@ KviTextIconsOptionsWidget::KviTextIconsOptionsWidget(QWidget * parent) m_pDel->setEnabled(false); connect(m_pTable,SIGNAL(itemSelectionChanged()),this,SLOT(itemSelectionChanged())); + connect(m_pTable,SIGNAL(itemClicked(QTableWidgetItem *)),this,SLOT(itemClicked(QTableWidgetItem *))); } KviTextIconsOptionsWidget::~KviTextIconsOptionsWidget() { } + +void KviTextIconsOptionsWidget::doPopup() +{ + if(!m_pPopup) + { + m_pPopup = new KviTalPopupMenu(this); + KviIconWidget * iw = new KviIconWidget(m_pPopup); + connect(iw,SIGNAL(selected(int)),this,SLOT(iconSelected(int))); + m_pPopup->insertItem(iw); + } + m_pPopup->popup(QCursor::pos()); +} + +void KviTextIconsOptionsWidget::iconSelected(int id) +{ + m_pItem->icon()->setId(id); + m_pItem->setIcon(QIcon(*m_pItem->icon()->pixmap())); +} + +void KviTextIconsOptionsWidget::chooseFromFile() +{ + QString szFile; + KviFileDialog::askForOpenFileName(szFile,"Choose icon filename",QString::null,"*.png","options"); + if(!szFile.isEmpty()) + { + if(g_pIconManager->getPixmap(szFile)) + { + m_pItem->icon()->setFilename(szFile); + m_pItem->setIcon(QIcon(*m_pItem->icon()->pixmap())); + } + } +} void KviTextIconsOptionsWidget::itemSelectionChanged() { int i = m_pTable->currentRow(); m_pDel->setEnabled(i >= 0 && i < m_pTable->rowCount()); } +void KviTextIconsOptionsWidget::itemClicked(QTableWidgetItem *i) +{ + if (i->column()!=1) return; + if (m_iLastEditedRow==i->row()) return; + if (m_pBox) + delete m_pBox; + m_pBox=new KviTalHBox(0); + m_pItem=(KviTextIconTableItem *)i; + QToolButton *iconButton=new QToolButton(m_pBox); + QToolButton *browseButton=new QToolButton(m_pBox); + browseButton->setText("..."); + m_pBox->setSpacing(0); + m_pBox->setMargin(0); + iconButton->setIcon(QIcon(*g_pIconManager->getSmallIcon(KVI_SMALLICON_THEME))); + m_pTable->setCellWidget(i->row(),1,m_pBox); + connect(iconButton,SIGNAL(clicked()),this,SLOT(doPopup())); + connect(browseButton,SIGNAL(clicked()),this,SLOT(chooseFromFile())); + m_iLastEditedRow=i->row(); + +} void KviTextIconsOptionsWidget::addClicked() { m_pTable->setRowCount(m_pTable->rowCount() + 1); - //m_pTable->item(m_pTable->rowCount() - 1,0)->setText(__tr2qs_ctx("unnamed","options")); - m_pTable->setItem(m_pTable->rowCount() - 1,0,new QTableWidgetItem(__tr2qs_ctx("unnamed","options"))); + m_pTable->item(m_pTable->rowCount() - 1,0)->setText(__tr2qs_ctx("unnamed","options")); m_pTable->setItem(m_pTable->rowCount() - 1,1,new KviTextIconTableItem(m_pTable,0)); m_pDel->setEnabled(true); } diff --git a/src/modules/options/optw_texticons.h b/src/modules/options/optw_texticons.h index 171d2b498..79e7cc24a 100644 --- a/src/modules/options/optw_texticons.h +++ b/src/modules/options/optw_texticons.h @@ -31,7 +31,6 @@ #include #include #include -#include class KviTextIconTableItem; @@ -40,30 +39,6 @@ class KviTextIconTableItem; #define KVI_OPTIONS_WIDGET_PARENT_KviTextIconsOptionsWidget KviToolsOptionsWidget #define KVI_OPTIONS_WIDGET_KEYWORDS_KviTextIconsOptionsWidget __tr2qs_no_lookup("smileys,emoticons") - -class KviTextIconEditor : public KviTalHBox -{ - Q_OBJECT -public: - KviTextIconEditor(QWidget * par); - ~KviTextIconEditor(); -protected: - KviTextIcon *m_pIcon; - KviTalPopupMenu *m_pPopup; - QToolButton *m_pIconButton; - QToolButton *m_pBrowseButton; -public: - void updateIcon(); - void setIcon(KviTextIcon * icon) - { m_pIcon = icon; }; - KviTextIcon* icon() - { return m_pIcon; }; -protected slots: - void iconSelected(int); - void doPopup(); - void chooseFromFile(); -}; - class KviTextIconTableItem : public QTableWidgetItem { friend class KviTextIconsOptionsWidget; @@ -75,31 +50,7 @@ protected: public: KviTextIcon * icon() { return m_pIcon; }; void setId(int id); - //virtual QWidget * createEditor() const; - void setContentFromEditor(QWidget * w); -}; - -// -// Yes. It's true. You spend more time to find the function to reimplement in order to get the -// desired behaviour than to think out your REAL algorithm. -// Usually the function to reimplement is somewhere in a very abstract class that you're -// forced to understand and then inherit. IMHO the Qt3 item views were *really* better. -// Let's hope that Trolls improve this. -// -class KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate : public QItemDelegate -{ -protected: - QTableWidget * m_pTableWidget; -public: - KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate(QTableWidget * pTableWidget) - : QItemDelegate(pTableWidget), m_pTableWidget(pTableWidget) {}; - ~KviTextIconQt4ModelViewParadigmIsRidiculouslyComplexAndUglyTableItemDelegate() - {}; -protected: - virtual QWidget * createEditor(QWidget * parent,const QStyleOptionViewItem & option,const QModelIndex & index) const; - virtual void setEditorData(QWidget * editor,const QModelIndex & index) const; - virtual void setModelData(QWidget * editor,QAbstractItemModel * model,const QModelIndex & index) const; - virtual void updateEditorGeometry(QWidget * editor,const QStyleOptionViewItem & option,const QModelIndex & index) const; + }; class KviTextIconsOptionsWidget : public KviOptionsWidget @@ -110,14 +61,23 @@ public: ~KviTextIconsOptionsWidget(); protected: QTableWidget * m_pTable; + int m_iLastEditedRow; + KviTextIconTableItem *m_pItem; QPushButton * m_pAdd; QPushButton * m_pDel; + KviTalPopupMenu *m_pPopup; + KviTalHBox *m_pBox; public: virtual void commit(); protected slots: void itemSelectionChanged(); + void itemClicked(QTableWidgetItem *i); void addClicked(); void delClicked(); + + void iconSelected(int); + void doPopup(); + void chooseFromFile(); }; #endif //!_OPTW_TEXTICONS_H_ -- cgit v1.3.1-10-gc9f91