change:更改以key的前些部分排序而不是全部。

This commit is contained in:
taynpg 2024-08-20 16:47:09 +08:00
parent 7a1bee6708
commit 87625e8bc4
5 changed files with 98 additions and 107 deletions

View File

@ -1,38 +1,17 @@
# .clang-format
# 风格格式化
BasedOnStyle: LLVM
# 4 空格缩进
BasedOnStyle: Google
IndentWidth: 4
# 连续对齐变量的声明
AlignConsecutiveDeclarations: true
# 指针左侧对齐
PointerAlignment: Left
# 访问说明符(public、private等)的偏移
AccessModifierOffset: -4
# 大括号
BreakBeforeBraces: Custom
BraceWrapping:
# 函数定义后面大括号在新行
AfterFunction: true
# class定义后面
AfterClass: true
# 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle: true
# 允许重新排版注释
ReflowComments: true
# 允许排序#include
SortIncludes: false
# 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 3
# tab宽度
TabWidth: 4
# 构造函数的初始化列表要么都在同一行,要么都各自一行
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# 每行字符的限制,0表示没有限制
ColumnLimit: 110
# 允许短的块放在同一行
AllowShortBlocksOnASingleLine: false
# 是否允许短函数在一行
AllowShortFunctionsOnASingleLine: InlineOnly
ColumnLimit: 150
AllowShortBlocksOnASingleLine: Never
AllowShortFunctionsOnASingleLine: None
AllowShortEnumsOnASingleLine: false

18
.vscode/settings.json vendored
View File

@ -1,7 +1,7 @@
{
"files.autoSave": "onFocusChange",
"editor.fontSize": 14,
"editor.fontFamily": "'Cousine Nerd Font Mono', 'IBM Plex Mono', 'MIBM Plex Mono'",
"editor.fontFamily": "'BlexMono Nerd Font Mono', 'BlexMono Nerd Font Mono', 'BlexMono Nerd Font Mono'",
"cmake.configureOnOpen": true,
"cmake.debugConfig": {
"console": "integratedTerminal",
@ -101,6 +101,20 @@
"qaction": "cpp",
"codecvt": "cpp",
"qregexp": "cpp",
"qregularexpression": "cpp"
"qregularexpression": "cpp",
"array": "cpp",
"bit": "cpp",
"charconv": "cpp",
"clocale": "cpp",
"compare": "cpp",
"concepts": "cpp",
"condition_variable": "cpp",
"format": "cpp",
"forward_list": "cpp",
"future": "cpp",
"optional": "cpp",
"sstream": "cpp",
"stop_token": "cpp",
"regex": "cpp"
}
}

View File

@ -2,19 +2,12 @@ cmake_minimum_required(VERSION 3.5)
project(OneLevelXmlOpr VERSION 0.1 LANGUAGES CXX)
# HOME
if (DEFINED ENV{HOME})
set(USER_HOME $ENV{HOME})
else()
message(FATAL_ERROR "HOME environment variable is not set.")
endif()
#
message(STATUS "User home directory: ${USER_HOME}")
set(CMAKE_PREFIX_PATH
"C:/Qt/6.6.3/msvc2019_64"
"${USER_HOME}/Qt5.14.2/5.14.2/gcc_64/"
)
set(CMAKE_AUTOUIC ON)

View File

@ -1,14 +1,17 @@
#include "MainWidget.h"
#include <QClipboard>
#include <QSettings>
#include <QDateTime>
#include <QFile>
#include <QKeyEvent>
#include <QDateTime>
#include <QScreen>
#include <QRegularExpression>
#include <QScreen>
#include <QSettings>
#include <filesystem>
#include "src/data_edit.h"
#include <regex>
#include "./ui_MainWidget.h"
#include "src/data_edit.h"
constexpr std::size_t g_OnePage = 100;
namespace fs = std::filesystem;
@ -16,7 +19,7 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
{
ui->setupUi(this);
setWindowTitle(u8"OneLevelXmlOpr v1.2.17");
setWindowTitle(u8"OneLevelXmlOpr v1.2.18");
setWindowIcon(QIcon("://resource/xml.ico"));
QScreen* primaryScreen = QGuiApplication::primaryScreen();
@ -185,8 +188,7 @@ void MainWidget::generate_table_widget()
metrics_ = std::make_shared<QFontMetrics>(tab_widget_->font());
tab_widget_->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tab_widget_, &QTableWidget::itemChanged, this,
[&](QTableWidgetItem* item) { item_changed_handle(item); });
connect(tab_widget_, &QTableWidget::itemChanged, this, [&](QTableWidgetItem* item) { item_changed_handle(item); });
connect(tab_widget_, &QTableWidget::customContextMenuRequested, this, &MainWidget::show_custom_menu);
auto config = ini_.get_config();
auto keys = CUtil::splitString(config.purpose, ",");
@ -457,7 +459,6 @@ bool MainWidget::edit_property(Element_t* target, int row)
return true;
}
// ele_update_gui 的 row 参数暂时废弃,无意义。
void MainWidget::ele_update_gui(Element_t* target, int row)
{
@ -636,27 +637,13 @@ Element_t* MainWidget::get_element_by_row(int row)
void MainWidget::sort_by_repeat(std::vector<Element_t*>& vec)
{
std::vector<SElement_t> turn_vec{};
for (const auto& item : vec) {
const char* str = item->Attribute(keys_[0].c_str());
std::string d(str);
turn_vec.emplace_back(item, d);
}
auto compare = [&](const SElement_t& se1, const SElement_t& se2) {
std::size_t i = 0;
// 逐个字符比较,直到找到不同的字符或者某个字符串到达结尾
while (i < se1.str.length() && i < se2.str.length()) {
if (se1.str[i] != se2.str[i]) {
return se1.str[i] < se2.str[i];
}
++i;
}
// 如果有一个字符串到达结尾,而另一个还没有,则较短的字符串排在前面
return se1.str.length() < se2.str.length();
};
std::sort(turn_vec.begin(), turn_vec.end(), compare);
std::sort(turn_vec.begin(), turn_vec.end(), [&](const SElement_t& se1, const SElement_t& se2) { return compare_by_prefix(se1, se2); });
vec.clear();
for (const auto& item : turn_vec) {
vec.push_back(item.ele);
@ -797,8 +784,7 @@ void MainWidget::get_related_elements(std::vector<OperElement*>& out, ReplaceAre
switch (area) {
case AREA_ALL_PAGE: {
out.resize(current_.size());
std::transform(current_.begin(), current_.end(), out.begin(),
[](Element_t* ele) { return new OperElement(ele, 0); });
std::transform(current_.begin(), current_.end(), out.begin(), [](Element_t* ele) { return new OperElement(ele, 0); });
break;
}
case AREA_CUR_PAGE: {
@ -810,8 +796,7 @@ void MainWidget::get_related_elements(std::vector<OperElement*>& out, ReplaceAre
}
case AREA_ALL: {
out.resize(vec_.size());
std::transform(vec_.begin(), vec_.end(), out.begin(),
[](Element_t* ele) { return new OperElement(ele, 0); });
std::transform(vec_.begin(), vec_.end(), out.begin(), [](Element_t* ele) { return new OperElement(ele, 0); });
break;
}
default: {
@ -838,6 +823,22 @@ void MainWidget::backup_file()
}
}
std::string MainWidget::extract_prefix(const std::string& name)
{
auto pos = name.find('.');
return (pos == std::string::npos) ? name : name.substr(0, pos);
}
bool MainWidget::compare_by_prefix(const SElement_t& se1, const SElement_t& se2)
{
std::string a = extract_prefix(se1.str);
std::string b = extract_prefix(se2.str);
if (a != b) {
return a < b;
}
return se1.str < se2.str; // 按照原始顺序排序
}
OperElement::OperElement(Element_t* ele, int row)
{
element_ = ele;

View File

@ -65,6 +65,10 @@ private:
void replace_content(bool is_common = true);
void backup_file();
private:
std::string extract_prefix(const std::string& name);
bool compare_by_prefix(const SElement_t& se1, const SElement_t& se2);
protected:
void closeEvent(QCloseEvent* event);
void keyPressEvent(QKeyEvent* event);