[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