mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 15:47:44 +00:00
LibGUI: Remove reference captures of stack variables in ProcessChooser
Since all reference-captured variables where pointers to non-stack objects whose owners outlive the lambdas, things were fine in practice, but it's a bit brittle and it makes a change I want to make in this code more difficult.
This commit is contained in:
parent
2e5c434e22
commit
cd7b4e813f
2 changed files with 15 additions and 14 deletions
|
@ -55,11 +55,11 @@ ProcessChooser::ProcessChooser(const StringView& window_title, const StringView&
|
||||||
widget.set_layout<GUI::VerticalBoxLayout>();
|
widget.set_layout<GUI::VerticalBoxLayout>();
|
||||||
widget.layout()->set_margins({ 0, 0, 0, 2 });
|
widget.layout()->set_margins({ 0, 0, 0, 2 });
|
||||||
|
|
||||||
auto& table_view = widget.add<GUI::TableView>();
|
m_table_view = widget.add<GUI::TableView>();
|
||||||
auto sorting_model = GUI::SortingProxyModel::create(RunningProcessesModel::create());
|
auto sorting_model = GUI::SortingProxyModel::create(RunningProcessesModel::create());
|
||||||
sorting_model->set_sort_role(GUI::Model::Role::Display);
|
sorting_model->set_sort_role(GUI::Model::Role::Display);
|
||||||
sorting_model->set_key_column_and_sort_order(RunningProcessesModel::Column::PID, GUI::SortOrder::Descending);
|
sorting_model->set_key_column_and_sort_order(RunningProcessesModel::Column::PID, GUI::SortOrder::Descending);
|
||||||
table_view.set_model(sorting_model);
|
m_table_view->set_model(sorting_model);
|
||||||
|
|
||||||
auto& button_container = widget.add<GUI::Widget>();
|
auto& button_container = widget.add<GUI::Widget>();
|
||||||
button_container.set_preferred_size(0, 30);
|
button_container.set_preferred_size(0, 30);
|
||||||
|
@ -71,13 +71,13 @@ ProcessChooser::ProcessChooser(const StringView& window_title, const StringView&
|
||||||
auto& select_button = button_container.add<GUI::Button>(m_button_label);
|
auto& select_button = button_container.add<GUI::Button>(m_button_label);
|
||||||
select_button.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed);
|
select_button.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed);
|
||||||
select_button.set_preferred_size(80, 24);
|
select_button.set_preferred_size(80, 24);
|
||||||
select_button.on_click = [&](auto) {
|
select_button.on_click = [this](auto) {
|
||||||
if (table_view.selection().is_empty()) {
|
if (m_table_view->selection().is_empty()) {
|
||||||
GUI::MessageBox::show(this, "No process selected!", m_window_title, GUI::MessageBox::Type::Error);
|
GUI::MessageBox::show(this, "No process selected!", m_window_title, GUI::MessageBox::Type::Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto index = table_view.selection().first();
|
auto index = m_table_view->selection().first();
|
||||||
auto pid_as_variant = table_view.model()->data(index, GUI::Model::Role::Custom);
|
auto pid_as_variant = m_table_view->model()->data(index, GUI::Model::Role::Custom);
|
||||||
m_pid = pid_as_variant.as_i32();
|
m_pid = pid_as_variant.as_i32();
|
||||||
done(ExecOK);
|
done(ExecOK);
|
||||||
};
|
};
|
||||||
|
@ -88,32 +88,32 @@ ProcessChooser::ProcessChooser(const StringView& window_title, const StringView&
|
||||||
done(ExecCancel);
|
done(ExecCancel);
|
||||||
};
|
};
|
||||||
|
|
||||||
table_view.model()->update();
|
m_table_view->model()->update();
|
||||||
|
|
||||||
m_refresh_timer = add<Core::Timer>();
|
m_refresh_timer = add<Core::Timer>();
|
||||||
|
|
||||||
m_refresh_timer->start(m_refresh_interval); // Start the timer to update the processes
|
m_refresh_timer->start(m_refresh_interval); // Start the timer to update the processes
|
||||||
m_refresh_timer->on_timeout = [&table_view] {
|
m_refresh_timer->on_timeout = [this] {
|
||||||
auto previous_selected_pid = -1; // Store the selection index to not to clear the selection upon update.
|
auto previous_selected_pid = -1; // Store the selection index to not to clear the selection upon update.
|
||||||
if (!table_view.selection().is_empty()) {
|
if (!m_table_view->selection().is_empty()) {
|
||||||
auto pid_as_variant = table_view.model()->data(table_view.selection().first(), GUI::Model::Role::Custom);
|
auto pid_as_variant = m_table_view->model()->data(m_table_view->selection().first(), GUI::Model::Role::Custom);
|
||||||
previous_selected_pid = pid_as_variant.as_i32();
|
previous_selected_pid = pid_as_variant.as_i32();
|
||||||
}
|
}
|
||||||
|
|
||||||
table_view.model()->update();
|
m_table_view->model()->update();
|
||||||
|
|
||||||
if (previous_selected_pid == -1) {
|
if (previous_selected_pid == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto model = table_view.model();
|
auto model = m_table_view->model();
|
||||||
auto row_count = model->row_count();
|
auto row_count = model->row_count();
|
||||||
auto column_index = 1; // Corresponds to PID column in the table_view.
|
auto column_index = 1; // Corresponds to PID column in the m_table_view.
|
||||||
for (int row_index = 0; row_index < row_count; ++row_index) {
|
for (int row_index = 0; row_index < row_count; ++row_index) {
|
||||||
auto cell_index = model->index(row_index, column_index);
|
auto cell_index = model->index(row_index, column_index);
|
||||||
auto pid_as_variant = model->data(cell_index, GUI::Model::Role::Custom);
|
auto pid_as_variant = model->data(cell_index, GUI::Model::Role::Custom);
|
||||||
if (previous_selected_pid == pid_as_variant.as_i32()) {
|
if (previous_selected_pid == pid_as_variant.as_i32()) {
|
||||||
table_view.selection().set(cell_index); // Set only if PIDs are matched.
|
m_table_view->selection().set(cell_index); // Set only if PIDs are matched.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,6 +47,7 @@ private:
|
||||||
String m_window_title;
|
String m_window_title;
|
||||||
String m_button_label;
|
String m_button_label;
|
||||||
RefPtr<Gfx::Bitmap> m_window_icon;
|
RefPtr<Gfx::Bitmap> m_window_icon;
|
||||||
|
RefPtr<TableView> m_table_view;
|
||||||
|
|
||||||
bool m_refresh_enabled { true };
|
bool m_refresh_enabled { true };
|
||||||
unsigned m_refresh_interval { 1000 };
|
unsigned m_refresh_interval { 1000 };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue