"Professional CMake" book suggest the following: "Targets should build successfully with or without compiler support for precompiled headers. It should be considered an optimization, not a requirement. In particular, do not explicitly include a precompile header (e.g. stdafx.h) in the source code, let CMake force-include an automatically generated precompile header on the compiler command line instead. This is more portable across the major compilers and is likely to be easier to maintain. It will also avoid warnings being generated from certain code checking tools like iwyu (include what you use)." Therefore, removed the "#include <PreCompiled.h>" from sources, also there is no need for the "#ifdef _PreComp_" anymore
354 lines
11 KiB
C++
354 lines
11 KiB
C++
/***************************************************************************
|
|
* Copyright (c) 2010 Werner Mayer <wmayer[at]users.sourceforge.net> *
|
|
* *
|
|
* This file is part of the FreeCAD CAx development system. *
|
|
* *
|
|
* This library is free software; you can redistribute it and/or *
|
|
* modify it under the terms of the GNU Library General Public *
|
|
* License as published by the Free Software Foundation; either *
|
|
* version 2 of the License, or (at your option) any later version. *
|
|
* *
|
|
* This library is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU Library General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Library General Public *
|
|
* License along with this library; see the file COPYING.LIB. If not, *
|
|
* write to the Free Software Foundation, Inc., 59 Temple Place, *
|
|
* Suite 330, Boston, MA 02111-1307, USA *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
# include <QApplication>
|
|
# include <QDesktopServices>
|
|
# include <QUrl>
|
|
|
|
#include "Command.h"
|
|
#include "Action.h"
|
|
#include "Application.h"
|
|
#include "BitmapFactory.h"
|
|
#include "Dialogs/DlgMacroExecuteImp.h"
|
|
#include "Dialogs/DlgMacroRecordImp.h"
|
|
#include "Macro.h"
|
|
#include "MainWindow.h"
|
|
#include "PythonDebugger.h"
|
|
|
|
|
|
using namespace Gui;
|
|
|
|
|
|
//===========================================================================
|
|
// Std_DlgMacroRecord
|
|
//===========================================================================
|
|
DEF_STD_CMD_A(StdCmdDlgMacroRecord)
|
|
|
|
StdCmdDlgMacroRecord::StdCmdDlgMacroRecord()
|
|
: Command("Std_DlgMacroRecord")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("Record &Macro");
|
|
|
|
sToolTipText = QT_TR_NOOP("Opens a dialog to record a macro");
|
|
sWhatsThis = "Std_DlgMacroRecord";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = "media-record";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdDlgMacroRecord::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
if (!getGuiApplication()->macroManager()->isOpen()){
|
|
Gui::Dialog::DlgMacroRecordImp cDlg(getMainWindow());
|
|
if (cDlg.exec() && getAction()) {
|
|
getAction()->setIcon(Gui::BitmapFactory().iconFromTheme("media-playback-stop"));
|
|
getAction()->setText(QCoreApplication::translate("StdCmdDlgMacroRecord", "S&top macro recording"));
|
|
getAction()->setToolTip(QCoreApplication::translate("StdCmdDlgMacroRecord", "Stop the macro recording session"));
|
|
}
|
|
}
|
|
else {
|
|
getGuiApplication()->macroManager()->commit();
|
|
if (getAction()) {
|
|
getAction()->setIcon(Gui::BitmapFactory().iconFromTheme("media-record"));
|
|
getAction()->setText(QString::fromLatin1(sMenuText));
|
|
getAction()->setToolTip(QString::fromLatin1(sToolTipText));
|
|
}
|
|
}
|
|
}
|
|
|
|
bool StdCmdDlgMacroRecord::isActive()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//===========================================================================
|
|
// Std_DlgMacroExecute
|
|
//===========================================================================
|
|
DEF_STD_CMD_A(StdCmdDlgMacroExecute)
|
|
|
|
StdCmdDlgMacroExecute::StdCmdDlgMacroExecute()
|
|
: Command("Std_DlgMacroExecute")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("Ma&cros");
|
|
|
|
sToolTipText = QT_TR_NOOP("Opens a dialog to execute a recorded macro");
|
|
sWhatsThis = "Std_DlgMacroExecute";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = "accessories-text-editor";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdDlgMacroExecute::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
Gui::Dialog::DlgMacroExecuteImp cDlg(getMainWindow());
|
|
cDlg.exec();
|
|
}
|
|
|
|
bool StdCmdDlgMacroExecute::isActive()
|
|
{
|
|
return ! (getGuiApplication()->macroManager()->isOpen());
|
|
}
|
|
|
|
//===========================================================================
|
|
// Std_DlgMacroExecuteDirect
|
|
//===========================================================================
|
|
DEF_STD_CMD_A(StdCmdDlgMacroExecuteDirect)
|
|
|
|
StdCmdDlgMacroExecuteDirect::StdCmdDlgMacroExecuteDirect()
|
|
: Command("Std_DlgMacroExecuteDirect")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("&Execute Macro");
|
|
sToolTipText = QT_TR_NOOP("Executes the macro in the editor");
|
|
sWhatsThis = "Std_DlgMacroExecuteDirect";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = "media-playback-start";
|
|
sAccel = "Ctrl+F6";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdDlgMacroExecuteDirect::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
doCommand(Command::Gui,"Gui.SendMsgToActiveView(\"Run\")");
|
|
}
|
|
|
|
bool StdCmdDlgMacroExecuteDirect::isActive()
|
|
{
|
|
return getGuiApplication()->sendHasMsgToActiveView("Run");
|
|
}
|
|
|
|
DEF_STD_CMD_A(StdCmdMacroAttachDebugger)
|
|
|
|
StdCmdMacroAttachDebugger::StdCmdMacroAttachDebugger()
|
|
: Command("Std_MacroAttachDebugger")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("&Attach to Remote Debugger");
|
|
|
|
sToolTipText = QT_TR_NOOP("Attaches to a remotely running debugger");
|
|
sWhatsThis = "Std_MacroAttachDebugger";
|
|
sStatusTip = sToolTipText;
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdMacroAttachDebugger::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
doCommand(Gui, "from freecad.gui import RemoteDebugger\n"
|
|
"RemoteDebugger.attachToRemoteDebugger()");
|
|
}
|
|
|
|
bool StdCmdMacroAttachDebugger::isActive()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
DEF_STD_CMD_A(StdCmdMacroStartDebug)
|
|
|
|
StdCmdMacroStartDebug::StdCmdMacroStartDebug()
|
|
: Command("Std_MacroStartDebug")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("&Debug Macro");
|
|
sToolTipText = QT_TR_NOOP("Starts the debugging of macros");
|
|
sWhatsThis = "Std_MacroStartDebug";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = "debug-start";
|
|
sAccel = "F6";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdMacroStartDebug::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
PythonDebugger* dbg = Application::Instance->macroManager()->debugger();
|
|
if (!dbg->isRunning())
|
|
doCommand(Command::Gui,"Gui.SendMsgToActiveView(\"StartDebug\")");
|
|
else
|
|
dbg->stepRun();
|
|
}
|
|
|
|
bool StdCmdMacroStartDebug::isActive()
|
|
{
|
|
return getGuiApplication()->sendHasMsgToActiveView("StartDebug");
|
|
}
|
|
|
|
DEF_STD_CMD_A(StdCmdMacroStopDebug)
|
|
|
|
StdCmdMacroStopDebug::StdCmdMacroStopDebug()
|
|
: Command("Std_MacroStopDebug")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("&Stop Debugging");
|
|
sToolTipText = QT_TR_NOOP("Stops the debugging of macros");
|
|
sWhatsThis = "Std_MacroStopDebug";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = "debug-stop";
|
|
sAccel = "Shift+F6";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdMacroStopDebug::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
Application::Instance->macroManager()->debugger()->tryStop();
|
|
}
|
|
|
|
bool StdCmdMacroStopDebug::isActive()
|
|
{
|
|
static PythonDebugger* dbg = Application::Instance->macroManager()->debugger();
|
|
return dbg->isRunning();
|
|
}
|
|
|
|
DEF_STD_CMD_A(StdCmdMacroStepOver)
|
|
|
|
StdCmdMacroStepOver::StdCmdMacroStepOver()
|
|
: Command("Std_MacroStepOver")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("Step &Over");
|
|
sToolTipText = QT_TR_NOOP("Steps to the next line in this file");
|
|
sWhatsThis = "Std_MacroStepOver";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = nullptr;
|
|
sAccel = "F10";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdMacroStepOver::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
Application::Instance->macroManager()->debugger()->stepOver();
|
|
}
|
|
|
|
bool StdCmdMacroStepOver::isActive()
|
|
{
|
|
static PythonDebugger* dbg = Application::Instance->macroManager()->debugger();
|
|
return dbg->isRunning();
|
|
}
|
|
|
|
DEF_STD_CMD_A(StdCmdMacroStepInto)
|
|
|
|
StdCmdMacroStepInto::StdCmdMacroStepInto()
|
|
: Command("Std_MacroStepInto")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("Step &Into");
|
|
sToolTipText = QT_TR_NOOP("Steps to the next line executed");
|
|
sWhatsThis = "Std_MacroStepInto";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = nullptr;
|
|
sAccel = "F11";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdMacroStepInto::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
Application::Instance->macroManager()->debugger()->stepInto();
|
|
}
|
|
|
|
bool StdCmdMacroStepInto::isActive()
|
|
{
|
|
static PythonDebugger* dbg = Application::Instance->macroManager()->debugger();
|
|
return dbg->isRunning();
|
|
}
|
|
|
|
DEF_STD_CMD_A(StdCmdToggleBreakpoint)
|
|
|
|
StdCmdToggleBreakpoint::StdCmdToggleBreakpoint()
|
|
: Command("Std_ToggleBreakpoint")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("Toggle &Breakpoint");
|
|
sToolTipText = QT_TR_NOOP("Adds or removes a breakpoint at this position");
|
|
sWhatsThis = "Std_ToggleBreakpoint";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = nullptr;
|
|
sAccel = "F9";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdToggleBreakpoint::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
doCommand(Command::Gui,"Gui.SendMsgToActiveView(\"ToggleBreakpoint\")");
|
|
}
|
|
|
|
bool StdCmdToggleBreakpoint::isActive()
|
|
{
|
|
return getGuiApplication()->sendHasMsgToActiveView("ToggleBreakpoint");
|
|
}
|
|
|
|
DEF_STD_CMD_A(StdCmdMacrosFolder)
|
|
|
|
StdCmdMacrosFolder::StdCmdMacrosFolder()
|
|
: Command("Std_OpenMacrosFolder")
|
|
{
|
|
sGroup = "Macro";
|
|
sMenuText = QT_TR_NOOP("Open Macro Folder");
|
|
sToolTipText = QT_TR_NOOP("Opens the macros folder in the system file manager");
|
|
sWhatsThis = "Std_OpenMacrosFolder";
|
|
sStatusTip = sToolTipText;
|
|
sPixmap = "MacroFolder";
|
|
sAccel = "";
|
|
eType = 0;
|
|
}
|
|
|
|
void StdCmdMacrosFolder::activated(int iMsg)
|
|
{
|
|
Q_UNUSED(iMsg);
|
|
|
|
QString path = QString::fromStdString(App::Application::getUserMacroDir());
|
|
QUrl url = QUrl::fromLocalFile(path);
|
|
QDesktopServices::openUrl(url);
|
|
}
|
|
|
|
bool StdCmdMacrosFolder::isActive()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
namespace Gui {
|
|
|
|
void CreateMacroCommands()
|
|
{
|
|
CommandManager &rcCmdMgr = Application::Instance->commandManager();
|
|
rcCmdMgr.addCommand(new StdCmdDlgMacroRecord());
|
|
rcCmdMgr.addCommand(new StdCmdDlgMacroExecute());
|
|
rcCmdMgr.addCommand(new StdCmdMacrosFolder());
|
|
rcCmdMgr.addCommand(new StdCmdDlgMacroExecuteDirect());
|
|
rcCmdMgr.addCommand(new StdCmdMacroAttachDebugger());
|
|
rcCmdMgr.addCommand(new StdCmdMacroStartDebug());
|
|
rcCmdMgr.addCommand(new StdCmdMacroStopDebug());
|
|
rcCmdMgr.addCommand(new StdCmdMacroStepOver());
|
|
rcCmdMgr.addCommand(new StdCmdMacroStepInto());
|
|
rcCmdMgr.addCommand(new StdCmdToggleBreakpoint());
|
|
}
|
|
|
|
} // namespace Gui
|