[rkward-cvs] SF.net SVN: rkward: [765] trunk/rkward

tfry at users.sourceforge.net tfry at users.sourceforge.net
Wed Sep 27 12:54:11 UTC 2006


Revision: 765
          http://svn.sourceforge.net/rkward/?rev=765&view=rev
Author:   tfry
Date:     2006-09-27 05:54:04 -0700 (Wed, 27 Sep 2006)

Log Message:
-----------
Fix some bugs in RKWorkplaceView

Modified Paths:
--------------
    trunk/rkward/ChangeLog
    trunk/rkward/TODO
    trunk/rkward/rkward/dataeditor/twintable.cpp
    trunk/rkward/rkward/windows/rkmdiwindow.h
    trunk/rkward/rkward/windows/rkworkplaceview.cpp

Modified: trunk/rkward/ChangeLog
===================================================================
--- trunk/rkward/ChangeLog	2006-09-27 11:16:08 UTC (rev 764)
+++ trunk/rkward/ChangeLog	2006-09-27 12:54:04 UTC (rev 765)
@@ -1,3 +1,4 @@
+- fix a long standing (but hard to trigger) crash while closing data editor window
 - fix "Open R Script File" filename ending filter
 - add mismatching brace detection to syntax highlighting
 - yet another crash on more than 100 rows bug fixed

Modified: trunk/rkward/TODO
===================================================================
--- trunk/rkward/TODO	2006-09-27 11:16:08 UTC (rev 764)
+++ trunk/rkward/TODO	2006-09-27 12:54:04 UTC (rev 765)
@@ -8,8 +8,6 @@
 Bugs:
 	- There seems to be a race condition at startup, leading to a crash in doPostInit () in rkward.cpp. (Un-)Fortunately it triggers only rarely, and I have not yet figured out, when it occurs.
 	- "cannot create html package index" when installing package as a regular user (due to R.home ("doc") not writable)
-	- on viewDeactivated, it may not be safe to call setCaption and there activeWindow (). Apparently, the pointer may be invalid:
-		- start rkward with empty table. open command editor. switch back to table. Edit some stuff in the table. Ctrl+W. Crash
 	- produce many readline calls (e.g. "for (i in 1:10) readline()") repeatedly and cancel all of them.
 		- Sometimes only the readine is interrupted, sometimes the whole command (might be R's fault? But works fine in plain R)
 		- Occasionally this seems to leave R in a bad (semi-crashed) state

Modified: trunk/rkward/rkward/dataeditor/twintable.cpp
===================================================================
--- trunk/rkward/rkward/dataeditor/twintable.cpp	2006-09-27 11:16:08 UTC (rev 764)
+++ trunk/rkward/rkward/dataeditor/twintable.cpp	2006-09-27 12:54:04 UTC (rev 765)
@@ -107,6 +107,8 @@
 	left_header_menu->insertItem (i18n ("Insert new case below"), this, SLOT (insertRowBelow ()), 0, HEADER_MENU_ID_ADD_ROW_BELOW);
 	left_header_menu->insertItem (QString::null, this, SLOT (deleteRow ()), 0, HEADER_MENU_ID_DEL_ROW);
 	left_header_menu->insertItem (QString::null, this, SLOT (deleteRows ()), 0, HEADER_MENU_ID_DEL_ROWS);
+
+	setFocusPolicy (QWidget::StrongFocus);
 }
 
 TwinTable::~TwinTable() {

Modified: trunk/rkward/rkward/windows/rkmdiwindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkmdiwindow.h	2006-09-27 11:16:08 UTC (rev 764)
+++ trunk/rkward/rkward/windows/rkmdiwindow.h	2006-09-27 12:54:04 UTC (rev 765)
@@ -46,7 +46,7 @@
 @param parent parent widget
 @param type Type of window */
 	RKMDIWindow (QWidget *parent, Type type);
-	~RKMDIWindow ();
+	virtual ~RKMDIWindow ();
 public:
 	virtual bool isModified () = 0;
 	virtual QString fullCaption ();

Modified: trunk/rkward/rkward/windows/rkworkplaceview.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkworkplaceview.cpp	2006-09-27 11:16:08 UTC (rev 764)
+++ trunk/rkward/rkward/windows/rkworkplaceview.cpp	2006-09-27 12:54:04 UTC (rev 765)
@@ -19,6 +19,8 @@
 
 #include <qtabbar.h>
 #include <qwidgetstack.h>
+#include <qapplication.h>
+#include <qevent.h>
 #include <qlayout.h>
 #include <qiconset.h>
 
@@ -56,20 +58,19 @@
 		if (tabs->count () > 1) tabs->show ();
 	}
 
-	tabs->setCurrentTab (id);	// activates the newly added window
+	setPage (id);		// active new window
 }
 
 void RKWorkplaceView::removePage (RKMDIWindow *widget, bool destroyed) {
 	RK_TRACE (APP);
 
-	int id = idOfWidget (widget);
+	int id = idOfWidget (widget);		// which page is it?
 	RK_DO (if (id == -1) qDebug ("did not find page in RKWorkplaceView::removePage"), APP, DL_WARNING);
-	pages.remove (id);
 	if (!destroyed) disconnect (widget, SIGNAL (captionChanged (RKMDIWindow *)), this, SLOT (childCaptionChanged (RKMDIWindow *)));
 
-	int oldindex = tabs->indexOf (tabs->currentTab ());
+	int oldindex = tabs->indexOf (tabs->currentTab ());	// which page will have to be activated later?
 	int oldcount = tabs->count ();
-	QTab *new_tab = tabs->tab (oldindex);
+	QTab *new_tab = tabs->tabAt (oldindex);
 	if (widget == activePage ()) {
 		if (oldindex >= 1) {
 			new_tab = tabs->tabAt (oldindex - 1);
@@ -79,15 +80,20 @@
 			new_tab = 0;
 		}
 	}
-	if (new_tab == 0) RK_ASSERT (oldcount == 1);
 
-	if (new_tab) tabs->setCurrentTab (new_tab);
-	else emit (pageChanged (0));
+	widgets->removeWidget (widget);			// remove
+	tabs->removeTab (tabs->tab (id));
+	pages.remove (id);
 
-	if (oldcount <= 2) tabs->hide ();
-
-	widgets->removeWidget (widget);
-	tabs->removeTab (tabs->tab (oldindex));
+	if (oldcount <= 2) tabs->hide ();		// activate next page
+	if (new_tab == 0) {
+		RK_ASSERT (oldcount == 1);
+		setCaption (QString ());
+		emit (pageChanged (0));
+	} else {
+		//tabs->setCurrentTab (new_tab); 	// somehome this version is NOT safe! (tabbar fails to emit signal?)
+		setPage (new_tab->identifier ());
+	}
 }
 
 void RKWorkplaceView::setActivePage (RKMDIWindow *widget) {
@@ -101,9 +107,11 @@
 
 RKMDIWindow *RKWorkplaceView::activePage () {
 	RK_TRACE (APP);
+	RK_DO (qDebug ("active page %d: %d, visible: %d", tabs->currentTab (), (int) pages[tabs->currentTab ()], (int) widgets->visibleWidget ()), APP, DL_DEBUG);
 
 	if (tabs->currentTab () == -1) return 0;
-	RK_ASSERT (pages[tabs->currentTab ()] == widgets->visibleWidget ());
+	// The assert below can in fact fail temporarily, as the widgetstack (widgets) does not update immediately after widgets->raiseWidget ().
+	//RK_ASSERT (pages[tabs->currentTab ()] == widgets->visibleWidget ());
 	return (pages[tabs->currentTab ()]);
 }
 
@@ -124,9 +132,17 @@
 		return;		// will get here again via signal from tabs
 	}
 
+	RK_DO (qDebug ("setting page %d: %d", page, (int) pages[page]), APP, DL_DEBUG);
 	RKMDIWindow *window = pages[page];
 	widgets->raiseWidget (window);
+
 	window->setFocus ();
+/*	// a slightly more convoluted version of window->setFocus, which set's the focus after the window has been shown, but unfortunately it does not work either
+	QFocusEvent *focus = new QFocusEvent (QEvent::FocusIn);
+	focus->setReason (QFocusEvent::Mouse);
+	qApp->postEvent (window, focus); */
+
+	emit (pageChanged (window));
 	setCaption (window->shortCaption ());
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the rkward-tracker mailing list