Skip to content

Commit

Permalink
Extract TemplatesMenu class from MainWindow (#5125)
Browse files Browse the repository at this point in the history
  • Loading branch information
winniehell authored and lukas-w committed Aug 24, 2019
1 parent 93f9134 commit a863830
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 64 deletions.
4 changes: 0 additions & 4 deletions include/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ public slots:

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

QMenu * m_templatesMenu;
QMenu * m_recentlyOpenedProjectsMenu;
int m_custom_templates_count;

struct keyModifiers
{
Expand Down Expand Up @@ -240,7 +237,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( const QDir& dir );

private:
int m_customTemplatesCount;
};

#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
64 changes: 4 additions & 60 deletions src/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
#include "SetupDialog.h"
#include "SideBar.h"
#include "SongEditor.h"
#include "TemplatesMenu.h"
#include "TextFloat.h"
#include "TimeLineWidget.h"
#include "ToolButton.h"
Expand Down Expand Up @@ -88,7 +89,6 @@ void disableAutoKeyAccelerators(QWidget* mainWindow)

MainWindow::MainWindow() :
m_workspace( NULL ),
m_templatesMenu( NULL ),
m_recentlyOpenedProjectsMenu( NULL ),
m_toolsMenu( NULL ),
m_autoSaveTimer( this ),
Expand Down Expand Up @@ -277,12 +277,8 @@ 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 * ) ) );

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

project_menu->addAction( embed::getIconPixmap( "project_open" ),
tr( "&Open..." ),
Expand Down Expand Up @@ -429,7 +425,7 @@ void MainWindow::finalize()
tr( "Create new project from template" ),
this, SLOT( emptySlot() ),
m_toolBar );
project_new_from_template->setMenu( m_templatesMenu );
project_new_from_template->setMenu( templates_menu );
project_new_from_template->setPopupMode( ToolButton::InstantPopup );

ToolButton * project_open = new ToolButton(
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
73 changes: 73 additions & 0 deletions src/gui/menus/TemplatesMenu.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#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),
m_customTemplatesCount(0)
{
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_customTemplatesCount;
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_customTemplatesCount = addTemplatesFromDir(ConfigManager::inst()->userTemplateDir() );
addTemplatesFromDir( ConfigManager::inst()->factoryProjectsDir() + "templates" );
}




int TemplatesMenu::addTemplatesFromDir( const 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();
}

0 comments on commit a863830

Please sign in to comment.