10 #include <QGuiApplication>
13 #include <QMainWindow>
15 #include <QMouseEvent>
19 #include <QStringBuilder>
21 #include <QToolButton>
26 #include "ui_navigatordialog.h"
36 using namespace swift::gui::settings;
44 CNavigatorDialog::CNavigatorDialog(QWidget *parent)
52 this->setContextMenuPolicy(Qt::CustomContextMenu);
54 m_input->setMaximumWidth(150);
55 m_marginMenuAction =
new QWidgetAction(
this);
56 m_marginMenuAction->setDefaultWidget(m_input);
59 m_originalQuitOnLastWindow = QGuiApplication::quitOnLastWindowClosed();
62 m_watchdog.setObjectName(this->objectName() +
":m_timer");
63 connect(&m_watchdog, &QTimer::timeout,
this, &CNavigatorDialog::onWatchdog);
65 this->setContextMenuPolicy(Qt::CustomContextMenu);
67 connect(
this, &CNavigatorDialog::customContextMenuRequested,
this, &CNavigatorDialog::showContextMenu);
71 Qt::QueuedConnection);
73 this->onStyleSheetsChanged();
83 this->insertOwnActions();
86 this->onStyleSheetsChanged();
92 QGridLayout *gridLayout =
new QGridLayout(ui->fr_NavigatorDialogInner);
93 gridLayout->setObjectName(
"gl_CNavigatorDialog");
94 gridLayout->setSpacing(0);
95 gridLayout->setContentsMargins(0, 0, 0, 0);
96 ui->fr_NavigatorDialogInner->setLayout(gridLayout);
101 for (QAction *action : this->actions())
103 if (!action) {
continue; }
104 QToolButton *tb =
new QToolButton(ui->fr_NavigatorDialogInner);
105 tb->setDefaultAction(action);
106 tb->setObjectName(this->objectName() % u
':' % action->objectName());
107 if (!action->text().isEmpty()) { tb->setToolTip(action->text()); }
108 gridLayout->addWidget(tb, r, c++);
110 if (c < columns) {
continue; }
114 m_currentColumns = gridLayout->columnCount();
115 this->adjustNavigatorSize(gridLayout);
125 QGuiApplication::setQuitOnLastWindowClosed(m_originalQuitOnLastWindow);
126 m_mainWindow->show();
138 this->setVisible(visible);
141 QGuiApplication::setQuitOnLastWindowClosed(
142 visible ?
false : m_originalQuitOnLastWindow);
144 if (visible) { m_watchdog.start(4000); }
145 else { m_watchdog.stop(); }
150 const bool visible = !this->isVisible();
161 this->restoreGeometry(geo);
172 if (!m.
isSuccess()) { CLogMessage::preformatted(m); }
175 void CNavigatorDialog::onStyleSheetsChanged()
180 this->setStyleSheet(
"");
181 this->setStyleSheet(qss);
182 this->adjustNavigatorSize();
193 if (event->buttons() & Qt::LeftButton)
201 QDialog::mouseMoveEvent(event);
211 if (event->buttons() & Qt::LeftButton)
218 QDialog::mousePressEvent(event);
224 QDialog::mouseReleaseEvent(event);
229 const QEvent::Type t = evt->type();
230 if (t == QEvent::WindowStateChange)
235 else { QDialog::changeEvent(evt); }
240 if (m_firstBuild) {
return; }
248 QDialog::paintEvent(event);
254 QApplication::setActiveWindow(
this);
255 QDialog::enterEvent(event);
258 void CNavigatorDialog::showContextMenu(
const QPoint &pos)
260 const QPoint globalPos = this->mapToGlobal(pos);
261 QScopedPointer<QMenu> contextMenu(
new QMenu(
this));
262 this->addToContextMenu(contextMenu.data());
263 QAction *selectedItem = contextMenu.data()->exec(globalPos);
264 Q_UNUSED(selectedItem);
267 void CNavigatorDialog::changeLayout()
269 QAction *a = qobject_cast<QAction *>(QObject::sender());
271 QString v(a->data().toString());
278 void CNavigatorDialog::menuChangeMargins(
const QMargins &margins)
280 this->setContentsMargins(margins);
281 this->adjustNavigatorSize();
284 void CNavigatorDialog::dummyFunction()
289 void CNavigatorDialog::onSettingsChanged()
294 void CNavigatorDialog::insertOwnActions()
297 QAction *a =
nullptr;
301 a =
new QAction(CIcons::save16(),
"Save state",
this);
307 const QIcon i(CIcons::changeIconBackgroundColor(this->style()->standardIcon(QStyle::SP_TitleBarCloseButton),
308 Qt::white, QSize(16, 16)));
309 a =
new QAction(i,
"Close",
this);
310 c = connect(a, &QAction::triggered,
this, &CNavigatorDialog::close, Qt::QueuedConnection);
315 int CNavigatorDialog::columnsForRows(
int rows)
317 Q_ASSERT_X(rows >= 0, Q_FUNC_INFO,
"no rows");
318 int items = this->actions().size();
319 int c = items / rows;
320 return (c * rows) < items ? c + 1 : c;
323 QGridLayout *CNavigatorDialog::myGridLayout()
const {
return qobject_cast<QGridLayout *>(this->layout()); }
325 void CNavigatorDialog::adjustNavigatorSize(QGridLayout *layout)
327 QGridLayout *gridLayout = layout ? layout : this->myGridLayout();
328 Q_ASSERT_X(gridLayout, Q_FUNC_INFO,
"Missing layout");
330 int w = 16 * gridLayout->columnCount();
331 int h = 16 * gridLayout->rowCount();
334 const QMargins margins = gridLayout->contentsMargins() + this->contentsMargins();
335 h = h + margins.top() + margins.bottom();
336 w = w + margins.left() + margins.right();
339 const QSize min(w + 2, h + 2);
340 ui->fr_NavigatorDialogInner->setMinimumSize(min);
341 this->setMinimumSize(min);
345 void CNavigatorDialog::onWatchdog()
352 void CNavigatorDialog::addToContextMenu(QMenu *contextMenu)
const
354 QAction *a = contextMenu->addAction(CIcons::resize16(),
"1 row",
this, &CNavigatorDialog::changeLayout);
356 a = contextMenu->addAction(CIcons::resize16(),
"2 rows",
this, &CNavigatorDialog::changeLayout);
358 a = contextMenu->addAction(CIcons::resize16(),
"1 column",
this, &CNavigatorDialog::changeLayout);
360 a = contextMenu->addAction(CIcons::resize16(),
"2 columns",
this, &CNavigatorDialog::changeLayout);
362 const QString frameLessActionText = this->
isFrameless() ?
"Normal window" :
"Frameless";
364 contextMenu->addAction(
"Adjust margins",
this, &CNavigatorDialog::dummyFunction);
365 contextMenu->addAction(m_marginMenuAction);
366 contextMenu->addSeparator();
bool isShuttingDown() const
Is application shutting down?
Main window which can be frameless.
bool handleMousePressEvent(QMouseEvent *event)
Mouse press, required for frameless window.
virtual void setFrameless(bool frameless)
Framless.
QPoint m_framelessDragPosition
position, if moving is handled with frameless window
bool handleMouseMoveEvent(QMouseEvent *event)
Mouse moving, required for frameless window.
bool isFrameless() const
Frameless?
const CStyleSheetUtility & getStyleSheetUtility() const
Style sheet handling.
void styleSheetsChanged()
Style sheet changed.
static bool stayOnTop(bool onTop, QWidget *widget)
Window flags / stay on top.
static void deleteLayout(QLayout *layout, bool deleteWidgets)
Delete hierarchy of layouts.
static bool useStyleSheetInDerivedWidget(QWidget *derivedWidget, QStyle::PrimitiveElement element=QStyle::PE_Widget)
Use style sheets in derived widgets.
QString style(const QString &fileName) const
Style for given file name.
static const QString & fileNameNavigator()
File name navigator.qss.
void navigatorClosed()
Navigator closed.
virtual void paintEvent(QPaintEvent *event)
void showNavigator(bool visible)
Visibility visibility.
virtual void changeEvent(QEvent *evt)
void buildNavigator(int columns)
Navigator.
void saveToSettings()
Save to settings.
virtual void enterEvent(QEnterEvent *event)
void restoreFromSettings()
Restore from settings.
virtual void mouseReleaseEvent(QMouseEvent *event)
virtual void mousePressEvent(QMouseEvent *event)
virtual void windowFlagsChanged()
Can be used as notification if window mode changes.
virtual void mouseMoveEvent(QMouseEvent *event)
void toggleNavigatorVisibility()
Toggle visibility.
virtual ~CNavigatorDialog()
Destructor.
void toggleFrameless()
Toggle frameless mode.
virtual void reject()
Called when dialog is closed.
Settings for navigator bar.
void setColumns(int columns)
Set columns.
bool isFramless() const
Frameless?
void setGeometry(const QByteArray &ba)
Set geometry.
QByteArray getGeometry() const
Geometry.
QMargins getMargins() const
Margins.
void setFrameless(bool frameless)
Frameless.
int getColumns() const
Number pf columns.
void setMargins(const QMargins &margins)
Set margins.
CStatusMessage setAndSave(const T &value, qint64 timestamp=0)
Write and save in the same step. Must be called from the thread in which the owner lives.
T get() const
Get a copy of the current value.
Streamable status message, e.g.
bool isSuccess() const
Operation considered successful.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
High level reusable GUI components.
Free functions in swift::misc.