Compare commits

...

35 Commits

Author SHA1 Message Date
Uwe Rathmann f4b7aa33fe Merge branch 'master' into features/menubutton 2025-02-28 09:30:23 +01:00
Uwe Rathmann ed584af5c1 Merge branch 'master' into features/menubutton 2025-02-06 13:52:22 +01:00
Uwe Rathmann 7f67014bef Merge branch 'master' into features/menubutton 2025-02-06 10:25:55 +01:00
Uwe Rathmann 607939a4dc Merge branch 'master' into features/menubutton 2024-12-10 14:11:26 +01:00
Uwe Rathmann aa2a76996d Merge branch 'master' into features/menubutton 2024-12-02 10:13:50 +01:00
Uwe Rathmann a40170159c Merge branch 'master' into features/menubutton 2024-09-17 17:42:39 +02:00
Uwe Rathmann 87ae5efd67 Merge branch 'master' into features/menubutton 2024-09-11 18:51:02 +02:00
Uwe Rathmann 714e47a74c fixed 2024-01-30 17:19:14 +01:00
Uwe Rathmann 0408c70442 Merge branch 'master' into features/menubutton 2024-01-30 17:18:55 +01:00
Uwe Rathmann 8e81db43f1 copyright adjusted 2024-01-17 16:09:11 +01:00
Uwe Rathmann e56c1fae9d Merge branch 'master' into features/menubutton 2024-01-17 16:08:23 +01:00
Uwe Rathmann e620b56d4e Merge branch 'master' into features/menubutton 2023-11-28 15:33:17 +01:00
Uwe Rathmann beec40af06 Merge branch 'master' into features/menubutton 2023-11-15 11:56:57 +01:00
Uwe Rathmann 130bd3f9d2 Merge branch 'master' into features/menubutton 2023-11-03 18:25:29 +01:00
Uwe Rathmann 606de9080a Merge branch 'master' into features/menubutton 2023-10-05 09:40:36 +02:00
Uwe Rathmann b273264629 Merge branch 'master' into features/menubutton 2023-09-27 11:17:07 +02:00
Uwe Rathmann f67ff13f93 Merge branch 'master' into features/menubutton 2023-07-28 08:11:16 +02:00
Uwe Rathmann ee7896e2d4 Merge branch 'master' into features/menubutton 2023-06-20 09:38:15 +02:00
Uwe Rathmann 9060f7cf75 Merge branch 'master' into features/menubutton 2023-05-16 12:55:13 +02:00
Uwe Rathmann 51fd38eb01 handling of menu separators fixed 2023-05-16 12:38:19 +02:00
Uwe Rathmann 78d3a9af9c Merge branch 'master' into features/menubutton 2023-05-16 11:13:48 +02:00
Uwe Rathmann dbe1fad7ec QskMenuButton introduced 2023-05-15 16:58:46 +02:00
Uwe Rathmann 99151186fb Merge branch 'master' into features/menubutton 2023-05-15 15:06:29 +02:00
Uwe Rathmann 260c35f2a4 Merge branch 'master' into features/menubutton 2023-05-15 13:43:09 +02:00
Uwe Rathmann ea36b7da8e wip 2023-05-15 12:53:30 +02:00
Uwe Rathmann b7e4f10f91 wip 2023-05-15 12:50:16 +02:00
Uwe Rathmann a0df814121 wip 2023-05-15 12:38:50 +02:00
Uwe Rathmann defb193387 wip 2023-05-15 12:26:25 +02:00
Uwe Rathmann b7fe24602c wip 2023-05-15 12:22:55 +02:00
Uwe Rathmann b25852ff6f wip 2023-05-15 11:12:15 +02:00
Uwe Rathmann b3ed7f90e4 wip 2023-05-15 10:51:25 +02:00
Uwe Rathmann 329efbb242 wip 2023-05-15 10:40:33 +02:00
Uwe Rathmann b1a816e61e wip 2023-05-15 10:06:01 +02:00
Uwe Rathmann a5a28bebc2 wip 2023-05-15 07:22:54 +02:00
Uwe Rathmann 2a7a68e915 wip 2023-05-12 14:58:40 +02:00
4 changed files with 255 additions and 50 deletions

View File

@ -25,7 +25,7 @@
#include <QskPushButton.h>
#include <QskPageIndicator.h>
#include <QskScrollArea.h>
#include <QskMenu.h>
#include <QskMenuButton.h>
#include <QskWindow.h>
#include <QskDialog.h>
#include <QskSkinManager.h>
@ -37,6 +37,8 @@
#include <QskGraphicProvider.h>
#include <QskGraphicIO.h>
#include <QskGraphic.h>
#include <QskLabelData.h>
#include <QskSetup.h>
#include <QGuiApplication>
@ -118,49 +120,29 @@ namespace
}
};
class MenuButton : public QskPushButton
{
public:
MenuButton( const QString& text, QQuickItem* parent = nullptr )
: QskPushButton( text, parent )
{
connect( this, &QskPushButton::pressed, this, &MenuButton::openMenu );
}
private:
void openMenu()
{
auto menu = new QskMenu( window()->contentItem() );
populateMenu( menu );
menu->setOrigin( geometry().bottomLeft() );
menu->open();
}
virtual void populateMenu( QskMenu* ) = 0;
};
class SkinButton final : public MenuButton
class SkinButton final : public QskMenuButton
{
public:
SkinButton( const QString& text, QQuickItem* parent = nullptr )
: MenuButton( text, parent )
{
}
private:
void populateMenu( QskMenu* menu ) override
: QskMenuButton( text, parent )
{
const auto names = qskSkinManager->skinNames();
for ( const auto& name : names )
menu->addOption( QUrl(), name );
setOptions( names );
if ( const auto index = names.indexOf( qskSkinManager->skinName() ) )
menu->setCurrentIndex( index );
setStartIndex( index );
connect( menu, &QskMenu::triggered, this, &SkinButton::changeSkin );
connect( this, &QskMenuButton::triggered,
this, &SkinButton::changeSkin );
}
void openMenu() override
{
const auto names = qskSkinManager->skinNames();
setStartIndex( names.indexOf( qskSkinManager->skinName() ) );
QskMenuButton::openMenu();
}
void changeSkin( int index )
@ -175,26 +157,27 @@ namespace
}
};
class FileButton final : public MenuButton
class FileButton final : public QskMenuButton
{
public:
FileButton( const QString& text, QQuickItem* parent = nullptr )
: MenuButton( text, parent )
: QskMenuButton( text, parent )
{
}
private:
void populateMenu( QskMenu* menu ) override
{
menu->addOption( "image://shapes/Rectangle/White", "Print" );
menu->addOption( "image://shapes/Diamond/Yellow", "Save As" );
menu->addOption( "image://shapes/Ellipse/Red", "Setup" );
menu->addSeparator();
menu->addOption( "image://shapes/Hexagon/PapayaWhip", "Quit" );
addOption( "image://shapes/Rectangle/White", "Print" );
addOption( "image://shapes/Diamond/Yellow", "Save As" );
addOption( "image://shapes/Ellipse/Red", "Setup" );
addSeparator();
addOption( "image://shapes/Hexagon/PapayaWhip", "Quit" );
// see https://github.com/uwerat/qskinny/issues/192
connect( menu, &QskMenu::triggered,
[]( int index ) { if ( index == 4 ) qApp->quit(); } );
connect( this, &QskMenuButton::triggered,
this, &FileButton::activate );
}
private:
void activate( int index )
{
if ( optionAt( index ).text() == "Quit" )
qApp->quit();
}
};

View File

@ -233,6 +233,7 @@ list(APPEND HEADERS
controls/QskListViewSkinlet.h
controls/QskMenu.h
controls/QskMenuSkinlet.h
controls/QskMenuButton.h
controls/QskObjectTree.h
controls/QskPageIndicator.h
controls/QskPageIndicatorSkinlet.h
@ -343,8 +344,9 @@ list(APPEND SOURCES
controls/QskItemAnchors.cpp
controls/QskListView.cpp
controls/QskListViewSkinlet.cpp
controls/QskMenuSkinlet.cpp
controls/QskMenu.cpp
controls/QskMenuSkinlet.cpp
controls/QskMenuButton.cpp
controls/QskObjectTree.cpp
controls/QskPageIndicator.cpp
controls/QskPageIndicatorSkinlet.cpp

View File

@ -0,0 +1,153 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "QskMenuButton.h"
#include "QskMenu.h"
#include "QskLabelData.h"
#include <qpointer.h>
#include <qquickwindow.h>
class QskMenuButton::PrivateData
{
public:
int triggeredIndex = -1;
int startIndex = -1;
QPointer< QskMenu > menu;
QVector< QskLabelData > options;
};
QskMenuButton::QskMenuButton( QQuickItem* parent )
: QskMenuButton( QString(), parent )
{
}
QskMenuButton::QskMenuButton( const QString& text, QQuickItem* parent )
: QskPushButton( text, parent )
, m_data( new PrivateData )
{
connect( this, &QskPushButton::pressed,
this, &QskMenuButton::openMenu );
}
QskMenuButton::~QskMenuButton()
{
}
int QskMenuButton::addOption( const QString& graphicSource, const QString& text )
{
return addOption( QskLabelData( text, graphicSource ) );
}
int QskMenuButton::addOption( const QUrl& graphicSource, const QString& text )
{
return addOption( QskLabelData( text, graphicSource ) );
}
int QskMenuButton::addOption( const QskLabelData& option )
{
const int index = m_data->options.count();
m_data->options += option;
if ( m_data->menu )
m_data->menu->setOptions( m_data->options );
return index;
}
void QskMenuButton::addSeparator()
{
addOption( QskLabelData() );
}
void QskMenuButton::setOptions( const QStringList& options )
{
setOptions( qskCreateLabelData( options ) );
}
void QskMenuButton::setOptions( const QVector< QskLabelData >& options )
{
m_data->options = options;
if ( m_data->menu )
m_data->menu->setOptions( m_data->options );
}
void QskMenuButton::clear()
{
m_data->options.clear();
if ( m_data->menu )
m_data->menu->clear();
}
QVector< QskLabelData > QskMenuButton::options() const
{
return m_data->options;
}
QskLabelData QskMenuButton::optionAt( int index ) const
{
return m_data->options.value( index );
}
int QskMenuButton::optionsCount() const
{
return m_data->options.count();
}
void QskMenuButton::setStartIndex( int index )
{
m_data->startIndex = index;
}
int QskMenuButton::triggeredIndex() const
{
return m_data->triggeredIndex;
}
QString QskMenuButton::triggeredText() const
{
return optionAt( m_data->triggeredIndex ).text();
}
const QskMenu* QskMenuButton::menu() const
{
return m_data->menu;
}
void QskMenuButton::openMenu()
{
if ( m_data->menu || window() == nullptr || m_data->options.isEmpty() )
return;
m_data->triggeredIndex = -1;
auto menu = new QskMenu( window()->contentItem() );
m_data->menu = menu;
menu->setOptions( m_data->options );
if ( m_data->startIndex >= 0 )
menu->setCurrentIndex( m_data->startIndex );
menu->setOrigin( geometry().bottomLeft() );
connect( menu, &QskMenu::triggered,
this, &QskMenuButton::updateTriggeredIndex );
menu->open();
}
void QskMenuButton::updateTriggeredIndex( int index )
{
if ( m_data->triggeredIndex != index )
{
m_data->triggeredIndex = index;
Q_EMIT triggered( index );
}
}
#include "moc_QskMenuButton.cpp"

View File

@ -0,0 +1,67 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_MENU_BUTTON_H
#define QSK_MENU_BUTTON_H
#include "QskPushButton.h"
class QskMenu;
class QskLabelData;
class QSK_EXPORT QskMenuButton : public QskPushButton
{
Q_OBJECT
Q_PROPERTY( QVector< QskLabelData > options READ options
WRITE setOptions NOTIFY optionsChanged )
Q_PROPERTY( int optionsCount READ optionsCount )
Q_PROPERTY( int triggeredIndex READ triggeredIndex NOTIFY triggered )
Q_PROPERTY( QString triggeredText READ triggeredText NOTIFY triggered )
public:
QskMenuButton( QQuickItem* parent = nullptr );
QskMenuButton( const QString& text, QQuickItem* parent = nullptr );
~QskMenuButton() override;
int addOption( const QString&, const QString& );
int addOption( const QUrl&, const QString& );
int addOption( const QskLabelData& );
void addSeparator();
void setOptions( const QVector< QskLabelData >& );
void setOptions( const QStringList& );
QVector< QskLabelData > options() const;
QskLabelData optionAt( int ) const;
int optionsCount() const;
const QskMenu* menu() const;
int triggeredIndex() const;
QString triggeredText() const;
public Q_SLOTS:
void setStartIndex( int );
void clear();
Q_SIGNALS:
void triggered( int index );
void optionsChanged();
protected:
virtual void openMenu();
private:
void updateTriggeredIndex( int );
class PrivateData;
std::unique_ptr< PrivateData > m_data;
};
#endif