diff --git a/processcore/process_attribute.h b/processcore/process_attribute.h --- a/processcore/process_attribute.h +++ b/processcore/process_attribute.h @@ -85,6 +85,14 @@ KSysGuard::Unit unit() const; void setUnit(KSysGuard::Unit unit); + /** + * A hint to UIs that this sensor would like to be visible by default. + * + * Defaults to false. + */ + bool isVisibleByDefault() const; + void setVisibleByDefault(bool visible); + /** * The last stored value for a given process */ diff --git a/processcore/process_attribute.cpp b/processcore/process_attribute.cpp --- a/processcore/process_attribute.cpp +++ b/processcore/process_attribute.cpp @@ -36,6 +36,8 @@ QHash m_data; bool m_enabled = false; + + bool m_defaultVisible = false; }; ProcessAttribute::ProcessAttribute(const QString &id, QObject *parent) @@ -134,6 +136,16 @@ d->m_unit = unit; } +bool KSysGuard::ProcessAttribute::isVisibleByDefault() const +{ + return d->m_defaultVisible; +} + +void KSysGuard::ProcessAttribute::setVisibleByDefault(bool visible) +{ + d->m_defaultVisible = visible; +} + QVariant ProcessAttribute::data(KSysGuard::Process *process) { return d->m_data.value(process); diff --git a/processui/ProcessModel.h b/processui/ProcessModel.h --- a/processui/ProcessModel.h +++ b/processui/ProcessModel.h @@ -31,6 +31,7 @@ namespace KSysGuard { class Processes; class Process; + class ProcessAttribute; } class ProcessModelPrivate; @@ -128,6 +129,9 @@ /** Returns for process controller pointer for this model */ KSysGuard::Processes *processController() const; //The processes instance + /** Returns the list of extra attributes provided by plugins */ + const QVector extraAttributes() const; + /** Convenience function to get the number of processes. * * Equivalent to processController->processCount() */ @@ -159,6 +163,9 @@ HeadingCGroup, HeadingMACContext, HeadingVmPSS, + // This entry should always match the actual last entry in this enum + 1. + // It is used to determine where plugin-provided headings start. + HeadingPluginStart = HeadingVmPSS + 1, }; enum { UidRole = Qt::UserRole, SortingValueRole, WindowIdRole, PlainValueRole, PercentageRole, PercentageHistoryRole }; diff --git a/processui/ProcessModel.cpp b/processui/ProcessModel.cpp --- a/processui/ProcessModel.cpp +++ b/processui/ProcessModel.cpp @@ -371,6 +371,11 @@ return d->mProcesses; } +const QVector ProcessModel::extraAttributes() const +{ + return d->mExtraAttributes; +} + #if HAVE_X11 void ProcessModelPrivate::windowRemoved(WId wid) { WindowInfo *window = mWIdToWindowInfo.take(wid); @@ -516,8 +521,6 @@ mExtraAttributes = mProcesses->attributes(); for (int i = 0 ; i < mExtraAttributes.count(); i ++) { - mExtraAttributes[i]->setEnabled(true); // In future we will toggle this based on column visibility - connect(mExtraAttributes[i], &KSysGuard::ProcessAttribute::dataChanged, this, [this, i](KSysGuard::Process *process) { const QModelIndex index = q->getQModelIndex(process, mHeadings.count() + i); emit q->dataChanged(index, index); diff --git a/processui/ksysguardprocesslist.cpp b/processui/ksysguardprocesslist.cpp --- a/processui/ksysguardprocesslist.cpp +++ b/processui/ksysguardprocesslist.cpp @@ -64,6 +64,7 @@ #include "ui_ProcessWidgetUI.h" #include "scripting.h" #include "process_controller.h" +#include "process_attribute.h" #include #include @@ -372,6 +373,15 @@ d->mUi->treeView->setDragEnabled(true); d->mUi->treeView->setDragDropMode(QAbstractItemView::DragOnly); + auto extraAttributes = d->mModel.extraAttributes(); + for (int i = 0; i < extraAttributes.count(); ++i) { + auto attribute = extraAttributes.at(i); + if (attribute->isVisibleByDefault()) { + attribute->setEnabled(true); + } else { + d->mUi->treeView->header()->hideSection(ProcessModel::HeadingPluginStart + i); + } + } //Sort by username by default d->mUi->treeView->sortByColumn(ProcessModel::HeadingUser, Qt::AscendingOrder); @@ -967,10 +977,18 @@ int i = result->data().toInt(); //We set data to be negative to hide a column, and positive to show a column - if(i < 0) - d->mUi->treeView->hideColumn(-1-i); - else { + if(i < 0) { + auto index = -1 - i; + d->mUi->treeView->hideColumn(index); + + if (index >= ProcessModel::HeadingPluginStart) { + d->mModel.extraAttributes().at(index - ProcessModel::HeadingPluginStart)->setEnabled(false); + } + } else { d->mUi->treeView->showColumn(i); + if (i >= ProcessModel::HeadingPluginStart) { + d->mModel.extraAttributes().at(i - ProcessModel::HeadingPluginStart)->setEnabled(true); + } updateList(); d->mUi->treeView->resizeColumnToContents(i); d->mUi->treeView->resizeColumnToContents(d->mFilterModel.columnCount()); @@ -1042,6 +1060,12 @@ //stop any scripts running, to save on memory if(d->mScripting) d->mScripting->stopAllScripts(); + + //Disable all plugin-provided attributes + for (auto attribute : d->mModel.extraAttributes()) { + attribute->setEnabled(false); + } + QWidget::hideEvent(event); } @@ -1051,6 +1075,14 @@ updateList(); QHeaderView *header = d->mUi->treeView->header(); d->mUi->treeView->sortByColumn(header->sortIndicatorSection(), header->sortIndicatorOrder()); + + auto attributes = d->mModel.extraAttributes(); + for (int i = 0; i < attributes.count(); ++i) { + if (!header->isSectionHidden(ProcessModel::HeadingPluginStart + i)) { + attributes.at(i)->setEnabled(true); + } + } + QWidget::showEvent(event); }