mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-25 10:58:52 +00:00
support for tabular*
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@37471 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
c0a727a9d4
commit
119ea9cd24
@ -11,6 +11,11 @@ adjustments are made to tex2lyx and bugs are fixed in lyx2lyx.
|
|||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
2011-02-03 Edwin Leuven <e.leuven@gmail.com>
|
||||||
|
* Format incremented to 411 (r37471)
|
||||||
|
Support tabular* : add tabularwidth parameter to
|
||||||
|
tabular features
|
||||||
|
|
||||||
2011-02-03 Jürgen Spitzmüller <spitz@lyx.org>
|
2011-02-03 Jürgen Spitzmüller <spitz@lyx.org>
|
||||||
* Format incremented to 411
|
* Format incremented to 411
|
||||||
New buffer param \language_package to allow per-document
|
New buffer param \language_package to allow per-document
|
||||||
|
@ -2436,6 +2436,28 @@ def convert_langpack(document):
|
|||||||
|
|
||||||
document.header.insert(i + 1, "\\language_package default")
|
document.header.insert(i + 1, "\\language_package default")
|
||||||
|
|
||||||
|
|
||||||
|
def revert_tabularwidth(document):
|
||||||
|
i = 0
|
||||||
|
while True:
|
||||||
|
i = find_token(document.body, "\\begin_inset Tabular", i)
|
||||||
|
if i == -1:
|
||||||
|
return
|
||||||
|
j = find_end_of_inset(document.body, i)
|
||||||
|
if j == -1:
|
||||||
|
document.warning("Unable to find end of Tabular inset at line " + str(i))
|
||||||
|
i += 1
|
||||||
|
continue
|
||||||
|
i += 1
|
||||||
|
features = find_token(document.body, "<features", i, j)
|
||||||
|
if features == -1:
|
||||||
|
document.warning("Can't find any features in Tabular inset at line " + str(i))
|
||||||
|
i = j
|
||||||
|
continue
|
||||||
|
if document.body[features].find('alignment="tabularwidth"') != -1:
|
||||||
|
remove_option(document.body, features, 'tabularwidth')
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# Conversion hub
|
# Conversion hub
|
||||||
#
|
#
|
||||||
@ -2506,10 +2528,12 @@ convert = [[346, []],
|
|||||||
[408, []],
|
[408, []],
|
||||||
[409, [convert_use_xetex]],
|
[409, [convert_use_xetex]],
|
||||||
[410, []],
|
[410, []],
|
||||||
[411, [convert_langpack]]
|
[411, [convert_langpack]],
|
||||||
|
[410, []]
|
||||||
]
|
]
|
||||||
|
|
||||||
revert = [[410, [revert_langpack]],
|
revert = [[411, [revert_tabularwidth]],
|
||||||
|
[410, [revert_langpack]],
|
||||||
[409, [revert_labeling]],
|
[409, [revert_labeling]],
|
||||||
[408, [revert_use_xetex]],
|
[408, [revert_use_xetex]],
|
||||||
[407, [revert_script]],
|
[407, [revert_script]],
|
||||||
|
@ -127,7 +127,7 @@ namespace {
|
|||||||
|
|
||||||
// Do not remove the comment below, so we get merge conflict in
|
// Do not remove the comment below, so we get merge conflict in
|
||||||
// independent branches. Instead add your own.
|
// independent branches. Instead add your own.
|
||||||
int const LYX_FORMAT = 411; // spitz: lang_package buffer param
|
int const LYX_FORMAT = 412; // edwin: set tabular width
|
||||||
|
|
||||||
typedef map<string, bool> DepClean;
|
typedef map<string, bool> DepClean;
|
||||||
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
|
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
|
||||||
|
@ -48,12 +48,14 @@ GuiTabular::GuiTabular(QWidget * parent)
|
|||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
|
|
||||||
|
tabularWidthED->setValidator(unsignedLengthValidator(tabularWidthED));
|
||||||
widthED->setValidator(unsignedLengthValidator(widthED));
|
widthED->setValidator(unsignedLengthValidator(widthED));
|
||||||
multirowOffsetED->setValidator(new LengthValidator(multirowOffsetED));
|
multirowOffsetED->setValidator(new LengthValidator(multirowOffsetED));
|
||||||
topspaceED->setValidator(new LengthValidator(topspaceED));
|
topspaceED->setValidator(new LengthValidator(topspaceED));
|
||||||
bottomspaceED->setValidator(new LengthValidator(bottomspaceED));
|
bottomspaceED->setValidator(new LengthValidator(bottomspaceED));
|
||||||
interlinespaceED->setValidator(new LengthValidator(interlinespaceED));
|
interlinespaceED->setValidator(new LengthValidator(interlinespaceED));
|
||||||
|
|
||||||
|
tabularWidthUnitCB->setCurrentItem(Length::defaultUnit());
|
||||||
widthUnitCB->setCurrentItem(Length::defaultUnit());
|
widthUnitCB->setCurrentItem(Length::defaultUnit());
|
||||||
multirowOffsetUnitCB->setCurrentItem(Length::defaultUnit());
|
multirowOffsetUnitCB->setCurrentItem(Length::defaultUnit());
|
||||||
topspaceUnitCB->setCurrentItem(Length::defaultUnit());
|
topspaceUnitCB->setCurrentItem(Length::defaultUnit());
|
||||||
@ -152,6 +154,8 @@ GuiTabular::GuiTabular(QWidget * parent)
|
|||||||
this, SLOT(checkEnabled()));
|
this, SLOT(checkEnabled()));
|
||||||
connect(rightRB, SIGNAL(clicked()),
|
connect(rightRB, SIGNAL(clicked()),
|
||||||
this, SLOT(checkEnabled()));
|
this, SLOT(checkEnabled()));
|
||||||
|
connect(tabularWidthED, SIGNAL(textEdited(const QString &)),
|
||||||
|
this, SLOT(checkEnabled()));
|
||||||
|
|
||||||
decimalPointLE->setInputMask("X; ");
|
decimalPointLE->setInputMask("X; ");
|
||||||
decimalPointLE->setMaxLength(1);
|
decimalPointLE->setMaxLength(1);
|
||||||
@ -199,15 +203,25 @@ void GuiTabular::checkEnabled()
|
|||||||
hAlignCB->setEnabled(!(multirowCB->isChecked()
|
hAlignCB->setEnabled(!(multirowCB->isChecked()
|
||||||
&& !widgetsToLength(widthED, widthUnitCB).empty())
|
&& !widgetsToLength(widthED, widthUnitCB).empty())
|
||||||
&& specialAlignmentED->text().isEmpty());
|
&& specialAlignmentED->text().isEmpty());
|
||||||
bool dalign =
|
bool const dalign =
|
||||||
hAlignCB->itemData(hAlignCB->currentIndex()).toString() == QString("decimal");
|
hAlignCB->itemData(hAlignCB->currentIndex()).toString() == QString("decimal");
|
||||||
decimalPointLE->setEnabled(dalign);
|
decimalPointLE->setEnabled(dalign);
|
||||||
decimalL->setEnabled(dalign);
|
decimalL->setEnabled(dalign);
|
||||||
|
|
||||||
|
bool const setwidth = TableAlignCB->currentText() == qt_("Middle")
|
||||||
|
&& !longTabularCB->isChecked() && !rotateTabularCB->isChecked();
|
||||||
|
tabularWidthL->setEnabled(setwidth);
|
||||||
|
tabularWidthED->setEnabled(setwidth);
|
||||||
|
tabularWidthUnitCB->setEnabled(setwidth);
|
||||||
|
|
||||||
|
bool const is_tabular_star = !tabularWidthED->text().isEmpty();
|
||||||
|
rotateTabularCB->setDisabled(is_tabular_star);
|
||||||
|
|
||||||
vAlignCB->setEnabled(!multirowCB->isChecked()
|
vAlignCB->setEnabled(!multirowCB->isChecked()
|
||||||
&& !widgetsToLength(widthED, widthUnitCB).empty()
|
&& !widgetsToLength(widthED, widthUnitCB).empty()
|
||||||
&& specialAlignmentED->text().isEmpty());
|
&& specialAlignmentED->text().isEmpty());
|
||||||
|
|
||||||
|
topspaceED->setEnabled(topspaceCO->currentIndex() == 2);
|
||||||
topspaceED->setEnabled(topspaceCO->currentIndex() == 2);
|
topspaceED->setEnabled(topspaceCO->currentIndex() == 2);
|
||||||
topspaceUnitCB->setEnabled(topspaceCO->currentIndex() == 2);
|
topspaceUnitCB->setEnabled(topspaceCO->currentIndex() == 2);
|
||||||
bottomspaceED->setEnabled(bottomspaceCO->currentIndex() == 2);
|
bottomspaceED->setEnabled(bottomspaceCO->currentIndex() == 2);
|
||||||
@ -216,13 +230,15 @@ void GuiTabular::checkEnabled()
|
|||||||
interlinespaceUnitCB->setEnabled(interlinespaceCO->currentIndex() == 2);
|
interlinespaceUnitCB->setEnabled(interlinespaceCO->currentIndex() == 2);
|
||||||
|
|
||||||
// setting as longtable is not allowed when table is inside a float
|
// setting as longtable is not allowed when table is inside a float
|
||||||
longTabularCB->setEnabled(funcEnabled(Tabular::SET_LONGTABULAR));
|
longTabularCB->setEnabled(!is_tabular_star && funcEnabled(Tabular::SET_LONGTABULAR));
|
||||||
bool const longtabular = longTabularCB->isChecked();
|
bool const longtabular = longTabularCB->isChecked();
|
||||||
longtableGB->setEnabled(true);
|
longtableGB->setEnabled(true);
|
||||||
newpageCB->setEnabled(longtabular);
|
newpageCB->setEnabled(longtabular);
|
||||||
alignmentGB->setEnabled(longtabular);
|
alignmentGB->setEnabled(longtabular);
|
||||||
// longtables cannot have a vertical alignment
|
// longtables and tabular* cannot have a vertical alignment
|
||||||
TableAlignCB->setDisabled(longtabular);
|
TableAlignCB->setDisabled(is_tabular_star || longtabular);
|
||||||
|
TableAlignCO->setDisabled(is_tabular_star || longtabular);
|
||||||
|
TableAlignCB->setDisabled(is_tabular_star || longtabular);
|
||||||
|
|
||||||
// FIXME: This Dialog is really horrible, disabling/enabling a checkbox
|
// FIXME: This Dialog is really horrible, disabling/enabling a checkbox
|
||||||
// depending on the cursor position is very very unintuitive...
|
// depending on the cursor position is very very unintuitive...
|
||||||
@ -394,6 +410,12 @@ docstring GuiTabular::dialogToParams() const
|
|||||||
// FIXME: We should use Tabular directly.
|
// FIXME: We should use Tabular directly.
|
||||||
string param_str = "tabular";
|
string param_str = "tabular";
|
||||||
|
|
||||||
|
// table width
|
||||||
|
string tabwidth = widgetsToLength(tabularWidthED, tabularWidthUnitCB);
|
||||||
|
if (tabwidth.empty())
|
||||||
|
tabwidth = "0pt";
|
||||||
|
setParam(param_str, Tabular::SET_TABULAR_WIDTH, tabwidth);
|
||||||
|
|
||||||
// apply the fixed width values
|
// apply the fixed width values
|
||||||
// this must be done before applying the column alignment
|
// this must be done before applying the column alignment
|
||||||
// because its value influences the alignment of multirow cells
|
// because its value influences the alignment of multirow cells
|
||||||
@ -674,6 +696,14 @@ void GuiTabular::paramsToDialog(Inset const * inset)
|
|||||||
|
|
||||||
///////////////////////////////////
|
///////////////////////////////////
|
||||||
// Set width and alignment
|
// Set width and alignment
|
||||||
|
|
||||||
|
Length const tabwidth = tabular.tabularWidth();
|
||||||
|
if (tabwidth.zero())
|
||||||
|
tabularWidthED->clear();
|
||||||
|
else
|
||||||
|
lengthToWidgets(widthED, widthUnitCB,
|
||||||
|
tabwidth.asString(), default_unit);
|
||||||
|
|
||||||
Length pwidth;
|
Length pwidth;
|
||||||
docstring special;
|
docstring special;
|
||||||
if (multicol) {
|
if (multicol) {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -183,6 +183,7 @@ TabularFeature tabularFeature[] =
|
|||||||
{ Tabular::LONGTABULAR_ALIGN_CENTER, "longtabular-align-center", false },
|
{ Tabular::LONGTABULAR_ALIGN_CENTER, "longtabular-align-center", false },
|
||||||
{ Tabular::LONGTABULAR_ALIGN_RIGHT, "longtabular-align-right", false },
|
{ Tabular::LONGTABULAR_ALIGN_RIGHT, "longtabular-align-right", false },
|
||||||
{ Tabular::SET_DECIMAL_POINT, "set-decimal-point", true },
|
{ Tabular::SET_DECIMAL_POINT, "set-decimal-point", true },
|
||||||
|
{ Tabular::SET_TABULAR_WIDTH, "set-tabular-width", true },
|
||||||
{ Tabular::LAST_ACTION, "", false }
|
{ Tabular::LAST_ACTION, "", false }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -678,6 +679,7 @@ void Tabular::init(Buffer * buf, row_type rows_arg,
|
|||||||
updateIndexes();
|
updateIndexes();
|
||||||
is_long_tabular = false;
|
is_long_tabular = false;
|
||||||
tabular_valignment = LYX_VALIGN_MIDDLE;
|
tabular_valignment = LYX_VALIGN_MIDDLE;
|
||||||
|
tabular_width = Length();
|
||||||
longtabular_alignment = LYX_LONGTABULAR_ALIGN_CENTER;
|
longtabular_alignment = LYX_LONGTABULAR_ALIGN_CENTER;
|
||||||
rotate = false;
|
rotate = false;
|
||||||
use_booktabs = false;
|
use_booktabs = false;
|
||||||
@ -1391,8 +1393,10 @@ void Tabular::write(ostream & os) const
|
|||||||
<< write_attribute("lastFootBottomDL", endlastfoot.bottomDL)
|
<< write_attribute("lastFootBottomDL", endlastfoot.bottomDL)
|
||||||
<< write_attribute("lastFootEmpty", endlastfoot.empty);
|
<< write_attribute("lastFootEmpty", endlastfoot.empty);
|
||||||
// longtables cannot be aligned vertically
|
// longtables cannot be aligned vertically
|
||||||
if (!is_long_tabular)
|
if (!is_long_tabular) {
|
||||||
os << write_attribute("tabularvalignment", tabular_valignment);
|
os << write_attribute("tabularvalignment", tabular_valignment);
|
||||||
|
os << write_attribute("tabularwidth", tabular_width);
|
||||||
|
}
|
||||||
if (is_long_tabular)
|
if (is_long_tabular)
|
||||||
os << write_attribute("longtabularalignment",
|
os << write_attribute("longtabularalignment",
|
||||||
longtabular_alignment);
|
longtabular_alignment);
|
||||||
@ -1489,6 +1493,7 @@ void Tabular::read(Lexer & lex)
|
|||||||
getTokenValue(line, "booktabs", use_booktabs);
|
getTokenValue(line, "booktabs", use_booktabs);
|
||||||
getTokenValue(line, "islongtable", is_long_tabular);
|
getTokenValue(line, "islongtable", is_long_tabular);
|
||||||
getTokenValue(line, "tabularvalignment", tabular_valignment);
|
getTokenValue(line, "tabularvalignment", tabular_valignment);
|
||||||
|
getTokenValue(line, "tabularwidth", tabular_width);
|
||||||
getTokenValue(line, "longtabularalignment", longtabular_alignment);
|
getTokenValue(line, "longtabularalignment", longtabular_alignment);
|
||||||
getTokenValue(line, "firstHeadTopDL", endfirsthead.topDL);
|
getTokenValue(line, "firstHeadTopDL", endfirsthead.topDL);
|
||||||
getTokenValue(line, "firstHeadBottomDL", endfirsthead.bottomDL);
|
getTokenValue(line, "firstHeadBottomDL", endfirsthead.bottomDL);
|
||||||
@ -2594,6 +2599,7 @@ int Tabular::TeXRow(otexstream & os, row_type row,
|
|||||||
int Tabular::latex(otexstream & os, OutputParams const & runparams) const
|
int Tabular::latex(otexstream & os, OutputParams const & runparams) const
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
bool const is_tabular_star = !tabular_width.zero();
|
||||||
|
|
||||||
//+---------------------------------------------------------------------
|
//+---------------------------------------------------------------------
|
||||||
//+ first the opening preamble +
|
//+ first the opening preamble +
|
||||||
@ -2616,7 +2622,10 @@ int Tabular::latex(otexstream & os, OutputParams const & runparams) const
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
os << "\\begin{tabular}";
|
if (is_tabular_star)
|
||||||
|
os << "\\begin{tabular*}{" << from_ascii(tabular_width.asLatexString()) << "}";
|
||||||
|
else
|
||||||
|
os << "\\begin{tabular}";
|
||||||
switch (tabular_valignment) {
|
switch (tabular_valignment) {
|
||||||
case LYX_VALIGN_TOP:
|
case LYX_VALIGN_TOP:
|
||||||
os << "[t]";
|
os << "[t]";
|
||||||
@ -2631,6 +2640,9 @@ int Tabular::latex(otexstream & os, OutputParams const & runparams) const
|
|||||||
|
|
||||||
os << "{";
|
os << "{";
|
||||||
|
|
||||||
|
if (is_tabular_star)
|
||||||
|
os << "@{\\extracolsep{\\fill}}";
|
||||||
|
|
||||||
for (col_type c = 0; c < ncols(); ++c) {
|
for (col_type c = 0; c < ncols(); ++c) {
|
||||||
if (columnLeftLine(c))
|
if (columnLeftLine(c))
|
||||||
os << '|';
|
os << '|';
|
||||||
@ -2716,7 +2728,10 @@ int Tabular::latex(otexstream & os, OutputParams const & runparams) const
|
|||||||
if (is_long_tabular)
|
if (is_long_tabular)
|
||||||
os << "\\end{longtable}";
|
os << "\\end{longtable}";
|
||||||
else
|
else
|
||||||
os << "\\end{tabular}";
|
if (is_tabular_star)
|
||||||
|
os << "\\end{tabular*}";
|
||||||
|
else
|
||||||
|
os << "\\end{tabular}";
|
||||||
if (rotate) {
|
if (rotate) {
|
||||||
// clear counter
|
// clear counter
|
||||||
os.countLines();
|
os.countLines();
|
||||||
@ -4360,6 +4375,11 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
|
|||||||
status.clear();
|
status.clear();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case Tabular::SET_TABULAR_WIDTH:
|
||||||
|
status.setEnabled(!tabular.rotate && !tabular.is_long_tabular
|
||||||
|
&& tabular.tabular_valignment == Tabular::LYX_VALIGN_MIDDLE);
|
||||||
|
break;
|
||||||
|
|
||||||
case Tabular::SET_DECIMAL_POINT:
|
case Tabular::SET_DECIMAL_POINT:
|
||||||
status.setEnabled(
|
status.setEnabled(
|
||||||
tabular.getAlignment(cur.idx()) == LYX_ALIGN_DECIMAL);
|
tabular.getAlignment(cur.idx()) == LYX_ALIGN_DECIMAL);
|
||||||
@ -4498,18 +4518,22 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
|
|||||||
|
|
||||||
case Tabular::TOGGLE_ROTATE_TABULAR:
|
case Tabular::TOGGLE_ROTATE_TABULAR:
|
||||||
case Tabular::SET_ROTATE_TABULAR:
|
case Tabular::SET_ROTATE_TABULAR:
|
||||||
|
status.setEnabled(tabular.tabular_width.zero());
|
||||||
status.setOnOff(tabular.rotate);
|
status.setOnOff(tabular.rotate);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Tabular::TABULAR_VALIGN_TOP:
|
case Tabular::TABULAR_VALIGN_TOP:
|
||||||
|
status.setEnabled(tabular.tabular_width.zero());
|
||||||
status.setOnOff(tabular.tabular_valignment
|
status.setOnOff(tabular.tabular_valignment
|
||||||
== Tabular::LYX_VALIGN_TOP);
|
== Tabular::LYX_VALIGN_TOP);
|
||||||
break;
|
break;
|
||||||
case Tabular::TABULAR_VALIGN_MIDDLE:
|
case Tabular::TABULAR_VALIGN_MIDDLE:
|
||||||
|
status.setEnabled(tabular.tabular_width.zero());
|
||||||
status.setOnOff(tabular.tabular_valignment
|
status.setOnOff(tabular.tabular_valignment
|
||||||
== Tabular::LYX_VALIGN_MIDDLE);
|
== Tabular::LYX_VALIGN_MIDDLE);
|
||||||
break;
|
break;
|
||||||
case Tabular::TABULAR_VALIGN_BOTTOM:
|
case Tabular::TABULAR_VALIGN_BOTTOM:
|
||||||
|
status.setEnabled(tabular.tabular_width.zero());
|
||||||
status.setOnOff(tabular.tabular_valignment
|
status.setOnOff(tabular.tabular_valignment
|
||||||
== Tabular::LYX_VALIGN_BOTTOM);
|
== Tabular::LYX_VALIGN_BOTTOM);
|
||||||
break;
|
break;
|
||||||
@ -5187,6 +5211,10 @@ void InsetTabular::tabularFeatures(Cursor & cur,
|
|||||||
|
|
||||||
switch (feature) {
|
switch (feature) {
|
||||||
|
|
||||||
|
case Tabular::SET_TABULAR_WIDTH:
|
||||||
|
tabular.setTabularWidth(Length(value));
|
||||||
|
break;
|
||||||
|
|
||||||
case Tabular::SET_PWIDTH: {
|
case Tabular::SET_PWIDTH: {
|
||||||
Length const len(value);
|
Length const len(value);
|
||||||
tabular.setColumnPWidth(cur, cur.idx(), len);
|
tabular.setColumnPWidth(cur, cur.idx(), len);
|
||||||
|
@ -270,6 +270,8 @@ public:
|
|||||||
///
|
///
|
||||||
SET_DECIMAL_POINT,
|
SET_DECIMAL_POINT,
|
||||||
///
|
///
|
||||||
|
SET_TABULAR_WIDTH,
|
||||||
|
///
|
||||||
LAST_ACTION
|
LAST_ACTION
|
||||||
};
|
};
|
||||||
///
|
///
|
||||||
@ -402,6 +404,10 @@ public:
|
|||||||
void setVAlignment(idx_type cell, VAlignment align,
|
void setVAlignment(idx_type cell, VAlignment align,
|
||||||
bool onlycolumn = false);
|
bool onlycolumn = false);
|
||||||
///
|
///
|
||||||
|
void setTabularWidth(Length const & l) { tabular_width = l; }
|
||||||
|
///
|
||||||
|
Length tabularWidth() const { return tabular_width; }
|
||||||
|
///
|
||||||
void setColumnPWidth(Cursor &, idx_type, Length const &);
|
void setColumnPWidth(Cursor &, idx_type, Length const &);
|
||||||
///
|
///
|
||||||
bool setMColumnPWidth(Cursor &, idx_type, Length const &);
|
bool setMColumnPWidth(Cursor &, idx_type, Length const &);
|
||||||
@ -675,6 +681,8 @@ public:
|
|||||||
///
|
///
|
||||||
mutable cell_vvector cell_info;
|
mutable cell_vvector cell_info;
|
||||||
///
|
///
|
||||||
|
Length tabular_width;
|
||||||
|
///
|
||||||
bool use_booktabs;
|
bool use_booktabs;
|
||||||
///
|
///
|
||||||
bool rotate;
|
bool rotate;
|
||||||
|
Loading…
Reference in New Issue
Block a user