View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002816 | Wishes | Panel | public | 2014-10-02 10:47 | 2014-10-08 17:15 |
| Reporter | Maximus | Assigned To | |||
| Priority | normal | Severity | minor | Reproducibility | have not tried |
| Status | new | Resolution | open | ||
| Product Version | 3.0 | ||||
| Summary | 0002816: Многострочная статусная область | ||||
| Description | Дать возможность юзеру настроить многострочную статусную область. Реализация - через фиктивную колонку "B". B[C,R] - (только для строки статуса) фиктивная колонка, соответствующая разрыву строки, таким образом можно настроить многострочную область статуса; ширина фиктивной колонки (хотя бы и 0) должна быть указана Можно указать один из модификаторов выравнивания, где: C - по центру, лидирующие и концевые пробелы обрезаются; R - по правому краю; Колонку можно указать на первом месте для выравнивания первой статусной строки | ||||
| Tags | No tags attached. | ||||
| Build | |||||
|
|
Multiline-panel-status-line.patch (21,008 bytes)
From def83a7e2451dc41a961629503091e6d69fcce58 Mon Sep 17 00:00:00 2001
From: Maximus5 <ConEmu.Maximus5@gmail.com>
Date: Fri, 29 Aug 2014 00:49:17 +0400
Subject: [PATCH] Multiline panel status line
---
unicode_far/FarEng.hlf.m4 | 9 ++
unicode_far/FarRus.hlf.m4 | 10 +++
unicode_far/filelist.cpp | 208 ++++++++++++++++++++++++++++++++++++++-------
unicode_far/filelist.hpp | 1 +
unicode_far/panel.hpp | 3 +-
unicode_far/panelctype.hpp | 3 +-
unicode_far/panelmix.cpp | 47 ++++++++--
7 files changed, 241 insertions(+), 40 deletions(-)
diff --git a/unicode_far/FarEng.hlf.m4 b/unicode_far/FarEng.hlf.m4
index c17f8f4..e39cb62 100644
--- a/unicode_far/FarEng.hlf.m4
+++ b/unicode_far/FarEng.hlf.m4
@@ -3978,6 +3978,15 @@ characters, delimited with commas. Allowed column types are:
F - number of streams
+ B[C,R] - ^<wrap>(only for status line) fictive column,
+means column break, so, you can set up multiline status area;
+you must specify column width (even if 0) must be specified.
+ You may supply one of align modificators,
+ where: C - ^<wrap>center align, leading and trailing spaces will be omitted;
+ R - right align;
+ ^<wrap>You may supply B column as first column
+for aligning first status line.
+
If the column types description contains more than one file name column,
the file panel will be displayed in multicolumn form.
diff --git a/unicode_far/FarRus.hlf.m4 b/unicode_far/FarRus.hlf.m4
index b630016..93794c1 100644
--- a/unicode_far/FarRus.hlf.m4
+++ b/unicode_far/FarRus.hlf.m4
@@ -4062,6 +4062,16 @@ $ #Настройка режимов просмотра панели файло
F - количество потоков
+ B[C,R] - ^<wrap>(только для строки статуса) фиктивная колонка,
+соответствующая разрыву строки, таким образом можно настроить
+многострочную область статуса; ширина фиктивной колонки (хотя бы и 0)
+должна быть указана
+ Можно указать один из модификаторов выравнивания,
+ где: C - ^<wrap>по центру, лидирующие и концевые пробелы обрезаются;
+ R - по правому краю;
+ ^<wrap>Колонку можно указать на первом месте для выравнивания первой
+статусной строки
+
Если описание типов колонок содержит более одной колонки имени
файла, панель файлов будет отображаться в многоколоночной форме.
diff --git a/unicode_far/filelist.cpp b/unicode_far/filelist.cpp
index d5ab232..6753e0a 100644
--- a/unicode_far/filelist.cpp
+++ b/unicode_far/filelist.cpp
@@ -2922,6 +2922,7 @@ int FileList::ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent)
Global->Elevation->ResetApprove();
int RetCode;
+ int StatusHeight = GetPanelStatusHeight();
if (IsVisible() && Global->Opt->ShowColumnTitles && !MouseEvent->dwEventFlags &&
MouseEvent->dwMousePosition.Y==m_Y1+1 &&
@@ -2997,7 +2998,7 @@ int FileList::ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent)
return RetCode;
if (MouseEvent->dwMousePosition.Y>m_Y1+Global->Opt->ShowColumnTitles &&
- MouseEvent->dwMousePosition.Y<m_Y2-2*Global->Opt->ShowPanelStatus)
+ MouseEvent->dwMousePosition.Y<m_Y2-StatusHeight)
{
SetFocus();
@@ -3091,14 +3092,14 @@ int FileList::ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent)
return TRUE;
}
- if (MouseEvent->dwMousePosition.Y>=m_Y2-2)
+ if (MouseEvent->dwMousePosition.Y>=m_Y2-StatusHeight)
{
SetFocus();
if (m_ListData.empty())
return TRUE;
- while (IsMouseButtonPressed() && IntKeyState.MouseY>=m_Y2-2)
+ while (IsMouseButtonPressed() && IntKeyState.MouseY>=m_Y2-StatusHeight)
{
MoveCursor(1);
@@ -7383,9 +7384,10 @@ static LNGID __FormatEndSelectedPhrase(size_t Count)
void FileList::DisplayObject()
{
- m_Height=m_Y2-m_Y1-4+!Global->Opt->ShowColumnTitles+(Global->Opt->ShowPanelStatus ? 0:2);
_OT(SysLog(L"[%p] FileList::DisplayObject()",this));
+ m_Height=m_Y2-m_Y1+!Global->Opt->ShowColumnTitles-(Global->Opt->ShowPanelStatus ? (GetPanelStatusHeight()+2) : 2);
+
if (UpdateRequired)
{
UpdateRequired=FALSE;
@@ -7796,14 +7798,15 @@ void FileList::ShowSelectedSize()
if (Global->Opt->ShowPanelStatus)
{
SetColor(COL_PANELBOX);
- DrawSeparator(m_Y2-2);
+ int StatusHeight = GetPanelStatusHeight();
+ DrawSeparator(m_Y2-StatusHeight);
for (size_t I=0,ColumnPos=m_X1+1; I<m_ViewSettings.PanelColumns.size() - 1; I++)
{
if (m_ViewSettings.PanelColumns[I].width < 0 || (I == m_ViewSettings.PanelColumns.size() - 2 && m_ViewSettings.PanelColumns[I+1].width < 0))
continue;
ColumnPos += m_ViewSettings.PanelColumns[I].width;
- GotoXY(static_cast<int>(ColumnPos),m_Y2-2);
+ GotoXY(static_cast<int>(ColumnPos),m_Y2-StatusHeight);
bool DoubleLine = Global->Opt->DoubleGlobalColumnSeparator && (!((I+1)%ColumnsInGlobal));
BoxText(BoxSymbols[DoubleLine?BS_B_H1V2:BS_B_H1V1]);
@@ -7820,7 +7823,7 @@ void FileList::ShowSelectedSize()
TruncStr(strSelStr,m_X2-m_X1-1);
int Length=(int)strSelStr.size();
SetColor(COL_PANELSELECTEDINFO);
- GotoXY(m_X1+(m_X2-m_X1+1-Length)/2,m_Y2-2*Global->Opt->ShowPanelStatus);
+ GotoXY(m_X1+(m_X2-m_X1+1-Length)/2,m_Y2-GetPanelStatusHeight());
Text(strSelStr);
}
}
@@ -8034,19 +8037,65 @@ void FileList::PrepareViewSettings(int ViewMode, const OpenPanelInfo *PlugInfo)
}
m_Columns=PreparePanelView(&m_ViewSettings);
- m_Height=m_Y2-m_Y1-4;
+ int StatusHeight = GetPanelStatusHeight();
+ m_Height=m_Y2-m_Y1-(Global->Opt->ShowPanelStatus ? (StatusHeight+2) : 2); //Maximus5: BUGBUG: ???
if (!Global->Opt->ShowColumnTitles)
m_Height++;
if (!Global->Opt->ShowPanelStatus)
- m_Height+=2;
+ m_Height+=StatusHeight;
}
int FileList::PreparePanelView(PanelViewSettings *PanelView)
{
- PrepareColumnWidths(PanelView->StatusColumns, (PanelView->Flags&PVS_FULLSCREEN) != 0, true);
+ std::vector<column> StatusColumns;
+ auto i = PanelView->StatusColumns.begin();
+ auto j = i;
+ bool EndOfList = false;
+ while (!EndOfList)
+ {
+ EndOfList = (i == PanelView->StatusColumns.end());
+ bool BreakColumn = ((i->type &0xFF)==LINEBREAK_COLUMN);
+ while (!EndOfList)
+ {
+ if (BreakColumn)
+ {
+ if (!StatusColumns.empty())
+ break;
+ }
+ else
+ {
+ if (StatusColumns.empty())
+ j = i;
+ StatusColumns.push_back(*i);
+ }
+
+ if (++i == PanelView->StatusColumns.end())
+ {
+ EndOfList = true;
+ break;
+ }
+
+ BreakColumn = ((i->type &0xFF)==LINEBREAK_COLUMN);
+ }
+
+ if (!StatusColumns.empty())
+ {
+ PrepareColumnWidths(StatusColumns, (PanelView->Flags&PVS_FULLSCREEN) != 0, true);
+ for (auto k = StatusColumns.begin(); k != StatusColumns.end() && j != i; k++, j++)
+ {
+ #ifdef _DEBUG
+ const column& K = *k;
+ const column& J = *j;
+ _ASSERTE(K.type == J.type && K.width_type == J.width_type);
+ #endif
+ j->width = k->width;
+ }
+ StatusColumns.clear();
+ }
+ }
return PrepareColumnWidths(PanelView->PanelColumns, (PanelView->Flags&PVS_FULLSCREEN) != 0, false);
}
@@ -8238,16 +8287,43 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
int StatusShown=FALSE;
int MaxLeftPos=0,MinLeftPos=FALSE;
size_t ColumnCount=ShowStatus ? m_ViewSettings.StatusColumns.size() : m_ViewSettings.PanelColumns.size();
+ int StatusHeight = GetPanelStatusHeight();
const auto& Columns = ShowStatus ? m_ViewSettings.StatusColumns : m_ViewSettings.PanelColumns;
- for (int I=m_Y1+1+Global->Opt->ShowColumnTitles,J=m_CurTopFile; I<m_Y2-2*Global->Opt->ShowPanelStatus; I++,J++)
+ size_t K0=0;
+ unsigned __int64 StatusAlign=0;
+
+
+ if (ShowStatus)
+ {
+ if ((Columns[K0].type&0xFF)==LINEBREAK_COLUMN)
+ K0++;
+ // ������ ������ ������ ������� ������������� �� ������ ShowStatus (1 based)
+ for (int S=1; S<ShowStatus; S++)
+ {
+ while (K0<ColumnCount)
+ {
+ if ((Columns[K0++].type&0xFF)==LINEBREAK_COLUMN)
+ break;
+ }
+ }
+ if (K0 && (Columns[K0-1].type&0xFF)==LINEBREAK_COLUMN)
+ StatusAlign=Columns[K0-1].type & (COLUMN_CENTERALIGN|COLUMN_RIGHTALIGN);
+ // ������� ��������� ������� � ���� ������
+ size_t K1=K0;
+ while (K1<ColumnCount && (Columns[K1].type&0xFF)!=LINEBREAK_COLUMN)
+ K1++;
+ ColumnCount=K1-K0;
+ }
+
+ for (int I=m_Y1+1+Global->Opt->ShowColumnTitles,J=m_CurTopFile; I<m_Y2-StatusHeight; I++,J++)
{
int CurColumn=StartColumn;
if (ShowStatus)
{
SetColor(COL_PANELTEXT);
- GotoXY(m_X1+1,m_Y2-1);
+ GotoXY(m_X1+1,m_Y2-StatusHeight+ShowStatus);
}
else
{
@@ -8258,7 +8334,9 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
int StatusLine=FALSE;
int Level = 1;
- for (size_t K=0; K<ColumnCount; K++)
+ FormatString strLine;
+
+ for (size_t K=K0; K<K0+ColumnCount; K++)
{
int ListPos=J+CurColumn*m_Height;
@@ -8295,7 +8373,8 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
{
if (!ShowStatus && !StatusShown && m_CurFile==ListPos && Global->Opt->ShowPanelStatus)
{
- ShowList(TRUE,CurColumn);
+ for (int S=1; S<StatusHeight; S++)
+ ShowList(S,CurColumn);
GotoXY(CurX,CurY);
StatusShown=TRUE;
SetShowColor(ListPos);
@@ -8329,7 +8408,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
}
}
- Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ColumnData+CurLeftPos;
+ strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ColumnData+CurLeftPos;
}
else
{
@@ -8342,7 +8421,11 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
if ((ViewFlags & COLUMN_MARK) && Width>2)
{
- Text(m_ListData[ListPos].Selected?L"\x221A ":L" ");
+ const wchar_t *MarkPtr = m_ListData[ListPos].Selected?L"\x221A ":L" ";
+ if (!ShowStatus)
+ Text(MarkPtr);
+ else
+ strLine.append(MarkPtr);
Width-=2;
}
@@ -8353,10 +8436,15 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
FarColor OldColor=GetColor();
if (!ShowStatus)
+ {
SetShowColor(ListPos, false);
-
- Text(OutCharacter);
- SetColor(OldColor);
+ Text(OutCharacter);
+ SetColor(OldColor);
+ }
+ else
+ {
+ strLine.append(OutCharacter);
+ }
}
const wchar_t *NamePtr = m_ShowShortNames && !m_ListData[ListPos].strShortName.empty() && !ShowStatus ? m_ListData[ListPos].strShortName.data():m_ListData[ListPos].strName.data();
@@ -8451,7 +8539,10 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
Lower(strName);
}
- Text(strName);
+ if (!ShowStatus)
+ Text(strName);
+ else
+ strLine.append(strName);
if (!ShowStatus)
@@ -8496,9 +8587,15 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
unsigned __int64 ViewFlags=Columns[K].type;
if (ViewFlags&COLUMN_RIGHTALIGN)
- Global->FS << fmt::RightAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
+ strLine << fmt::RightAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
else
- Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
+ strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
+
+ if (!ShowStatus)
+ {
+ Text(strLine);
+ strLine.clear();
+ }
if (!ShowStatus && StrLength(ExtPtr) > ColumnWidth)
{
@@ -8522,7 +8619,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
case PACKED_COLUMN:
case STREAMSSIZE_COLUMN:
{
- Text(FormatStr_Size(
+ strLine.append(FormatStr_Size(
m_ListData[ListPos].FileSize,
m_ListData[ListPos].AllocationSize,
m_ListData[ListPos].StreamsSize,
@@ -8565,13 +8662,13 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
break;
}
- Global->FS << FormatStr_DateTime(FileTime,ColumnType,Columns[K].type,ColumnWidth);
+ strLine << FormatStr_DateTime(FileTime,ColumnType,Columns[K].type,ColumnWidth);
break;
}
case ATTR_COLUMN:
{
- Global->FS << FormatStr_Attribute(m_ListData[ListPos].FileAttr,ColumnWidth);
+ strLine << FormatStr_Attribute(m_ListData[ListPos].FileAttr,ColumnWidth);
break;
}
@@ -8594,7 +8691,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
if (pos != string::npos)
strDizText.resize(pos);
- Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<strDizText;
+ strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<strDizText;
break;
}
@@ -8626,7 +8723,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
}
}
- Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<Owner+CurLeftPos;
+ strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<Owner+CurLeftPos;
break;
}
@@ -8634,15 +8731,15 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
{
int nlink = m_ListData[ListPos].NumberOfLinks;
if (nlink >= 0)
- Global->FS << fmt::ExactWidth(ColumnWidth) << nlink;
+ strLine << fmt::ExactWidth(ColumnWidth) << nlink;
else
- Global->FS << fmt::ExactWidth(ColumnWidth) << L"?";
+ strLine << fmt::ExactWidth(ColumnWidth) << L"?";
break;
}
case NUMSTREAMS_COLUMN:
{
- Global->FS << fmt::ExactWidth(ColumnWidth)<<m_ListData[ListPos].NumberOfStreams;
+ strLine << fmt::ExactWidth(ColumnWidth)<<m_ListData[ListPos].NumberOfStreams;
break;
}
@@ -8651,7 +8748,13 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
}
else
{
- Global->FS << fmt::MinWidth(ColumnWidth)<<L"";
+ strLine << fmt::MinWidth(ColumnWidth)<<L"";
+ }
+
+ if (!ShowStatus)
+ {
+ Text(strLine);
+ strLine.clear();
}
if (ShowDivider==FALSE)
@@ -8670,8 +8773,10 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
if (K==ColumnCount-1)
BoxText(CurX+ColumnWidth==m_X2 ? BoxSymbols[BS_V2]:L' ');
+ else if (!ShowStatus)
+ BoxText(BoxSymbols[(Global->Opt->DoubleGlobalColumnSeparator && Level == ColumnsInGlobal)?BS_V2:BS_V1]);
else
- BoxText(ShowStatus ? L' ':BoxSymbols[(Global->Opt->DoubleGlobalColumnSeparator && Level == ColumnsInGlobal)?BS_V2:BS_V1]);
+ strLine.append(L" ");
if (!ShowStatus)
SetColor(COL_PANELTEXT);
@@ -8689,6 +8794,29 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
}
}
+ if (ShowStatus && !strLine.empty())
+ {
+ GotoXY(m_X1+1,WhereY());
+ SetColor(COL_PANELTEXT);
+ if (StatusAlign & COLUMN_CENTERALIGN)
+ RemoveExternalSpaces(strLine);
+ else if (StatusAlign & COLUMN_RIGHTALIGN)
+ RemoveTrailingSpaces(strLine);
+ int LineLen = static_cast<int>(strLine.length());
+ if (LineLen<(m_X2-m_X1-1))
+ {
+ if (StatusAlign & COLUMN_CENTERALIGN)
+ Global->FS << fmt::MinWidth((m_X2-m_X1-1-LineLen)>>1)<<L"";
+ else if (StatusAlign & COLUMN_RIGHTALIGN)
+ Global->FS << fmt::MinWidth(m_X2-m_X1-1-LineLen)<<L"";
+ }
+ else if (LineLen>(m_X2-m_X1-1))
+ {
+ LineLen = m_X2-m_X1-1;
+ }
+ Global->FS << fmt::MinWidth(LineLen)<<strLine/*LinePtr*/;
+ }
+
if ((!ShowStatus || StatusLine) && WhereX()<m_X2)
{
SetColor(COL_PANELTEXT);
@@ -8733,3 +8861,19 @@ bool FileList::IsColumnDisplayed(int Type)
return std::any_of(ALL_CONST_RANGE(m_ViewSettings.PanelColumns), is_same_type) ||
std::any_of(ALL_CONST_RANGE(m_ViewSettings.StatusColumns), is_same_type);
}
+
+int FileList::GetPanelStatusHeight()
+{
+ if (!Global->Opt->ShowPanelStatus)
+ return 0;
+ int Count=0;
+ int CountMax = m_Y2-m_Y1-5;
+ for (size_t I=0; I<m_ViewSettings.StatusColumns.size() && Count<CountMax; I++)
+ {
+ if (I && (m_ViewSettings.StatusColumns[I].type&0xFF)==LINEBREAK_COLUMN)
+ {
+ Count++;
+ }
+ }
+ return Count+2; // <Number of status lines> + 1 (delimiter line)
+}
diff --git a/unicode_far/filelist.hpp b/unicode_far/filelist.hpp
index 1da4b83..0cd8ace 100644
--- a/unicode_far/filelist.hpp
+++ b/unicode_far/filelist.hpp
@@ -340,6 +340,7 @@ public:
void PluginEndSelection();
int PluginPanelHelp(const PluginHandle* hPlugin) const;
void ResetLastUpdateTime() {LastUpdateTime = 0;}
+ virtual int GetPanelStatusHeight();
static void SetFilePanelModes();
static void SavePanelModes();
diff --git a/unicode_far/panel.hpp b/unicode_far/panel.hpp
index 90e2668..2a51fb2 100644
--- a/unicode_far/panel.hpp
+++ b/unicode_far/panel.hpp
@@ -346,6 +346,7 @@ public:
void SetFullScreen() { m_ViewSettings.Flags |= PVS_FULLSCREEN; }
bool CreateFullPathName(const string& Name, const string& ShortName, DWORD FileAttr, string &strDest, int UNC, int ShortNameAsIs = TRUE) const;
+ virtual int GetPanelStatusHeight() { return 0; };
static void EndDrag();
@@ -411,4 +412,4 @@ public:
private:
virtual void Update(int Mode) override {};
virtual void UpdateKeyBar() override {}
-};
\ No newline at end of file
+};
diff --git a/unicode_far/panelctype.hpp b/unicode_far/panelctype.hpp
index acd9b5e..edb4457 100644
--- a/unicode_far/panelctype.hpp
+++ b/unicode_far/panelctype.hpp
@@ -60,7 +60,8 @@ enum PANEL_COLUMN_TYPE {
CUSTOM_COLUMN7,
CUSTOM_COLUMN8,
CUSTOM_COLUMN9,
-
+ LINEBREAK_COLUMN,
+
COLUMN_TYPES_COUNT
};
diff --git a/unicode_far/panelmix.cpp b/unicode_far/panelmix.cpp
index 31d395e..e21180b 100644
--- a/unicode_far/panelmix.cpp
+++ b/unicode_far/panelmix.cpp
@@ -50,12 +50,13 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "plugins.hpp"
#include "language.hpp"
-int ColumnTypeWidth[]={0, 6, 6, 8, 5, 14, 14, 14, 14, 6, 0, 0, 3, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+int ColumnTypeWidth[]={0, 6, 6, 8, 5, 14, 14, 14, 14, 6, 0, 0, 3, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static_assert(ARRAYSIZE(ColumnTypeWidth) == COLUMN_TYPES_COUNT, "wrong size of ColumnTypeWidth array");
-static const wchar_t *ColumnSymbol[]={L"N",L"S",L"P",L"D",L"T",L"DM",L"DC",L"DA",L"DE",L"A",L"Z",L"O",L"LN",L"F",L"G",L"X",L"C0",L"C1",L"C2",L"C3",L"C4",L"C5",L"C6",L"C7",L"C8",L"C9"};
+static const wchar_t *ColumnSymbol[]={L"N",L"S",L"P",L"D",L"T",L"DM",L"DC",L"DA",L"DE",L"A",L"Z",L"O",L"LN",L"F",L"G",L"X",L"C0",L"C1",L"C2",L"C3",L"C4",L"C5",L"C6",L"C7",L"C8",L"C9",L"B"};
static_assert(ARRAYSIZE(ColumnSymbol) == COLUMN_TYPES_COUNT, "wrong size of ColumnSymbol array");
+
void ShellUpdatePanels(Panel *SrcPanel,BOOL NeedSetUpADir)
{
if (!SrcPanel)
@@ -401,12 +402,38 @@ void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, s
}
else
{
- for (unsigned I=0; I<ARRAYSIZE(ColumnSymbol); I++)
+ if (strArgName.at(0) == L'B')
{
- if (strArgName == ColumnSymbol[I])
+ unsigned __int64 &ColumnType = Columns.back().type;
+ ColumnType=LINEBREAK_COLUMN;
+ const wchar_t *Ptr = strArgName.c_str()+1;
+
+ while (*Ptr)
{
- Columns.back().type = I;
- break;
+ switch (*Ptr)
+ {
+ case L'R':
+ if (!(ColumnType & COLUMN_CENTERALIGN))
+ ColumnType|=COLUMN_RIGHTALIGN;
+ break;
+ case L'C':
+ if (!(ColumnType & COLUMN_RIGHTALIGN))
+ ColumnType|=COLUMN_CENTERALIGN;
+ break;
+ }
+
+ Ptr++;
+ }
+ }
+ else
+ {
+ for (unsigned I=0; I<ARRAYSIZE(ColumnSymbol); I++)
+ {
+ if (strArgName == ColumnSymbol[I])
+ {
+ Columns.back().type = I;
+ break;
+ }
}
}
}
@@ -522,6 +549,14 @@ void ViewSettingsToText(const std::vector<column>& Columns, string &strColumnTit
strType += L"R";
}
+ if (ColumnType==LINEBREAK_COLUMN)
+ {
+ if (i.type & COLUMN_CENTERALIGN)
+ strType += L"C";
+ else if (i.type & COLUMN_RIGHTALIGN)
+ strType += L"R";
+ }
+
strColumnTitles += strType;
strColumnWidths += std::to_wstring(i.width);
--
1.8.5.2.msysgit.0
|
|
|
Will be great, and join with this old wish: http://bugs.farmanager.com/view.php?id=2362 and this old post too: http://forum.farmanager.com/viewtopic.php?f=38&t=6462&p=81806#p81806 Excellent add-on Maximus!!! |