5#include <QCoreApplication>
9#if defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
10#include <QGuiApplication>
14#if defined(QT_UTILITIES_GUI_QTWIDGETS)
15#include <QApplication>
17#if (QT_VERSION < QT_VERSION_CHECK(5, 10, 0))
18#include <QDesktopWidget>
33 switch (documentStatus) {
35 if (documentPath.isEmpty()) {
36 return QCoreApplication::translate(
"Utilities::windowTitle",
"Unsaved - %1").arg(QCoreApplication::applicationName());
38 const QFileInfo file(documentPath);
39 return QCoreApplication::translate(
"Utilities::windowTitle",
"%1 - %2 - %3")
40 .arg(file.fileName(), file.dir().path(), QCoreApplication::applicationName());
43 if (documentPath.isEmpty()) {
44 return QCoreApplication::translate(
"Utilities::windowTitle",
"*Unsaved - %1").arg(QCoreApplication::applicationName());
46 const QFileInfo file(documentPath);
47 return QCoreApplication::translate(
"Utilities::windowTitle",
"*%1 - %2 - %3")
48 .arg(file.fileName(), file.dir().path(), QCoreApplication::applicationName());
51 return QCoreApplication::applicationName();
58#if defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
64QColor windowFrameColorForPalette(
const QPalette &palette)
66 return palette.window().color().darker(108);
72QColor windowFrameColor()
74 return windowFrameColorForPalette(QGuiApplication::palette());
80QColor instructionTextColorForPalette(
const QPalette &palette)
82 return isPaletteDark(palette) ? palette.text().color() : QColor(0x00, 0x33, 0x99);
88QColor instructionTextColor()
90 return instructionTextColorForPalette(QGuiApplication::palette());
98QString dialogStyleForPalette(
const QPalette &palette)
101 return QStringLiteral(
"#mainWidget { color: palette(text); background-color: "
102 "palette(base); border: none; }"
103 "#bottomWidget { background-color: palette(window); "
104 "color: palette(window-text); border-top: 1px solid %1; }"
105 "QMessageBox QLabel, QInputDialog QLabel, "
106 "*[classNames~=\"heading\"] { font-size: 12pt; color: %2; "
108 "*[classNames~=\"input-invalid\"] { color: red; }")
109 .arg(windowFrameColorForPalette(palette).name(), instructionTextColorForPalette(palette).name());
112 return QStringLiteral(
"*[classNames~=\"heading\"] { font-weight: bold; }"
113 "*[classNames~=\"input-invalid\"] { color: red; }");
121const QString &dialogStyle()
123 static const auto style = dialogStyleForPalette(QGuiApplication::palette());
127#ifdef QT_UTILITIES_GUI_QTWIDGETS
129QRect availableScreenGeometryAtPoint(
const QPoint &point)
131#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
132 QScreen *
const screen = QGuiApplication::screenAt(point);
136 return screen->availableGeometry();
138 return QApplication::desktop()->availableGeometry(point);
143static QRect shrinkRectByMargins(QRect rect,
const QMargins &margins)
145 rect.setLeft(rect.left() + margins.left());
146 rect.setTop(rect.top() + margins.top());
147 rect.setRight(rect.right() - margins.right());
148 rect.setBottom(rect.bottom() - margins.bottom());
152static QRect limitRect(QRect rect,
const QRect &bounds)
154 if (rect.left() < bounds.left()) {
155 rect.setLeft(bounds.left());
157 if (rect.top() < bounds.top()) {
158 rect.setTop(bounds.top());
160 if (rect.right() > bounds.right()) {
161 rect.setRight(bounds.right());
163 if (rect.bottom() > bounds.bottom()) {
164 rect.setBottom(bounds.bottom());
169static QMargins widgetFrame(QWidget *widget,
const QMargins &defaultAssumption = QMargins(10, 25, 10, 10))
171 if (!widget->isWindow()) {
174 const auto widgetGeometry = widget->geometry();
175 const auto frameGeometry = widget->frameGeometry();
176 const auto frame = QMargins(widgetGeometry.left() - frameGeometry.left(), widgetGeometry.top() - frameGeometry.top(),
177 frameGeometry.right() - widgetGeometry.right(), frameGeometry.bottom() - widgetGeometry.bottom());
178 return frame.isNull() ? defaultAssumption : frame;
181static bool centerWidgetInternal(QWidget *widget,
const QWidget *parent,
const QPoint *position,
bool avoidOverflow)
183 const auto availableGeometry = parent ? parent->geometry() : availableScreenGeometryAtPoint(position ? *position : QCursor::pos());
184 const auto alignedRect = QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, widget->size(), availableGeometry);
185 if (!avoidOverflow) {
186 widget->setGeometry(alignedRect);
189 const auto limitedRect = limitRect(alignedRect, shrinkRectByMargins(availableGeometry, widgetFrame(widget)));
190 widget->setGeometry(limitedRect);
191 return alignedRect != limitedRect;
200void centerWidget(QWidget *widget,
const QWidget *parent,
const QPoint *position)
202 centerWidgetInternal(widget, parent, position,
false);
215bool centerWidgetAvoidingOverflow(QWidget *widget,
const QWidget *parent,
const QPoint *position)
217 return centerWidgetInternal(widget, parent, position,
true);
227void cornerWidget(QWidget *widget,
const QPoint *position)
229 const QPoint cursorPos(position ? *position : QCursor::pos());
230 const QRect availableGeometry(availableScreenGeometryAtPoint(cursorPos));
231 const Qt::Alignment alignment
232 = (cursorPos.x() - availableGeometry.left() < availableGeometry.right() - cursorPos.x() ? Qt::AlignLeft : Qt::AlignRight)
233 | (cursorPos.y() - availableGeometry.top() < availableGeometry.bottom() - cursorPos.y() ? Qt::AlignTop : Qt::AlignBottom);
234 widget->setGeometry(QStyle::alignedRect(Qt::LeftToRight, alignment, widget->size(), availableGeometry));
240void makeHeading(QWidget *widget)
242 widget->setProperty(
"classNames", widget->property(
"classNames").toStringList() << QStringLiteral(
"heading"));
251void updateStyle(QWidget *widget)
253 widget->style()->unpolish(widget);
254 widget->style()->polish(widget);
DocumentStatus
The DocumentStatus enum specifies the status of the document in a window.
QT_UTILITIES_EXPORT QString generateWindowTitle(DocumentStatus documentStatus, const QString &documentPath)
Generates the window title string for the specified documentStatus and documentPath.
QT_UTILITIES_EXPORT bool isPaletteDark(const QPalette &palette=QPalette())
Returns whether palette is dark.