[prev in list] [next in list] [prev in thread] [next in thread]
List: koffice-devel
Subject: Re: kword frameUnderMouse bug ?
From: Frank Dekervel <Frank.dekervel () student ! kuleuven ! ac ! Be>
Date: 2002-02-28 14:39:39
[Download RAW message or body]
Op woensdag 27 februari 2002 16:17, schreef Thomas Zander:
> Please give it a try.
hi,
This should be better then.
* kwdoc contains logic for going deeper than the currently selected frame if
wanted.
* kwcanvas uses this to do:
- control = select multiple frames & go deeper if needed
- control+shift = select only one frame.
the behaviour is fine for me, but i guess there might be some subtle errors.
please have a look at it.
greetings,
Frank
["kwcanvas.diff" (text/x-diff)]
Index: kwcanvas.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwcanvas.cc,v
retrieving revision 1.322
diff -u -2 -d -p -b -r1.322 kwcanvas.cc
--- kwcanvas.cc 2002/02/23 15:52:42 1.322
+++ kwcanvas.cc 2002/02/28 14:06:22
@@ -323,7 +323,15 @@ void KWCanvas::mpEditFrame( QMouseEvent
{
if ( ! ( e->state() & ShiftButton || e->state() & ControlButton ) )
- selectAllFrames( FALSE );
- selectFrame( frame, TRUE );
+ selectAllFrames( FALSE ); // if we don't hold shift or control, destroy old frame selection
+ KWFrame *f = m_doc->frameUnderMouse(nPoint, 0L, true);
+ if (f == frame) {
+ if (e->state() & ShiftButton)
+ selectAllFrames( FALSE ); // shift deselects everything.
+ selectFrame( frame, TRUE ); // select the frame.
}
+ else
+ m_ctrlClickOnSelectedFrame = true;
+
+ }
else if(frame) // clicked on a frame that was already selected
{
@@ -1105,11 +1113,14 @@ void KWCanvas::mrEditFrame( QMouseEvent
{
// No frame was moved or resized.
- // If CTRL+click on selected frame, unselect it
if ( e->state() & ControlButton )
{
KWFrame * frame = m_doc->frameUnderMouse( nPoint );
- if ( m_ctrlClickOnSelectedFrame && frame->isSelected() )
+ if ( m_ctrlClickOnSelectedFrame /* && frame->isSelected() */ ) // kervel: why the && ?
{
- selectFrame( frame, false );
+ KWFrame *f = m_doc->frameUnderMouse( nPoint,0L,true );
+ if (e->state() & ShiftButton)
+ selectAllFrames( false );
+ if (f)
+ selectFrame(f,true);
emit frameSelectedChanged();
}
["kwdoc.diff" (text/x-diff)]
Index: kwdoc.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwdoc.cc,v
retrieving revision 1.330
diff -u -2 -d -p -b -r1.330 kwdoc.cc
--- kwdoc.cc 2002/02/22 23:30:31 1.330
+++ kwdoc.cc 2002/02/28 04:15:43
@@ -2366,13 +2366,109 @@ KWFrameSet * KWDocument::frameSetByName(
}
-KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border )
+KWFrame * KWDocument::deepestInlineFrame(KWFrame *parent, const QPoint& nPoint, bool *border) {
+ KWFrameSet *fs=parent->frameSet();
+ KoPoint docPoint( unzoomPoint( nPoint ) );
+ QPtrListIterator<KWFrameSet> fit = framesetsIterator();
+
+ for (fit.toLast(); fit.current(); --fit) // z-order
+ {
+ KWFrameSet *frameSet = fit.current();
+ if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
+ continue;
+ if (!frameSet->isFloating())
+ continue;
+ if (fs != frameSet->anchorFrameset())
+ continue;
+ // frameset is a child of parent. now find out if its under the mouse.
+ KWFrame *frsFrame = frameSet->frameByBorder(nPoint);
+ // yup it is. its even the border. stop looking for childs.
+ if (frsFrame) {
+ if (border) *border=true;
+ return frsFrame;
+ }
+ frsFrame = frameSet->frameAtPos(docPoint.x(),docPoint.y());
+ // yup it is. look for childs
+ if (frsFrame) {
+ return deepestInlineFrame(frsFrame,nPoint,border);
+ }
+ }
+ if (*border) border=false;
+ return parent;
+}
+
+KWFrame * KWDocument::frameBelowFrame(const QPoint& nPoint, KWFrame *frame, bool *border) {
+
+ KWFrameSet *fs = frame->frameSet();
+ KoPoint docPoint( unzoomPoint( nPoint ) );
+ bool reallyStartLooking=false;
+ if (fs->isFloating()) {
+ // inline frame: the frame below is the parent frame.
+ // since we know nPoint is already in frame, we don't have to check it for anchorFrame here.
+ KWFrameSet *frameSet = fs->anchorFrameset();
+ KWFrame *f = frameSet->frameByBorder(nPoint);
+ // for comments see below.
+ if (f) {
+ if (border) *border=true;
+ return f;
+ }
+ f = frameSet->frameAtPos(docPoint.x(),docPoint.y());
+ if (f) {
+ if (border) *border=false;
+ return f;
+ }
+
+
+ } else {
+ QPtrListIterator<KWFrameSet> fit = framesetsIterator();
+ for (fit.toLast(); fit.current(); --fit) // z-order
+ {
+ KWFrameSet *frameSet = fit.current();
+ if ( !(frameSet->isVisible()) || frameSet->isRemoveableHeader() )
+ continue;
+ // we're not interested in floating frames here.
+ if (frameSet->isFloating())
+ continue;
+ // if we are really looking (we already found the given frameset in the z-ordered
+ // tree)
+ if (reallyStartLooking) {
+ KWFrame *f = frameSet->frameByBorder(nPoint);
+ // We found a frame below the given frame that is okay for a border.
+ if (f) {
+ if (border) *border=true;
+ return f;
+ }
+ // We found a frame below the given frame that is okay.
+ f = frameSet->frameAtPos(docPoint.x(),docPoint.y());
+ // return the deepest inline frame. Remember less deep inline frames
+ // are 'below' deeper inline frames.
+ if (f) {
+ return deepestInlineFrame(f,nPoint,border);
+ }
+ }
+
+ if (frameSet == fs)
+ reallyStartLooking=true;
+
+ }
+ return 0L;
+ }
+ return 0L;
+}
+
+
+KWFrame * KWDocument::topFrameUnderMouse( const QPoint& nPoint, bool* border)
{
KoPoint docPoint( unzoomPoint( nPoint ) );
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
+
for ( fit.toLast(); fit.current() ; --fit ) // z-order
{
KWFrameSet *frameSet = fit.current();
+ // only consider non-inline frames.
+ if (frameSet->isFloating())
+ continue;
if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
continue;
+
KWFrame * frame = frameSet->frameByBorder( nPoint );
if ( frame )
@@ -2382,14 +2478,36 @@ KWFrame * KWDocument::frameUnderMouse( c
}
frame = frameSet->frameAtPos( docPoint.x(), docPoint.y() );
- //kdDebug() << "KWDocument::frameAtPos found frameset " << frameSet
- // << " at position " << docPoint.x() << "," << docPoint.y() << endl;
if ( frame )
{
- if ( border ) *border = false;
- return frame;
+ return deepestInlineFrame(frame,nPoint,border);
}
}
return 0L;
+}
+
+KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border, bool firstNonSelected )
+{
+ KWFrame *candidate=topFrameUnderMouse(nPoint,border);
+ if (!firstNonSelected)
+ return candidate;
+ KWFrame *goDeeper=candidate;
+ bool foundselected=false;
+ while (goDeeper) {
+ while (goDeeper && goDeeper->isSelected())
+ {
+ goDeeper=frameBelowFrame(nPoint, goDeeper, border);
+ foundselected=true;
+ }
+ if (foundselected)
+ if (goDeeper)
+ return goDeeper;
+ else
+ return candidate;
+ else
+ goDeeper=frameBelowFrame(nPoint, goDeeper, border);
+
+ }
+ return candidate;
}
@@ -2409,16 +2527,12 @@ QString KWDocument::generateFramesetName
QCursor KWDocument::getMouseCursor( const QPoint &nPoint, bool controlPressed )
{
- QPtrListIterator<KWFrameSet> fit = framesetsIterator();
- for ( fit.toLast(); fit.current() ; --fit )
- {
- KWFrameSet *frameSet = fit.current();
- if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
- continue;
-
+ bool border=true;
+ KWFrame *frame = frameUnderMouse(nPoint, &border );
+ if (frame) {
QCursor cursor;
- if ( frameSet->getMouseCursor( nPoint, controlPressed, cursor ) )
+ KWFrameSet *frameSet = frame->frameSet();
+ if ( frameSet->getMouseCursor(nPoint, controlPressed, cursor))
return cursor;
}
-
return ibeamCursor;
}
Index: kwdoc.h
===================================================================
RCS file: /home/kde/koffice/kword/kwdoc.h,v
retrieving revision 1.145
diff -u -2 -d -p -b -r1.145 kwdoc.h
--- kwdoc.h 2002/02/22 23:30:31 1.145
+++ kwdoc.h 2002/02/28 04:15:44
@@ -175,5 +175,6 @@ public:
// Returns the frame under the mouse (or 0)
// The bool border is true if the mouse is on a border, false if it's inside the frame
- KWFrame * frameUnderMouse( const QPoint& nPoint, bool* border = 0L );
+ // if firstNonSelected is set to true, frameUnderMouse searches for the upper frame that is not selected.
+ KWFrame * frameUnderMouse( const QPoint& nPoint, bool* border = 0L, bool firstNonSelected = false );
// Return the total number of framesets
@@ -546,4 +547,9 @@ protected:
private:
+ //private helper functions for frameUnderMouse
+ KWFrame *topFrameUnderMouse( const QPoint& nPoint, bool* border=0L);
+ KWFrame *frameBelowFrame(const QPoint& nPoint, KWFrame *frame, bool *border=0L);
+ KWFrame *deepestInlineFrame(KWFrame *parent, const QPoint& nPoint, bool *border);
+
QPtrList<KWView> m_lstViews;
QPtrList<KWChild> m_lstChildren;
_______________________________________________
koffice-devel mailing list
koffice-devel@mail.kde.org
http://mail.kde.org/mailman/listinfo/koffice-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic