lyx_mirror/src/frontends/qt/Action.cpp
Jean-Marc Lasgouttes 2898c335be Add mechanism to change icons in RTL mode
When the cursor in RTL text, icons for "depth-increment" or
"layout-toggle Enumerate" look wrong.

To fix this, the lfun "bidi" is introduced. "bidi ltr func" behaves
like "func" in LTR text, but is unknown in RTL text. "bidi rtl" does
the opposite. This allows to add two icons, but only have one icon
available. When no document is available, only LTR is assumed.

To make this work, the handling of unknown functions in toolbar has
been changed so this these functions can change dynamically their
existence.

The icon themes `default', `oxygen' and `classic' have been updated
accordingly.

Fixes bug #4451.
2019-07-22 15:20:38 +02:00

96 lines
1.9 KiB
C++

/**
* \file Action.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Abdelrazak Younes
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "Action.h"
// DispatchResult.h is needed by the windows compiler because lyx::dispatch
// returns a DispatchResult const reference. Gcc does not complain. Weird...
#include "DispatchResult.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
#include "LyX.h"
#include "qt_helpers.h"
#include "support/debug.h"
#include "support/lstrings.h"
using namespace std;
namespace lyx {
namespace frontend {
Action::Action(FuncRequest func, QIcon const & icon, QString const & text,
QString const & tooltip, QObject * parent)
: QAction(parent), func_(make_shared<FuncRequest>(move(func)))
{
init(icon, text, tooltip);
}
Action::Action(shared_ptr<FuncRequest const> func,
QIcon const & icon, QString const & text,
QString const & tooltip, QObject * parent)
: QAction(parent), func_(func)
{
init(icon, text, tooltip);
}
void Action::init(QIcon const & icon, QString const & text,
QString const & tooltip)
{
// only Qt/Mac handles that
setMenuRole(NoRole);
setIcon(icon);
setText(text);
setToolTip(tooltip);
setStatusTip(tooltip);
connect(this, SIGNAL(triggered()), this, SLOT(action()));
update();
}
void Action::update()
{
FuncStatus const status = getStatus(*func_);
if (status.onOff(true)) {
setCheckable(true);
setChecked(true);
} else if (status.onOff(false)) {
setCheckable(true);
setChecked(false);
} else {
setCheckable(false);
}
setVisible(!status.unknown());
setEnabled(status.enabled());
}
void Action::action()
{
//LYXERR(Debug::ACTION, "calling lyx::dispatch: func_: ");
lyx::dispatch(*func_);
triggered(this);
}
} // namespace frontend
} // namespace lyx
#include "moc_Action.cpp"