* Make the popup window itself be movable; fix the associated with the gripping

and moving problems.
This commit is contained in:
Konstantin Isakov 2009-02-06 18:43:07 +00:00
parent 12c49065e5
commit 61943519c1
6 changed files with 51 additions and 104 deletions

View file

@ -64,7 +64,6 @@ HEADERS += folding.hh \
dictlock.hh \
wordfinder.hh \
groupcombobox.hh \
griparea.hh \
keyboardstate.hh \
mouseover.hh \
preferences.hh
@ -80,8 +79,7 @@ SOURCES += folding.cc main.cc dictionary.cc md5.c config.cc sources.cc \
dsl.cc dsl_details.cc filetype.cc fsencoding.cc groups.cc \
groups_widgets.cc instances.cc article_maker.cc scanpopup.cc \
articleview.cc externalviewer.cc dictlock.cc wordfinder.cc \
groupcombobox.cc griparea.cc keyboardstate.cc mouseover.cc \
preferences.cc
groupcombobox.cc keyboardstate.cc mouseover.cc preferences.cc
win32 {
SOURCES += mouseover_win32/ThTypes.c

View file

@ -1,53 +0,0 @@
/* This file is (c) 2008-2009 Konstantin Isakov <ikm@users.berlios.de>
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
#include "griparea.hh"
#include <QMouseEvent>
GripArea::GripArea( QWidget * parent ): QWidget( parent )
{
setCursor( Qt::OpenHandCursor );
}
void GripArea::paintEvent( QPaintEvent * )
{
if ( isEnabled() )
{
QStylePainter p( this );
QStyleOptionDockWidgetV2 opt;
opt.initFrom( this );
p.drawControl( QStyle::CE_DockWidgetTitle, opt );
}
}
void GripArea::mousePressEvent( QMouseEvent * ev )
{
startPos = ev->globalPos();
setCursor( Qt::ClosedHandCursor );
}
void GripArea::mouseMoveEvent( QMouseEvent * ev )
{
QPoint newPos = ev->globalPos();
QPoint delta = newPos - startPos;
startPos = newPos;
// Find a top-level window
QWidget * w = this;
while( w && !w->isWindow() && w->windowType() != Qt::SubWindow )
w = w->parentWidget();
w->move( w->pos() + delta );
}
void GripArea::mouseReleaseEvent( QMouseEvent * )
{
setCursor( Qt::OpenHandCursor );
}

View file

@ -1,32 +0,0 @@
/* This file is (c) 2008-2009 Konstantin Isakov <ikm@users.berlios.de>
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
#ifndef __GRIPAREA_HH_INCLUDED__
#define __GRIPAREA_HH_INCLUDED__
#include <QWidget>
#include <QStylePainter>
#include <QStyleOptionDockWidget>
/// A grip area to move a window, looking like a dock widget's title area.
class GripArea: public QWidget
{
Q_OBJECT
public:
GripArea( QWidget * parent );
protected:
virtual void paintEvent( QPaintEvent * );
virtual void mousePressEvent( QMouseEvent * );
virtual void mouseMoveEvent( QMouseEvent * );
virtual void mouseReleaseEvent( QMouseEvent * );
private:
QPoint startPos;
};
#endif

View file

@ -158,9 +158,30 @@ vector< sptr< Dictionary::Class > > const & ScanPopup::getActiveDicts()
groups[ currentGroup ].dictionaries;
}
void ScanPopup::mousePressEvent( QMouseEvent * ev )
{
startPos = ev->globalPos();
setCursor( Qt::ClosedHandCursor );
QDialog::mousePressEvent( ev );
}
void ScanPopup::mouseMoveEvent( QMouseEvent * event )
{
if ( event->buttons() )
{
QPoint newPos = event->globalPos();
QPoint delta = newPos - startPos;
startPos = newPos;
// Find a top-level window
move( pos() + delta );
}
#ifdef Q_OS_WIN32
else
if ( !ui.pinButton->isChecked() )
{
if ( !mouseEnteredOnce )
@ -184,6 +205,12 @@ void ScanPopup::mouseMoveEvent( QMouseEvent * event )
QDialog::mouseMoveEvent( event );
}
void ScanPopup::mouseReleaseEvent( QMouseEvent * ev )
{
unsetCursor();
QDialog::mouseReleaseEvent( ev );
}
void ScanPopup::leaveEvent( QEvent * event )
{
QDialog::leaveEvent( event );
@ -193,9 +220,15 @@ void ScanPopup::leaveEvent( QEvent * event )
// Combo-boxes seem to generate leave events for their parents when
// unfolded, so we check coordinates as well.
// If the dialog is pinned, we don't hide the popup
if ( !ui.pinButton->isChecked() && !geometry().contains( QCursor::pos() ) )
// If the dialog is pinned, we don't hide the popup.
// If some mouse buttons are pressed, we don't hide the popup either,
// since it indicates the move operation is underway.
if ( !ui.pinButton->isChecked() && !geometry().contains( QCursor::pos() ) &&
QApplication::mouseButtons() == Qt::NoButton )
{
unsetCursor(); // Just in case
hide();
}
}
void ScanPopup::resizeEvent( QResizeEvent * event )

View file

@ -41,12 +41,16 @@ private:
bool mouseEnteredOnce;
QPoint startPos; // For window moving
void handleInputWord( QString const & );
void initiateTranslation();
vector< sptr< Dictionary::Class > > const & getActiveDicts();
virtual void mouseMoveEvent( QMouseEvent * event );
virtual void mousePressEvent( QMouseEvent * );
virtual void mouseMoveEvent( QMouseEvent * );
virtual void mouseReleaseEvent( QMouseEvent * );
virtual void leaveEvent( QEvent * event );
virtual void resizeEvent( QResizeEvent * event );

View file

@ -91,14 +91,17 @@
</widget>
</item>
<item>
<widget class="GripArea" name="gripArea" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="pinButton">
@ -130,12 +133,6 @@
<extends>QComboBox</extends>
<header>groupcombobox.hh</header>
</customwidget>
<customwidget>
<class>GripArea</class>
<extends>QWidget</extends>
<header>griparea.hh</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="resources.qrc"/>