diff --git a/Applications/FileManager/DirectoryTableModel.h b/Applications/FileManager/DirectoryTableModel.h index a275a12c7b..f89251b16c 100644 --- a/Applications/FileManager/DirectoryTableModel.h +++ b/Applications/FileManager/DirectoryTableModel.h @@ -6,7 +6,7 @@ class DirectoryTableModel final : public GTableModel { public: - DirectoryTableModel(); + static Retained create() { return adopt(*new DirectoryTableModel); } virtual ~DirectoryTableModel() override; enum Column { @@ -33,6 +33,8 @@ public: size_t bytes_in_files() const { return m_bytes_in_files; } private: + DirectoryTableModel(); + String name_for_uid(uid_t) const; String name_for_gid(gid_t) const; diff --git a/Applications/FileManager/DirectoryTableView.cpp b/Applications/FileManager/DirectoryTableView.cpp index 28f54303de..938f9ebf76 100644 --- a/Applications/FileManager/DirectoryTableView.cpp +++ b/Applications/FileManager/DirectoryTableView.cpp @@ -3,10 +3,9 @@ DirectoryTableView::DirectoryTableView(GWidget* parent) : GTableView(parent) + , m_model(DirectoryTableModel::create()) { - auto directory_model = make(); - m_model = directory_model.ptr(); - set_model(make(move(directory_model))); + set_model(GSortingProxyTableModel::create(m_model.copy_ref())); GTableView::model()->set_key_column_and_sort_order(DirectoryTableModel::Column::Name, GSortOrder::Ascending); } diff --git a/Applications/FileManager/DirectoryTableView.h b/Applications/FileManager/DirectoryTableView.h index 1bc56e8ab1..b7567e718a 100644 --- a/Applications/FileManager/DirectoryTableView.h +++ b/Applications/FileManager/DirectoryTableView.h @@ -24,5 +24,5 @@ private: void set_status_message(const String&); - DirectoryTableModel* m_model { nullptr }; + Retained m_model; }; diff --git a/Applications/IRCClient/IRCAppWindow.cpp b/Applications/IRCClient/IRCAppWindow.cpp index abc6a16897..95ee161f3b 100644 --- a/Applications/IRCClient/IRCAppWindow.cpp +++ b/Applications/IRCClient/IRCAppWindow.cpp @@ -125,7 +125,7 @@ void IRCAppWindow::setup_widgets() m_window_list = new GTableView(horizontal_container); m_window_list->set_headers_visible(false); m_window_list->set_alternating_row_colors(false); - m_window_list->set_model(OwnPtr(m_client.client_window_list_model())); + m_window_list->set_model(m_client.client_window_list_model()); m_window_list->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill); m_window_list->set_preferred_size({ 100, 0 }); m_client.client_window_list_model()->on_activation = [this] (IRCWindow& window) { diff --git a/Applications/IRCClient/IRCChannel.cpp b/Applications/IRCClient/IRCChannel.cpp index 381f461ffe..97e644b91d 100644 --- a/Applications/IRCClient/IRCChannel.cpp +++ b/Applications/IRCClient/IRCChannel.cpp @@ -8,8 +8,8 @@ IRCChannel::IRCChannel(IRCClient& client, const String& name) : m_client(client) , m_name(name) , m_log(IRCLogBuffer::create()) + , m_member_model(IRCChannelMemberListModel::create(*this)) { - m_member_model = new IRCChannelMemberListModel(*this); m_window = m_client.aid_create_window(this, IRCWindow::Channel, m_name); m_window->set_log_buffer(*m_log); } diff --git a/Applications/IRCClient/IRCChannel.h b/Applications/IRCClient/IRCChannel.h index 9bbdc71fc8..12c0ae491f 100644 --- a/Applications/IRCClient/IRCChannel.h +++ b/Applications/IRCClient/IRCChannel.h @@ -34,8 +34,8 @@ public: const IRCLogBuffer& log() const { return *m_log; } IRCLogBuffer& log() { return *m_log; } - IRCChannelMemberListModel* member_model() { return m_member_model; } - const IRCChannelMemberListModel* member_model() const { return m_member_model; } + IRCChannelMemberListModel* member_model() { return m_member_model.ptr(); } + const IRCChannelMemberListModel* member_model() const { return m_member_model.ptr(); } int member_count() const { return m_members.size(); } String member_at(int i) { return m_members[i].name; } @@ -63,6 +63,6 @@ private: bool m_open { false }; Retained m_log; - IRCChannelMemberListModel* m_member_model { nullptr }; + Retained m_member_model; IRCWindow* m_window { nullptr }; }; diff --git a/Applications/IRCClient/IRCChannelMemberListModel.h b/Applications/IRCClient/IRCChannelMemberListModel.h index 89aaf5b4cc..661a0d07a9 100644 --- a/Applications/IRCClient/IRCChannelMemberListModel.h +++ b/Applications/IRCClient/IRCChannelMemberListModel.h @@ -8,7 +8,7 @@ class IRCChannel; class IRCChannelMemberListModel final : public GTableModel { public: enum Column { Name }; - explicit IRCChannelMemberListModel(IRCChannel&); + static Retained create(IRCChannel& channel) { return adopt(*new IRCChannelMemberListModel(channel)); } virtual ~IRCChannelMemberListModel() override; virtual int row_count() const override; @@ -22,5 +22,7 @@ public: Function on_activation; private: + explicit IRCChannelMemberListModel(IRCChannel&); + IRCChannel& m_channel; }; diff --git a/Applications/IRCClient/IRCClient.cpp b/Applications/IRCClient/IRCClient.cpp index 83d0c09fe2..b46773c23f 100644 --- a/Applications/IRCClient/IRCClient.cpp +++ b/Applications/IRCClient/IRCClient.cpp @@ -31,10 +31,10 @@ IRCClient::IRCClient(const String& address, int port) : m_hostname(address) , m_port(port) , m_nickname("anon") + , m_client_window_list_model(IRCWindowListModel::create(*this)) , m_log(IRCLogBuffer::create()) { m_socket = new GTCPSocket(this); - m_client_window_list_model = new IRCWindowListModel(*this); } IRCClient::~IRCClient() diff --git a/Applications/IRCClient/IRCClient.h b/Applications/IRCClient/IRCClient.h index 2dea2281a6..8c6029f39d 100644 --- a/Applications/IRCClient/IRCClient.h +++ b/Applications/IRCClient/IRCClient.h @@ -46,8 +46,8 @@ public: void register_subwindow(IRCWindow&); void unregister_subwindow(IRCWindow&); - IRCWindowListModel* client_window_list_model() { return m_client_window_list_model; } - const IRCWindowListModel* client_window_list_model() const { return m_client_window_list_model; } + IRCWindowListModel* client_window_list_model() { return m_client_window_list_model.ptr(); } + const IRCWindowListModel* client_window_list_model() const { return m_client_window_list_model.ptr(); } int window_count() const { return m_windows.size(); } const IRCWindow& window_at(int index) const { return *m_windows.at(index); } @@ -118,7 +118,6 @@ private: IRCWindow* m_server_subwindow { nullptr }; - IRCWindowListModel* m_client_window_list_model { nullptr }; - + Retained m_client_window_list_model; Retained m_log; }; diff --git a/Applications/IRCClient/IRCLogBuffer.cpp b/Applications/IRCClient/IRCLogBuffer.cpp index 69b35a2adf..bfa8736306 100644 --- a/Applications/IRCClient/IRCLogBuffer.cpp +++ b/Applications/IRCClient/IRCLogBuffer.cpp @@ -9,8 +9,8 @@ Retained IRCLogBuffer::create() } IRCLogBuffer::IRCLogBuffer() + : m_model(IRCLogBufferModel::create(*this)) { - m_model = new IRCLogBufferModel(*this); } IRCLogBuffer::~IRCLogBuffer() diff --git a/Applications/IRCClient/IRCLogBuffer.h b/Applications/IRCClient/IRCLogBuffer.h index 6be5576be7..e1b6b472dd 100644 --- a/Applications/IRCClient/IRCLogBuffer.h +++ b/Applications/IRCClient/IRCLogBuffer.h @@ -27,11 +27,11 @@ public: void add_message(const String& text, Color = Color::Black); void dump() const; - const IRCLogBufferModel* model() const { return m_model; } - IRCLogBufferModel* model() { return m_model; } + const IRCLogBufferModel* model() const { return m_model.ptr(); } + IRCLogBufferModel* model() { return m_model.ptr(); } private: IRCLogBuffer(); - IRCLogBufferModel* m_model { nullptr }; + Retained m_model; CircularQueue m_messages; }; diff --git a/Applications/IRCClient/IRCLogBufferModel.h b/Applications/IRCClient/IRCLogBufferModel.h index 7605ca3bab..446b4b2ecb 100644 --- a/Applications/IRCClient/IRCLogBufferModel.h +++ b/Applications/IRCClient/IRCLogBufferModel.h @@ -13,7 +13,7 @@ public: __Count, }; - explicit IRCLogBufferModel(Retained&&); + static Retained create(Retained&& log_buffer) { return adopt(*new IRCLogBufferModel(move(log_buffer))); } virtual ~IRCLogBufferModel() override; virtual int row_count() const override; @@ -25,5 +25,7 @@ public: virtual void activate(const GModelIndex&) override; private: + explicit IRCLogBufferModel(Retained&&); + Retained m_log_buffer; }; diff --git a/Applications/IRCClient/IRCWindow.cpp b/Applications/IRCClient/IRCWindow.cpp index 4c8df7820a..627d03c578 100644 --- a/Applications/IRCClient/IRCWindow.cpp +++ b/Applications/IRCClient/IRCWindow.cpp @@ -32,7 +32,7 @@ IRCWindow::IRCWindow(IRCClient& client, void* owner, Type type, const String& na member_view->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill); member_view->set_preferred_size({ 100, 0 }); member_view->set_alternating_row_colors(false); - member_view->set_model(OwnPtr(channel().member_model())); + member_view->set_model(channel().member_model()); } m_text_editor = new GTextEditor(GTextEditor::SingleLine, this); @@ -59,7 +59,7 @@ IRCWindow::~IRCWindow() void IRCWindow::set_log_buffer(const IRCLogBuffer& log_buffer) { m_log_buffer = &log_buffer; - m_table_view->set_model(OwnPtr((IRCLogBufferModel*)log_buffer.model())); + m_table_view->set_model(log_buffer.model()); } bool IRCWindow::is_active() const diff --git a/Applications/IRCClient/IRCWindowListModel.h b/Applications/IRCClient/IRCWindowListModel.h index d50f293c34..1157280bc4 100644 --- a/Applications/IRCClient/IRCWindowListModel.h +++ b/Applications/IRCClient/IRCWindowListModel.h @@ -12,7 +12,7 @@ public: Name, }; - explicit IRCWindowListModel(IRCClient&); + static Retained create(IRCClient& client) { return adopt(*new IRCWindowListModel(client)); } virtual ~IRCWindowListModel() override; virtual int row_count() const override; @@ -26,5 +26,7 @@ public: Function on_activation; private: + explicit IRCWindowListModel(IRCClient&); + IRCClient& m_client; }; diff --git a/Applications/ProcessManager/ProcessTableModel.h b/Applications/ProcessManager/ProcessTableModel.h index 558b37f643..743b0b8bcf 100644 --- a/Applications/ProcessManager/ProcessTableModel.h +++ b/Applications/ProcessManager/ProcessTableModel.h @@ -21,7 +21,7 @@ public: __Count }; - ProcessTableModel(); + static Retained create() { return adopt(*new ProcessTableModel); } virtual ~ProcessTableModel() override; virtual int row_count() const override; @@ -32,6 +32,8 @@ public: virtual void update() override; private: + ProcessTableModel(); + struct ProcessState { pid_t pid; unsigned nsched; diff --git a/Applications/ProcessManager/ProcessTableView.cpp b/Applications/ProcessManager/ProcessTableView.cpp index 65c33f81dc..1c10572ec3 100644 --- a/Applications/ProcessManager/ProcessTableView.cpp +++ b/Applications/ProcessManager/ProcessTableView.cpp @@ -6,7 +6,7 @@ ProcessTableView::ProcessTableView(GWidget* parent) : GTableView(parent) { - set_model(make(make())); + set_model(GSortingProxyTableModel::create(ProcessTableModel::create())); model()->set_key_column_and_sort_order(ProcessTableModel::Column::CPU, GSortOrder::Descending); start_timer(1000); model()->update(); diff --git a/Applications/Terminal/main.cpp b/Applications/Terminal/main.cpp index a3cba5d296..2eb2ddc079 100644 --- a/Applications/Terminal/main.cpp +++ b/Applications/Terminal/main.cpp @@ -92,7 +92,7 @@ int main(int argc, char** argv) window->set_should_exit_event_loop_on_close(true); Terminal terminal(ptm_fd); - window->set_has_alpha_channel(true); + window->set_has_alpha_channel(false); window->set_main_widget(&terminal); window->move_to(300, 300); terminal.apply_size_increments_to_window(*window); diff --git a/LibGUI/GSortingProxyTableModel.cpp b/LibGUI/GSortingProxyTableModel.cpp index 1077d633a4..c86d955956 100644 --- a/LibGUI/GSortingProxyTableModel.cpp +++ b/LibGUI/GSortingProxyTableModel.cpp @@ -3,7 +3,7 @@ #include #include -GSortingProxyTableModel::GSortingProxyTableModel(OwnPtr&& target) +GSortingProxyTableModel::GSortingProxyTableModel(Retained&& target) : m_target(move(target)) , m_key_column(-1) { diff --git a/LibGUI/GSortingProxyTableModel.h b/LibGUI/GSortingProxyTableModel.h index 429ca91e62..feb8bfae54 100644 --- a/LibGUI/GSortingProxyTableModel.h +++ b/LibGUI/GSortingProxyTableModel.h @@ -4,7 +4,7 @@ class GSortingProxyTableModel final : public GTableModel { public: - explicit GSortingProxyTableModel(OwnPtr&&); + static Retained create(Retained&& model) { return adopt(*new GSortingProxyTableModel(move(model))); } virtual ~GSortingProxyTableModel() override; virtual int row_count() const override; @@ -23,12 +23,14 @@ public: GModelIndex map_to_target(const GModelIndex&) const; private: + explicit GSortingProxyTableModel(Retained&&); + GTableModel& target() { return *m_target; } const GTableModel& target() const { return *m_target; } void resort(); - OwnPtr m_target; + Retained m_target; Vector m_row_mappings; int m_key_column { -1 }; GSortOrder m_sort_order { GSortOrder::Ascending }; diff --git a/LibGUI/GTableModel.h b/LibGUI/GTableModel.h index 659ddae91a..11b8466040 100644 --- a/LibGUI/GTableModel.h +++ b/LibGUI/GTableModel.h @@ -34,7 +34,7 @@ private: GModelIndex m_index; }; -class GTableModel { +class GTableModel : public Retainable { public: struct ColumnMetadata { int preferred_width { 0 }; diff --git a/LibGUI/GTableView.cpp b/LibGUI/GTableView.cpp index 9d4b528b5b..1f42a176c0 100644 --- a/LibGUI/GTableView.cpp +++ b/LibGUI/GTableView.cpp @@ -13,7 +13,7 @@ GTableView::~GTableView() { } -void GTableView::set_model(OwnPtr&& model) +void GTableView::set_model(RetainPtr&& model) { if (model.ptr() == m_model.ptr()) return; diff --git a/LibGUI/GTableView.h b/LibGUI/GTableView.h index 06e9765a50..1cb5e4de3e 100644 --- a/LibGUI/GTableView.h +++ b/LibGUI/GTableView.h @@ -16,7 +16,7 @@ public: int header_height() const { return m_headers_visible ? 16 : 0; } int item_height() const { return 16; } - void set_model(OwnPtr&&); + void set_model(RetainPtr&&); GTableModel* model() { return m_model.ptr(); } const GTableModel* model() const { return m_model.ptr(); } @@ -49,7 +49,7 @@ private: int column_width(int) const; void update_content_size(); - OwnPtr m_model; + RetainPtr m_model; int m_horizontal_padding { 5 }; bool m_headers_visible { true }; bool m_alternating_row_colors { true };