Skip to content

Commit

Permalink
#3434 and other format-related
Browse files Browse the repository at this point in the history
  • Loading branch information
alabuzhev committed May 19, 2017
1 parent 45b4927 commit 0378834
Show file tree
Hide file tree
Showing 18 changed files with 168 additions and 190 deletions.
11 changes: 5 additions & 6 deletions far/FarEng.hlf.m4
Expand Up @@ -1773,10 +1773,9 @@ Allowed column types are:
G[C,T,F,E] - size of file streams
where: C - format file size;
T - use 1000 instead of 1024 as a divider;
F - show file sizes similar to Windows
Explorer (i.e. 999 bytes will be
displayed as 999 and 1000 bytes will
be displayed as 0.97 K);
F - show size as a decimal fraction
using the most appropriate unit,
e. g. 0.97 K, 1.44 M, 3.5 G etc.
E - economic mode, no space between file
size and suffix will be shown
(i.e. 0.97K);
Expand Down Expand Up @@ -3454,8 +3453,8 @@ $ #Change Drive Menu Options#
Показать общее и свободное место на диске.
Комбинация клавиш в меню: Ctrl-5

#Показывать размер в стиле Windows Explorer#
Уточние опции показа размеров диска в стиле Windows Explorer (в виде числа с плавающей точкой).
#Показывать размер в виде десятичной дроби#
Показать общее и свободное место на диске в виде десятичной дроби.
Комбинация клавиш в меню: Ctrl-5 (повторное нажатие).

#Показывать сетевое имя/путь SUBST/имя VHD#
Expand Down
10 changes: 5 additions & 5 deletions far/FarRus.hlf.m4
Expand Up @@ -1804,9 +1804,9 @@ $ #Дополнительные параметры поиска#
G[C,T,F,E] - размер потоков файла
где: C - форматировать размер файла;
T - использовать 1000 вместо 1024 как делитель;
F - показывать размер файла в стиле Windows
Explorer (т.е. 999 байт будут показаны
как 999, а 1000 байт как 0.97 K);
F - показывать размер в виде десятичной дроби, используя
наиболее подходящую единицу измерения, например
0,97 К, 1,44 М, 53,2 Г.
E - экономичный режим, не показывать пробел
перед суффиксом размера файла
(т.е. 0.97KB);
Expand Down Expand Up @@ -3525,8 +3525,8 @@ $ #Настройка меню выбора диска#
Показать общее и свободное место на диске.
Комбинация клавиш в меню: Ctrl-5

#Показывать размер в стиле Windows Explorer#
Уточние опции показа размеров диска в стиле Windows Explorer (в виде числа с плавающей точкой).
#Показывать размер в виде десятичной дроби#
Показать общее и свободное место на диске в виде десятичной дроби.
Комбинация клавиш в меню: Ctrl-5 (повторное нажатие).

#Показывать сетевое имя/путь SUBST/имя VHD#
Expand Down
7 changes: 7 additions & 0 deletions far/changelog
@@ -1,3 +1,10 @@
drkns 19.05.2017 23:29:09 +0000 - build 4963

1. 0003434: В функции FormatFileSize параметр Width не полностью соотвествуют документации.
Изменение в API: "сколько получится" теперь подразумевается при 0, а не при -1.

2. Прочие исправления (а возможно и новые баги) в той же функции и окресностях.

drkns 16.05.2017 07:34:39 +0000 - build 4962

1. Уточение процесса загрузки плагинов.
Expand Down
2 changes: 1 addition & 1 deletion far/clipboard.cpp
Expand Up @@ -131,7 +131,7 @@ class system_clipboard: noncopyable, public Clipboard

hMem.release();

auto Locale = os::memory::global::copy<LCID>(LOCALE_USER_DEFAULT);
auto Locale = os::memory::global::copy<LCID>(GetThreadLocale());
if (!Locale)
return false;

Expand Down
4 changes: 2 additions & 2 deletions far/copy_progress.cpp
Expand Up @@ -137,8 +137,8 @@ static string FormatCounter(lng CounterId, lng AnotherId, unsigned long long Cur
const auto PaddedLabelSize = std::max(Label.size(), msg(AnotherId).size()) + 1;
Label.resize(PaddedLabelSize, L' ');

auto StrCurrent = InsertCommas(CurrentValue);
auto StrTotal = ShowTotal? InsertCommas(TotalValue) : string();
const auto StrCurrent = GroupDigits(CurrentValue);
const auto StrTotal = ShowTotal? GroupDigits(TotalValue) : string();

auto Value = ShowTotal? concat(StrCurrent, L" / "_sv, StrTotal) : StrCurrent;
if (MaxWidth > PaddedLabelSize)
Expand Down
2 changes: 1 addition & 1 deletion far/datetime.cpp
Expand Up @@ -139,7 +139,7 @@ void OnIntlSettingsChange()
DWORD ConvertYearToFull(DWORD ShortYear)
{
DWORD UpperBoundary = 0;
if(!GetCalendarInfo(LOCALE_USER_DEFAULT, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX|CAL_RETURN_NUMBER, nullptr, 0, &UpperBoundary))
if(!GetCalendarInfo(GetThreadLocale(), CAL_GREGORIAN, CAL_ITWODIGITYEARMAX|CAL_RETURN_NUMBER, nullptr, 0, &UpperBoundary))
{
UpperBoundary = 2029; // Magic, current default value.
}
Expand Down
8 changes: 4 additions & 4 deletions far/diskmenu.cpp
Expand Up @@ -744,14 +744,14 @@ static int ChangeDiskMenu(panel_ptr Owner, int Pos, bool FirstCall)
if (Global->Opt->ChangeDriveMode & DRIVE_SHOW_SIZE)
{
//размер как минимум в мегабайтах
NewItem.TotalSize = FileSizeToStr(TotalSize, 9, COLUMN_COMMAS | COLUMN_MULTIPLIER_M);
NewItem.FreeSize = FileSizeToStr(UserFree, 9, COLUMN_COMMAS | COLUMN_MULTIPLIER_M);
NewItem.TotalSize = FileSizeToStr(TotalSize, 9, COLUMN_COMMAS | COLUMN_UNIT_M);
NewItem.FreeSize = FileSizeToStr(UserFree, 9, COLUMN_COMMAS | COLUMN_UNIT_M);
}
else
{
//размер с точкой и для 0 добавляем букву размера (B)
NewItem.TotalSize = FileSizeToStr(TotalSize, 9, COLUMN_FLOATSIZE | COLUMN_SHOWMULTIPLIER);
NewItem.FreeSize = FileSizeToStr(UserFree, 9, COLUMN_FLOATSIZE | COLUMN_SHOWMULTIPLIER);
NewItem.TotalSize = FileSizeToStr(TotalSize, 9, COLUMN_FLOATSIZE | COLUMN_SHOWUNIT);
NewItem.FreeSize = FileSizeToStr(UserFree, 9, COLUMN_FLOATSIZE | COLUMN_SHOWUNIT);
}
RemoveExternalSpaces(NewItem.TotalSize);
RemoveExternalSpaces(NewItem.FreeSize);
Expand Down
20 changes: 10 additions & 10 deletions far/farlang.templ.m4
Expand Up @@ -16390,16 +16390,16 @@ upd:"Show &size"
"Показувати &розмір"

MChangeDriveShowSizeFloat
"Показывать ра&змер в стиле Windows Explorer"
"Show size in &Windows Explorer style"
"Zobrazit velikost ve stylu Průzkumníka &Windows"
"Größe als in &Windows Explorer anzeigen"
upd:"Show size in &Windows Explorer style"
upd:"Show size in &Windows Explorer style"
"Mostrar tamaño estilo &Windows Explorer"
"Zobraziť veľkosť v štýle Prieskumníka &Windows"
"Mostra Dimensione Come &Windows"
"Показувати ро&змір у стилі Windows Explorer"
"Показывать ра&змер в виде десятичной дроби"
"Show size as a decimal fraction"
upd:"Show size as a decimal fraction"
upd:"Show size as a decimal fraction"
upd:"Show size as a decimal fraction"
upd:"Show size as a decimal fraction"
upd:"Show size as a decimal fraction"
upd:"Show size as a decimal fraction"
upd:"Show size as a decimal fraction"
"Показувати ро&змір у вигляді десяткового дробу"

MChangeDriveShowRemovableDrive
"Показывать параметры см&енных дисков"
Expand Down
27 changes: 12 additions & 15 deletions far/filelist.cpp
Expand Up @@ -7799,27 +7799,24 @@ void FileList::SetShowColor(int Position, bool FileColor) const
SetColor(GetShowColor(Position,FileColor));
}

static string size2str(ULONGLONG Size, int width, int short_mode = -1)
static string size2str(ULONGLONG Size, int width, bool FloatStyle, bool short_mode)
{
if (short_mode < 0)
short_mode = Global->Opt->ShowBytes ? 0 : +1;

if (!short_mode)
{
return InsertCommas(Size);
return GroupDigits(Size);
}
else if (width <= 0) // float style
else if (FloatStyle) // float style
{
auto str = FileSizeToStr(Size, 10, COLUMN_FLOATSIZE | COLUMN_SHOWMULTIPLIER);
auto str = FileSizeToStr(Size, width, COLUMN_FLOATSIZE | COLUMN_SHOWUNIT);
RemoveExternalSpaces(str);
return str;
}
else
{
string Str = str(Size);
if (Str.size() > static_cast<size_t>(width))
if (static_cast<int>(Str.size()) > width)
{
Str = FileSizeToStr(Size, width, COLUMN_SHOWMULTIPLIER);
Str = FileSizeToStr(Size, width, COLUMN_SHOWUNIT);
RemoveExternalSpaces(Str);
}
return Str;
Expand Down Expand Up @@ -7847,12 +7844,12 @@ void FileList::ShowSelectedSize()
}
if (m_SelFileCount)
{
auto strFormStr = size2str(SelFileSize, 6, 0);
auto strFormStr = size2str(SelFileSize, 6, false, false);
auto strSelStr = format(lng::MListFileSize, strFormStr, m_SelFileCount-m_SelDirCount, m_SelDirCount);
auto avail_width = static_cast<size_t>(std::max(0, m_X2 - m_X1 - 1));
if (strSelStr.size() > avail_width)
{
strFormStr = size2str(SelFileSize, 6, +1);
strFormStr = size2str(SelFileSize, 6, false, true);
strSelStr = format(lng::MListFileSize, strFormStr, m_SelFileCount-m_SelDirCount, m_SelDirCount);
if (strSelStr.size() > avail_width)
TruncStrFromEnd(strSelStr, static_cast<int>(avail_width));
Expand All @@ -7870,12 +7867,12 @@ void FileList::ShowTotalSize(const OpenPanelInfo &Info)
if (!Global->Opt->ShowPanelTotals && m_PanelMode == panel_mode::PLUGIN_PANEL && !(Info.Flags & OPIF_REALNAMES))
return;

const auto& calc_total_string = [this, Info](int short_mode)
const auto& calc_total_string = [this, Info](bool short_mode)
{
string strFreeSize, strTotalSize;
auto strFormSize = size2str(TotalFileSize, 6, short_mode);
auto strFormSize = size2str(TotalFileSize, 6, false, short_mode);
if (Global->Opt->ShowPanelFree && (m_PanelMode != panel_mode::PLUGIN_PANEL || (Info.Flags & (OPIF_REALNAMES | OPIF_USEFREESIZE))))
strFreeSize = (FreeDiskSize != static_cast<unsigned long long>(-1)) ? size2str(FreeDiskSize, 0, short_mode) : L"?";
strFreeSize = (FreeDiskSize != static_cast<unsigned long long>(-1)) ? size2str(FreeDiskSize, 10, true, short_mode) : L"?";

if (Global->Opt->ShowPanelTotals)
{
Expand All @@ -7897,7 +7894,7 @@ void FileList::ShowTotalSize(const OpenPanelInfo &Info)
};

auto avail_width = static_cast<size_t>(std::max(0, m_X2 - m_X1 - 1));
auto strTotalStr = calc_total_string(-1);
auto strTotalStr = calc_total_string(!Global->Opt->ShowBytes);
if (strTotalStr.size() > avail_width)
{
if (Global->Opt->ShowBytes)
Expand Down
4 changes: 2 additions & 2 deletions far/infolist.cpp
Expand Up @@ -375,11 +375,11 @@ void InfoList::DisplayObject()
string str;
if (Global->Opt->ShowBytes)
{
str = InsertCommas(Size); // + L' ';
str = GroupDigits(Size); // + L' ';
}
else
{
str = FileSizeToStr(Size, 16, COLUMN_FLOATSIZE | COLUMN_SHOWMULTIPLIER);
str = FileSizeToStr(Size, 16, COLUMN_FLOATSIZE | COLUMN_SHOWUNIT);
if (str.back() != bytes_suffix[0])
str += bytes_suffix;
}
Expand Down
12 changes: 6 additions & 6 deletions far/locale.cpp
Expand Up @@ -40,7 +40,7 @@ int locale::GetDateFormat()
int Result;

// TODO: log
if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDATE | LOCALE_RETURN_NUMBER, reinterpret_cast<wchar_t*>(&Result), sizeof(Result) / sizeof(wchar_t)))
if (!GetLocaleInfo(GetThreadLocale(), LOCALE_IDATE | LOCALE_RETURN_NUMBER, reinterpret_cast<wchar_t*>(&Result), sizeof(Result) / sizeof(wchar_t)))
return 0;

return Result;
Expand All @@ -49,7 +49,7 @@ int locale::GetDateFormat()
wchar_t locale::GetDateSeparator()
{
wchar_t Info[100];
if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDATE, Info, static_cast<int>(std::size(Info))))
if (!GetLocaleInfo(GetThreadLocale(), LOCALE_SDATE, Info, static_cast<int>(std::size(Info))))
{
// TODO: log
return L'/';
Expand All @@ -60,7 +60,7 @@ wchar_t locale::GetDateSeparator()
wchar_t locale::GetTimeSeparator()
{
wchar_t Info[100];
if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIME, Info, static_cast<int>(std::size(Info))))
if (!GetLocaleInfo(GetThreadLocale(), LOCALE_STIME, Info, static_cast<int>(std::size(Info))))
{
// TODO: log
return L':';
Expand All @@ -71,7 +71,7 @@ wchar_t locale::GetTimeSeparator()
wchar_t locale::GetDecimalSeparator()
{
wchar_t Separator[4];
if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, Separator, static_cast<int>(std::size(Separator))))
if (!GetLocaleInfo(GetThreadLocale(), LOCALE_SDECIMAL, Separator, static_cast<int>(std::size(Separator))))
{
// TODO: log
*Separator = L'.';
Expand All @@ -86,7 +86,7 @@ wchar_t locale::GetDecimalSeparator()
wchar_t locale::GetThousandSeparator()
{
wchar_t Separator[4];
if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, Separator, static_cast<int>(std::size(Separator))))
if (!GetLocaleInfo(GetThreadLocale(), LOCALE_STHOUSAND, Separator, static_cast<int>(std::size(Separator))))
{
// TODO: log
*Separator = L',';
Expand All @@ -106,7 +106,7 @@ string locale::GetValue(LCID lcid, LCTYPE id)
string locale::GetTimeFormat()
{
wchar_t TimeBuffer[MAX_PATH];
const size_t Size = ::GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, nullptr, nullptr, TimeBuffer, static_cast<int>(std::size(TimeBuffer)));
const size_t Size = ::GetTimeFormat(GetThreadLocale(), TIME_NOSECONDS, nullptr, nullptr, TimeBuffer, static_cast<int>(std::size(TimeBuffer)));

if (!Size)
{
Expand Down
2 changes: 1 addition & 1 deletion far/macro.cpp
Expand Up @@ -2908,7 +2908,7 @@ static bool size2strFunc(FarMacroCall* Data)
{
const auto Params = parseParams(3, Data);
const auto Width = static_cast<int>(Params[2].asInteger());
PassString(FileSizeToStr(Params[0].asInteger(), !Width? -1 : Width, Params[1].asInteger()), Data);
PassString(FileSizeToStr(Params[0].asInteger(), Width, Params[1].asInteger()), Data);
return true;
}

Expand Down
19 changes: 11 additions & 8 deletions far/panelctype.hpp
Expand Up @@ -69,20 +69,23 @@ enum FILEPANEL_COLUMN_MODES: unsigned long long
COLUMN_THOUSAND = 0x0400000000000000LL, // Вместо делителя 1024 использовать делитель 1000
COLUMN_BRIEF = 0x0200000000000000LL,
COLUMN_MONTH = 0x0100000000000000LL,
COLUMN_FLOATSIZE = 0x0080000000000000LL, // Показывать размер файла в стиле Windows Explorer (т.е. 999 байт будут показаны как 999, а 1000 байт как 0.97 K)
COLUMN_FLOATSIZE = 0x0080000000000000LL, // Показывать размер в виде десятичной дроби, используя наиболее подходящую единицу измерения, например 0,97 К, 1,44 М, 53,2 Г.

COLUMN_ECONOMIC = 0x0040000000000000LL, // Экономичный режим, не показывать пробел перед суффиксом размера файла (т.е. 0.97K)
COLUMN_SHOWMULTIPLIER = 0x0010000000000000LL, // Показывать суффиксы B,K,M,G,T,P,E
COLUMN_SHOWUNIT = 0x0010000000000000LL, // Показывать суффиксы B,K,M,G,T,P,E
COLUMN_FULLOWNER = 0x0008000000000000LL,
COLUMN_NOEXTENSION = 0x0004000000000000LL,
COLUMN_RIGHTALIGNFORCE = 0x0001000000000000LL,
COLUMN_MARK_DYNAMIC = 0x0000800000000000LL,

COLUMN_USE_MULTIPLIER = 0x0020000000000000LL, // Минимально допустимый множитель при форматировании
COLUMN_MULTIPLIER_K = COLUMN_USE_MULTIPLIER | 0,
COLUMN_MULTIPLIER_M = COLUMN_USE_MULTIPLIER | 1,
COLUMN_MULTIPLIER_G = COLUMN_USE_MULTIPLIER | 2,
COLUMN_MULTIPLIER_T = COLUMN_USE_MULTIPLIER | 3,
COLUMN_MULTIPLIER_MASK = 0x0000000000000003LL // может быть только 0, 1, 2 или 3 (K,M,G,T), например, 1 - "размер как минимум в мегабайтах"
COLUMN_USE_UNIT = 0x0020000000000000LL, // Минимально допустимыая единица измерения при форматировании например, 1 - "размер как минимум в мегабайтах"
COLUMN_UNIT_K = COLUMN_USE_UNIT | 0,
COLUMN_UNIT_M = COLUMN_USE_UNIT | 1,
COLUMN_UNIT_G = COLUMN_USE_UNIT | 2,
COLUMN_UNIT_T = COLUMN_USE_UNIT | 3,
COLUMN_UNIT_P = COLUMN_USE_UNIT | 4,
COLUMN_UNIT_E = COLUMN_USE_UNIT | 5,
COLUMN_UNIT_MASK = 0x000000000000000FLL
};

enum col_width
Expand Down
8 changes: 4 additions & 4 deletions far/plugapi.cpp
Expand Up @@ -2800,13 +2800,13 @@ size_t WINAPI apiFormatFileSize(unsigned long long Size, intptr_t Width, FARFORM
{
{FFFS_COMMAS, COLUMN_COMMAS}, // Вставлять разделитель между тысячами
{FFFS_THOUSAND, COLUMN_THOUSAND}, // Вместо делителя 1024 использовать делитель 1000
{FFFS_FLOATSIZE, COLUMN_FLOATSIZE}, // Показывать размер файла в стиле Windows Explorer (т.е. 999 байт будут показаны как 999, а 1000 байт как 0.97 K)
{FFFS_FLOATSIZE, COLUMN_FLOATSIZE}, // Показывать размер в виде десятичной дроби, используя наиболее подходящую единицу измерения, например 0,97 К, 1,44 М, 53,2 Г.
{FFFS_ECONOMIC, COLUMN_ECONOMIC}, // Экономичный режим, не показывать пробел перед суффиксом размера файла (т.е. 0.97K)
{FFFS_MINSIZEINDEX, COLUMN_USE_MULTIPLIER}, // Минимально допустимый множитель при форматировании
{FFFS_SHOWBYTESINDEX, COLUMN_SHOWMULTIPLIER}, // Показывать суффиксы B,K,M,G,T,P,E
{FFFS_MINSIZEINDEX, COLUMN_USE_UNIT}, // Минимально допустимая единица измерения при форматировании
{FFFS_SHOWBYTESINDEX, COLUMN_SHOWUNIT}, // Показывать суффиксы B,K,M,G,T,P,E
};

unsigned long long FinalFlags = std::accumulate(ALL_CONST_RANGE(FlagsPair), Flags & COLUMN_MULTIPLIER_MASK, [Flags](auto FinalFlags, const auto& i){ return FinalFlags | ((Flags & i.first)? i.second : 0); });
unsigned long long FinalFlags = std::accumulate(ALL_CONST_RANGE(FlagsPair), Flags & COLUMN_UNIT_MASK, [Flags](auto FinalFlags, const auto& i){ return FinalFlags | ((Flags & i.first)? i.second : 0); });

auto strDestStr = FileSizeToStr(Size, Width, FinalFlags);

Expand Down
6 changes: 3 additions & 3 deletions far/qview.cpp
Expand Up @@ -233,11 +233,11 @@ void QuickView::DisplayObject()
{
if (Global->Opt->ShowBytes)
{
return InsertCommas(Size); // + L' ' + bytes_suffix;
return GroupDigits(Size); // + L' ' + bytes_suffix;
}
else
{
auto str = FileSizeToStr(Size, 10, COLUMN_FLOATSIZE | COLUMN_SHOWMULTIPLIER);
auto str = FileSizeToStr(Size, 10, COLUMN_FLOATSIZE | COLUMN_SHOWUNIT);
RemoveExternalSpaces(str);
if (str.back() != bytes_suffix[0])
str += bytes_suffix;
Expand Down Expand Up @@ -278,7 +278,7 @@ void QuickView::DisplayObject()
GotoXY(m_X1+2,m_Y1+11);
PrintText(msg(lng::MQuickViewCluster));
SetColor(iColor);
PrintText(prefix + InsertCommas(Data.ClusterSize));
PrintText(prefix + GroupDigits(Data.ClusterSize));

SetColor(COL_PANELTEXT);
GotoXY(m_X1+2,m_Y1+12);
Expand Down

0 comments on commit 0378834

Please sign in to comment.