qskinny/src/dialogs/QskDialogWindow.cpp

125 lines
2.6 KiB
C++
Raw Normal View History

2017-07-21 16:21:34 +00:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskDialogWindow.h"
2018-07-19 12:10:48 +00:00
#include <qeventloop.h>
#include <qpointer.h>
2017-07-21 16:21:34 +00:00
class QskDialogWindow::PrivateData
{
2018-08-03 06:15:28 +00:00
public:
PrivateData()
: result( QskDialog::Rejected )
, inDone( false )
2017-07-21 16:21:34 +00:00
{
}
QskDialog::DialogCode result : 1;
bool inDone : 1; // flag blocking recursive done calls
};
2018-08-03 06:15:28 +00:00
QskDialogWindow::QskDialogWindow( QWindow* parent )
: Inherited( parent )
, m_data( new PrivateData() )
2017-07-21 16:21:34 +00:00
{
2018-08-03 06:15:28 +00:00
setFlags( Qt::Dialog | Qt::WindowTitleHint | Qt::WindowCloseButtonHint |
Qt::WindowSystemMenuHint | Qt::WindowContextHelpButtonHint );
2017-07-21 16:21:34 +00:00
}
QskDialogWindow::~QskDialogWindow()
{
}
void QskDialogWindow::setResult( QskDialog::DialogCode result )
{
m_data->result = result;
}
QskDialog::DialogCode QskDialogWindow::result() const
{
return m_data->result;
}
QskDialog::DialogCode QskDialogWindow::exec()
{
const bool deleteOnClose = this->deleteOnClose();
setDeleteOnClose( false );
show();
QEventLoop eventLoop;
connect( this, &QskDialogWindow::finished, &eventLoop, &QEventLoop::quit );
( void ) eventLoop.exec( QEventLoop::DialogExec );
const QskDialog::DialogCode result =
static_cast< QskDialog::DialogCode >( m_data->result );
if ( deleteOnClose )
delete this;
return result;
}
void QskDialogWindow::done( QskDialog::DialogCode result )
{
m_data->result = result;
Q_EMIT finished( result );
if ( result == QskDialog::Accepted )
Q_EMIT accepted();
else
Q_EMIT rejected();
const QPointer< QObject > that = this;
m_data->inDone = true;
close();
if ( that )
{
// we might be deleted during close
m_data->inDone = false;
}
}
void QskDialogWindow::accept()
{
done( QskDialog::Accepted );
}
void QskDialogWindow::reject()
{
done( QskDialog::Rejected );
}
bool QskDialogWindow::event( QEvent* event )
{
if ( event->type() == QEvent::Close )
{
if ( !m_data->inDone )
done( QskDialog::Rejected );
}
return Inherited::event( event );
}
void QskDialogWindow::keyPressEvent( QKeyEvent* event )
{
if ( event->matches( QKeySequence::Cancel ) )
{
// using shortcuts instead ???
reject();
return;
}
Inherited::keyPressEvent( event );
}
#include "moc_QskDialogWindow.cpp"