aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar TheXception2008-11-04 00:30:47 +0000
committerGravatar TheXception2008-11-04 00:30:47 +0000
commit1ac6797cf7eeb2be675260f3fd60190eaa186623 (patch)
tree503356efbef97676da6c62c5e63f5abd324b0c19 /src
parentfixed typo (diff)
downloadKVIrc-1ac6797cf7eeb2be675260f3fd60190eaa186623.tar.gz
KVIrc-1ac6797cf7eeb2be675260f3fd60190eaa186623.tar.bz2
KVIrc-1ac6797cf7eeb2be675260f3fd60190eaa186623.zip
ported new mdi system to trunk
needs testing git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@2813 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src')
-rw-r--r--src/kvirc/CMakeLists.txt2
-rw-r--r--src/kvirc/kernel/kvi_irccontext.cpp21
-rw-r--r--src/kvirc/ui/kvi_frame.cpp64
-rw-r--r--src/kvirc/ui/kvi_frame.h22
-rw-r--r--src/kvirc/ui/kvi_ircview.cpp10
-rw-r--r--src/kvirc/ui/kvi_mdicaption.cpp262
-rw-r--r--src/kvirc/ui/kvi_mdicaption.h96
-rw-r--r--src/kvirc/ui/kvi_mdichild.cpp520
-rw-r--r--src/kvirc/ui/kvi_mdichild.h171
-rw-r--r--src/kvirc/ui/kvi_mdimanager.cpp846
-rw-r--r--src/kvirc/ui/kvi_mdimanager.h102
-rw-r--r--src/kvirc/ui/kvi_userlistview.cpp15
-rw-r--r--src/kvirc/ui/kvi_window.cpp37
-rw-r--r--src/kvirc/ui/kvi_window.h13
-rw-r--r--src/modules/about/ENTRIES14
-rw-r--r--src/modules/about/abouttext.inc38
16 files changed, 660 insertions, 1573 deletions
diff --git a/src/kvirc/CMakeLists.txt b/src/kvirc/CMakeLists.txt
index eabe41454..723109651 100644
--- a/src/kvirc/CMakeLists.txt
+++ b/src/kvirc/CMakeLists.txt
@@ -38,7 +38,6 @@ SET(kvirc_MOC_HDRS
ui/kvi_ircview.h
ui/kvi_ircviewtools.h
ui/kvi_maskeditor.h
- ui/kvi_mdicaption.h
ui/kvi_mdichild.h
ui/kvi_mdimanager.h
ui/kvi_menubar.h
@@ -118,7 +117,6 @@ SET(kvirc_SRCS
ui/kvi_ircview_loghandling.cpp
ui/kvi_ircviewtools.cpp
ui/kvi_maskeditor.cpp
- ui/kvi_mdicaption.cpp
ui/kvi_mdichild.cpp
ui/kvi_mdimanager.cpp
ui/kvi_menubar.cpp
diff --git a/src/kvirc/kernel/kvi_irccontext.cpp b/src/kvirc/kernel/kvi_irccontext.cpp
index 073786c3c..78a7246e6 100644
--- a/src/kvirc/kernel/kvi_irccontext.cpp
+++ b/src/kvirc/kernel/kvi_irccontext.cpp
@@ -158,8 +158,11 @@ void KviIrcContext::closeAllDeadChannels()
while(m_pDeadChannels)
{
KviChannel * c = m_pDeadChannels->first();
- if(c)m_pFrame->closeWindow(c);
- else {
+ if(c)
+ {
+ m_pFrame->closeWindow(c);
+ QApplication::processEvents(QEventLoop::ExcludeSocketNotifiers & QEventLoop::ExcludeUserInputEvents);
+ } else {
// ops....
delete m_pDeadChannels;
m_pDeadChannels = 0;
@@ -172,8 +175,11 @@ void KviIrcContext::closeAllDeadQueries()
while(m_pDeadQueries)
{
KviQuery * q = m_pDeadQueries->first();
- if(q)m_pFrame->closeWindow(q);
- else {
+ if(q)
+ {
+ m_pFrame->closeWindow(q);
+ QApplication::processEvents(QEventLoop::ExcludeSocketNotifiers & QEventLoop::ExcludeUserInputEvents);
+ } else {
// ops....
delete m_pDeadQueries;
m_pDeadQueries = 0;
@@ -186,8 +192,11 @@ void KviIrcContext::closeAllContextWindows()
while(m_pContextWindows)
{
KviWindow * w = m_pContextWindows->first();
- if(w)m_pFrame->closeWindow(w);
- else {
+ if(w)
+ {
+ m_pFrame->closeWindow(w);
+ QApplication::processEvents(QEventLoop::ExcludeSocketNotifiers & QEventLoop::ExcludeUserInputEvents);
+ } else {
// ops...
delete m_pContextWindows;
m_pContextWindows = 0;
diff --git a/src/kvirc/ui/kvi_frame.cpp b/src/kvirc/ui/kvi_frame.cpp
index a7b53b346..ca806fceb 100644
--- a/src/kvirc/ui/kvi_frame.cpp
+++ b/src/kvirc/ui/kvi_frame.cpp
@@ -113,8 +113,6 @@ KviFrame::KviFrame()
setUsesBigPixmaps(KVI_OPTION_BOOL(KviOption_boolUseBigIcons));
m_pMdi = new KviMdiManager(m_pSplitter,this,"mdi_manager");
- connect(m_pMdi,SIGNAL(enteredSdiMode()),this,SLOT(enteredSdiMode()));
- connect(m_pMdi,SIGNAL(leftSdiMode()),this,SLOT(leftSdiMode()));
// This theoretically had to exists before KviMdiManager (that uses enterSdiMode)
m_pMenuBar = new KviMenuBar(this,"main_menu_bar");
@@ -165,6 +163,8 @@ KviFrame::KviFrame()
installAccelerators(this);
layout()->setSizeConstraint(QLayout::SetNoConstraint);
+ connect(this, SIGNAL(signalDeleteWindow(KviWindow*)), this, SLOT(deleteWindow(KviWindow*)), Qt::QueuedConnection);
+ connect(this, SIGNAL(signalMaximizeMdiChildWindow(KviMdiChild*)), this, SLOT(maximizeMdiChildWindow(KviMdiChild*)), Qt::QueuedConnection);
}
KviFrame::~KviFrame()
@@ -222,7 +222,7 @@ KviFrame::~KviFrame()
g_pFrame = 0;
}
-int KviFrame::registerAccelerator(const QString &szKeySequence,QObject *,const char *)
+int KviFrame::registerAccelerator(const QString &szKeySequence,QObject * recv,const char * slot)
{
QShortcut *sc=new QShortcut(QKeySequence(szKeySequence),this);
connect(sc,SIGNAL(activated()),this,SLOT(accelActivated()));
@@ -548,9 +548,12 @@ void KviFrame::saveWindowProperties(KviWindow * wnd,const QString &szSection)
g_pWinPropertiesConfig->writeEntry("IsDocked",wnd->mdiParent());
-// KviWindow * top = g_pActiveWindow;
-// if(!top)top = wnd;
-// g_pWinPropertiesConfig->writeEntry("IsMaximized",top->isMaximized());
+ if (wnd->mdiParent())
+ {
+ g_pWinPropertiesConfig->writeEntry("IsMaximized",wnd->mdiParent()->isMaximized());
+ } else {
+ g_pWinPropertiesConfig->writeEntry("IsMaximized",wnd->isMaximized());
+ }
g_pWinPropertiesConfig->writeEntry("WinRect",wnd->externalGeometry());
@@ -613,13 +616,22 @@ void KviFrame::closeWindow(KviWindow *wnd)
// and shut it down...
// KviWindow will call childWindowDestroyed() here
- if(wnd->mdiParent()) {
+ if(wnd->mdiParent())
+ {
m_pMdi->destroyChild(wnd->mdiParent(),true);
- } else {
- delete wnd;
}
+ emit signalDeleteWindow(wnd);
}
+void KviFrame::deleteWindow(KviWindow * wnd)
+{
+ delete wnd;
+}
+
+void KviFrame::maximizeMdiChildWindow(KviMdiChild * lpC)
+{
+ lpC->maximize();
+}
void KviFrame::addWindow(KviWindow *wnd,bool bShow)
{
@@ -652,14 +664,7 @@ void KviFrame::addWindow(KviWindow *wnd,bool bShow)
if(KVI_OPTION_BOOL(KviOption_boolWindowsRememberProperties))
{
bool bDocked = g_pWinPropertiesConfig->readBoolEntry("IsDocked",true);
- //bool bMaximized = g_pWinPropertiesConfig->readBoolEntry("IsMaximized",false);
- bool bMaximized;
-
- if(KVI_OPTION_BOOL(KviOption_boolMdiManagerInSdiMode))
- {
- bMaximized = true;
- //KVI_OPTION_BOOL(KviOption_boolMdiManagerInSdiMode) = false;
- } else bMaximized = false;
+ bool bMaximized = g_pWinPropertiesConfig->readBoolEntry("IsMaximized",false);
QRect rect = g_pWinPropertiesConfig->readRectEntry("WinRect",QRect(10,10,500,380));
@@ -673,12 +678,14 @@ void KviFrame::addWindow(KviWindow *wnd,bool bShow)
wnd->triggerCreationEvents();
if(bShow)
{
+ if(bMaximized) emit signalMaximizeMdiChildWindow(lpC);
+
m_pMdi->showAndActivate(lpC);
- if(bMaximized)wnd->maximize();
+
// Handle the special case of this top level widget not being the active one.
// In this situation the child will not get the focusInEvent
// and thus will not call out childWindowActivated() method
- if(!isActiveWindow())childWindowActivated(wnd);
+ if(!isActiveWindow()) childWindowActivated(wnd);
}
} else {
wnd->setGeometry(rect);
@@ -722,14 +729,17 @@ docking_done:
}
}
-KviMdiChild * KviFrame::dockWindow(KviWindow *wnd,bool bShow,bool bCascade,QRect *setGeom)
+KviMdiChild * KviFrame::dockWindow(KviWindow * wnd, bool bShow, bool bCascade, QRect * setGeom)
{
if(wnd->mdiParent())return wnd->mdiParent();
KviMdiChild * lpC = new KviMdiChild(m_pMdi,"");
lpC->setClient(wnd);
+ lpC->setGeometry(wnd->geometry());
+
wnd->youAreDocked();
m_pMdi->manageChild(lpC,bCascade,setGeom);
- if(bShow)m_pMdi->showAndActivate(lpC);
+ if(bShow) m_pMdi->showAndActivate(lpC);
+
return lpC;
}
@@ -739,6 +749,7 @@ void KviFrame::undockWindow(KviWindow *wnd)
KviMdiChild * lpC = wnd->mdiParent();
lpC->unsetClient();
m_pMdi->destroyChild(lpC,false);
+ wnd->show();
wnd->youAreUndocked();
wnd->raise();
wnd->setFocus();
@@ -927,16 +938,6 @@ void KviFrame::windowActivationChange(bool bOldActive)
}
}
-void KviFrame::enteredSdiMode()
-{
- updateCaption();
-}
-
-void KviFrame::leftSdiMode()
-{
- updateCaption();
-}
-
#define KVI_DEFAULT_FRAME_CAPTION "KVIrc " KVI_VERSION " " KVI_RELEASE_NAME
void KviFrame::updateCaption()
@@ -1331,3 +1332,4 @@ void KviFrame::hideEvent ( QHideEvent * e)
#ifndef COMPILE_USE_STANDALONE_MOC_SOURCES
#include "kvi_frame.moc"
#endif //!COMPILE_USE_STANDALONE_MOC_SOURCES
+
diff --git a/src/kvirc/ui/kvi_frame.h b/src/kvirc/ui/kvi_frame.h
index fb3ddd73f..dd9c3c941 100644
--- a/src/kvirc/ui/kvi_frame.h
+++ b/src/kvirc/ui/kvi_frame.h
@@ -70,7 +70,7 @@ public:
public:
void setPrevWindowState(Qt::WindowStates state) { m_uStoredWindowState = state; };
Qt::WindowStates getPrevWindowState() { return m_uStoredWindowState; };
-
+
virtual void refresh(){};
virtual void die(){ delete this; };
};
@@ -184,16 +184,16 @@ protected:
void createWindowList();
void recreateWindowList();
-
+
KviMdiChild * dockWindow(KviWindow *wnd,bool bShow = true,bool bCascade = true,QRect * setGeom = 0);
void undockWindow(KviWindow *wnd);
-
+
void closeWindow(KviWindow *wnd);
-
+
// called by KviWindow
void childWindowCloseRequest(KviWindow *wnd);
void childWindowActivated(KviWindow *wnd);
-
+
void childContextStateChange(KviIrcContext * c);
void childConnectionNickNameChange(KviIrcConnection * c);
void childConnectionAwayStateChange(KviIrcConnection * c);
@@ -201,7 +201,7 @@ protected:
void childConnectionLagChange(KviIrcConnection * c);
void childConnectionServerInfoChange(KviIrcConnection * c);
void childWindowSelectionStateChange(KviWindow * pWnd,bool bGotSelectionNow);
-
+
virtual void closeEvent(QCloseEvent *e);
virtual void resizeEvent(QResizeEvent *e);
virtual void moveEvent(QMoveEvent *e);
@@ -211,21 +211,21 @@ protected:
void updatePseudoTransparency();
KviAccel * installAccelerators(QWidget * wnd);
-
+
virtual void hideEvent ( QHideEvent * e);
protected slots:
void switchToNextWindow();
void switchToPrevWindow();
void switchToNextWindowInContext();
void switchToPrevWindowInContext();
-
+
void maximizeWindow();
void minimizeWindow();
void accelActivated();
- void enteredSdiMode();
- void leftSdiMode();
void toolbarsPopupSelected(int id);
+ void deleteWindow(KviWindow * wnd);
+ void maximizeMdiChildWindow(KviMdiChild * lpC);
signals:
void activeWindowChanged(); // almost never 0.. but may be
void activeContextChanged(); // may be 0!
@@ -236,6 +236,8 @@ signals:
void activeConnectionServerInfoChanged();
void activeConnectionLagChanged();
void activeWindowSelectionStateChanged(bool bGotSelectionNow);
+ void signalDeleteWindow(KviWindow * wnd);
+ void signalMaximizeMdiChildWindow(KviMdiChild * lpC);
protected:
void applyOptions();
private:
diff --git a/src/kvirc/ui/kvi_ircview.cpp b/src/kvirc/ui/kvi_ircview.cpp
index fca434b70..eefb86ca1 100644
--- a/src/kvirc/ui/kvi_ircview.cpp
+++ b/src/kvirc/ui/kvi_ircview.cpp
@@ -981,16 +981,6 @@ void KviIrcView::paintEvent(QPaintEvent *p)
return; //can't show stuff here
}
- // if the mdiManager is in SDI mode and this window is attacched but is not the toplevel one
- // then it is hidden completely behind the other windows and we can avoid to paint it :)
- if(g_pFrame->mdiManager()->isInSDIMode() &&
- (m_pKviWindow->mdiParent() != g_pFrame->mdiManager()->topChild()) &&
- (m_pKviWindow->mdiParent()))
- {
- m_iUnprocessedPaintEventRequests = 0; // assume a full repaint when this widget is shown...
- return; // totally hidden behind other windows
- }
-
int widgetHeight = height();
static QRect r; // static: avoid calling constructor and destructor every time...
diff --git a/src/kvirc/ui/kvi_mdicaption.cpp b/src/kvirc/ui/kvi_mdicaption.cpp
deleted file mode 100644
index 2bb66a2c3..000000000
--- a/src/kvirc/ui/kvi_mdicaption.cpp
+++ /dev/null
@@ -1,262 +0,0 @@
-//=============================================================================
-//
-// File : kvi_mdicaption.cpp
-// Creation date : Tue Sep 2 2003 02:35:45 by Szymon Stefanek
-//
-// This file is part of the KVirc irc client distribution
-// Copyright (C) 2003-2008 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-//=============================================================================
-
-
-
-#define _KVI_DEBUG_CHECK_RANGE_
-#include "kvi_debug.h"
-#include "kvi_mdichild.h"
-#include "kvi_mdimanager.h"
-#include "kvi_string.h"
-#include "kvi_locale.h"
-#include "kvi_options.h"
-#include "kvi_settings.h"
-#include "kvi_iconmanager.h"
-#include "kvi_window.h"
-#include "kvi_mdicaption.h"
-#include "kvi_pointerlist.h"
-#include "kvi_tal_popupmenu.h"
-
-#include <QCursor>
-#include <QApplication>
-#include <QFontMetrics>
-#include <QPixmap>
-#include <QStyle>
-#include <QPainter>
-//#include <QDrawUtil>
-#include <QEvent>
-#include <QPaintEvent>
-#include <QStyleOption>
-#include <QTextDocument>
-
-KviMdiCaptionButton::KviMdiCaptionButton(const QPixmap &pix,QWidget * parent,const char * name)
-: QToolButton(parent)
-{
- setObjectName(name);
- setIcon(QIcon(pix));
- //setAutoRaise(true);
- setMinimumSize(18,18);
-}
-
-KviMdiCaptionButton::~KviMdiCaptionButton()
-{
-}
-
-void KviMdiCaptionButton::paintEvent(QPaintEvent *)
-{
- QPainter painter(this);
- drawButton(&painter);
-}
-
-void KviMdiCaptionButton::drawButton(QPainter *p)
-{
- QBrush b(parentWidget()->palette().window());
-
- if(isDown())
- qDrawShadePanel(p,0,0,width(),height(),palette(),true,1,&b);
- else
- p->fillRect(0,0,width(),height(),b);
-
- int x = (width() - 16) / 2;
- int y = (width() - 16) / 2;
- p->drawPixmap(x,y,16,16,icon().pixmap(16,16),0,0,16,16);
-}
-
-
-KviMdiCaption::KviMdiCaption(KviMdiChild * parent,const char * name)
-: QWidget(parent)
-{
- setObjectName(name);
- m_pMaximizeButton = new KviMdiCaptionButton(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MAXIMIZE)),this,"maximize_button");
- connect(m_pMaximizeButton,SIGNAL(clicked()),parent,SLOT(maximize()));
- m_pMinimizeButton = new KviMdiCaptionButton(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINIMIZE)),this,"minimize_button");
- connect(m_pMinimizeButton,SIGNAL(clicked()),parent,SLOT(minimize()));
- m_pCloseButton = new KviMdiCaptionButton(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CLOSE)),this,"close_button");
- connect(m_pCloseButton,SIGNAL(clicked()),parent,SLOT(closeRequest()));
- m_pSystemButton = new KviMdiCaptionButton(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DEFAULTICON)),this,"icon_button");
- connect(m_pSystemButton,SIGNAL(clicked()),parent,SLOT(systemPopupSlot()));
-
- m_lastMousePos = QPoint(-1,-1);
- m_bMouseGrabbed = true;
- m_bActive = false;
- calcLineSpacing();
- setAutoFillBackground(false);
-}
-
-KviMdiCaption::~KviMdiCaption()
-{
-}
-
-void KviMdiCaption::reloadImages()
-{
- m_pMaximizeButton->setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MAXIMIZE)));
- m_pMinimizeButton->setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINIMIZE)));
- m_pCloseButton->setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CLOSE)));
-}
-
-void KviMdiCaption::calcLineSpacing()
-{
- QFontMetrics fm(font());
- m_iLineSpacing = fm.lineSpacing() + 3;
- if(m_iLineSpacing < 20)m_iLineSpacing = 20;
-}
-
-int KviMdiCaption::heightHint()
-{
- return m_iLineSpacing;
-}
-
-void KviMdiCaption::setActive(bool bActive)
-{
- m_bActive = bActive;
-
- QPalette pal(Qt::white,m_bActive ? KVI_OPTION_COLOR(KviOption_colorMdiCaptionActive) : KVI_OPTION_COLOR(KviOption_colorMdiCaptionInactive));
- setPalette(pal);
- //update();
- m_pSystemButton->update();
- m_pCloseButton->update();
- m_pMinimizeButton->update();
- m_pMaximizeButton->update();
-}
-
-void KviMdiCaption::fontChange(const QFont &old)
-{
- calcLineSpacing();
- QWidget::fontChange(old);
- ((KviMdiChild *)parent())->resizeEvent(0);
-}
-
-void KviMdiCaption::mousePressEvent(QMouseEvent *)
-{
- m_bMouseGrabbed = true;
- m_lastMousePos = QCursor::pos();
- setCursor(Qt::SizeAllCursor);
- ((KviMdiChild *)parent())->activate(true);
-}
-
-void KviMdiCaption::mouseMoveEvent(QMouseEvent *)
-{
- if(m_bMouseGrabbed)
- {
- QPoint p = QCursor::pos();
- int dx = m_lastMousePos.x() - p.x();
- int dy = m_lastMousePos.y() - p.y();
- KviMdiChild * c = (KviMdiChild *)parent();
-
- int nx = c->manager()->childX(c) - dx;
- int ny = c->manager()->childY(c) - dy;
-
- if((nx < 0) || (ny < 0))
- {
- int cx = p.x();
- int cy = p.y();
- if(nx < 0)
- {
- cx -= nx;
- nx = 0;
- }
- if(ny < 0)
- {
- cy -= ny;
- ny = 0;
- }
-
- QCursor::setPos(cx,cy);
- m_lastMousePos = QPoint(cx,cy);
- } else {
- m_lastMousePos = p;
- }
-
- c->manager()->moveChild(c,nx,ny);
- c->manager()->childMoved(c);
- }
-}
-
-void KviMdiCaption::mouseDoubleClickEvent(QMouseEvent *)
-{
- ((KviMdiChild *)parent())->maximize();
-}
-
-void KviMdiCaption::paintEvent(QPaintEvent * e)
-{
- QRect r = e->rect();
- QPainter p(this);
- p.fillRect(r,m_bActive ? KVI_OPTION_COLOR(KviOption_colorMdiCaptionActive) : KVI_OPTION_COLOR(KviOption_colorMdiCaptionInactive));
- QString text;
- if (m_bActive)text=((KviMdiChild *)parent())->xmlActiveCaption();
- else text=((KviMdiChild *)parent())->xmlInactiveCaption();
-
- QTextDocument doc;
- p.translate(16,0);
- doc.setHtml(text);
- doc.setDefaultFont(font());
- doc.drawContents(&p);
-}
-
-void KviMdiCaption::mouseReleaseEvent(QMouseEvent *)
-{
- m_bMouseGrabbed = false;
- setCursor(Qt::ArrowCursor);
-// releaseMouse();
-}
-
-void KviMdiCaption::setFocusProxy(QWidget * w)
-{
- QWidget::setFocusProxy(w);
- m_pSystemButton->setFocusProxy(w);
- m_pMinimizeButton->setFocusProxy(w);
- m_pMaximizeButton->setFocusProxy(w);
- m_pCloseButton->setFocusProxy(w);
-}
-
-void KviMdiCaption::resizeEvent(QResizeEvent *)
-{
- int s = height() - 2;
- m_pSystemButton->setGeometry(1,1,s,s);
- m_pCloseButton->setGeometry(width() - (s + 1),
- 1,s,s);
- m_pMaximizeButton->setGeometry(width() - ((s << 1) + 2),
- 1,s,s);
- m_pMinimizeButton->setGeometry(width() - ((s * 3) + 3),
- 1,s,s);
-}
-
-
-
-KviMenuBarToolButton::KviMenuBarToolButton(QWidget * par,const QPixmap &img, const char * name)
-: QToolButton(par)
-{
- setProperty("name",name);
- setIcon(img);
- setAutoRaise(true);
-}
-
-KviMenuBarToolButton::~KviMenuBarToolButton()
-{
-}
-
-QSize KviMenuBarToolButton::sizeHint() const
-{
- return QSize(20,20);
-}
diff --git a/src/kvirc/ui/kvi_mdicaption.h b/src/kvirc/ui/kvi_mdicaption.h
deleted file mode 100644
index bc3713e80..000000000
--- a/src/kvirc/ui/kvi_mdicaption.h
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef _KVI_MDICAPTION_H_
-#define _KVI_MDICAPTION_H_
-//=============================================================================
-//
-// File : kvi_mdicaption.h
-// Creation date : Tue Sep 2 2003 02:35:45 by Szymon Stefanek
-//
-// This file is part of the KVirc irc client distribution
-// Copyright (C) 2003-2008 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-//=============================================================================
-
-#include "kvi_settings.h"
-#include <QLabel>
-#include <QToolButton>
-
-class KviMdiManager;
-class KviMdiChild;
-
-class KVIRC_API KviMdiCaptionButton : public QToolButton
-{
- Q_OBJECT
-public:
- KviMdiCaptionButton(const QPixmap &pix,QWidget * parent,const char * name);
- ~KviMdiCaptionButton();
-protected:
- virtual void drawButton(QPainter * p);
- virtual void paintEvent(QPaintEvent *e);
-};
-
-
-class KviMenuBarToolButton : public QToolButton
-{
- Q_OBJECT
-public:
- KviMenuBarToolButton(QWidget * par,const QPixmap &img, const char * name);
- ~KviMenuBarToolButton();
-public:
- virtual QSize sizeHint() const;
-};
-
-
-class KVIRC_API KviMdiCaption : public QWidget
-{
- friend class KviMdiChild;
- Q_OBJECT
-public:
- KviMdiCaption(KviMdiChild * parent,const char * name);
- ~KviMdiCaption();
-protected:
- QPoint m_lastMousePos;
- bool m_bMouseGrabbed;
- int m_iLineSpacing;
- bool m_bActive;
- KviMdiCaptionButton * m_pSystemButton;
- KviMdiCaptionButton * m_pMinimizeButton;
- KviMdiCaptionButton * m_pMaximizeButton;
- KviMdiCaptionButton * m_pCloseButton;
- QPixmap m_pixSystemIcon;
-public:
- int heightHint();
- void setActive(bool bActive);
- bool active(){ return m_bActive; };
- void setSystemIcon(const QPixmap &pix){ m_pSystemButton->setIcon(QIcon(pix)); m_pixSystemIcon = pix; };
- const QPixmap * systemIcon(){ return &m_pixSystemIcon; };
- void enableClose(bool bEnable){ m_pCloseButton->setEnabled(bEnable); };
- bool closeEnabled(){ return m_pCloseButton->isEnabled(); };
- virtual void setFocusProxy(QWidget * w);
-protected:
- void calcLineSpacing();
- virtual void fontChange(const QFont &old);
- virtual void mousePressEvent(QMouseEvent *e);
- virtual void mouseDoubleClickEvent(QMouseEvent *e);
- virtual void mouseMoveEvent(QMouseEvent *e);
- virtual void mouseReleaseEvent(QMouseEvent *e);
- virtual void paintEvent(QPaintEvent * e);
- virtual void resizeEvent(QResizeEvent * e);
- void reloadImages();
-};
-
-
-#endif //_KVI_MDICAPTION_H_
diff --git a/src/kvirc/ui/kvi_mdichild.cpp b/src/kvirc/ui/kvi_mdichild.cpp
index 779ddb042..6014c1fea 100644
--- a/src/kvirc/ui/kvi_mdichild.cpp
+++ b/src/kvirc/ui/kvi_mdichild.cpp
@@ -22,6 +22,10 @@
//
//=============================================================================
+/**
+* \file kvi_mdichild.cpp
+* \brief MDI subwindow stuff
+*/
#define _KVI_DEBUG_CHECK_RANGE_
#include "kvi_debug.h"
@@ -33,7 +37,6 @@
#include "kvi_settings.h"
#include "kvi_iconmanager.h"
#include "kvi_window.h"
-#include "kvi_mdicaption.h"
#include "kvi_pointerlist.h"
#include "kvi_tal_popupmenu.h"
@@ -43,9 +46,9 @@
#include <QPixmap>
#include <QStyle>
#include <QPainter>
-//#include <qobjectlist.h>
#include <QEvent>
#include <QMouseEvent>
+#include <QBoxLayout>
#ifdef COMPILE_ON_MAC
#include "kvi_app.h" //Needed for g_pApp
@@ -68,82 +71,82 @@
#define KVI_MDI_RESIZE_BOTTOMRIGHT (8|4)
-KviMdiChild::KviMdiChild(KviMdiManager * par,const char * name)
-: QFrame(par->viewport())
+KviMdiChild::KviMdiChild(KviMdiManager * par, const char * name)
+: QMdiSubWindow()
{
setObjectName(name ? name : "mdi_child");
- setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
- setFrameShape(NoFrame);
- m_pManager = par;
- m_pCaption = new KviMdiCaption(this,"mdi_caption");
+ m_pManager = par;
- m_bResizeMode = false;
- m_iResizeCorner = KVI_MDI_NORESIZE;
- m_iLastCursorCorner = KVI_MDI_NORESIZE;
+ m_pClient = 0;
- m_pClient = 0;
- m_state = Normal;
- m_restoredGeometry = QRect(10,10,100,100);
+ connect(this, SIGNAL(windowStateChanged(Qt::WindowStates,Qt::WindowStates)), this, SLOT(windowStateChangedEvent(Qt::WindowStates,Qt::WindowStates)));
+ connect(this, SIGNAL(minimizeSignal()), this, SLOT(minimize()), Qt::QueuedConnection);
+ connect(this, SIGNAL(restoreSignal()), this, SLOT(restore()), Qt::QueuedConnection);
+ connect(this, SIGNAL(maximizeSignal()), this, SLOT(maximize()), Qt::QueuedConnection);
- setMouseTracking(true);
+ m_restoredGeometry = QRect(10,10,320,240);
setMinimumSize(KVI_MDICHILD_MIN_WIDTH,KVI_MDICHILD_MIN_HEIGHT);
+ m_bCloseEnabled = true;
+ m_State = Normal;
+
+ connect(systemMenu(), SIGNAL(aboutToShow()), this, SLOT(updateSystemPopup()));
setAutoFillBackground(true);
}
+void KviMdiChild::setRestoredGeometry(const QRect &r)
+{
+ m_restoredGeometry = r;
+ setGeometry(r);
+}
+
KviMdiChild::~KviMdiChild()
{
- if(m_pClient)delete m_pClient;
+ if(m_pClient) delete m_pClient;
}
-void KviMdiChild::reloadImages()
+void KviMdiChild::closeEvent(QCloseEvent * e)
{
- m_pCaption->reloadImages();
+ widget()->close();
+ e->ignore();
}
QRect KviMdiChild::restoredGeometry()
{
- if(m_state == Maximized)return m_restoredGeometry;
- else return QRect(x(),y(),width(),height());
-// else return geometry();
+ return geometry();
+}
+KviMdiChild::MdiChildState KviMdiChild::state()
+{
+ return m_State;
}
void KviMdiChild::setBackgroundRole(QPalette::ColorRole)
{
// hack
- QFrame::setBackgroundRole(QPalette::Window);
+ //QFrame::setBackgroundRole(QPalette::Window);
}
-void KviMdiChild::setIcon(const QPixmap &pix)
+void KviMdiChild::setIcon(QPixmap pix)
{
- m_pCaption->setSystemIcon(pix);
-
- if((m_state == Maximized) && (m_pManager->topChild() == this))
- {
- m_pManager->updateSDIMode();
- }
+ m_pIcon = pix;
+ QMdiSubWindow::setWindowIcon(QIcon(pix));
}
const QPixmap * KviMdiChild::icon()
{
- return m_pCaption->systemIcon();
+ return &m_pIcon;
}
void KviMdiChild::enableClose(bool bEnable)
{
- m_pCaption->enableClose(bEnable);
- if((m_state == Maximized) && (m_pManager->topChild() == this))
- {
- m_pManager->updateSDIMode();
- }
-
+ m_bCloseEnabled = bEnable;
}
bool KviMdiChild::closeEnabled()
{
- return m_pCaption->closeEnabled();
+ return m_bCloseEnabled;
}
void KviMdiChild::setWindowTitle(const QString & plain,const QString & xmlActive,const QString & xmlInactive)
@@ -151,51 +154,109 @@ void KviMdiChild::setWindowTitle(const QString & plain,const QString & xmlActive
m_szPlainCaption = plain;
m_szXmlActiveCaption = xmlActive;
m_szXmlInactiveCaption = xmlInactive;
- //m_pCaptionLabel->setActive(m_pCaptionLabel->active());
- m_pCaption->update();
+ QMdiSubWindow::setWindowTitle(plain);
}
-void KviMdiChild::maximize()
+void KviMdiChild::windowStateChangedEvent( Qt::WindowStates oldState, Qt::WindowStates newState )
{
- if(m_state == Minimized)restore(); // restore first
- if(m_state == Normal)m_restoredGeometry = geometry();
- m_state = Maximized;
- manager()->maximizeChild(this);
+ // check if window has been minmized
+ if (!(oldState & Qt::WindowMinimized) && (newState & Qt::WindowMinimized))
+ {
+ m_LastState = m_State;
+ m_State = Minimized;
+ // notify KviMdiManager
+ m_pManager->childMinimized(this,true);
+ // call the queued event since we can't change state while being in another event
+ emit minimizeSignal();
+ // update channelist caption
+ updateCaption();
+ return;
+ }
+
+ // check if window has been maximized
+ if (!(oldState & Qt::WindowMaximized) && newState & Qt::WindowMaximized)
+ {
+ m_LastState = m_State;
+ m_State = Maximized;
+
+ m_pManager->childMaximized(this);
+ // update channelist caption
+ updateCaption();
+ return;
+ }
+
+ if ((oldState & Qt::WindowMaximized) && !(newState & Qt::WindowMaximized))
+ {
+ m_LastState = m_State;
+ m_State = Normal;
+ m_pManager->childRestored(this,true);
+ // update channelist caption
+ updateCaption();
+ return;
+ }
+
+ if ((oldState & Qt::WindowMinimized) && !(newState & Qt::WindowMinimized))
+ {
+ m_LastState = m_State;
+ m_State = Normal;
+ // notify KviMdiManager
+ m_pManager->childRestored(this,true);
+ // update channelist caption
+ updateCaption();
+ return;
+ }
}
-void KviMdiChild::restore()
+void KviMdiChild::queuedMinimize()
{
- if(m_restoredGeometry.x() < 0)m_restoredGeometry.setX(0);
- if(m_restoredGeometry.y() < 0)m_restoredGeometry.setY(0);
- // ensure coherency
- if(m_restoredGeometry.width() < 5)m_restoredGeometry.setWidth(5);
- if(m_restoredGeometry.height() < 5)m_restoredGeometry.setHeight(5);
+ emit minimizeSignal();
+}
+
+void KviMdiChild::queuedRestore()
+{
+ emit restoreSignal();
+}
+
+void KviMdiChild::queuedMaximize()
+{
+ emit maximizeSignal();
+}
+
+void KviMdiChild::maximize()
+{
+ m_LastState = m_State;
+ m_State = Maximized;
- /*
- if((m_restoredGeometry.x() + m_restoredGeometry.width()) > m_pManager->width())
- m_restoredGeometry.setWidth(m_pManager->width() - m_restoredGeometry.x());
- if((m_restoredGeometry.y() + m_restoredGeometry.height()) > m_pManager->height())
- m_restoredGeometry.setHeight(m_pManager->height() - m_restoredGeometry.y());
- */
+ showMaximized();
+ m_pManager->childMaximized(this);
+
+ updateCaption();
+}
- switch(m_state)
+void KviMdiChild::restore()
+{
+ switch(state())
{
case Maximized:
- m_pManager->moveChild(this,m_restoredGeometry.x(),m_restoredGeometry.y());
- resize(m_restoredGeometry.width(),m_restoredGeometry.height());
- m_state = Normal;
+ m_State = Normal;
+ showNormal();
m_pManager->childRestored(this,true);
break;
case Minimized:
- m_pManager->moveChild(this,m_restoredGeometry.x(),m_restoredGeometry.y());
- resize(m_restoredGeometry.width(),m_restoredGeometry.height());
- show();
- m_state = Normal;
+ m_State = Normal;
+ if (m_LastState == Normal)
+ {
+ showNormal();
+ } else maximize();
+ updateCaption();
m_pManager->childRestored(this,false);
break;
case Normal:
- m_state = Normal;
- if(!isVisible())show();
+ m_State = Normal;
+ if(!isVisible())
+ {
+ show();
+ }
return;
break;
}
@@ -203,45 +264,39 @@ void KviMdiChild::restore()
void KviMdiChild::minimize()
{
- switch(m_state)
+ m_LastState = m_State;
+ switch(state())
{
case Maximized:
+ m_State = Minimized;
hide();
- m_state = Minimized;
m_pManager->childMinimized(this,true);
break;
case Normal:
- m_restoredGeometry = geometry();
+ m_State = Minimized;
hide();
- m_state = Minimized;
m_pManager->childMinimized(this,false);
break;
case Minimized:
- m_state = Minimized;
- if(isVisible())hide();
+ m_State = Minimized;
+ if(isVisible())
+ {
+ hide();
+ }
return;
break;
}
+ updateCaption();
}
-void KviMdiChild::closeRequest()
-{
- if(closeEnabled())if(m_pClient)m_pClient->close();
-}
-/*
-void KviMdiChild::systemPopupAboutToShow()
+void KviMdiChild::updateCaption()
{
- m_pSystemPopup->clear();
- if(m_state != Maximized)m_pSystemPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MAXIMIZE)),__tr("&Maximize"),this,SLOT(maximize()));
- if(m_state != Minimized)m_pSystemPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINIMIZE)),__tr("M&inimize"),this,SLOT(minimize()));
- if(m_state != Normal)m_pSystemPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_RESTORE)),__tr("&Restore"),this,SLOT(restore()));
- if(closeEnabled())
+ if (m_pClient && m_pClient->inherits("KviWindow"))
{
- m_pSystemPopup->insertSeparator();
- m_pSystemPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CLOSE)),__tr("&Close"),this,SLOT(closeRequest()));
+ ((KviWindow*)m_pClient)->updateCaptionListItem();
}
}
-*/
+
void KviMdiChild::moveEvent(QMoveEvent *e)
{
#ifdef COMPILE_PSEUDO_TRANSPARENCY
@@ -253,292 +308,37 @@ void KviMdiChild::moveEvent(QMoveEvent *e)
}
}
#endif
- QFrame::moveEvent(e);
+ QMdiSubWindow::moveEvent(e);
}
void KviMdiChild::systemPopupSlot()
{
-/*
- if(sender()->inherits("QToolButton"))
- {
- emit systemPopupRequest(((QToolButton *)sender())->mapToGlobal(QPoint(0,((QToolButton *)sender())->height())));
- } else {
-*/
- emit systemPopupRequest(m_pCaption->mapToGlobal(QPoint(5,5)));
-// }
-}
-
-void KviMdiChild::resizeEvent(QResizeEvent *e)
-{
- //debug("Resize mdi child");
- int s = m_pCaption->heightHint();
- m_pCaption->setGeometry(KVI_MDICHILD_BORDER,KVI_MDICHILD_BORDER,
- width() - (KVI_MDICHILD_BORDER << 1),s);
-
- if(m_pClient)
- {
- int yPos = KVI_MDICHILD_BORDER + s + KVI_MDICHILD_SPACING;
- m_pClient->setGeometry(KVI_MDICHILD_BORDER,yPos,
- width() - (KVI_MDICHILD_BORDER << 1),height() - (yPos + KVI_MDICHILD_BORDER));
- }
- QFrame::resizeEvent(e);
-}
-
-void KviMdiChild::mousePressEvent(QMouseEvent *e)
-{
- if(m_state == Maximized)return;
- m_iResizeCorner=getResizeCorner(e->pos().x(),e->pos().y());
- if(m_iResizeCorner != KVI_MDI_NORESIZE)
- {
- grabMouse(getResizeCursor(m_iResizeCorner));
- m_bResizeMode = true;
- }
-}
-
-void KviMdiChild::mouseReleaseEvent(QMouseEvent *)
-{
- m_iResizeCorner=KVI_MDI_NORESIZE;
- m_iLastCursorCorner=KVI_MDI_NORESIZE;
-
- if(m_bResizeMode)
- {
- m_bResizeMode = false;
- releaseMouse();
- }
-
- //if(QApplication::overrideCursor())QApplication::restoreOverrideCursor();
-}
-
-QCursor KviMdiChild::getResizeCursor(int resizeCorner)
-{
- switch (resizeCorner)
- {
- case KVI_MDI_RESIZE_LEFT:
- case KVI_MDI_RESIZE_RIGHT:
- return Qt::SizeHorCursor;
- break;
- case KVI_MDI_RESIZE_TOP:
- case KVI_MDI_RESIZE_BOTTOM:
- return Qt::SizeVerCursor;
- break;
- case KVI_MDI_RESIZE_TOPLEFT:
- case KVI_MDI_RESIZE_BOTTOMRIGHT:
- return Qt::SizeFDiagCursor;
- break;
- case KVI_MDI_RESIZE_BOTTOMLEFT:
- case KVI_MDI_RESIZE_TOPRIGHT:
- return Qt::SizeBDiagCursor;
- break;
- default:
- return Qt::ArrowCursor;
- break;
- }
-}
-
-void KviMdiChild::mouseMoveEvent(QMouseEvent *e)
-{
- if(e->modifiers() & Qt::LeftButton)
- {
- if(m_iResizeCorner && (m_state != Maximized))resizeWindowOpaque(m_iResizeCorner);
- } else {
- setResizeCursor(getResizeCorner(e->pos().x(), e->pos().y()));
- }
-}
-
-void KviMdiChild::setResizeCursor(int resizeCorner)
-{
- if(resizeCorner == m_iLastCursorCorner)
- return; //Don't do it twice
- m_iLastCursorCorner = resizeCorner;
- if(resizeCorner == KVI_MDI_NORESIZE)
- {
- setCursor(getResizeCursor(resizeCorner));
- //if(QApplication::overrideCursor())QApplication::restoreOverrideCursor();
- } else {
- if(m_state != Maximized)
- {
- setCursor(getResizeCursor(resizeCorner));
- //QApplication::setOverrideCursor(getResizeCursor(resizeCorner),true);
- }
- }
-}
-
-void KviMdiChild::leaveEvent(QEvent *)
-{
- if(!m_bResizeMode)
- {
- m_iResizeCorner=KVI_MDI_NORESIZE;
- m_iLastCursorCorner=KVI_MDI_NORESIZE;
- //if(QApplication::overrideCursor())QApplication::restoreOverrideCursor();
- } else {
- if(m_iResizeCorner != KVI_MDI_NORESIZE)resizeWindowOpaque(m_iResizeCorner);
- }
-}
-
-void KviMdiChild::calculateResizeRect(int resizeCorner,QPoint mousePos,QRect &resizeRect,int minWidth,int minHeight)
-{
- switch(resizeCorner)
- {
- case KVI_MDI_RESIZE_LEFT:
- resizeRect.setLeft(mousePos.x() - 1);
- if(resizeRect.width() < minWidth)resizeRect.setLeft(resizeRect.right() - minWidth);
- if(resizeRect.x() < 0)resizeRect.setX(0);
- break;
- case KVI_MDI_RESIZE_RIGHT:
- resizeRect.setRight(mousePos.x() + 1);
- if(resizeRect.width() < minWidth)resizeRect.setRight(resizeRect.left() + minWidth);
- break;
- case KVI_MDI_RESIZE_TOP:
- resizeRect.setTop(mousePos.y() - 1);
- if(resizeRect.height() < minHeight)resizeRect.setTop(resizeRect.bottom() - minHeight);
- if(resizeRect.y() < 0)resizeRect.setY(0);
- break;
- case KVI_MDI_RESIZE_BOTTOM:
- resizeRect.setBottom(mousePos.y() + 1);
- if(resizeRect.height() < minHeight)resizeRect.setBottom(resizeRect.top() + minHeight);
- break;
- case KVI_MDI_RESIZE_BOTTOMRIGHT:
- resizeRect.setBottom(mousePos.y() + 1);
- if(resizeRect.height() < minHeight)resizeRect.setBottom(resizeRect.top() + minHeight);
- resizeRect.setRight(mousePos.x() + 1);
- if(resizeRect.width() < minWidth)resizeRect.setRight(resizeRect.left() + minWidth);
- break;
- case KVI_MDI_RESIZE_TOPRIGHT:
- resizeRect.setTop(mousePos.y() - 1);
- if(resizeRect.height() < minHeight)resizeRect.setTop(resizeRect.bottom() - minHeight);
- if(resizeRect.y() < 0)resizeRect.setY(0);
- resizeRect.setRight(mousePos.x() + 1);
- if(resizeRect.width() < minWidth)resizeRect.setRight(resizeRect.left() + minWidth);
- break;
- case KVI_MDI_RESIZE_BOTTOMLEFT:
- resizeRect.setBottom(mousePos.y() + 1);
- if(resizeRect.height() < minHeight)resizeRect.setBottom(resizeRect.top() + minHeight);
- resizeRect.setLeft(mousePos.x() - 1);
- if(resizeRect.width() < minWidth)resizeRect.setLeft(resizeRect.right() - minWidth);
- if(resizeRect.x() < 0)resizeRect.setX(0);
- break;
- case KVI_MDI_RESIZE_TOPLEFT:
- resizeRect.setTop(mousePos.y() - 1);
- if(resizeRect.height() < minHeight)resizeRect.setTop(resizeRect.bottom() - minHeight);
- if(resizeRect.y() < 0)resizeRect.setY(0);
- resizeRect.setLeft(mousePos.x() - 1);
- if(resizeRect.width() < minWidth)resizeRect.setLeft(resizeRect.right() - minWidth);
- if(resizeRect.x() < 0)resizeRect.setX(0);
- break;
- }
-}
-
-void KviMdiChild::calculateMinimumSize(int &minWidth,int &minHeight)
-{
- if(m_pClient){
- minWidth = m_pClient->minimumSize().width() + (KVI_MDICHILD_BORDER << 1);
- minHeight = m_pClient->minimumSize().height()+ (KVI_MDICHILD_BORDER << 1)+
- m_pCaption->heightHint() + KVI_MDICHILD_SPACING;
- }
- if(minWidth<KVI_MDICHILD_MIN_WIDTH)minWidth=KVI_MDICHILD_MIN_WIDTH;
- if(minHeight<KVI_MDICHILD_MIN_HEIGHT)minHeight=KVI_MDICHILD_MIN_HEIGHT;
-}
-
-void KviMdiChild::resizeWindowOpaque(int resizeCorner)
-{
- int minWidth=0;
- int minHeight=0;
- QRect resizeRect(m_pManager->childX(this),m_pManager->childY(this),width(),height());
- calculateMinimumSize(minWidth,minHeight);
- QPoint mousePos = m_pManager->mapFromGlobal(QCursor::pos());
- calculateResizeRect(resizeCorner,mousePos,resizeRect,minWidth,minHeight);
- m_pManager->moveChild(this,resizeRect.x(),resizeRect.y());
- resize(resizeRect.width(),resizeRect.height());
- m_pManager->childMoved(this);
-
- if(m_state == Maximized)
- {
- m_state=Normal;
- m_pManager->childRestored(this,true);
- }
-
+ emit systemPopupRequest(QCursor::pos());
}
-int KviMdiChild::getResizeCorner(int ax,int ay)
-{
- int ret = KVI_MDI_NORESIZE;
- if((ax>0)&&(ax<(KVI_MDICHILD_BORDER+2))) ret |= KVI_MDI_RESIZE_LEFT;
- if((ax<width())&&(ax>(width()-(KVI_MDICHILD_BORDER+2)))) ret |= KVI_MDI_RESIZE_RIGHT;
- if((ay>0)&&(ay<(KVI_MDICHILD_BORDER+2))) ret |= KVI_MDI_RESIZE_TOP;
- if((ay<(height()))&&(ay>(height()-(KVI_MDICHILD_BORDER+2)))) ret |= KVI_MDI_RESIZE_BOTTOM;
- return ret;
-}
-
-void KviMdiChild::setClient(QWidget *w)
+void KviMdiChild::setClient(QWidget * w)
{
__range_valid(m_pClient==0);
__range_valid(w!=0);
m_pClient = w;
- //resize to match the client
- int clientYPos=m_pCaption->heightHint()+KVI_MDICHILD_SPACING+KVI_MDICHILD_BORDER;
- resize(w->width()+(KVI_MDICHILD_BORDER << 1),w->height()+KVI_MDICHILD_BORDER+clientYPos);
-
- //Reparent if needed
- if(w->parent()!=this){
- //reparent to this widget , no flags , point , show it
- QPoint pnt2(KVI_MDICHILD_BORDER,clientYPos);
- w->setParent(this, w->windowFlags() & ~Qt::WindowType_Mask);
- w->setGeometry(pnt2.x(),pnt2.y(),w->width(),w->height());
- w->show();
- } else w->move(KVI_MDICHILD_BORDER,clientYPos);
-
- setFocusProxy(w);
- m_pCaption->setFocusProxy(w);
-
-/*
- m_pMinimizeButton->setFocusProxy(w);
- m_pMaximizeButton->setFocusProxy(w);
- m_pCloseButton->setFocusProxy(w);
- m_pIconButton->setFocusProxy(w);
-*/
- //linkChildren(w);
-
- if(m_pClient->minimumSize().width() > KVI_MDICHILD_MIN_WIDTH &&
- m_pClient->minimumSize().height() > KVI_MDICHILD_MIN_HEIGHT)
- {
- setMinimumWidth(m_pClient->minimumSize().width() + (KVI_MDICHILD_BORDER << 1));
- setMinimumHeight(m_pClient->minimumSize().height() + (KVI_MDICHILD_BORDER << 1) +
- m_pCaption->heightHint() + KVI_MDICHILD_SPACING);
- }
+ setWidget(w);
KviStr tmp(KviStr::Format,"mdi_child_%s",w->objectName().toUtf8().data());
- setObjectName(tmp.ptr());
+ w->setObjectName(tmp.ptr());
}
void KviMdiChild::unsetClient()
{
__range_valid(m_pClient!=0);
if(!m_pClient)return;
- //reparent to desktop widget , no flags , point , show it
- //unlinkChildren(m_pClient);
- setFocusProxy(0); //remove the focus proxy...
- //Kewl...the reparent function has a small prob now..
- //the new toplelvel widgets gets not reenabled for dnd
-#ifdef COMPILE_ON_MAC
- QRect r = g_pApp->desktop()->availableGeometry(m_pClient);
- r.translate(0, 22);
- m_pClient->setParent(0, m_pClient->windowFlags() & ~Qt::WindowType_Mask);
- m_pClient->setGeometry(r.topLeft().x(),r.topLeft().y(),m_pClient->width(),m_pClient->height());
- m_pClient->show();
-#else
- QPoint p=m_pClient->mapToGlobal(QPoint(0,0));
- m_pClient->setParent(0, m_pClient->windowFlags() & ~Qt::WindowType_Mask);
- m_pClient->setGeometry(p.x(),p.y(),m_pClient->width(),m_pClient->height());
- m_pClient->show();
-#endif
- m_pClient=0;
+ setWidget(0);
+ m_pClient = 0;
setObjectName("mdi_child");
}
void KviMdiChild::activate(bool bSetFocus)
{
- if(!m_pCaption->active())m_pCaption->setActive(true);
if(m_pManager->topChild() != this)
m_pManager->setTopChild(this,bSetFocus);
else if(bSetFocus)setFocus();
@@ -546,24 +346,18 @@ void KviMdiChild::activate(bool bSetFocus)
void KviMdiChild::focusInEvent(QFocusEvent *)
{
- // We gained focus by click , tab or from the caption label
- // Bring this child to top
- m_pCaption->setActive(true);
- m_pManager->setTopChild(this,false); //Do not focus by now...
- /*The client is our focusProxy ! it should be focused by Qt !*/
-#ifdef _KVI_DEBUG_CLASS_NAME_
- __range_valid(focusProxy() == m_pClient);
-#endif
}
-QSize KviMdiChild::sizeHint() const
+void KviMdiChild::updateSystemPopup()
{
- if(m_pClient)
+ if(m_pClient->inherits("KviWindow"))
{
- QSize s = m_pClient->sizeHint();
- QSize ret(s.width() + (KVI_MDICHILD_BORDER << 1),
- s.height() + (KVI_MDICHILD_BORDER << 1) + KVI_MDICHILD_SPACING + m_pCaption->heightHint());
- return ret;
+ systemMenu()->clear();
+ QMenu * tmp = ((KviWindow*) m_pClient)->generatePopup();
+ if (tmp)
+ {
+ systemMenu()->addActions(tmp->actions());
+ }
}
- return QFrame::sizeHint();
+
}
diff --git a/src/kvirc/ui/kvi_mdichild.h b/src/kvirc/ui/kvi_mdichild.h
index 1179829b3..a9f5ad92d 100644
--- a/src/kvirc/ui/kvi_mdichild.h
+++ b/src/kvirc/ui/kvi_mdichild.h
@@ -24,90 +24,173 @@
//
//=============================================================================
+/**
+* \file kvi_mdichild.h
+* \brief MDI subwindow stuff
+*/
+
#include "kvi_settings.h"
#include "kvi_string.h"
#include <QFrame>
#include <QLabel>
+#include <QLabel>
+#include <QToolButton>
+#include <QMdiSubWindow>
+#include <QWidget>
+#include <QWindowStateChangeEvent>
+#include <QTimer>
+
+#include "kvi_tal_popupmenu.h"
class KviMdiManager;
class KviMdiChild;
-class KviMdiCaption;
-
class QCursor;
-class KVIRC_API KviMdiChild : public QFrame
+/**
+* \class KviMdiChild
+* \brief Class of an MDI window
+*/
+
+class KVIRC_API KviMdiChild : public QMdiSubWindow
{
friend class KviMdiManager;
- friend class KviMdiCaption;
Q_OBJECT
public:
+ /**
+ * \brief Constructor
+ * \param par The mdi-manager the mdi-child belongs to.
+ * \param name The name of the mdi-child
+ */
KviMdiChild(KviMdiManager* par,const char * name = 0);
~KviMdiChild();
public:
- enum MdiChildState { Maximized , Minimized , Normal };
+ enum MdiChildState { Maximized = 0 , Minimized , Normal };
protected:
+ /// Contains the according KviMdiManager object.
KviMdiManager * m_pManager;
- KviMdiCaption * m_pCaption;
private:
- int m_iResizeCorner;
- int m_iLastCursorCorner;
- bool m_bResizeMode;
- QWidget * m_pClient;
- MdiChildState m_state;
- QRect m_restoredGeometry;
-
- QString m_szXmlActiveCaption;
- QString m_szXmlInactiveCaption;
- QString m_szPlainCaption;
+ /// The widget docked into our MDI window.
+ QWidget * m_pClient;
+ /// Saves the geometry of the window for restoring it's position
+ QRect m_restoredGeometry;
+ /// Saves the last state of our window
+ MdiChildState m_State;
+ /// Saves the last state before window is minimized
+ MdiChildState m_LastState;
+ /// Contains the current window Icon
+ QPixmap m_pIcon;
+ /// XML-Version of active Caption.
+ QString m_szXmlActiveCaption;
+ /// XML-Version of inactive Caption.
+ QString m_szXmlInactiveCaption;
+ /// Caption as plain text.
+ QString m_szPlainCaption;
+ /// If window can be closed or not
+ bool m_bCloseEnabled;
+private:
+ void updateCaption();
public:
+ /// Read the current geometry
QRect restoredGeometry();
- void setRestoredGeometry(const QRect &r){ m_restoredGeometry = r; };
+
+ /// Set new geomentry
+ /// \param r The geometry the window will take when it will be restored
+ void setRestoredGeometry(const QRect &r);
+
+ /// Set the client widget which is shown in the subwindow
+ /// \param w The new client widget which is docked into our KviMdiChild
void setClient(QWidget * w);
- QWidget * client(){ return m_pClient; };
+
+ /// Returns the currently in the window visible widget
+ QWidget * client() { return m_pClient; };
+
+ /// Removes the client widget
void unsetClient();
- KviMdiCaption * captionLabel(){ return m_pCaption; };
- MdiChildState state(){ return m_state; };
- const QString & plainCaption(){ return m_szPlainCaption; };
- const QString & xmlActiveCaption(){ return m_szXmlActiveCaption; };
- const QString & xmlInactiveCaption(){ return m_szXmlInactiveCaption; };
+
+ /// Get the current window state
+ MdiChildState state();
+
+ /// Return plain text caption
+ const QString & plainCaption() { return m_szPlainCaption; };
+
+ /// Return xml-caption string for active caption
+ const QString & xmlActiveCaption() { return m_szXmlActiveCaption; };
+
+ /// Return xml-caption string for inactive caption
+ const QString & xmlInactiveCaption() { return m_szXmlInactiveCaption; };
+
+ /** Set the window title
+ * \param plain Plain text of caption
+ * \param xmlActive not used
+ * \param xmlInactive not used
+ */
void setWindowTitle(const QString & plain,const QString & xmlActive,const QString & xmlInactive);
- virtual QSize sizeHint() const;
- void setIcon(const QPixmap &pix);
+
+ /// Set the window icon
+ /// \param pix The new icon
+ void setIcon(QPixmap pix);
+
+ /// Return current window icon
const QPixmap * icon();
+
+ /// Enable or disable the close button
+ /// \param bEnable Activate/Deactivate close button
void enableClose(bool bEnable);
+
+ /// Return if close is enabled
bool closeEnabled();
+
+ /// Returns the current KviMdiManager of the subwindow
KviMdiManager * manager(){ return m_pManager; };
+
+ /// Activate this subwindow
void activate(bool bSetFocus);
- void reloadImages();
+
+ /// Since Qt sometimes does not like changing window states while being in another event
+ void queuedMinimize();
+ /// Since Qt sometimes does not like changing window states while being in another event
+ void queuedRestore();
+ /// Since Qt sometimes does not like changing window states while being in another event
+ void queuedMaximize();
+
public slots:
+ /// Maximize this window
void maximize();
+ /// Minimize this window
void minimize();
+ /// Restore it's latest postition/state
void restore();
+
+ // TODO: ???
void systemPopupSlot();
- void closeRequest();
+
+ /// Event is used to catch minmize event of the KviMdiSubWindow
+ void windowStateChangedEvent( Qt::WindowStates oldState, Qt::WindowStates newState );
+private slots:
+ void updateSystemPopup();
signals:
+ /// Signal is emitted when user clicks on the window icon
void systemPopupRequest(const QPoint & pnt);
+ /// Signal is used to minimize the window
+ void minimizeSignal();
+ void maximizeSignal();
+ void restoreSignal();
+ void hideSignal();
protected:
+ // TODO: ???
virtual void setBackgroundRole(QPalette::ColorRole);
- virtual void resizeEvent(QResizeEvent *e);
- virtual void mousePressEvent(QMouseEvent *e);
- virtual void mouseMoveEvent(QMouseEvent *e);
- virtual void mouseReleaseEvent(QMouseEvent *e);
- virtual void leaveEvent(QEvent *e);
+ // TODO: ???
virtual void focusInEvent(QFocusEvent *);
- virtual void moveEvent(QMoveEvent *e);
-// bool eventFilter(QObject *o,QEvent *e);
- void emitSystemPopupRequest(const QPoint & pnt){ emit systemPopupRequest(pnt); };
-private:
-// void linkChildren(QWidget *w);
-// void unlinkChildren(QWidget *w);
- QCursor getResizeCursor(int resizeCorner);
- void resizeWindowOpaque(int resizeCorner);
- int getResizeCorner(int ax,int ay);
- void calculateMinimumSize(int &minWidth,int &minHeight);
- void setResizeCursor(int resizeCorner);
- void calculateResizeRect(int resizeCorner,QPoint mousePos,QRect &resizeRect,int minWidth,int minHeight);
+
+ /// Updates the widget background when moving
+ virtual void moveEvent(QMoveEvent * e);
+
+ /// Hook into close event to make user decisions possible
+ virtual void closeEvent(QCloseEvent * e);
+
+ // TODO: ???
+ void emitSystemPopupRequest(const QPoint & pnt) { emit systemPopupRequest(pnt); };
};
diff --git a/src/kvirc/ui/kvi_mdimanager.cpp b/src/kvirc/ui/kvi_mdimanager.cpp
index d30125b2d..506320207 100644
--- a/src/kvirc/ui/kvi_mdimanager.cpp
+++ b/src/kvirc/ui/kvi_mdimanager.cpp
@@ -22,6 +22,10 @@
//
//=============================================================================
+/**
+* \file kvi_mdimanager.cpp
+* \brief The MDI-manager
+*/
#include "kvi_debug.h"
@@ -33,7 +37,6 @@
#include "kvi_iconmanager.h"
#include "kvi_frame.h"
#include "kvi_menubar.h"
-#include "kvi_mdicaption.h"
#include "kvi_app.h"
#include "kvi_tal_popupmenu.h"
#include "kvi_tal_hbox.h"
@@ -44,6 +47,9 @@
#include <QCursor>
#include <QEvent>
#include <QMouseEvent>
+#include <QLabel>
+#include <QToolButton>
+
#ifdef COMPILE_PSEUDO_TRANSPARENCY
#include <QPixmap>
@@ -54,24 +60,12 @@
KviMdiManager::KviMdiManager(QWidget * parent,KviFrame * pFrm,const char *)
-: KviTalScrollView(parent)
+: QMdiArea(parent)
{
setFrameShape(NoFrame);
- m_pZ = new KviPointerList<KviMdiChild>;
- m_pZ->setAutoDelete(true);
m_pFrm = pFrm;
- m_iSdiIconItemId = 0;
- m_iSdiCloseItemId = 0;
- m_iSdiRestoreItemId = 0;
- m_iSdiMinimizeItemId = 0;
- m_pSdiIconButton = 0;
- m_pSdiCloseButton = 0;
- m_pSdiRestoreButton = 0;
- m_pSdiMinimizeButton = 0;
- m_pSdiControls = 0;
-
m_pWindowPopup = new KviTalPopupMenu(this);
connect(m_pWindowPopup,SIGNAL(activated(int)),this,SLOT(menuActivated(int)));
connect(m_pWindowPopup,SIGNAL(aboutToShow()),this,SLOT(fillWindowPopup()));
@@ -80,24 +74,18 @@ KviMdiManager::KviMdiManager(QWidget * parent,KviFrame * pFrm,const char *)
viewport()->setAutoFillBackground(false);
// setStaticBackground(true);
- resizeContents(width(),height());
- setFocusPolicy(Qt::NoFocus);
- viewport()->setFocusPolicy(Qt::NoFocus);
+ //setFocusPolicy(Qt::NoFocus);
+ //viewport()->setFocusPolicy(Qt::NoFocus);
connect(g_pApp,SIGNAL(reloadImages()),this,SLOT(reloadImages()));
}
KviMdiManager::~KviMdiManager()
{
- delete m_pZ;
}
void KviMdiManager::reloadImages()
{
- for(KviMdiChild * c = m_pZ->first();c;c = m_pZ->next())
- {
- c->reloadImages();
- }
}
bool KviMdiManager::focusNextPrevChild(bool bNext)
@@ -132,27 +120,9 @@ void KviMdiManager::manageChild(KviMdiChild * lpC,bool bCascade,QRect *setGeom)
{
__range_valid(lpC);
- m_pZ->insert(0,lpC); //hidden -> last in the Z order
-
- if(bCascade)
- {
- QPoint p = getCascadePoint(m_pZ->count()-1);
- addChild(lpC,p.x(),p.y());
- } else {
- // FIXME: is this right ?
- QPoint p = lpC->pos();
- if(p.x() < 0)p.setX(0);
- if(p.y() < 0)p.setY(0);
- addChild(lpC,p.x(),p.y());
+ QMdiSubWindow * w = this->addSubWindow((QMdiSubWindow*)lpC);
- if(setGeom)
- {
- if(setGeom->left() < 0)setGeom->setLeft(0);
- if(setGeom->top() < 0)setGeom->setTop(0);
- moveChild(lpC,setGeom->x(),setGeom->y());
- lpC->setGeometry(*setGeom);
- }
- }
+ if(isInSDIMode()) lpC->queuedMaximize();
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
}
@@ -164,108 +134,85 @@ void KviMdiManager::showAndActivate(KviMdiChild * lpC)
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
}
+KviMdiChild * KviMdiManager::topChild()
+{
+ return (KviMdiChild*)activeSubWindow();
+};
+
void KviMdiManager::setTopChild(KviMdiChild *lpC,bool bSetFocus)
{
__range_valid(lpC);
// The following check fails safely at startup....
- // __range_valid(lpC->isVisible() || lpC->testWState(WState_ForceHide));
- KviMdiChild * pOldTop = m_pZ->last();
- if(pOldTop != lpC)
- {
- m_pZ->setAutoDelete(false);
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
- if(!m_pZ->removeRef(lpC))
- {
- m_pZ->setAutoDelete(true);
- return; // no such child ?
- }
-
- // disable the labels of all the other children
- //for(KviMdiChild *pC=m_pZ->first();pC;pC=m_pZ->next())
- //{
- // pC->captionLabel()->setActive(false);
- //}
- KviMdiChild * pMaximizedChild = pOldTop;
- if(pOldTop)
- {
- pOldTop->captionLabel()->setActive(false);
- if(pOldTop->m_state != KviMdiChild::Maximized)pMaximizedChild=0;
- }
-
- m_pZ->setAutoDelete(true);
- m_pZ->append(lpC);
-
- if(pMaximizedChild)lpC->maximize(); //do not animate the change
- lpC->raise();
- if(pMaximizedChild)pMaximizedChild->restore();
+ if (tmp.last()->inherits("KviMdiChild"))
+ {
+ KviMdiChild * oldlpC = (KviMdiChild *) tmp.last();
+ if (oldlpC && oldlpC->isMaximized()) lpC->queuedMaximize();
}
+ setActiveSubWindow((QMdiSubWindow*) lpC);
+
if(bSetFocus)
{
if(!lpC->hasFocus())
{
lpC->setFocus();
- /*
- if(topLevelWidget()->isActiveWindow())
- {
-
- }
- */
}
}
-}
-void KviMdiManager::focusInEvent(QFocusEvent *)
-{
- focusTopChild();
}
void KviMdiManager::destroyChild(KviMdiChild *lpC,bool bFocusTopChild)
{
- bool bWasMaximized = lpC->state() == KviMdiChild::Maximized;
- disconnect(lpC);
- lpC->blockSignals(true);
-#ifdef _KVI_DEBUG_CHECK_RANGE_
- //Report invalid results in a debug session
- __range_valid(m_pZ->removeRef(lpC));
-#else
- m_pZ->removeRef(lpC);
-#endif
- if(bWasMaximized)
+ removeSubWindow(lpC);
+
+ if (lpC->isMaximized() && activeSubWindow())
{
- KviMdiChild * c=topChild();
- if(c)
- {
- if(c->state() != KviMdiChild::Minimized)c->maximize();
- else {
- // minimized top child...the last one
- leaveSDIMode();
- }
- } else {
- // SDI state change
- leaveSDIMode();
- }
+ if (!activeSubWindow()->inherits("KviMdiChild")) return;
+
+ KviMdiChild * tmp = (KviMdiChild *) activeSubWindow();
+ tmp->queuedMaximize();
}
+
if(bFocusTopChild)focusTopChild();
- if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
- updateContentsSize();
+ if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows)) tile();
}
KviMdiChild * KviMdiManager::highestChildExcluding(KviMdiChild * pChild)
{
- KviMdiChild * c = m_pZ->last();
- while(c && (c == pChild))c = m_pZ->prev();
- return c;
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
+ QListIterator<QMdiSubWindow*> wl(tmp);
+ wl.toBack();
+
+ KviMdiChild * c;
+ while (wl.hasPrevious())
+ {
+ c = (KviMdiChild*) wl.previous();
+ if (!c->inherits("KviMdiChild")) continue;
+ if (c == pChild) continue;
+ return c;
+ }
+ return 0;
}
QPoint KviMdiManager::getCascadePoint(int indexOfWindow)
{
QPoint pnt(0,0);
if(indexOfWindow==0)return pnt;
- KviMdiChild *lpC=m_pZ->first();
- int step=(lpC ? (lpC->captionLabel()->heightHint()+KVI_MDICHILD_BORDER) : 20);
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
+
+ if (!tmp.last()->inherits("KviMdiChild"))
+ {
+ debug("QMdiSubWindow doesn't inherit from KviMdiChild!");
+ return pnt;
+ }
+
+ KviMdiChild * lpC = (KviMdiChild *) tmp.last();
+
+ int step=0;
int availableHeight=viewport()->height()-(lpC ? lpC->minimumSize().height() : KVI_MDICHILD_MIN_HEIGHT);
int availableWidth=viewport()->width()-(lpC ? lpC->minimumSize().width() : KVI_MDICHILD_MIN_WIDTH);
int ax=0;
@@ -282,353 +229,138 @@ QPoint KviMdiManager::getCascadePoint(int indexOfWindow)
return pnt;
}
-void KviMdiManager::mousePressEvent(QMouseEvent *e)
+void KviMdiManager::mousePressEvent(QMouseEvent * e)
{
//Popup the window menu
- if(e->button() & Qt::RightButton)m_pWindowPopup->popup(mapToGlobal(e->pos()));
+ if(e->button() & Qt::RightButton) m_pWindowPopup->popup(mapToGlobal(e->pos()));
}
void KviMdiManager::childMoved(KviMdiChild *)
{
- updateContentsSize();
-}
-void KviMdiManager::maximizeChild(KviMdiChild * lpC)
-{
- // the children must be moved once by the means of QScrollView::moveChild()
- // so the QScrollView internal structures get updated with the negative
- // position of the widget, otherwise, when restoring with moveChild()
- // it will refuse to move it back to the original position
- resizeContents(visibleWidth(),visibleHeight());
- //// updateScrollBars();
- g_pApp->sendPostedEvents();
- if(g_pApp->closingDown())return;
-
- moveChild(lpC,-KVI_MDICHILD_HIDDEN_EDGE,
- -(KVI_MDICHILD_HIDDEN_EDGE + KVI_MDICHILD_SPACING + lpC->m_pCaption->heightHint()));
-
- lpC->setGeometry(
- -KVI_MDICHILD_HIDDEN_EDGE,
- -(KVI_MDICHILD_HIDDEN_EDGE + KVI_MDICHILD_SPACING + lpC->m_pCaption->heightHint()),
- viewport()->width() + (KVI_MDICHILD_HIDDEN_EDGE * 2), //KVI_MDICHILD_DOUBLE_HIDDEN_EDGE,
- viewport()->height() + (KVI_MDICHILD_HIDDEN_EDGE * 2) + lpC->m_pCaption->heightHint() + KVI_MDICHILD_SPACING);
-
- if(isInSDIMode())updateSDIMode();
- else {
- enterSDIMode(lpC);
- // make sure that the child is focused
- lpC->setFocus();
- }
-
- // fixme: we could hide all the other children now!
}
-
-
-void KviMdiManager::resizeEvent(QResizeEvent *e)
+void KviMdiManager::maximizeChild(KviMdiChild * lpC)
{
- //If we have a maximized children at the top , adjust its size
- KviTalScrollView::resizeEvent(e);
- KviMdiChild *lpC=m_pZ->last();
- if(lpC)
- {
- if(lpC->state()==KviMdiChild::Maximized)
- {
- // SDI mode
- lpC->resize(viewport()->width() + (KVI_MDICHILD_HIDDEN_EDGE * 2),
- viewport()->height() + lpC->m_pCaption->heightHint() + (KVI_MDICHILD_HIDDEN_EDGE * 2) + KVI_MDICHILD_SPACING);
- return;
- } else {
- if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
- }
- }
- updateContentsSize();
}
-
-/*
void KviMdiManager::childMaximized(KviMdiChild * lpC)
{
- if(lpC == m_pZ->last())
- {
- enterSDIMode(lpC);
- }
- updateContentsSize();
+ m_bInSDIMode = true;
}
-*/
+
void KviMdiManager::childMinimized(KviMdiChild * lpC,bool bWasMaximized)
{
__range_valid(lpC);
- if(m_pZ->findRef(lpC) == -1)return;
- if(m_pZ->count() > 1)
+
+ if(subWindowList().count() > 1)
{
- m_pZ->setAutoDelete(false);
-#ifdef _KVI_DEBUG_CHECK_RANGE_
- //Report invalid results in a debug session
- __range_valid(m_pZ->removeRef(lpC));
-#else
- m_pZ->removeRef(lpC);
-#endif
- m_pZ->setAutoDelete(true);
- m_pZ->insert(0,lpC);
- if(bWasMaximized)
+ if(!bWasMaximized)
{
- // Need to maximize the top child
- lpC = m_pZ->last();
- if(!lpC)return; //??
- if(lpC->state()==KviMdiChild::Minimized)
- {
- if(bWasMaximized)leaveSDIMode();
- return;
- }
- lpC->maximize(); //do nrot animate the change
- } else {
- if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
+ if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows)) tile();
}
focusTopChild();
} else {
// Unique window minimized...it won't loose the focus...!!
setFocus(); //Remove focus from the child
- if(bWasMaximized)leaveSDIMode();
}
- updateContentsSize();
}
-void KviMdiManager::childRestored(KviMdiChild * lpC,bool bWasMaximized)
+void KviMdiManager::childRestored(KviMdiChild * lpC, bool bWasMaximized)
{
if(bWasMaximized)
{
- if(lpC != m_pZ->last())return; // do nothing in this case
- leaveSDIMode();
- updateContentsSize();
+ if(lpC != subWindowList().last()) return; // do nothing in this case
}
- if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
+ if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows)) tile();
+ if (bWasMaximized) m_bInSDIMode = false;
}
void KviMdiManager::focusTopChild()
{
- KviMdiChild *lpC=m_pZ->last();
- if(!lpC)return;
- if(!lpC->isVisible())return;
- // if(lpC->state()==KviMdiChild::Minimized)return;
- // debug("Focusing top child %s",lpC->name());
- //disable the labels of all the other children
- for(KviMdiChild *pC=m_pZ->first();pC;pC=m_pZ->next())
+ if (!activeSubWindow()) return;
+ if (!activeSubWindow()->inherits("KviMdiChild")) return;
+
+ KviMdiChild * lpC;
+
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::ActivationHistoryOrder);
+ QListIterator<QMdiSubWindow*> wl(tmp);
+ wl.toBack();
+
+ while (wl.hasPrevious())
{
- if(pC != lpC)
- pC->captionLabel()->setActive(false);
+ lpC = (KviMdiChild*) wl.previous();
+ if (!lpC->inherits("KviMdiChild")) continue;
+
+ if (lpC->state() != KviMdiChild::Minimized)
+ {
+ break;
+ }
}
+
+ if(!lpC)return;
+ if(isInSDIMode()) lpC->queuedMaximize();
lpC->raise();
if(!lpC->hasFocus())lpC->setFocus();
}
void KviMdiManager::minimizeActiveChild()
{
- KviMdiChild * lpC = m_pZ->last();
- if(!lpC)return;
- if(lpC->state() != KviMdiChild::Minimized)lpC->minimize();
+ if (!activeSubWindow()->inherits("KviMdiChild")) return;
+
+ KviMdiChild * lpC = (KviMdiChild *) activeSubWindow();
+ if(lpC->state() != KviMdiChild::Minimized) lpC->minimize();
}
void KviMdiManager::restoreActiveChild()
{
- KviMdiChild * lpC = m_pZ->last();
- if(!lpC)return;
+ if (!activeSubWindow()->inherits("KviMdiChild")) return;
+
+ KviMdiChild * lpC = (KviMdiChild *) activeSubWindow();
if(lpC->state() == KviMdiChild::Maximized)lpC->restore();
}
void KviMdiManager::closeActiveChild()
{
- KviMdiChild * lpC = m_pZ->last();
- if(!lpC)return;
- lpC->closeRequest();
+ if (!activeSubWindow()->inherits("KviMdiChild")) return;
+
+ KviMdiChild * lpC = (KviMdiChild *) activeSubWindow();
+ lpC->close();
}
void KviMdiManager::updateContentsSize()
{
- KviMdiChild * c = m_pZ->last();
- if(c)
- {
- if(c->state() == KviMdiChild::Maximized)
- {
- return;
- }
- }
-
- int fw = frameWidth() * 2;
- int mx = width() - fw;
- int my = height() - fw;
-
- for(c = m_pZ->first();c;c = m_pZ->next())
- {
- if(c->isVisible())
- {
- int x = childX(c) + c->width();
- if(x > mx)mx = x;
- int y = childY(c) + c->height();
- if(y > my)my = y;
- }
- }
-
- resizeContents(mx,my);
}
-
-void KviMdiManager::updateSDIMode()
+void KviMdiManager::activeChildSystemPopup()
{
+ if (!activeSubWindow()->inherits("KviMdiChild")) return;
- KviMdiChild * lpC = m_pZ->last();
-
- if(m_pSdiCloseButton)
- m_pSdiCloseButton->setEnabled(lpC ? lpC->closeEnabled() : false);
-
-// This would result in an addictional main menu bar entry on MacOSX which would trigger a popup menu and not
-// a submenu. Due to the optical reasons it is removed here.
-// The same popup is triggered by right clicking on the window name in the channel window list.
-#ifndef COMPILE_ON_MAC
- KviMenuBar * b = m_pFrm->mainMenuBar();
-
- const QPixmap * pix = lpC ? lpC->icon() : 0;
- if(!pix)pix = g_pIconManager->getSmallIcon(KVI_SMALLICON_NONE);
- else if(pix->isNull())pix = g_pIconManager->getSmallIcon(KVI_SMALLICON_NONE);
-
- if(!m_pSdiIconButton)
- {
- m_pSdiIconButton = new KviMenuBarToolButton(b,*pix,"nonne");
- connect(m_pSdiIconButton,SIGNAL(clicked()),this,SLOT(activeChildSystemPopup()));
- // This is an obscure, undocumented and internal function in QT4 QMenuBar
- // I won't be surprised if this disappears....
- b->setCornerWidget(m_pSdiIconButton,Qt::TopLeftCorner);
- m_pSdiIconButton->show();
- connect(m_pSdiIconButton,SIGNAL(destroyed()),this,SLOT(sdiIconButtonDestroyed()));
- } else {
- m_pSdiIconButton->setIcon(QIcon(*pix));
- }
-#endif //COMPILE_ON_MAC
-}
+ KviMdiChild * lpC = (KviMdiChild *) activeSubWindow();
-void KviMdiManager::activeChildSystemPopup()
-{
- KviMdiChild * lpC = m_pZ->last();
- if(!lpC)return;
QPoint pnt;
- if(m_pSdiIconButton)
+ /*if(m_pSdiIconButton)
{
pnt = m_pSdiIconButton->mapToGlobal(QPoint(0,m_pSdiIconButton->height()));
} else {
pnt = QCursor::pos();
- }
+ }*/
lpC->emitSystemPopupRequest(pnt);
}
bool KviMdiManager::isInSDIMode()
{
- return (m_pSdiCloseButton != 0);
+ return m_bInSDIMode;
}
-
-void KviMdiManager::enterSDIMode(KviMdiChild *)
-{
- if(!m_pSdiCloseButton)
- {
- KviMenuBar * b = m_pFrm->mainMenuBar();
-
- QWidget * pButtonParent;
-
- m_pSdiControls = new KviTalHBox(b);
- m_pSdiControls->setMargin(0);
- m_pSdiControls->setSpacing(2);
- m_pSdiControls->setAutoFillBackground(false);
- pButtonParent = m_pSdiControls;
-
- m_pSdiMinimizeButton = new KviMenuBarToolButton(pButtonParent,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINIMIZE)),"btnminimize");
- connect(m_pSdiMinimizeButton,SIGNAL(clicked()),this,SLOT(minimizeActiveChild()));
- connect(m_pSdiMinimizeButton,SIGNAL(destroyed()),this,SLOT(sdiMinimizeButtonDestroyed()));
-
- m_pSdiRestoreButton = new KviMenuBarToolButton(pButtonParent,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_RESTORE)),"btnrestore");
- connect(m_pSdiRestoreButton,SIGNAL(clicked()),this,SLOT(restoreActiveChild()));
- connect(m_pSdiRestoreButton,SIGNAL(destroyed()),this,SLOT(sdiRestoreButtonDestroyed()));
-
- m_pSdiCloseButton = new KviMenuBarToolButton(pButtonParent,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CLOSE)),"btnclose");
- connect(m_pSdiCloseButton,SIGNAL(clicked()),this,SLOT(closeActiveChild()));
- connect(m_pSdiCloseButton,SIGNAL(destroyed()),this,SLOT(sdiCloseButtonDestroyed()));
-
- // This is an obscure, undocumented and internal function in QT4 QMenuBar
- // I won't be surprised if this disappears....
- b->setCornerWidget(m_pSdiControls,Qt::TopRightCorner);
- // The show below SHOULD force a re-layout of the menubar..
- // but it doesn't work when the KviFrame is still hidden (at startup)
- // We handle this BUG in showEvent()
- m_pSdiControls->show();
- emit enteredSdiMode();
-
- setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- }
-
- updateSDIMode();
-}
void KviMdiManager::relayoutMenuButtons()
{
- // force a re-layout of the menubar in Qt4 (see the note in enterSDIMode())
- // by resetting the corner widget
- if(m_pSdiControls)
- {
- m_pFrm->mainMenuBar()->setCornerWidget(0,Qt::TopRightCorner);
- m_pFrm->mainMenuBar()->setCornerWidget(m_pSdiControls,Qt::TopRightCorner);
- }
- // also force an activation of the top MdiChild since it probably didn't get it yet
+ // also force an activation of the top MdiChild since it probably didn't get it yet*/
KviMdiChild * c = topChild();
if(c) c->activate(false);
}
-
-void KviMdiManager::sdiIconButtonDestroyed()
-{
- m_iSdiIconItemId = 0;
- m_pSdiIconButton = 0;
-}
-
-void KviMdiManager::sdiMinimizeButtonDestroyed()
-{
- m_iSdiMinimizeItemId = 0;
- m_pSdiMinimizeButton = 0;
-}
-
-void KviMdiManager::sdiRestoreButtonDestroyed()
-{
- m_iSdiRestoreItemId = 0;
- m_pSdiRestoreButton = 0;
-}
-
-void KviMdiManager::sdiCloseButtonDestroyed()
-{
- m_iSdiCloseItemId = 0;
- m_pSdiCloseButton = 0;
-}
-
-void KviMdiManager::leaveSDIMode()
-{
- __range_valid(m_pSdiCloseButton);
-
- if(m_pSdiControls)
- {
- delete m_pSdiControls;
- m_pSdiControls = 0;
- }
- if(m_pSdiIconButton)
- {
- m_pSdiIconButton->hide(); // this will force a QMenuBar relayout
- delete m_pSdiIconButton;
- m_pSdiIconButton = 0;
- }
-
- setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
-
- emit leftSdiMode();
-}
-
#define KVI_TILE_METHOD_ANODINE 0
#define KVI_TILE_METHOD_PRAGMA4HOR 1
#define KVI_TILE_METHOD_PRAGMA4VER 2
@@ -681,18 +413,31 @@ void KviMdiManager::fillWindowPopup()
m_pWindowPopup->insertSeparator();
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINIMIZE)),(__tr2qs("Mi&nimize All")),this,SLOT(minimizeAll()));
-// m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_RESTORE)),(__tr2qs("&Restore all")),this,SLOT(restoreAll()));
-//
+ m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_RESTORE)),(__tr2qs("&Restore all")),this,SLOT(restoreAll()));
+
m_pWindowPopup->insertSeparator();
- int i=100;
+ int i = 100;
QString szItem;
QString szCaption;
- for(KviMdiChild *lpC=m_pZ->first();lpC;lpC=m_pZ->next())
+ QList<QMdiSubWindow*> tmp = subWindowList(QMdiArea::StackingOrder);
+ QListIterator<QMdiSubWindow*> m_pZ(tmp);
+
+ KviMdiChild * lpC;
+
+ while (m_pZ.hasNext())
{
+ lpC = (KviMdiChild *) m_pZ.next();
+
+ if (!lpC->inherits("KviMdiChild"))
+ {
+ i++;
+ continue;
+ }
+
szItem.setNum(((uint)i)-99);
szItem+=". ";
- szCaption = lpC->plainCaption();
+ szCaption = lpC->windowTitle();
if(szCaption.length() > 30)
{
QString trail = szCaption.right(12);
@@ -707,10 +452,17 @@ void KviMdiManager::fillWindowPopup()
szItem+=szCaption;
szItem+=")";
} else szItem+=szCaption;
+
const QPixmap * pix = lpC->icon();
- if(pix && !(pix->isNull()))m_pWindowPopup->insertItem(*pix,szItem,i);
- else m_pWindowPopup->insertItem(szItem,i);
- m_pWindowPopup->setItemChecked(i,((uint)i)==(m_pZ->count()+99));
+
+ if (pix && !(pix->isNull()))
+ {
+ m_pWindowPopup->insertItem(*pix, szItem,i);
+ } else {
+ m_pWindowPopup->insertItem(szItem);
+ }
+
+ //m_pWindowPopup->setItemChecked(i, ((uint)i) == (m_pZ->count()+99) ); <- ????
i++;
}
}
@@ -719,193 +471,106 @@ void KviMdiManager::menuActivated(int id)
{
if(id<100)return;
id-=100;
- __range_valid(((uint)id) < m_pZ->count());
- KviMdiChild *lpC=m_pZ->at(id);
- if(!lpC)return;
- if(lpC->state()==KviMdiChild::Minimized)lpC->restore();
- setTopChild(lpC,true);
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
+
+ __range_valid(((uint)id) < tmp.count());
+
+ if (!tmp.at(id)->inherits("KviMdiChild")) return;
+ KviMdiChild * lpC = (KviMdiChild *) tmp.at(id);
+
+ if(!lpC) return;
+ if(lpC->state() == KviMdiChild::Minimized) lpC->restore();
+
+ setTopChild(lpC, true);
}
void KviMdiManager::ensureNoMaximized()
{
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
+
KviMdiChild * lpC;
- for(lpC=m_pZ->first();lpC;lpC=m_pZ->next())
+ for(int i = 0; i < tmp.count(); i++)
{
- if(lpC->state()==KviMdiChild::Maximized)lpC->restore();
+ if (tmp.at(i)->inherits("KviMdiChild"))
+ {
+ lpC = (KviMdiChild *) tmp.at(i);
+ if(lpC->state() == KviMdiChild::Maximized) lpC->restore();
+ }
}
}
void KviMdiManager::tileMethodMenuActivated(int id)
{
int idx = m_pTileMethodPopup->itemParameter(id);
- if(idx < 0)idx = 0;
- if(idx >= KVI_NUM_TILE_METHODS)idx = KVI_TILE_METHOD_PRAGMA9VER;
+
+ if(idx < 0) idx = 0;
+ if(idx >= KVI_NUM_TILE_METHODS) idx = KVI_TILE_METHOD_PRAGMA9VER;
+
KVI_OPTION_UINT(KviOption_uintTileMethod) = idx;
- if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
+
+ if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows)) tile();
}
void KviMdiManager::cascadeWindows()
{
- ensureNoMaximized();
- // this hack is needed to ensure that the scrollbars are hidden and the viewport()->width() and height() are correct
- resizeContents(visibleWidth(),visibleHeight());
- // updateScrollBars();
- g_pApp->sendPostedEvents();
- if(g_pApp->closingDown())return;
-
- int idx=0;
- KviPointerList<KviMdiChild> list;
- list.copyFrom(m_pZ);
-
- list.setAutoDelete(false);
- while(!list.isEmpty())
- {
- KviMdiChild *lpC=list.first();
- if(lpC->state() != KviMdiChild::Minimized)
- {
- QPoint p = getCascadePoint(idx);
- moveChild(lpC,p.x(),p.y());
- lpC->resize(lpC->sizeHint());
- idx++;
- }
- list.removeFirst();
- }
- focusTopChild();
- updateContentsSize();
}
void KviMdiManager::cascadeMaximized()
{
- ensureNoMaximized();
- // this hack is needed to ensure that the scrollbars are hidden and the viewport()->width() and height() are correct
- resizeContents(visibleWidth(),visibleHeight());
- // updateScrollBars();
- g_pApp->sendPostedEvents();
- if(g_pApp->closingDown())return;
-
- int idx=0;
- KviPointerList<KviMdiChild> list;
- list.copyFrom(m_pZ);
-
- list.setAutoDelete(false);
- while(!list.isEmpty())
- {
- KviMdiChild *lpC=list.first();
- if(lpC->state() != KviMdiChild::Minimized)
- {
- QPoint pnt(getCascadePoint(idx));
- moveChild(lpC,pnt.x(),pnt.y());
- QSize curSize(viewport()->width() - pnt.x(),viewport()->height() - pnt.y());
- if((lpC->minimumSize().width() > curSize.width()) ||
- (lpC->minimumSize().height() > curSize.height()))lpC->resize(lpC->minimumSize());
- else lpC->resize(curSize);
- idx++;
- }
- list.removeFirst();
- }
- focusTopChild();
- updateContentsSize();
}
void KviMdiManager::expandVertical()
{
- ensureNoMaximized();
- // this hack is needed to ensure that the scrollbars are hidden and the viewport()->width() and height() are correct
- resizeContents(visibleWidth(),visibleHeight());
- // updateScrollBars();
- g_pApp->sendPostedEvents();
- if(g_pApp->closingDown())return;
-
- KviPointerList<KviMdiChild> list;
- list.copyFrom(m_pZ);
-
- list.setAutoDelete(false);
- while(!list.isEmpty())
- {
- KviMdiChild *lpC=list.first();
- if(lpC->state() != KviMdiChild::Minimized)
- {
- moveChild(lpC,lpC->x(),0);
- lpC->resize(lpC->width(),viewport()->height());
- }
- list.removeFirst();
- }
-
- focusTopChild();
- updateContentsSize();
}
void KviMdiManager::expandHorizontal()
{
- ensureNoMaximized();
- // this hack is needed to ensure that the scrollbars are hidden and the viewport()->width() and height() are correct
- resizeContents(visibleWidth(),visibleHeight());
- // updateScrollBars();
- g_pApp->sendPostedEvents();
- if(g_pApp->closingDown())return;
-
- KviPointerList<KviMdiChild> list;
- list.copyFrom(m_pZ);
-
- list.setAutoDelete(false);
- while(!list.isEmpty())
- {
- KviMdiChild *lpC=list.first();
- if(lpC->state() != KviMdiChild::Minimized)
- {
- moveChild(lpC,0,lpC->y());
- lpC->resize(viewport()->width(),lpC->height());
- }
- list.removeFirst();
- }
- focusTopChild();
- updateContentsSize();
}
void KviMdiManager::minimizeAll()
{
- KviPointerList<KviMdiChild> list;
- list.copyFrom(m_pZ);
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
- list.setAutoDelete(false);
- m_pFrm->setActiveWindow((KviWindow*)m_pFrm->firstConsole());
- while(!list.isEmpty())
+ KviMdiChild * lpC;
+
+ for(int i = 0; i < tmp.count(); i++)
{
- KviMdiChild *lpC=list.first();
- if(lpC->state() != KviMdiChild::Minimized)lpC->minimize();
- list.removeFirst();
+ if (tmp.at(i)->inherits("KviMdiChild"))
+ {
+ lpC = (KviMdiChild *) tmp.at(i);
+ if(lpC->state() == KviMdiChild::Minimized) lpC->minimize();
+ }
}
- focusTopChild();
- updateContentsSize();
}
-/*
+
void KviMdiManager::restoreAll()
{
- int idx=0;
- KviPointerList<KviMdiChild> list;
- list.copyFrom(m_pZ);
+ QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
+
+ KviMdiChild * lpC;
- list.setAutoDelete(false);
- while(!list.isEmpty())
+ for(int i = 0; i < tmp.count(); i++)
{
- KviMdiChild *lpC=list.first();
- if(lpC->state() != KviMdiChild::Normal && (!(lpC->plainCaption()).contains("CONSOLE") ))
- lpC->restore();
- list.removeFirst();
+ if (tmp.at(i)->inherits("KviMdiChild"))
+ {
+ lpC = (KviMdiChild *) tmp.at(i);
+ if(lpC->state() == KviMdiChild::Normal) lpC->restore();
+ }
}
- focusTopChild();
- updateContentsSize();
}
-*/
+
int KviMdiManager::getVisibleChildCount()
{
- int cnt=0;
- for(KviMdiChild *lpC=m_pZ->first();lpC;lpC=m_pZ->next())
+ QList<QMdiSubWindow *> l = subWindowList();
+
+ int cnt = 0;
+ int i = 0;
+ for(i = 0; i < l.count(); i++)
{
- if(lpC->state() != KviMdiChild::Minimized)cnt++;
+ if(!l.at(i)->isHidden()) cnt++;
}
return cnt;
}
@@ -942,144 +607,9 @@ void KviMdiManager::toggleAutoTile()
void KviMdiManager::tileAllInternal(int maxWnds,bool bHorizontal)
{
- //NUM WINDOWS = 1,2,3,4,5,6,7,8,9
- static int colstable[9]={ 1,1,1,2,2,2,3,3,3 }; //num columns
- static int rowstable[9]={ 1,2,3,2,3,3,3,3,3 }; //num rows
- static int lastwindw[9]={ 1,1,1,1,2,1,3,2,1 }; //last window multiplier
- static int colrecall[9]={ 0,0,0,3,3,3,6,6,6 }; //adjust self
- static int rowrecall[9]={ 0,0,0,0,4,4,4,4,4 }; //adjust self
-
- int * pColstable = bHorizontal ? colstable : rowstable;
- int * pRowstable = bHorizontal ? rowstable : colstable;
- int * pColrecall = bHorizontal ? colrecall : rowrecall;
- int * pRowrecall = bHorizontal ? rowrecall : colrecall;
-
- ensureNoMaximized();
- // this hack is needed to ensure that the scrollbars are hidden and the viewport()->width() and height() are correct
- resizeContents(visibleWidth(),visibleHeight());
- // updateScrollBars();
- g_pApp->sendPostedEvents();
- if(g_pApp->closingDown())return;
-
- KviMdiChild *lpTop=topChild();
- int numVisible=getVisibleChildCount();
-
- if(numVisible<1)return;
-
- int numToHandle=((numVisible > maxWnds) ? maxWnds : numVisible);
- int xQuantum=viewport()->width()/pColstable[numToHandle-1];
- if(xQuantum < ((lpTop->minimumSize().width() > KVI_MDICHILD_MIN_WIDTH) ? lpTop->minimumSize().width() : KVI_MDICHILD_MIN_WIDTH)){
- if(pColrecall[numToHandle-1]==0)debug("Tile : Not enouh space");
- else tileAllInternal(pColrecall[numToHandle-1],bHorizontal);
- return;
- }
- int yQuantum=viewport()->height()/pRowstable[numToHandle-1];
- if(yQuantum < ((lpTop->minimumSize().height() > KVI_MDICHILD_MIN_HEIGHT) ? lpTop->minimumSize().height() : KVI_MDICHILD_MIN_HEIGHT)){
- if(pRowrecall[numToHandle-1]==0)debug("Tile : Not enough space");
- else tileAllInternal(pRowrecall[numToHandle-1],bHorizontal);
- return;
- }
- int curX=0;
- int curY=0;
- int curRow=1;
- int curCol=1;
- int curWin=1;
-
- for(KviMdiChild * lpC=m_pZ->first();lpC;lpC=m_pZ->next())
- {
- if(lpC->state()!=KviMdiChild::Minimized)
- {
- if((curWin%numToHandle)==0)
- {
- moveChild(lpC,curX,curY);
- lpC->resize(xQuantum * lastwindw[numToHandle-1],yQuantum);
- } else {
- moveChild(lpC,curX,curY);
- lpC->resize(xQuantum,yQuantum);
- }
- //example : 12 windows : 3 cols 3 rows
- if(curCol<pColstable[numToHandle-1])
- { //curCol<3
- curX+=xQuantum; //add a column in the same row
- curCol++; //increase current column
- } else {
- curX=0; //new row
- curCol=1; //column 1
- if(curRow<pRowstable[numToHandle-1])
- { //curRow<3
- curY+=yQuantum; //add a row
- curRow++; //
- } else {
- curY=0; //restart from beginning
- curRow=1; //
- }
- }
- curWin++;
- }
- }
- if(lpTop)lpTop->setFocus();
- updateContentsSize();
}
void KviMdiManager::tileAnodine()
{
- ensureNoMaximized();
- // this hack is needed to ensure that the scrollbars are hidden and the viewport()->width() and height() are correct
- resizeContents(visibleWidth(),visibleHeight());
- // updateScrollBars();
- g_pApp->sendPostedEvents();
- if(g_pApp->closingDown())return;
-
- KviMdiChild *lpTop=topChild();
- int numVisible=getVisibleChildCount(); // count visible windows
- if(numVisible<1)return;
- int numCols=int(sqrt((double)numVisible)); // set columns to square root of visible count
- // create an array to form grid layout
- int *numRows=new int[numCols];
- int numCurCol=0;
- while(numCurCol<numCols)
- {
- numRows[numCurCol]=numCols; // create primary grid values
- numCurCol++;
- }
- int numDiff=numVisible-(numCols*numCols); // count extra rows
- int numCurDiffCol=numCols; // set column limiting for grid updates
- while(numDiff>0)
- {
- numCurDiffCol--;
- numRows[numCurDiffCol]++; // add extra rows to column grid
- if(numCurDiffCol<1)numCurDiffCol=numCols; // rotate through the grid
- numDiff--;
- }
- numCurCol=0;
- int numCurRow=0;
- int curX=0;
- int curY=0;
- // the following code will size everything based on my grid above
- // there is no limit to the number of windows it will handle
- // it's great when a kick-ass theory works!!! // Pragma :)
- int xQuantum=viewport()->width()/numCols;
- int yQuantum=viewport()->height()/numRows[numCurCol];
-
- for(KviMdiChild * lpC=m_pZ->first();lpC;lpC=m_pZ->next())
- {
- if(lpC->state() != KviMdiChild::Minimized)
- {
- moveChild(lpC,curX,curY);
- lpC->resize(xQuantum,yQuantum);
- numCurRow++;
- curY+=yQuantum;
- if(numCurRow==numRows[numCurCol])
- {
- numCurRow=0;
- numCurCol++;
- curY=0;
- curX+=xQuantum;
- if(numCurCol!=numCols)yQuantum=viewport()->height()/numRows[numCurCol];
- }
- }
- }
- delete[] numRows;
- if(lpTop)lpTop->setFocus();
- updateContentsSize();
+ this->tileSubWindows();
}
diff --git a/src/kvirc/ui/kvi_mdimanager.h b/src/kvirc/ui/kvi_mdimanager.h
index 4f0fa1e9c..6d0ccaa17 100644
--- a/src/kvirc/ui/kvi_mdimanager.h
+++ b/src/kvirc/ui/kvi_mdimanager.h
@@ -2,7 +2,7 @@
#define _KVI_MDIMANAGER_H_
//=============================================================================
//
-// File : kvi_mdimanager.h
+// File : kvi+_mdimanager.h
// Creation date : Wed Jun 21 2000 17:28:04 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
@@ -24,6 +24,10 @@
//
//=============================================================================
+/**
+* \file kvi_mdimanager.h
+* \brief The MDI-manager
+*/
#include "kvi_settings.h"
#include "kvi_pointerlist.h"
@@ -32,6 +36,7 @@
#include <QWidget>
#include <QFrame>
#include <QPixmap>
+#include <QMdiArea>
#define KVI_MDICHILD_BORDER 4
#define KVI_MDICHILD_SPACING 2
@@ -45,59 +50,85 @@
class KviMdiChild;
#endif
-//class KviMdiCaptionButton;
class KviFrame;
class KviTalPopupMenu;
class KviTalHBox;
class KviSdiButtonBox;
-class KviMenuBarToolButton;
-class KVIRC_API KviMdiManager : public KviTalScrollView
+/**
+* \class KviMdiManager
+* \brief Handles all MDI windows
+* This MDI-manager is based on QMdiArea of Qt 4. It handles all docked windows and does their tiling.
+* Basicly all windows are managed by the KviFrame, which also gives the order to the MDI-manager to dock or undock a window.
+* What does that mean?
+* All windows in KVIrc are of the type QWidget which can be standalone windows. These are packed into a QMdiSubWindow and added to the MDI-manager.
+* So the KviMdiManager gets a KviMdiChild which will be set as main widget of our QMdiSubWindow. When it'll be undocked QMdiSubWindow will be removed and our KviWindow is "free" again.
+*/
+
+class KVIRC_API KviMdiManager : public QMdiArea
{
friend class KviMdiChild;
friend class KviMdiCaption;
Q_OBJECT
public:
- KviMdiManager(QWidget * parent,KviFrame * pFrm,const char * name);
+ KviMdiManager(QWidget * parent,KviFrame * pFrm, const char * name);
~KviMdiManager();
public:
- KviMdiChild * topChild(){ return m_pZ->last(); };
+ /// Get the currently active window
+ KviMdiChild * topChild();
+
KviMdiChild * highestChildExcluding(KviMdiChild * pChild);
- void manageChild(KviMdiChild * lpC,bool bCascade = true,QRect * setGeom = 0);
- void setTopChild(KviMdiChild *lpC,bool bSetFocus);
+
+ /** Add an KviMdiChild to the area
+ * \param lpC The KviMdiChild
+ * \param bCascade Cascade window or not.
+ * \param setGeom Sets the windows geometry before shown
+ */
+ void manageChild(KviMdiChild * lpC, bool bCascade = true, QRect * setGeom = 0);
+
+ /** Bring the KviMdiChild to the foreground
+ * \param lpC The KviMdiChild
+ * \param bSetFocus If set the KviMdiChild will get the keyboard focus
+ */
+ void setTopChild(KviMdiChild * lpC, bool bSetFocus);
+
+ /** Show the KviMdiChild and bring it to the front
+ * \param lpC The KviMdiChild which will be shown.
+ */
void showAndActivate(KviMdiChild * lpC);
- KviTalPopupMenu * windowPopup(){ return m_pWindowPopup; };
+
+ KviTalPopupMenu * windowPopup() { return m_pWindowPopup; };
+
+ /// Move the focus the the top window
void focusTopChild();
- void destroyChild(KviMdiChild *lpC,bool bFocusTopChild = true);
+
+ /** Remove and delete the subwindow
+ * \param lpC The KviMdiChild which will be destroyed.
+ * \param bFocusTopChild Defines if the next window which will appear afterwards will get the focus or not.
+ */
+ void destroyChild(KviMdiChild * lpC, bool bFocusTopChild = true);
+
+ /// Get all visible subwindows
int getVisibleChildCount();
+
+ /// Check if we are in SDI mode
bool isInSDIMode();
+private:
+ bool m_bInSDIMode;
protected:
- KviPointerList<KviMdiChild> * m_pZ; // topmost child is the last in the list
+ KviTalPopupMenu * m_pWindowPopup;
+ KviTalPopupMenu * m_pTileMethodPopup;
+ KviFrame * m_pFrm;
- KviMenuBarToolButton * m_pSdiRestoreButton;
- KviMenuBarToolButton * m_pSdiMinimizeButton;
- KviMenuBarToolButton * m_pSdiCloseButton;
- KviMenuBarToolButton * m_pSdiIconButton;
-
- KviTalHBox * m_pSdiControls;
- int m_iSdiIconItemId;
- int m_iSdiRestoreItemId;
- int m_iSdiMinimizeItemId;
- int m_iSdiCloseItemId;
-
- KviTalPopupMenu * m_pWindowPopup;
- KviTalPopupMenu * m_pTileMethodPopup;
- KviFrame * m_pFrm;
protected:
void updateContentsSize();
- //void childMaximized(KviMdiChild *lpC);
+ void childMaximized(KviMdiChild *lpC);
void childMinimized(KviMdiChild *lpC,bool bWasMaximized);
void childRestored(KviMdiChild *lpC,bool bWasMaximized);
void childMoved(KviMdiChild * lpC);
void maximizeChild(KviMdiChild * lpC);
- virtual void focusInEvent(QFocusEvent *e);
+
virtual void mousePressEvent(QMouseEvent *e);
- virtual void resizeEvent(QResizeEvent *e);
virtual void paintEvent(QPaintEvent * event);
virtual bool focusNextPrevChild(bool pNext);
public slots:
@@ -107,7 +138,7 @@ public slots:
void expandVertical();
void expandHorizontal();
void minimizeAll();
- // void restoreAll(); <-- this does nothing
+ void restoreAll(); //<-- this does nothing (not working?)
void tile();
void toggleAutoTile();
@@ -121,20 +152,13 @@ protected slots:
void menuActivated(int id);
void tileMethodMenuActivated(int id);
void fillWindowPopup();
- void sdiMinimizeButtonDestroyed();
- void sdiRestoreButtonDestroyed();
- void sdiCloseButtonDestroyed();
- void sdiIconButtonDestroyed();
private:
void ensureNoMaximized();
void tileAllInternal(int maxWnds,bool bHorizontal);
QPoint getCascadePoint(int indexOfWindow);
- void enterSDIMode(KviMdiChild *lpC);
- void leaveSDIMode();
- void updateSDIMode();
-signals:
- void enteredSdiMode();
- void leftSdiMode();
+//signals:
+// void enteredSdiMode();
+// void leftSdiMode();
};
#endif //_KVI_MDIMANAGER_H_
diff --git a/src/kvirc/ui/kvi_userlistview.cpp b/src/kvirc/ui/kvi_userlistview.cpp
index 69a6751f6..3fedceb43 100644
--- a/src/kvirc/ui/kvi_userlistview.cpp
+++ b/src/kvirc/ui/kvi_userlistview.cpp
@@ -55,6 +55,7 @@
#include <QDateTime>
#include <QEvent>
#include <QPaintEvent>
+#include <QMdiSubWindow>
#ifdef COMPILE_PSEUDO_TRANSPARENCY
extern QPixmap * g_pShadedChildGlobalDesktopBackground;
@@ -1639,20 +1640,6 @@ void KviUserListViewArea::scrollBarMoved(int iNewVal)
void KviUserListViewArea::paintEvent(QPaintEvent * e)
{
// update the scroll bar
- // if the mdiManager is in SDI mode
- // and this window is attacched but is not the toplevel one
- // then it is hidden completely behind the other windows
- // and we can avoid to paint it :)
- if(!isVisible())
- return;
-
- if(g_pFrame->mdiManager()->isInSDIMode() &&
- (m_pListView->window()->mdiParent() != g_pFrame->mdiManager()->topChild()) &&
- (m_pListView->window()->mdiParent()))
- {
- return; // totally hidden behind other windows
- }
-
int iWidth = width() - m_pScrollBar->width();
QRect r = e->rect();
diff --git a/src/kvirc/ui/kvi_window.cpp b/src/kvirc/ui/kvi_window.cpp
index bb987d9b7..9fd8899d2 100644
--- a/src/kvirc/ui/kvi_window.cpp
+++ b/src/kvirc/ui/kvi_window.cpp
@@ -22,6 +22,11 @@
//
//=============================================================================
+/**
+* \file kvi_window.cpp
+* \brief Contains the KviWindow class
+*/
+
#define KVI_WINDOW_MIN_WIDTH 100
#define KVI_WINDOW_MIN_HEIGHT 100
@@ -663,6 +668,11 @@ void KviWindow::updateCaption()
g_pFrame->updateCaption();
}
+void KviWindow::updateCaptionListItem()
+{
+ if(m_pWindowListItem) m_pWindowListItem->captionChanged();
+}
+
void KviWindow::createSystemTextEncodingPopup()
{
if(!g_pMdiWindowSystemTextEncodingPopup)
@@ -731,7 +741,7 @@ void KviWindow::createSystemTextEncodingPopup()
connect(g_pMdiWindowSystemTextEncodingPopupStandard,SIGNAL(activated(int)),this,SLOT(systemTextEncodingPopupStandardActivated(int)));
}
-void KviWindow::systemPopupRequest(const QPoint &pnt)
+KviTalPopupMenu * KviWindow::generatePopup()
{
if(!g_pMdiWindowSystemMainPopup)
g_pMdiWindowSystemMainPopup = new KviTalPopupMenu();
@@ -779,6 +789,13 @@ void KviWindow::systemPopupRequest(const QPoint &pnt)
fillContextPopup(g_pMdiWindowSystemMainPopup);
+ return g_pMdiWindowSystemMainPopup;
+}
+
+void KviWindow::systemPopupRequest(const QPoint &pnt)
+{
+ generatePopup();
+
g_pMdiWindowSystemMainPopup->popup(pnt);
}
@@ -874,7 +891,6 @@ void KviWindow::delayedClose()
void KviWindow::closeEvent(QCloseEvent *e)
{
- debug("GOT CLOSE EVENT");
e->ignore();
g_pFrame->childWindowCloseRequest(this);
}
@@ -1158,24 +1174,20 @@ void KviWindow::maximize()
bool KviWindow::isMinimized()
{
if(mdiParent())
+ {
return (mdiParent()->state() == KviMdiChild::Minimized);
- else
- return QWidget::isMinimized();
+ }
+ return QWidget::isMinimized();
}
bool KviWindow::isMaximized()
{
// debug ("check maximized %s",mdiParent()->plainCaption().utf8().data());
if(mdiParent())
+ {
return (mdiParent()->state() == KviMdiChild::Maximized);
- // Heh...how to check it ?
- // Empirical check
- QRect rect = g_pApp->desktop()->screenGeometry(g_pApp->desktop()->primaryScreen());
-
- int wdth = (rect.width() * 75) / 100;
- int hght = (rect.height() * 75) / 100;
-
- return ((x() <= 1)&&(y() <= 1)&&(width() >= wdth)&&(height() >= hght));
+ }
+ return QWidget::isMaximized();
}
void KviWindow::restore()
@@ -1192,6 +1204,7 @@ void KviWindow::restore()
QRect KviWindow::externalGeometry()
{
+
#ifndef COMPILE_ON_MAC
return mdiParent() ? mdiParent()->restoredGeometry() : frameGeometry();
#else
diff --git a/src/kvirc/ui/kvi_window.h b/src/kvirc/ui/kvi_window.h
index ace129bce..5512badb8 100644
--- a/src/kvirc/ui/kvi_window.h
+++ b/src/kvirc/ui/kvi_window.h
@@ -24,6 +24,12 @@
//
//=============================================================================
+/**
+* \file kvi_window.h
+* \brief Contains the KviWindow class
+*/
+
+
#include "kvi_app.h"
#include "kvi_string.h"
#include "kvi_qstring.h"
@@ -118,6 +124,11 @@ class KviTalHBox;
#define KVI_ACTIVITY_VERYHOT 5
#define KVI_ACTIVITY_FIRE 6
+/**
+* \class KviWindow
+* \brief Base class for all windows in KVIrc
+*/
+
class KVIRC_API KviWindow : public QWidget
{
friend class KviInput;
@@ -169,6 +180,7 @@ public:
// The global ID of this window: unique in the application
inline QString id(){ return QString("%1").arg(m_uId); };
inline unsigned long int numericId(){ return m_uId; };
+ KviTalPopupMenu * generatePopup();
public:
// THIS is the function that should be used
inline const QString & windowName(){ return m_szName; };
@@ -262,6 +274,7 @@ public:
// virtual void getBaseLogFileName(KviStr &buffer);
virtual void getBaseLogFileName(QString &buffer);
virtual void updateCaption();
+ void updateCaptionListItem();
virtual void applyOptions();
virtual void updateIcon();
virtual void ownMessage(const QString &){};
diff --git a/src/modules/about/ENTRIES b/src/modules/about/ENTRIES
index 9672001f0..593a907cc 100644
--- a/src/modules/about/ENTRIES
+++ b/src/modules/about/ENTRIES
@@ -48,6 +48,12 @@ MAIL: voker57 at gmail dot com
ROLE: Bugfixing, cmake, kde4, other new stuff
TEXT: I'm not sure how i did it, but it works
+NAME: TheXception
+NICK: TheXception
+MAIL: kvirc@thexception.net
+ROLE: Bugfixing, german tutorials
+TEXT: everything is possible, it only needs its time.
+
SECTION: Translators
NAME: Ahinu
@@ -301,14 +307,8 @@ TEXT: <Grifisx> The difference between me and you is just that
TEXT: <Grifisx> You see things and you say "Why?" But I dream things
TEXT: <Grifisx> that never were and I say..."Why not?"
-NAME: TheXception
-NICK: TheXception
-MAIL: kvirc@thexception.net
-ROLE: bugfixes, german tutorials
-TEXT: everything is possible, it only needs its time.
-
NAME: Lorenzo Marcon
NICK: LoSko
MAIL: http://losko.altervista.org/nglfserv/
ROLE: Bug hunting and fixing, doc fixes, scripting (NGL File Server)
-TEXT: I don't know what I want, but I know how to get it. \ No newline at end of file
+TEXT: I don't know what I want, but I know how to get it.
diff --git a/src/modules/about/abouttext.inc b/src/modules/about/abouttext.inc
index e3b58bf40..f42f7262e 100644
--- a/src/modules/about/abouttext.inc
+++ b/src/modules/about/abouttext.inc
@@ -154,6 +154,25 @@ static const char * g_szAboutText = "" \
"\"I'm not sure how i did it, but it works\"" \
"</i></font></td></tr>" \
"</table><br><br>" \
+"<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">" \
+"<tr><td align=\"center\">" \
+"<font color=\"#000000\" size=\"+2\"><b>TheXception</b></font>" \
+"</td></tr>" \
+"<tr><td align=\"center\"><font color=\"#800020\" size=\"+2\"> (" \
+"TheXception" \
+")</font></td></tr>" \
+"<tr><td align=\"center\"><font color=\"#0000FF\" size=\"+1\">" \
+"[" \
+"kvirc@thexception.net" \
+"]" \
+"</font></td></tr>" \
+"<tr><td align=\"center\"><font color=\"#303030\">" \
+"Bugfixing, german tutorials" \
+"</font></td></tr>" \
+"<tr><td align=\"center\"><font color=\"#606060\"><i>" \
+"\"everything is possible, it only needs its time.\"" \
+"</i></font></td></tr>" \
+"</table><br><br>" \
"<br><table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">" \
"<tr><td align=\"center\">" \
"<font color=\"#000000\" size=\"+3\"><b>Translators</b></font>" \
@@ -877,25 +896,6 @@ static const char * g_szAboutText = "" \
"</table><br><br>" \
"<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">" \
"<tr><td align=\"center\">" \
-"<font color=\"#000000\" size=\"+2\"><b>TheXception</b></font>" \
-"</td></tr>" \
-"<tr><td align=\"center\"><font color=\"#800020\" size=\"+2\"> (" \
-"TheXception" \
-")</font></td></tr>" \
-"<tr><td align=\"center\"><font color=\"#0000FF\" size=\"+1\">" \
-"[" \
-"kvirc@thexception.net" \
-"]" \
-"</font></td></tr>" \
-"<tr><td align=\"center\"><font color=\"#303030\">" \
-"bugfixes, german tutorials" \
-"</font></td></tr>" \
-"<tr><td align=\"center\"><font color=\"#606060\"><i>" \
-"\"everything is possible, it only needs its time.\"" \
-"</i></font></td></tr>" \
-"</table><br><br>" \
-"<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">" \
-"<tr><td align=\"center\">" \
"<font color=\"#000000\" size=\"+2\"><b>Lorenzo Marcon</b></font>" \
"</td></tr>" \
"<tr><td align=\"center\"><font color=\"#800020\" size=\"+2\"> (" \