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.
@ -516,6 +516,20 @@ dist_images_DATA1X = \
|
|||||||
images/all-changes-accept.svgz \
|
images/all-changes-accept.svgz \
|
||||||
images/all-changes-reject.svgz \
|
images/all-changes-reject.svgz \
|
||||||
images/banner.svgz \
|
images/banner.svgz \
|
||||||
|
images/bidi_ltr_depth-decrement.svgz \
|
||||||
|
images/bidi_ltr_depth-increment.svgz \
|
||||||
|
images/bidi_ltr_layout-toggle_Description.svgz \
|
||||||
|
images/bidi_ltr_layout-toggle_Enumerate.svgz \
|
||||||
|
images/bidi_ltr_layout-toggle_Itemize.svgz \
|
||||||
|
images/bidi_ltr_layout-toggle_List.svgz \
|
||||||
|
images/bidi_ltr_layout-toggle_Section.svgz \
|
||||||
|
images/bidi_rtl_depth-decrement.svgz \
|
||||||
|
images/bidi_rtl_depth-increment.svgz \
|
||||||
|
images/bidi_rtl_layout-toggle_Description.svgz \
|
||||||
|
images/bidi_rtl_layout-toggle_Enumerate.svgz \
|
||||||
|
images/bidi_rtl_layout-toggle_Itemize.svgz \
|
||||||
|
images/bidi_rtl_layout-toggle_List.svgz \
|
||||||
|
images/bidi_rtl_layout-toggle_Section.svgz \
|
||||||
images/bookmark-goto.svgz \
|
images/bookmark-goto.svgz \
|
||||||
images/bookmark-goto_0.svgz \
|
images/bookmark-goto_0.svgz \
|
||||||
images/bookmark-save.svgz \
|
images/bookmark-save.svgz \
|
||||||
@ -1802,6 +1816,20 @@ imagesoxygendir = $(imagesdir)/oxygen
|
|||||||
dist_imagesoxygen_DATA1X = \
|
dist_imagesoxygen_DATA1X = \
|
||||||
images/oxygen/all-changes-accept.svgz \
|
images/oxygen/all-changes-accept.svgz \
|
||||||
images/oxygen/all-changes-reject.svgz \
|
images/oxygen/all-changes-reject.svgz \
|
||||||
|
images/oxygen/bidi_ltr_depth-decrement.svgz \
|
||||||
|
images/oxygen/bidi_ltr_depth-increment.svgz \
|
||||||
|
images/oxygen/bidi_ltr_layout-toggle_Description.svgz \
|
||||||
|
images/oxygen/bidi_ltr_layout-toggle_Enumerate.svgz \
|
||||||
|
images/oxygen/bidi_ltr_layout-toggle_Itemize.svgz \
|
||||||
|
images/oxygen/bidi_ltr_layout-toggle_List.svgz \
|
||||||
|
images/oxygen/bidi_ltr_layout-toggle_Section.svgz \
|
||||||
|
images/oxygen/bidi_rtl_depth-decrement.svgz \
|
||||||
|
images/oxygen/bidi_rtl_depth-increment.svgz \
|
||||||
|
images/oxygen/bidi_rtl_layout-toggle_Description.svgz \
|
||||||
|
images/oxygen/bidi_rtl_layout-toggle_Enumerate.svgz \
|
||||||
|
images/oxygen/bidi_rtl_layout-toggle_Itemize.svgz \
|
||||||
|
images/oxygen/bidi_rtl_layout-toggle_List.svgz \
|
||||||
|
images/oxygen/bidi_rtl_layout-toggle_Section.svgz \
|
||||||
images/oxygen/bookmark-goto.svgz \
|
images/oxygen/bookmark-goto.svgz \
|
||||||
images/oxygen/bookmark-goto_0.svgz \
|
images/oxygen/bookmark-goto_0.svgz \
|
||||||
images/oxygen/bookmark-save.svgz \
|
images/oxygen/bookmark-save.svgz \
|
||||||
@ -2005,6 +2033,20 @@ imagesclassicdir = $(imagesdir)/classic
|
|||||||
dist_imagesclassic_DATA = \
|
dist_imagesclassic_DATA = \
|
||||||
images/classic/all-changes-accept.png \
|
images/classic/all-changes-accept.png \
|
||||||
images/classic/all-changes-reject.png \
|
images/classic/all-changes-reject.png \
|
||||||
|
images/classic/bidi_ltr_depth-decrement.png \
|
||||||
|
images/classic/bidi_ltr_depth-increment.png \
|
||||||
|
images/classic/bidi_ltr_layout-toggle_Description.png \
|
||||||
|
images/classic/bidi_ltr_layout-toggle_Enumerate.png \
|
||||||
|
images/classic/bidi_ltr_layout-toggle_Itemize.png \
|
||||||
|
images/classic/bidi_ltr_layout-toggle_List.png \
|
||||||
|
images/classic/bidi_ltr_layout-toggle_Section.png \
|
||||||
|
images/classic/bidi_rtl_depth-decrement.png \
|
||||||
|
images/classic/bidi_rtl_depth-increment.png \
|
||||||
|
images/classic/bidi_rtl_layout-toggle_Description.png \
|
||||||
|
images/classic/bidi_rtl_layout-toggle_Enumerate.png \
|
||||||
|
images/classic/bidi_rtl_layout-toggle_Itemize.png \
|
||||||
|
images/classic/bidi_rtl_layout-toggle_List.png \
|
||||||
|
images/classic/bidi_rtl_layout-toggle_Section.png \
|
||||||
images/classic/bookmark-goto.png \
|
images/classic/bookmark-goto.png \
|
||||||
images/classic/bookmark-goto_0.png \
|
images/classic/bookmark-goto_0.png \
|
||||||
images/classic/bookmark-save.png \
|
images/classic/bookmark-save.png \
|
||||||
|
BIN
lib/images/bidi_ltr_depth-decrement.svgz
Normal file
BIN
lib/images/bidi_ltr_depth-increment.svgz
Normal file
BIN
lib/images/bidi_ltr_layout-toggle_Description.svgz
Normal file
BIN
lib/images/bidi_ltr_layout-toggle_Enumerate.svgz
Normal file
BIN
lib/images/bidi_ltr_layout-toggle_Itemize.svgz
Normal file
BIN
lib/images/bidi_ltr_layout-toggle_List.svgz
Normal file
BIN
lib/images/bidi_ltr_layout-toggle_Section.svgz
Normal file
BIN
lib/images/bidi_rtl_depth-decrement.svgz
Normal file
BIN
lib/images/bidi_rtl_depth-increment.svgz
Normal file
BIN
lib/images/bidi_rtl_layout-toggle_Description.svgz
Normal file
BIN
lib/images/bidi_rtl_layout-toggle_Enumerate.svgz
Normal file
BIN
lib/images/bidi_rtl_layout-toggle_Itemize.svgz
Normal file
BIN
lib/images/bidi_rtl_layout-toggle_List.svgz
Normal file
BIN
lib/images/bidi_rtl_layout-toggle_Section.svgz
Normal file
BIN
lib/images/classic/bidi_ltr_depth-decrement.png
Normal file
After Width: | Height: | Size: 208 B |
BIN
lib/images/classic/bidi_ltr_depth-increment.png
Normal file
After Width: | Height: | Size: 215 B |
BIN
lib/images/classic/bidi_ltr_layout-toggle_Description.png
Normal file
After Width: | Height: | Size: 210 B |
BIN
lib/images/classic/bidi_ltr_layout-toggle_Enumerate.png
Normal file
After Width: | Height: | Size: 234 B |
BIN
lib/images/classic/bidi_ltr_layout-toggle_Itemize.png
Normal file
After Width: | Height: | Size: 202 B |
BIN
lib/images/classic/bidi_ltr_layout-toggle_List.png
Normal file
After Width: | Height: | Size: 199 B |
BIN
lib/images/classic/bidi_ltr_layout-toggle_Section.png
Normal file
After Width: | Height: | Size: 238 B |
BIN
lib/images/classic/bidi_rtl_depth-decrement.png
Normal file
After Width: | Height: | Size: 202 B |
BIN
lib/images/classic/bidi_rtl_depth-increment.png
Normal file
After Width: | Height: | Size: 205 B |
BIN
lib/images/classic/bidi_rtl_layout-toggle_Description.png
Normal file
After Width: | Height: | Size: 192 B |
BIN
lib/images/classic/bidi_rtl_layout-toggle_Enumerate.png
Normal file
After Width: | Height: | Size: 189 B |
BIN
lib/images/classic/bidi_rtl_layout-toggle_Itemize.png
Normal file
After Width: | Height: | Size: 183 B |
BIN
lib/images/classic/bidi_rtl_layout-toggle_List.png
Normal file
After Width: | Height: | Size: 158 B |
BIN
lib/images/classic/bidi_rtl_layout-toggle_Section.png
Normal file
After Width: | Height: | Size: 238 B |
BIN
lib/images/oxygen/bidi_ltr_depth-decrement.svgz
Normal file
BIN
lib/images/oxygen/bidi_ltr_depth-increment.svgz
Normal file
BIN
lib/images/oxygen/bidi_ltr_layout-toggle_Description.svgz
Normal file
BIN
lib/images/oxygen/bidi_ltr_layout-toggle_Enumerate.svgz
Normal file
BIN
lib/images/oxygen/bidi_ltr_layout-toggle_Itemize.svgz
Normal file
BIN
lib/images/oxygen/bidi_ltr_layout-toggle_List.svgz
Normal file
BIN
lib/images/oxygen/bidi_ltr_layout-toggle_Section.svgz
Normal file
BIN
lib/images/oxygen/bidi_rtl_depth-decrement.svgz
Normal file
BIN
lib/images/oxygen/bidi_rtl_depth-increment.svgz
Normal file
BIN
lib/images/oxygen/bidi_rtl_layout-toggle_Description.svgz
Normal file
BIN
lib/images/oxygen/bidi_rtl_layout-toggle_Enumerate.svgz
Normal file
BIN
lib/images/oxygen/bidi_rtl_layout-toggle_Itemize.svgz
Normal file
BIN
lib/images/oxygen/bidi_rtl_layout-toggle_List.svgz
Normal file
BIN
lib/images/oxygen/bidi_rtl_layout-toggle_Section.svgz
Normal file
@ -113,12 +113,20 @@ ToolbarSet
|
|||||||
|
|
||||||
Toolbar "extra" "Extra"
|
Toolbar "extra" "Extra"
|
||||||
Item "Default" "layout"
|
Item "Default" "layout"
|
||||||
Item "Numbered list" "layout-toggle Enumerate"
|
# The bidi function is used here to select a different
|
||||||
Item "Itemized list" "layout-toggle Itemize"
|
# icon depending on the direction of the current text.
|
||||||
Item "List" "layout-toggle List"
|
Item "Numbered list" "bidi ltr layout-toggle Enumerate"
|
||||||
Item "Description" "layout-toggle Description"
|
Item "Numbered list" "bidi rtl layout-toggle Enumerate"
|
||||||
Item "Increase depth" "depth-increment"
|
Item "Itemized list" "bidi ltr layout-toggle Itemize"
|
||||||
Item "Decrease depth" "depth-decrement"
|
Item "Itemized list" "bidi rtl layout-toggle Itemize"
|
||||||
|
Item "List" "bidi ltr layout-toggle List"
|
||||||
|
Item "List" "bidi rtl layout-toggle List"
|
||||||
|
Item "Description" "bidi ltr layout-toggle Description"
|
||||||
|
Item "Description" "bidi rtl layout-toggle Description"
|
||||||
|
Item "Increase depth" "bidi ltr depth-increment"
|
||||||
|
Item "Increase depth" "bidi rtl depth-increment"
|
||||||
|
Item "Decrease depth" "bidi ltr depth-decrement"
|
||||||
|
Item "Decrease depth" "bidi rtl depth-decrement"
|
||||||
Separator
|
Separator
|
||||||
Item "Insert figure float" "float-insert figure"
|
Item "Insert figure float" "float-insert figure"
|
||||||
Item "Insert table float" "float-insert table"
|
Item "Insert table float" "float-insert table"
|
||||||
|
@ -485,6 +485,7 @@ enum FuncCode
|
|||||||
LFUN_BUFFER_WRITE_AS_TEMPLATE, // spitz, 20190323
|
LFUN_BUFFER_WRITE_AS_TEMPLATE, // spitz, 20190323
|
||||||
LFUN_TABULAR_STYLE_INSERT, // spitz, 20190325
|
LFUN_TABULAR_STYLE_INSERT, // spitz, 20190325
|
||||||
LFUN_PARAGRAPH_SELECT, // Kornel, 20190416
|
LFUN_PARAGRAPH_SELECT, // Kornel, 20190416
|
||||||
|
LFUN_BIDI,
|
||||||
LFUN_LASTACTION // end of the table
|
LFUN_LASTACTION // end of the table
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -332,6 +332,20 @@ void LyXAction::init()
|
|||||||
{ LFUN_BIBTEX_DATABASE_DEL, "bibtex-database-del", Noop, Edit },
|
{ LFUN_BIBTEX_DATABASE_DEL, "bibtex-database-del", Noop, Edit },
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \var lyx::FuncCode lyx::LFUN_BIDI
|
||||||
|
* \li Action: Helper function for bidirectional toolbar icons
|
||||||
|
* \li Notion: In a text, the function is marked as `unknown' when the
|
||||||
|
current direction does not correspond to DIRECTION (ltr
|
||||||
|
or rtl). Otherwise the function behaves exactly as
|
||||||
|
ACTION. The result is that ACTION will be associated to
|
||||||
|
a different icon depending on text direction.
|
||||||
|
* \li Syntax: bidi <DIRECTION> <ACTION>
|
||||||
|
* \li Origin: JMarc, 21 July 2019
|
||||||
|
* \endvar
|
||||||
|
*/
|
||||||
|
{ LFUN_BIDI, "bidi", Noop, System },
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \var lyx::FuncCode lyx::LFUN_BOOKMARK_CLEAR
|
* \var lyx::FuncCode lyx::LFUN_BOOKMARK_CLEAR
|
||||||
* \li Action: Clears the list of saved bookmarks.
|
* \li Action: Clears the list of saved bookmarks.
|
||||||
|
@ -76,6 +76,7 @@ void Action::update()
|
|||||||
setCheckable(false);
|
setCheckable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setVisible(!status.unknown());
|
||||||
setEnabled(status.enabled());
|
setEnabled(status.enabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,11 +70,11 @@
|
|||||||
#include "support/lassert.h"
|
#include "support/lassert.h"
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "support/lyxalgo.h" // sorted
|
#include "support/lyxalgo.h" // sorted
|
||||||
#include "support/textutils.h"
|
|
||||||
#include "support/Messages.h"
|
#include "support/Messages.h"
|
||||||
#include "support/os.h"
|
#include "support/os.h"
|
||||||
#include "support/Package.h"
|
#include "support/Package.h"
|
||||||
#include "support/TempFile.h"
|
#include "support/TempFile.h"
|
||||||
|
#include "support/textutils.h"
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
#include "support/AppleScript.h"
|
#include "support/AppleScript.h"
|
||||||
@ -928,7 +928,7 @@ public:
|
|||||||
struct GuiApplication::Private
|
struct GuiApplication::Private
|
||||||
{
|
{
|
||||||
Private(): language_model_(0), meta_fake_bit(NoModifier),
|
Private(): language_model_(0), meta_fake_bit(NoModifier),
|
||||||
global_menubar_(0)
|
global_menubar_(0)
|
||||||
{
|
{
|
||||||
#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400)
|
#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400)
|
||||||
#if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
|
#if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
|
||||||
@ -1292,6 +1292,24 @@ bool GuiApplication::getStatus(FuncRequest const & cmd, FuncStatus & flag) const
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case LFUN_BIDI: {
|
||||||
|
string const dir = cmd.getArg(0);
|
||||||
|
string const lfun = cmd.getLongArg(1);
|
||||||
|
BufferView const * bv =
|
||||||
|
current_view_ ? current_view_->currentBufferView() : nullptr;
|
||||||
|
bool rtl = bv ? bv->cursor().innerParagraph().isRTL(bv->buffer().params())
|
||||||
|
: layoutDirection() == Qt::RightToLeft;
|
||||||
|
if (((rtl && dir != "rtl") || (!rtl && dir != "ltr"))) {
|
||||||
|
flag.setUnknown(true);
|
||||||
|
flag.setEnabled(false);
|
||||||
|
} else {
|
||||||
|
FuncRequest func(lyxaction.lookupFunc(lfun));
|
||||||
|
func.setOrigin(cmd.origin());
|
||||||
|
flag = getStatus(func);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case LFUN_CURSOR_FOLLOWS_SCROLLBAR_TOGGLE:
|
case LFUN_CURSOR_FOLLOWS_SCROLLBAR_TOGGLE:
|
||||||
case LFUN_REPEAT:
|
case LFUN_REPEAT:
|
||||||
case LFUN_PREFERENCES_SAVE:
|
case LFUN_PREFERENCES_SAVE:
|
||||||
@ -1869,6 +1887,7 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
|
|||||||
lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar;
|
lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// --- syntax commands ----------------------------
|
||||||
case LFUN_REPEAT: {
|
case LFUN_REPEAT: {
|
||||||
// repeat command
|
// repeat command
|
||||||
string countstr;
|
string countstr;
|
||||||
@ -2020,6 +2039,18 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case LFUN_BIDI: {
|
||||||
|
string const lfun = cmd.getLongArg(1);
|
||||||
|
FuncRequest func(lyxaction.lookupFunc(cmd.getLongArg(1)));
|
||||||
|
func.setOrigin(cmd.origin());
|
||||||
|
FuncStatus const stat = getStatus(func);
|
||||||
|
if (stat.enabled()) {
|
||||||
|
dispatch(func);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case LFUN_PREFERENCES_SAVE:
|
case LFUN_PREFERENCES_SAVE:
|
||||||
lyxrc.write(support::makeAbsPath("preferences",
|
lyxrc.write(support::makeAbsPath("preferences",
|
||||||
package().user_support().absFileName()), false);
|
package().user_support().absFileName()), false);
|
||||||
|
@ -519,8 +519,7 @@ void GuiToolbar::add(ToolbarItem const & item)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ToolbarItem::COMMAND: {
|
case ToolbarItem::COMMAND: {
|
||||||
if (!getStatus(*item.func_).unknown())
|
addAction(addItem(item));
|
||||||
addAction(addItem(item));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|