Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extract TemplatesMenu class from MainWindow #5125

Merged
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions include/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#include "ConfigManager.h"
#include "SubWindow.h"
#include "TemplatesMenu.h"

class QAction;
class QDomElement;
Expand Down Expand Up @@ -148,7 +149,6 @@ public slots:

void emptySlot();
void createNewProject();
void createNewProjectFromTemplate( QAction * _idx );
void openProject();
bool saveProject();
bool saveProjectAs();
Expand Down Expand Up @@ -204,9 +204,8 @@ private slots:
QWidget * m_toolBar;
QGridLayout * m_toolBarLayout;

QMenu * m_templatesMenu;
TemplatesMenu * m_templatesMenu;
QMenu * m_recentlyOpenedProjectsMenu;
int m_custom_templates_count;

struct keyModifiers
{
Expand Down Expand Up @@ -240,7 +239,6 @@ private slots:

private slots:
void browseHelp();
void fillTemplatesMenu();
void openRecentlyOpenedProject( QAction * _action );
void showTool( QAction * _idx );
void updateRecentlyOpenedProjectsMenu();
Expand Down
23 changes: 23 additions & 0 deletions include/TemplatesMenu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#ifndef TEMPLATESMENU_H
#define TEMPLATESMENU_H

#include <QDir>
#include <QMenu>

class TemplatesMenu : public QMenu
{
Q_OBJECT
public:
TemplatesMenu(QWidget *parent = nullptr);
virtual ~TemplatesMenu() = default;

private slots:
void createNewProjectFromTemplate( QAction * _idx );
void fillTemplatesMenu();
int addTemplatesFromDir( QDir dir );

private:
int m_custom_templates_count;
lukas-w marked this conversation as resolved.
Show resolved Hide resolved
};

#endif // TEMPLATESMENU_H
2 changes: 2 additions & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ SET(LMMS_SRCS
gui/editors/PianoRoll.cpp
gui/editors/SongEditor.cpp

gui/menus/TemplatesMenu.cpp

gui/widgets/AutomatableButton.cpp
gui/widgets/AutomatableSlider.cpp
gui/widgets/CaptionMenu.cpp
Expand Down
58 changes: 1 addition & 57 deletions src/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -277,11 +277,7 @@ void MainWindow::finalize()
this, SLOT( createNewProject() ),
QKeySequence::New );

m_templatesMenu = new QMenu( tr("New from template"), this );
connect( m_templatesMenu, SIGNAL( aboutToShow() ), SLOT( fillTemplatesMenu() ) );
connect( m_templatesMenu, SIGNAL( triggered( QAction * ) ),
SLOT( createNewProjectFromTemplate( QAction * ) ) );

m_templatesMenu = new TemplatesMenu( this );
project_menu->addMenu(m_templatesMenu);

project_menu->addAction( embed::getIconPixmap( "project_open" ),
Expand Down Expand Up @@ -809,24 +805,6 @@ void MainWindow::createNewProject()



void MainWindow::createNewProjectFromTemplate( QAction * _idx )
{
if( m_templatesMenu && mayChangeProject(true) )
{
int indexOfTemplate = m_templatesMenu->actions().indexOf( _idx );
bool isFactoryTemplate = indexOfTemplate >= m_custom_templates_count;
QString dirBase = isFactoryTemplate ?
ConfigManager::inst()->factoryTemplatesDir() :
ConfigManager::inst()->userTemplateDir();

const QString f = dirBase + _idx->text().replace("&&", "&") + ".mpt";
Engine::getSong()->createNewProjectFromTemplate(f);
}
}




void MainWindow::openProject()
{
if( mayChangeProject(false) )
Expand Down Expand Up @@ -1448,40 +1426,6 @@ void MainWindow::timerEvent( QTimerEvent * _te)



void MainWindow::fillTemplatesMenu()
{
m_templatesMenu->clear();

auto addTemplatesFromDir = [this]( QDir dir ) {
QStringList templates = dir.entryList( QStringList( "*.mpt" ),
QDir::Files | QDir::Readable );

if ( templates.size() && ! m_templatesMenu->actions().isEmpty() )
{
m_templatesMenu->addSeparator();
}

for( QStringList::iterator it = templates.begin();
it != templates.end(); ++it )
{
m_templatesMenu->addAction(
embed::getIconPixmap( "project_file" ),
( *it ).left( ( *it ).length() - 4 ).replace("&", "&&") );
#ifdef LMMS_BUILD_APPLE
m_templatesMenu->actions().last()->setIconVisibleInMenu(false); // QTBUG-44565 workaround
m_templatesMenu->actions().last()->setIconVisibleInMenu(true);
#endif
}

return templates.size();
};

m_custom_templates_count = addTemplatesFromDir( ConfigManager::inst()->userTemplateDir() );
addTemplatesFromDir( ConfigManager::inst()->factoryProjectsDir() + "templates" );
}




void MainWindow::showTool( QAction * _idx )
{
Expand Down
72 changes: 72 additions & 0 deletions src/gui/menus/TemplatesMenu.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include "TemplatesMenu.h"
#include "GuiApplication.h"
#include "ConfigManager.h"
#include "Engine.h"
#include "embed.h"
#include "MainWindow.h"
#include "Song.h"

TemplatesMenu::TemplatesMenu(QWidget *parent) :
QMenu(tr("New from template"), parent)
{
connect( this, SIGNAL( aboutToShow() ), SLOT( fillTemplatesMenu() ) );
connect( this, SIGNAL( triggered( QAction * ) ),
SLOT( createNewProjectFromTemplate( QAction * ) ) );
}




void TemplatesMenu::createNewProjectFromTemplate( QAction * _idx )
{
if( gui->mainWindow()->mayChangeProject(true) )
{
int indexOfTemplate = actions().indexOf( _idx );
bool isFactoryTemplate = indexOfTemplate >= m_custom_templates_count;
QString dirBase = isFactoryTemplate ?
ConfigManager::inst()->factoryTemplatesDir() :
ConfigManager::inst()->userTemplateDir();

const QString f = dirBase + _idx->text().replace("&&", "&") + ".mpt";
Engine::getSong()->createNewProjectFromTemplate(f);
}
}





void TemplatesMenu::fillTemplatesMenu()
{
clear();

m_custom_templates_count = addTemplatesFromDir( ConfigManager::inst()->userTemplateDir() );
addTemplatesFromDir( ConfigManager::inst()->factoryProjectsDir() + "templates" );
}




int TemplatesMenu::addTemplatesFromDir( QDir dir ) {
QStringList templates = dir.entryList( QStringList( "*.mpt" ),
QDir::Files | QDir::Readable );

if ( templates.size() && ! actions().isEmpty() )
{
addSeparator();
}

for( QStringList::iterator it = templates.begin();
it != templates.end(); ++it )
{
addAction(
embed::getIconPixmap( "project_file" ),
( *it ).left( ( *it ).length() - 4 ).replace("&", "&&") );
#ifdef LMMS_BUILD_APPLE
actions().last()->setIconVisibleInMenu(false); // QTBUG-44565 workaround
actions().last()->setIconVisibleInMenu(true);
#endif
}

return templates.size();
}