--Boundary-00=_guvO+wg3y28uhIU Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Bugfix patch posted for review - Made it so that when you have it set to tabbing and emssage queue, that the tab doesnt appear until you click the view msg bubble (follow window behaviour) - Finally traced down the point of origin of all the saveOptions/writeDockConfig bugs, I was accessing a null pointer, because the m_activeView variable was not being cleared when you closed a chat view. Fixed. -- Jason Keirstead, BCS http://www.keirstead.org --Boundary-00=_guvO+wg3y28uhIU Content-Type: text/x-diff; charset="us-ascii"; name="libkopete.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="libkopete.diff" ? libkopete.diff Index: kopetemessagemanager.cpp =================================================================== RCS file: /home/kde/kdenonbeta/kopete/libkopete/kopetemessagemanager.cpp,v retrieving revision 1.92 diff -u -p -r1.92 kopetemessagemanager.cpp --- kopetemessagemanager.cpp 29 Jan 2003 20:30:13 -0000 1.92 +++ kopetemessagemanager.cpp 31 Jan 2003 22:40:03 -0000 @@ -384,7 +384,7 @@ void KopeteMessageManager::readMessages( //Raise the tab if needed if (d->mWidget == ChatWindow) - static_cast(myWindow)->makeWidgetDockVisible(mainView); + static_cast(myWindow)->setActiveView( static_cast(mainView)->dockWidget() ); //Only grab focus if we opened the chat ourselves if ( queueEmpty ) Index: ui/chatview.cpp =================================================================== RCS file: /home/kde/kdenonbeta/kopete/libkopete/ui/chatview.cpp,v retrieving revision 1.96 diff -u -p -r1.96 chatview.cpp --- ui/chatview.cpp 30 Jan 2003 00:16:39 -0000 1.96 +++ ui/chatview.cpp 31 Jan 2003 22:40:03 -0000 @@ -142,7 +142,7 @@ ChatView::ChatView( KopeteMessageManager //Finalize historyPos = -1; - m_mainWindow = (KopeteChatWindow*)parent; + m_mainWindow = static_cast(parent); membersDock = 0L; m_manager = mgr; backgroundFile = QString::null; @@ -150,6 +150,7 @@ ChatView::ChatView( KopeteMessageManager slotConfigChanged(); isModified = false; isActive = false; + isDocked = false; //Restore docking positions readOptions(); @@ -162,7 +163,6 @@ ChatView::ChatView( KopeteMessageManager ChatView::~ChatView() { kdDebug(14010) << k_funcinfo << "Destroying ChatView" << endl; - m_mainWindow->chatViewList.remove( this ); emit Closing(); } @@ -523,11 +523,13 @@ void ChatView::addChatMessage( KopeteMes isModified = true; if( m_dockWidget->parentDockTabGroup() ) m_dockWidget->parentDockTabGroup()->setTabLabel( m_dockWidget, m_captionText + QString::fromLatin1( "*" ) ); + } } -void ChatView::setActive(bool value) +void ChatView::setActive( bool value ) { + isActive = value; if( isActive ) { @@ -535,6 +537,15 @@ void ChatView::setActive(bool value) if( m_dockWidget->parentDockTabGroup() ) m_dockWidget->parentDockTabGroup()->setTabLabel( m_dockWidget, m_captionText ); } + else + { + saveOptions(); + } +} + +void ChatView::setDocked( bool value ) +{ + isDocked = value; } void ChatView::refreshView() Index: ui/chatview.h =================================================================== RCS file: /home/kde/kdenonbeta/kopete/libkopete/ui/chatview.h,v retrieving revision 1.46 diff -u -p -r1.46 chatview.h --- ui/chatview.h 29 Jan 2003 21:04:35 -0000 1.46 +++ ui/chatview.h 31 Jan 2003 22:40:03 -0000 @@ -117,6 +117,8 @@ namespace Kopete */ void setCurrentMessage( const KopeteMessage &newMessage ); + void setDocked( bool value ); + /** * Sets the placement of the members contact list. * DockLeft, DockRight, or DockNone. @@ -160,6 +162,8 @@ namespace Kopete * @return The contents of the view */ const QString viewsText() { return viewContents; } + + const bool docked() { return isDocked; } public slots: @@ -313,6 +317,7 @@ namespace Kopete bool bgOverride; bool isModified; bool isActive; + bool isDocked; QString backgroundFile; KRootPixmap *root; Index: ui/kopetechatwindow.cpp =================================================================== RCS file: /home/kde/kdenonbeta/kopete/libkopete/ui/kopetechatwindow.cpp,v retrieving revision 1.108 diff -u -p -r1.108 kopetechatwindow.cpp --- ui/kopetechatwindow.cpp 30 Jan 2003 00:16:39 -0000 1.108 +++ ui/kopetechatwindow.cpp 31 Jan 2003 22:40:03 -0000 @@ -60,13 +60,12 @@ KopeteChatWindow::KopeteChatWindow(QWidg initActions(); readOptions(); backgroundFile = 0L; - m_viewCount = 0; + chatViewList.setAutoDelete( false ); } KopeteChatWindow::~KopeteChatWindow() { kdDebug(14010) << k_funcinfo << endl; - m_viewCount = 0; slotViewClosed(); if( m_activeView ) m_activeView->saveOptions(); @@ -203,9 +202,6 @@ ChatView *KopeteChatWindow::addChatView( KDockWidget *mainView; - if( m_activeView != 0L ) - m_activeView->saveOptions(); - QString windowCaption = manager->chatName(); if( windowCaption.length() > 20 ) windowCaption = windowCaption.left( 20 ).append( QString::fromLatin1( "..." ) ); @@ -215,19 +211,23 @@ ChatView *KopeteChatWindow::addChatView( mainView->setToolTipString( manager->chatName() ); mainView->setDockWindowType( NET::Normal ); - mainView->setDockSite(KDockWidget::DockCenter); - mainView->setEnableDocking(KDockWidget::DockCenter); + mainView->setDockSite(KDockWidget::DockCenter | KDockWidget::DockNone); + mainView->setEnableDocking(KDockWidget::DockCenter | KDockWidget::DockNone); //If there is only one chatview on the window, ensure he is the main dock widget before proceeding if( m_activeView && ( chatViewList.count() == 1) ) { kdDebug(14010) << k_funcinfo << "setMainDockWidget called" << endl; setMainDockWidget( m_activeView->dockWidget() ); - setView( m_activeView ); + setView( m_activeView->dockWidget() ); + m_activeView->setDocked( true ); } - KDockWidget *currentMainView = getMainDockWidget(); - if( currentMainView == 0L ) + m_activeView = new ChatView ( manager, mainView, this ); + m_activeView->setCaptionText( windowCaption ); + chatViewList.append( m_activeView ); + + if( getMainDockWidget() == 0L ) { kdDebug(14010) << k_funcinfo << "Initial add, setMainDockWidget called" << endl; setMainDockWidget( mainView ); @@ -236,39 +236,29 @@ ChatView *KopeteChatWindow::addChatView( else { kdDebug(14010) << k_funcinfo << "Subsequent add, dock to main window" << endl; - mainView->manualDock( currentMainView, KDockWidget::DockCenter ); + mainView->hide(); + mainView->manualDock( 0L, KDockWidget::DockNone ); } - - m_activeView = new ChatView ( manager, mainView, this ); - m_activeView->setCaptionText( windowCaption ); - chatViewList.append( m_activeView ); + mainView->setWidget( m_activeView ); - //Lock this for now since re-parenting doesnt work, dont let them mess their view up - mainView->setEnableDocking(KDockWidget::DockCenter); - KWin::setIcons( winId(), protocolIcon, protocolIcon ); setCaption( windowCaption, false ); connect( mainView, SIGNAL(headerCloseButtonClicked()), mainView, SLOT(deleteLater()) ); connect( m_activeView, SIGNAL(Closing()), this, SLOT(slotViewClosed()) ); - - if( mainView->parentDockTabGroup() ) - { - connect ( mainView->parentDockTabGroup(), SIGNAL(currentChanged(QWidget *)), this, SLOT(setActiveView(QWidget *)) ); - kdDebug(14010) << k_funcinfo << "Parent tab group exists" << endl; - } updateMembersActions(); - m_viewCount++; return m_activeView; } void KopeteChatWindow::slotViewClosed() { - --m_viewCount; - if( m_viewCount <= 0 ) + chatViewList.remove( m_activeView ); + m_activeView = 0L; + + if( chatViewList.count() <= 0 ) { if( backgroundFile != 0L ) { @@ -295,13 +285,33 @@ void KopeteChatWindow::updateBackground( void KopeteChatWindow::setActiveView( QWidget* active ) { kdDebug(14010) << k_funcinfo << endl; - m_activeView->setActive(false); - m_activeView = (ChatView*)((KDockWidget*)active)->getWidget(); - m_activeView->setActive(true); + + //If there is an active view, tell it isn't active anymore + if( m_activeView ) + m_activeView->setActive( false ); + + //Get the view switched to + KDockWidget *activeDock = static_cast(active); + m_activeView = static_cast( activeDock->getWidget() ); + if( !m_activeView->docked() ) + { + kdDebug(14010) << k_funcinfo << "View is not docked, docking in now" << endl; + activeDock->manualDock( getMainDockWidget(), KDockWidget::DockCenter ); + m_activeView->setDocked( true ); + activeDock->setEnableDocking(KDockWidget::DockCenter); + connect ( activeDock->parentDockTabGroup(), SIGNAL(currentChanged(QWidget *)), this, SLOT(setActiveView(QWidget *)) ); + } + + //Tell it it is active + m_activeView->setActive( true ); + //Raise the tab + activeDock->makeDockVisible(); + //Update window caption to match setCaption( m_activeView->caption(), false ); + //Update icons to match protocolIcon = UserIcon( m_activeView->manager()->protocol()->protocolIcon() ); KWin::setIcons( winId(), protocolIcon, protocolIcon ); - + //Update chat members actions updateMembersActions(); } Index: ui/kopetechatwindow.h =================================================================== RCS file: /home/kde/kdenonbeta/kopete/libkopete/ui/kopetechatwindow.h,v retrieving revision 1.57 diff -u -p -r1.57 kopetechatwindow.h --- ui/kopetechatwindow.h 30 Jan 2003 00:16:39 -0000 1.57 +++ ui/kopetechatwindow.h 31 Jan 2003 22:40:03 -0000 @@ -85,7 +85,6 @@ private: ChatView *m_activeView; bool widgetSet; const KopeteContact *m_us; - int m_viewCount; KAction* editCut; KAction* editCopy; --Boundary-00=_guvO+wg3y28uhIU-- _______________________________________________ Kopete-devel mailing list Kopete-devel@mail.kde.org http://mail.kde.org/mailman/listinfo/kopete-devel