diff options
| author | 2008-11-04 00:30:47 +0000 | |
|---|---|---|
| committer | 2008-11-04 00:30:47 +0000 | |
| commit | 1ac6797cf7eeb2be675260f3fd60190eaa186623 (patch) | |
| tree | 503356efbef97676da6c62c5e63f5abd324b0c19 /src | |
| parent | fixed typo (diff) | |
| download | KVIrc-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.txt | 2 | ||||
| -rw-r--r-- | src/kvirc/kernel/kvi_irccontext.cpp | 21 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_frame.cpp | 64 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_frame.h | 22 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_ircview.cpp | 10 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_mdicaption.cpp | 262 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_mdicaption.h | 96 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_mdichild.cpp | 520 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_mdichild.h | 171 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_mdimanager.cpp | 846 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_mdimanager.h | 102 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_userlistview.cpp | 15 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_window.cpp | 37 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_window.h | 13 | ||||
| -rw-r--r-- | src/modules/about/ENTRIES | 14 | ||||
| -rw-r--r-- | src/modules/about/abouttext.inc | 38 |
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\"> (" \ |
