2024-11-18 09:33:05 +01:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
2023-12-20 19:13:50 +05:30
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2024-08-06 15:19:21 +02:00
|
|
|
#include "QtInstanceButton.hxx"
|
2023-12-20 19:13:50 +05:30
|
|
|
#include "QtInstanceDialog.hxx"
|
|
|
|
#include <QtWidgets/QMessageBox>
|
|
|
|
|
2024-10-02 09:13:05 +02:00
|
|
|
class QtInstanceMessageDialog : public QtInstanceDialog, public virtual weld::MessageDialog
|
2023-12-20 19:13:50 +05:30
|
|
|
{
|
2024-10-02 09:13:05 +02:00
|
|
|
Q_OBJECT
|
2024-02-03 11:35:33 +01:00
|
|
|
|
2023-12-20 19:13:50 +05:30
|
|
|
private:
|
|
|
|
QMessageBox* m_pMessageDialog;
|
tdf#130857 qt weld: Add layout/widget for extra msg dialog controls
weld::MessageDialog::weld_message_area needs to return
a weld::Container that can be used to insert additional
controls into a message dialog.
In order to implement this for QtInstanceMessageDialog,
insert an additional widget with a QVBoxLayout layout
into the QMessageBox layout, and return that one.
In order to ensure that the extra controls are inserted
in between the labels holding the text in the message dialog
and the button box, make use of the known implementation detail
that Qt's QMessageBox uses QGridLayout for its layout
(see QMessageBoxPrivate::setupLayout in qtbase [1]),
find where the last label is positioned, shift everything
after the last label down by one row in the grid layout,
then insert the extra widget in the now empty row.
If QMessageBox internals ever change to use a different layout,...,
then this will have to be adjusted in the future, but it
works fine in my tests with both, Qt 5.15 and current
qtbase dev (as of commit 4c0b45553862d3eff35906d02ea5e2afd9252bbd).
This will be needed e.g. by the "LibreOfficDev Help Not Installed"
dialog that shows up when pressing F1 in a build not including
the local help.
[1] https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qmessagebox.cpp?id=4c0b45553862d3eff35906d02ea5e2afd9252bbd#n290
Change-Id: I2153add5145a4655800ca89f8e943610014b1021
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176091
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Tested-by: Jenkins
2024-11-05 17:40:28 +01:00
|
|
|
// widget containing a layout to add additional items
|
|
|
|
QWidget* m_pExtraControlsContainer;
|
2023-12-20 19:13:50 +05:30
|
|
|
|
|
|
|
public:
|
|
|
|
QtInstanceMessageDialog(QMessageBox* pMessageDialog);
|
|
|
|
|
|
|
|
virtual void set_primary_text(const rtl::OUString& rText) override;
|
|
|
|
|
|
|
|
virtual void set_secondary_text(const rtl::OUString& rText) override;
|
|
|
|
|
2024-11-10 23:01:07 +01:00
|
|
|
virtual std::unique_ptr<weld::Container> weld_message_area() override;
|
2023-12-20 19:13:50 +05:30
|
|
|
|
|
|
|
virtual OUString get_primary_text() const override;
|
|
|
|
|
|
|
|
virtual OUString get_secondary_text() const override;
|
2024-01-23 13:47:21 +01:00
|
|
|
|
|
|
|
// weld::Dialog overrides
|
|
|
|
virtual void add_button(const OUString& rText, int nResponse,
|
|
|
|
const OUString& rHelpId = {}) override;
|
2024-01-23 14:04:54 +01:00
|
|
|
virtual void set_default_response(int nResponse) override;
|
2024-11-26 22:11:16 +01:00
|
|
|
std::unique_ptr<weld::Button> weld_button_for_response(int nResponse) override;
|
2024-01-23 13:47:21 +01:00
|
|
|
virtual int run() override;
|
2024-02-03 11:35:33 +01:00
|
|
|
|
2024-08-06 15:04:57 +02:00
|
|
|
private:
|
tdf#130857 qt weld: Add layout/widget for extra msg dialog controls
weld::MessageDialog::weld_message_area needs to return
a weld::Container that can be used to insert additional
controls into a message dialog.
In order to implement this for QtInstanceMessageDialog,
insert an additional widget with a QVBoxLayout layout
into the QMessageBox layout, and return that one.
In order to ensure that the extra controls are inserted
in between the labels holding the text in the message dialog
and the button box, make use of the known implementation detail
that Qt's QMessageBox uses QGridLayout for its layout
(see QMessageBoxPrivate::setupLayout in qtbase [1]),
find where the last label is positioned, shift everything
after the last label down by one row in the grid layout,
then insert the extra widget in the now empty row.
If QMessageBox internals ever change to use a different layout,...,
then this will have to be adjusted in the future, but it
works fine in my tests with both, Qt 5.15 and current
qtbase dev (as of commit 4c0b45553862d3eff35906d02ea5e2afd9252bbd).
This will be needed e.g. by the "LibreOfficDev Help Not Installed"
dialog that shows up when pressing F1 in a build not including
the local help.
[1] https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qmessagebox.cpp?id=4c0b45553862d3eff35906d02ea5e2afd9252bbd#n290
Change-Id: I2153add5145a4655800ca89f8e943610014b1021
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176091
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Tested-by: Jenkins
2024-11-05 17:40:28 +01:00
|
|
|
QWidget* addWidgetForExtraItems();
|
2024-08-06 15:04:57 +02:00
|
|
|
virtual QPushButton* buttonForResponseCode(int nResponse);
|
|
|
|
|
tdf#130857 qt weld: Move runAsync logic to QtInstanceDialog
Refactor the handling for running a QtInstanceMessageDialog
asynchronously, and reuse the logic for the QtInstanceDialog
base class:
Move implementations for both QtInstanceMessageDialog::runAsync
methods and the involved class members from QtInstanceMessageDialog
to QtInstanceDialog.
Split the previous logic from
QtInstanceMessageDialog::dialogFinished into two methods:
* move most of the logic as is to a new virtual slot
in the base class, QtInstanceDialog::dialogFinished
* override the base class implementation to get the
response code from the actually clicked button
via the PROPERTY_VCL_RESPONSE_CODE property
set on that button, and call the base class
method with that one.
For QtInstanceDialog, there's no QDialog::clickedButton
method that could be used to retrieve the clicked button,
but it's also not needed there, because there a slot
connected to the QAbstractButton::clicked signal that triggers
closing the dialog, and passes the proper response code of the
corresponding button already, see
commit 08b55df5c9e42c1ccb78a156261811875629342a
Author: Michael Weghorn <m.weghorn@posteo.de>
Date: Sat Sep 28 00:32:15 2024 +0200
tdf#130857 qt weld: Close dialog on button click
With this commit in place, QtInstanceDialog can now
also be run asynchronously, instead of the
QtInstanceDialog::runAsync methods
just returning true without doing anything.
This will be needed e.g. when adding support for the
"Tools" -> "Word Count" dialog in Writer.
Change-Id: I4edb9443cb11d1dc831a18f708cdbdd67c239aa6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174374
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Tested-by: Jenkins
2024-10-02 09:33:08 +02:00
|
|
|
protected slots:
|
|
|
|
virtual void dialogFinished(int nResult) override;
|
2023-12-20 19:13:50 +05:30
|
|
|
};
|
|
|
|
|
2024-11-18 09:33:05 +01:00
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|