|
|
|
|
@ -12,11 +12,15 @@
|
|
|
|
|
#include <QListWidget>
|
|
|
|
|
#include "nmData/nmDataLogFile.h"
|
|
|
|
|
#include <QTextEdit>
|
|
|
|
|
#include <QShortcut>
|
|
|
|
|
#include <QKeySequence>
|
|
|
|
|
#include <QApplication>
|
|
|
|
|
|
|
|
|
|
nmWxSelectWellsWidget::nmWxSelectWellsWidget(QWidget* aParent) :
|
|
|
|
|
QWidget(aParent),
|
|
|
|
|
m_pListWidget(new QListWidget(this)),
|
|
|
|
|
m_pLineEdit(new QTextEdit(this))
|
|
|
|
|
m_pLineEdit(new QTextEdit(this)),
|
|
|
|
|
m_nLastClickedIndex(-1)
|
|
|
|
|
{
|
|
|
|
|
// 主布局
|
|
|
|
|
QGridLayout* layout = new QGridLayout;
|
|
|
|
|
@ -27,6 +31,15 @@ nmWxSelectWellsWidget::nmWxSelectWellsWidget(QWidget* aParent) :
|
|
|
|
|
layout->addWidget(m_pLineEdit, 1, 1);
|
|
|
|
|
// m_pLineEdit->setText(multiLineText);
|
|
|
|
|
m_pLineEdit->setReadOnly(true);
|
|
|
|
|
// 快捷键:Ctrl+A全选,Ctrl+Shift+A清空选择
|
|
|
|
|
QShortcut* selectAllShortcut = new QShortcut(QKeySequence::SelectAll, this);
|
|
|
|
|
selectAllShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
|
|
|
|
connect(selectAllShortcut, SIGNAL(activated()), this, SLOT(onSelectAllItems()));
|
|
|
|
|
|
|
|
|
|
QShortcut* clearSelectionShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_A), this);
|
|
|
|
|
clearSelectionShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
|
|
|
|
connect(clearSelectionShortcut, SIGNAL(activated()), this, SLOT(onClearSelectedItems()));
|
|
|
|
|
|
|
|
|
|
this->setMinimumWidth(200);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -62,7 +75,9 @@ void nmWxSelectWellsWidget::addItem(QString name, QVariant value)
|
|
|
|
|
|
|
|
|
|
QStringList nmWxSelectWellsWidget::getItems()
|
|
|
|
|
{
|
|
|
|
|
return m_pLineEdit->toPlainText().split("\n");
|
|
|
|
|
QStringList items = m_pLineEdit->toPlainText().split("\n");
|
|
|
|
|
items.removeAll(QString());
|
|
|
|
|
return items;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmWxSelectWellsWidget::setSelectedItems(QStringList selectItems)
|
|
|
|
|
@ -72,6 +87,20 @@ void nmWxSelectWellsWidget::setSelectedItems(QStringList selectItems)
|
|
|
|
|
|
|
|
|
|
void nmWxSelectWellsWidget::onUpdateSelections()
|
|
|
|
|
{
|
|
|
|
|
// 如果由井项点击触发,则记录点击位置并处理Shift范围选择
|
|
|
|
|
nmWxSelectWellItemWidget* clickedItemWidget = qobject_cast<nmWxSelectWellItemWidget*>(sender());
|
|
|
|
|
if (clickedItemWidget) {
|
|
|
|
|
const int clickedIndex = this->indexOfItemWidget(clickedItemWidget);
|
|
|
|
|
if (clickedIndex >= 0) {
|
|
|
|
|
const bool shiftPressed = QApplication::keyboardModifiers() & Qt::ShiftModifier;
|
|
|
|
|
if (shiftPressed && m_nLastClickedIndex >= 0 && m_nLastClickedIndex != clickedIndex) {
|
|
|
|
|
// Shift+点击:将上次点击项到当前项之间的井批量设置为当前选择状态
|
|
|
|
|
this->setRangeItemsSelected(m_nLastClickedIndex, clickedIndex, clickedItemWidget->getSelected());
|
|
|
|
|
}
|
|
|
|
|
m_nLastClickedIndex = clickedIndex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStringList nameList;
|
|
|
|
|
// 遍历所有的itemWidget,获取所有被选中的信息
|
|
|
|
|
for (int i = 0; i < m_pListWidget->count(); i++) {
|
|
|
|
|
@ -83,6 +112,71 @@ void nmWxSelectWellsWidget::onUpdateSelections()
|
|
|
|
|
m_pLineEdit->setPlainText(nameList.join("\n"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查找井项在列表中的位置
|
|
|
|
|
int nmWxSelectWellsWidget::indexOfItemWidget(nmWxSelectWellItemWidget* itemWidget) const
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < m_pListWidget->count(); i++) {
|
|
|
|
|
if (m_pListWidget->itemWidget(m_pListWidget->item(i)) == itemWidget) {
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 批量设置所有井的选中状态,最后统一刷新右侧文本
|
|
|
|
|
void nmWxSelectWellsWidget::setAllItemsSelected(bool selected)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < m_pListWidget->count(); i++) {
|
|
|
|
|
nmWxSelectWellItemWidget* itemWidget = static_cast<nmWxSelectWellItemWidget*>(m_pListWidget->itemWidget(m_pListWidget->item(i)));
|
|
|
|
|
if (!itemWidget) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 屏蔽单项信号,避免批量操作时重复刷新
|
|
|
|
|
const bool oldSignalsBlocked = itemWidget->blockSignals(true);
|
|
|
|
|
itemWidget->setSelected(selected);
|
|
|
|
|
itemWidget->blockSignals(oldSignalsBlocked);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this->onUpdateSelections();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 批量设置指定范围内井的选中状态
|
|
|
|
|
void nmWxSelectWellsWidget::setRangeItemsSelected(int fromIndex, int toIndex, bool selected)
|
|
|
|
|
{
|
|
|
|
|
// 允许从下往上Shift+点击
|
|
|
|
|
if (fromIndex > toIndex) {
|
|
|
|
|
const int tempIndex = fromIndex;
|
|
|
|
|
fromIndex = toIndex;
|
|
|
|
|
toIndex = tempIndex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = fromIndex; i <= toIndex && i < m_pListWidget->count(); i++) {
|
|
|
|
|
nmWxSelectWellItemWidget* itemWidget = static_cast<nmWxSelectWellItemWidget*>(m_pListWidget->itemWidget(m_pListWidget->item(i)));
|
|
|
|
|
if (!itemWidget) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 屏蔽单项信号,范围处理完成后由外层统一刷新
|
|
|
|
|
const bool oldSignalsBlocked = itemWidget->blockSignals(true);
|
|
|
|
|
itemWidget->setSelected(selected);
|
|
|
|
|
itemWidget->blockSignals(oldSignalsBlocked);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 响应Ctrl+A,全选所有井
|
|
|
|
|
void nmWxSelectWellsWidget::onSelectAllItems()
|
|
|
|
|
{
|
|
|
|
|
this->setAllItemsSelected(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 响应Ctrl+Shift+A,清空所有已选择井
|
|
|
|
|
void nmWxSelectWellsWidget::onClearSelectedItems()
|
|
|
|
|
{
|
|
|
|
|
this->setAllItemsSelected(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nmWxSelectWellItemWidget::nmWxSelectWellItemWidget()
|
|
|
|
|
: m_pCBox(NULL)
|
|
|
|
|
|