You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvirc/ui/kvi_modew.cpp

176 lines
4.7 KiB

//============================================================================
//
// File : kvi_modew.cpp
// Creation date : 12.11.2005 23.50 by Uzhva Alexey
//
// This file is part of the KVirc irc client distribution
//
// 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 opinion) 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.
//
//============================================================================
#define __KVIRC__
#include "kvi_themedlabel.h"
#include "kvi_channel.h"
#include "kvi_options.h"
#include "kvi_ircconnectionserverinfo.h"
#include "kvi_ircconnectionuserinfo.h"
#include "kvi_qcstring.h"
#include <tqframe.h>
#include <tqlineedit.h>
#include "kvi_tal_hbox.h"
#include <tqevent.h>
KviModeWidget::KviModeWidget(TQWidget * par,KviChannel* chan,const char * name)
:TQFrame(par,name)
{
m_pChannel=chan;
m_pLabel=0;
m_pLineEdit=0;
#ifdef COMPILE_USE_QT4
setAutoFillBackground(false);
#else
setBackgroundMode(TQWidget::NoBackground);
#endif
reset();
}
KviModeWidget::~KviModeWidget()
{
}
void KviModeWidget::reset()
{
if(m_pLineEdit)
{
delete m_pLineEdit;
m_pLineEdit=0;
}
if(!m_pLabel)
m_pLabel=new KviThemedLabel(this,0);
refreshModes();
m_pLabel->show();
connect(m_pLabel,TQT_SIGNAL(doubleClicked()),this,TQT_SLOT(labelDoubleClick()));
TQResizeEvent* ev=new TQResizeEvent(size(),size());
resizeEvent(ev);
delete ev;
if(m_pChannel->input())
m_pChannel->setFocus();
}
void KviModeWidget::refreshModes()
{
TQString szMode=m_pChannel->channelMode();
if(!m_pChannel->channelKey().isEmpty())
szMode+=TQString(" k:%1").arg(m_pChannel->channelKey());
if(!m_pChannel->channelLimit().isEmpty())
szMode+=TQString(" l:%1").arg(m_pChannel->channelLimit().ptr());
if(m_pLabel)
m_pLabel->setText(szMode);
}
void KviModeWidget::applyOptions()
{
if(m_pLabel)
m_pLabel->applyOptions();
}
void KviModeWidget::resizeEvent(TQResizeEvent *e)
{
if(e)TQFrame::resizeEvent(e);
if(m_pLabel)
{
m_pLabel->setGeometry(0,0,width(),height());
}
if(m_pLineEdit)
{
m_pLineEdit->setGeometry(0,0,width(),height());
}
}
void KviModeWidget::labelDoubleClick()
{
if(m_pLabel && ( m_pChannel->isMeHalfOp() || m_pChannel->isMeOp() || m_pChannel->isMeChanOwner() || m_pChannel->isMeChanAdmin() || m_pChannel->connection()->userInfo()->hasUserMode('o') || m_pChannel->connection()->userInfo()->hasUserMode('O')) )
{
delete m_pLabel;
m_pLabel=0;
m_pLineEdit = new TQLineEdit(this,0);
m_pLineEdit->setText(m_pChannel->channelMode());
m_pLineEdit->show();
m_pLineEdit->setFocus();
resizeEvent(new TQResizeEvent(size(),size()));
m_pLineEdit->installEventFilter( this );
connect(m_pLineEdit,TQT_SIGNAL(textChanged ( const TQString & ) ),this,TQT_SLOT(editorTextChanged( const TQString & )));
}
}
bool KviModeWidget::eventFilter( TQObject *obj, TQEvent *ev )
{
if( (TQT_BASE_OBJECT(obj)==TQT_BASE_OBJECT(m_pLineEdit)) && ( ev->type() == TQEvent::KeyPress ) )
{
TQKeyEvent *keyEvent = (TQKeyEvent*)ev;
switch(keyEvent->key())
{
case TQt::Key_Return:
case TQt::Key_Enter:
editorReturnPressed();
return TRUE;
case TQt::Key_Escape:
reset();
return TRUE;
}
}
return TQFrame::eventFilter( obj, ev );
}
void KviModeWidget::editorReturnPressed()
{
TQString szCurModes=m_pChannel->channelMode();
TQString szNewModes=m_pLineEdit->text();
TQString szMinusModes;
for(int i=0; i<szCurModes.length(); i++)
{
if(szNewModes.contains(szCurModes[i]))
szNewModes.remove(szCurModes[i]);
else
szMinusModes+=szCurModes[i];
}
TQString mode;
if(!szMinusModes.isEmpty()) mode+=TQString("-"+szMinusModes);
if(!szNewModes.isEmpty()) mode+=TQString("+"+szNewModes);
if(!mode.isEmpty())
{
KviTQCString chan = m_pChannel->connection()->encodeText(m_pChannel->name());
m_pChannel->connection()->sendFmtData("MODE %s %s",chan.data(),mode.utf8().data());
}
reset();
}
void KviModeWidget::editorTextChanged( const TQString & text)
{
int i = 0;
TQString szText=text;
for(i=0;i<szText.length();i++)
{
if( !m_pChannel->connection()->serverInfo()->supportedPlainModes().contains(szText[i]) ||
szText.find(szText[i])<i )
szText.remove(i,1);
}
m_pLineEdit->setText(szText);
}
#include "kvi_modew.moc"