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/kernel/kvi_action.cpp

435 lines
10 KiB

//=============================================================================
//
// File : kvi_action.cpp
// Created on Sun 21 Nov 2004 03:36:34 by Szymon Stefanek
//
// This file is part of the KVIrc IRC Client distribution
// Copyright (C) 2004 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 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_action.h"
#include "kvi_customtoolbar.h"
#include "kvi_frame.h"
#include "kvi_irccontext.h"
#include "kvi_ircconnection.h"
#include "kvi_iconmanager.h"
#include "kvi_app.h"
#include "kvi_window.h"
#include "kvi_channel.h"
#include "kvi_console.h"
#include "kvi_query.h"
#include "kvi_styled_controls.h"
#include <tqtoolbutton.h>
#include "kvi_tal_popupmenu.h"
KviAction::~KviAction()
{
if(m_pWidgetList)
{
for(TQWidget * b = m_pWidgetList->first();b;b = m_pWidgetList->next())
disconnect(b,TQT_SIGNAL(destroyed()),this,TQT_SLOT(widgetDestroyed()));
m_pWidgetList->setAutoDelete(true);
delete m_pWidgetList;
}
}
const TQString & KviAction::visibleName()
{
return m_szVisibleName;
}
const TQString & KviAction::description()
{
return m_szDescription;
}
bool KviAction::isKviUserActionNeverOverrideThis()
{
return false;
}
void KviAction::registerAccelerator()
{
if(!m_szKeySequence.isEmpty())
m_iAccelId = g_pFrame->registerAccelerator(m_szKeySequence,this,TQT_SLOT(activate()));
}
void KviAction::unregisterAccelerator()
{
if(m_iAccelId != 0)
{
if(g_pFrame)
g_pFrame->unregisterAccelerator(m_iAccelId);
m_iAccelId = 0;
}
}
void KviAction::setEnabled(bool bEnabled)
{
if(bEnabled)
m_uInternalFlags |= KVI_ACTION_FLAG_ENABLED;
else
m_uInternalFlags &= ~KVI_ACTION_FLAG_ENABLED;
if(m_pWidgetList)
{
if(bEnabled)
{
for(TQWidget * t = m_pWidgetList->first();t;t = m_pWidgetList->next())
if(!t->isEnabled())t->setEnabled(true);
} else {
for(TQWidget * t = m_pWidgetList->first();t;t = m_pWidgetList->next())
if(t->isEnabled())t->setEnabled(false);
}
}
}
int KviAction::validateFlags(int iFlagsToValidate)
{
if(iFlagsToValidate & EnableAtLogin)
iFlagsToValidate |= NeedsConnection;
if(iFlagsToValidate & NeedsConnection)
iFlagsToValidate |= NeedsContext;
if(iFlagsToValidate & WindowOnlyIfUsersSelected)
{
if(!(iFlagsToValidate & InternalWindowMask))
iFlagsToValidate &= ~WindowOnlyIfUsersSelected;
}
return iFlagsToValidate;
}
TQPixmap * KviAction::smallIcon()
{
if(m_iSmallIconId != 0)return g_pIconManager->getSmallIcon(m_iSmallIconId);
return 0;
}
TQPixmap * KviAction::bigIcon()
{
return g_pIconManager->getBigIcon(m_szBigIcon);
}
void KviAction::setup()
{
connect(g_pApp,TQT_SIGNAL(reloadImages()),this,TQT_SLOT(reloadImages()));
if(m_uFlags & InternalWindowMask)
{
connect(g_pFrame,TQT_SIGNAL(activeWindowChanged()),this,TQT_SLOT(activeWindowChanged()));
if((m_uFlags & WindowOnlyIfUsersSelected) && (m_uFlags & (WindowChannel | WindowConsole | WindowQuery)))
connect(g_pFrame,TQT_SIGNAL(activeWindowSelectionStateChanged(bool)),this,TQT_SLOT(activeWindowSelectionStateChanged(bool)));
activeWindowChanged();
} else {
if(m_uFlags & NeedsConnection)
{
connect(g_pFrame,TQT_SIGNAL(activeContextChanged()),this,TQT_SLOT(activeContextChanged()));
connect(g_pFrame,TQT_SIGNAL(activeContextStateChanged()),this,TQT_SLOT(activeContextStateChanged()));
KviIrcContext * c = g_pFrame->activeContext();
if(!c)setEnabled(false);
else {
switch(c->state())
{
case KviIrcContext::LoggingIn:
setEnabled(m_uFlags & EnableAtLogin);
break;
case KviIrcContext::Connected:
setEnabled(true);
break;
default:
setEnabled(false);
break;
}
}
} else {
if(m_uFlags & NeedsContext)
{
connect(g_pFrame,TQT_SIGNAL(activeContextChanged()),this,TQT_SLOT(activeContextChanged()));
if(!g_pFrame->activeContext())setEnabled(false);
else setEnabled(true);
}
}
}
m_uInternalFlags |= KVI_ACTION_FLAG_SETUPDONE;
}
void KviAction::reloadImages()
{
if(!m_pWidgetList)return;
TQPixmap * p = bigIcon();
for(TQWidget * b = m_pWidgetList->first();b;b = m_pWidgetList->next())
{
if(b->inherits(TQTOOLBUTTON_OBJECT_NAME_STRING))
((TQToolButton *)b)->setIconSet(p ? *p : TQPixmap());
}
}
void KviAction::activeWindowChanged()
{
if(m_uFlags & NeedsContext)
{
if(!g_pFrame->activeContext())
{
if(isEnabled())setEnabled(false);
return;
}
}
if(m_uFlags & NeedsConnection)
{
switch(g_pFrame->activeContext()->state())
{
case KviIrcContext::LoggingIn:
if(!(m_uFlags & EnableAtLogin))
{
if(isEnabled())setEnabled(false);
return;
}
break;
case KviIrcContext::Connected:
// this is ok
break;
default:
if(isEnabled())setEnabled(false);
return;
break;
}
}
if(!g_pActiveWindow)
{
if(isEnabled())setEnabled(false);
return;
}
switch(g_pActiveWindow->type())
{
case KVI_WINDOW_TYPE_CONSOLE:
if(m_uFlags & WindowConsole)
{
if(m_uFlags & WindowOnlyIfUsersSelected)
{
bool bEnabled = ((KviConsole *)g_pActiveWindow)->selectedCount() > 0;
if(bEnabled != isEnabled())setEnabled(bEnabled);
} else {
if(!isEnabled())setEnabled(true);
}
} else {
if(isEnabled())setEnabled(false);
}
break;
case KVI_WINDOW_TYPE_CHANNEL:
if(m_uFlags & WindowChannel)
{
if(m_uFlags & WindowOnlyIfUsersSelected)
{
bool bEnabled = ((KviChannel *)g_pActiveWindow)->selectedCount() > 0;
if(bEnabled != isEnabled())setEnabled(bEnabled);
} else {
if(!isEnabled())setEnabled(true);
}
} else {
if(isEnabled())setEnabled(false);
}
break;
case KVI_WINDOW_TYPE_QUERY:
if(m_uFlags & WindowQuery)
{
if(m_uFlags & WindowOnlyIfUsersSelected)
{
bool bEnabled = ((KviQuery *)g_pActiveWindow)->selectedCount() > 0;
if(bEnabled != isEnabled())setEnabled(bEnabled);
} else {
if(!isEnabled())setEnabled(true);
}
} else {
if(isEnabled())setEnabled(false);
}
break;
case KVI_WINDOW_TYPE_DCCCHAT:
if(m_uFlags & WindowDccChat)
{
if(!isEnabled())setEnabled(true);
} else {
if(isEnabled())setEnabled(false);
}
break;
default:
if(m_uFlags & InternalWindowMask)
if(isEnabled())setEnabled(false);
else
if(!isEnabled())setEnabled(true);
break;
}
}
void KviAction::activeWindowSelectionStateChanged(bool bSelectedNow)
{
// we jump here ONLY if m_uFlags & WindowOnlyIfUsersSelected
// and thus also m_uFlags & InternalWindowMask
switch(g_pActiveWindow->type())
{
case KVI_WINDOW_TYPE_CONSOLE:
if(m_uFlags & WindowConsole)
{
if(bSelectedNow != isEnabled())setEnabled(bSelectedNow);
} else {
if(isEnabled())setEnabled(false);
}
break;
case KVI_WINDOW_TYPE_CHANNEL:
if(m_uFlags & WindowChannel)
{
if(bSelectedNow != isEnabled())setEnabled(bSelectedNow);
} else {
if(isEnabled())setEnabled(false);
}
break;
case KVI_WINDOW_TYPE_QUERY:
if(m_uFlags & WindowQuery)
{
if(bSelectedNow != isEnabled())setEnabled(bSelectedNow);
} else {
if(isEnabled())setEnabled(false);
}
break;
case KVI_WINDOW_TYPE_DCCCHAT:
if(m_uFlags & WindowDccChat)
{
if(!isEnabled())setEnabled(true);
} else {
if(isEnabled())setEnabled(false);
}
break;
default:
if(isEnabled())setEnabled(false);
break;
}
}
void KviAction::activeContextChanged()
{
// works only if NeedsContext is specified!
KviIrcContext * c = g_pFrame->activeContext();
if(c)
{
if(m_uFlags & NeedsConnection)
activeContextStateChanged();
else
if(!isEnabled())setEnabled(true);
} else {
if(isEnabled())setEnabled(false);
}
}
void KviAction::activeContextStateChanged()
{
KviIrcContext * c = g_pFrame->activeContext();
if(c)
{
switch(c->state())
{
case KviIrcContext::Idle:
case KviIrcContext::Connecting:
if(isEnabled())setEnabled(false);
break;
case KviIrcContext::LoggingIn:
if(m_uFlags & EnableAtLogin)
{
if(!isEnabled())setEnabled(true);
} else {
if(isEnabled())setEnabled(false);
}
break;
case KviIrcContext::Connected:
if(!isEnabled())setEnabled(true);
break;
default:
if(isEnabled())setEnabled(false);
break;
}
} else {
if(isEnabled())setEnabled(false);
}
}
bool KviAction::addToPopupMenu(KviTalPopupMenu *pMenu)
{
if(!setupDone())setup();
TQPixmap * p = smallIcon();
int id;
TQString t = visibleName();
if(!m_szKeySequence.isEmpty())t += '\t' + m_szKeySequence;
if(p)
{
id = pMenu->insertItem(*p,t,this,TQT_SLOT(activate()));
} else {
id = pMenu->insertItem(t,this,TQT_SLOT(activate()));
}
if(!isEnabled())pMenu->setItemEnabled(id,false);
return true;
}
void KviAction::widgetDestroyed()
{
if(!m_pWidgetList)return;
TQWidget * b = (TQWidget *)sender();
m_pWidgetList->removeRef(b);
}
void KviAction::registerWidget(TQWidget * b)
{
connect(b,TQT_SIGNAL(destroyed()),this,TQT_SLOT(widgetDestroyed()));
if(!m_pWidgetList)
{
m_pWidgetList = new KviPointerList<TQWidget>;
m_pWidgetList->setAutoDelete(false);
}
m_pWidgetList->append(b);
}
TQWidget * KviAction::addToCustomToolBar(KviCustomToolBar *pParentToolBar)
{
if(!setupDone())setup();
TQPixmap * p = bigIcon();
TQToolButton * b = new KviStyledToolButton(
p ? *p : TQPixmap(),
visibleName(),
visibleName(),
this,TQT_SLOT(activate()),pParentToolBar,m_szName);
#ifdef COMPILE_USE_QT4
pParentToolBar->addWidget(b);
#endif
if(!isEnabled())b->setEnabled(false);
registerWidget(b);
return b;
}
void KviAction::activate()
{
if(isEnabled())
emit activated();
}