From 1089cd137854cb6ced017c343709ba5596b61b18 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 15 Mar 2019 16:12:51 +0100 Subject: [PATCH] IRCClient: Start using GStackWidget for the subwindows. --- Applications/IRCClient/IRCAppWindow.cpp | 28 ++++++++----------- Applications/IRCClient/IRCAppWindow.h | 4 ++- Applications/IRCClient/IRCClient.cpp | 2 +- .../IRCClient/IRCClientWindowListModel.cpp | 4 ++- .../IRCClient/IRCClientWindowListModel.h | 4 +++ 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Applications/IRCClient/IRCAppWindow.cpp b/Applications/IRCClient/IRCAppWindow.cpp index 13641085bf..2d2d656c6a 100644 --- a/Applications/IRCClient/IRCAppWindow.cpp +++ b/Applications/IRCClient/IRCAppWindow.cpp @@ -1,6 +1,7 @@ #include "IRCAppWindow.h" #include "IRCClientWindow.h" #include "IRCClientWindowListModel.h" +#include #include #include @@ -28,14 +29,6 @@ void IRCAppWindow::setup_client() ensure_window(IRCClientWindow::Channel, channel_name); }; - m_client.on_query_message = [this] (const String& name) { - // FIXME: Update query view. - }; - - m_client.on_channel_message = [this] (const String& channel_name) { - // FIXME: Update channel view. - }; - m_client.connect(); } @@ -46,22 +39,23 @@ void IRCAppWindow::setup_widgets() set_main_widget(widget); widget->set_layout(make(Orientation::Horizontal)); - auto* subwindow_list = new GTableView(widget); - subwindow_list->set_headers_visible(false); - subwindow_list->set_model(OwnPtr(m_client.client_window_list_model())); - subwindow_list->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill); - subwindow_list->set_preferred_size({ 120, 0 }); + auto* window_list = new GTableView(widget); + window_list->set_headers_visible(false); + window_list->set_model(OwnPtr(m_client.client_window_list_model())); + window_list->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill); + window_list->set_preferred_size({ 120, 0 }); + m_client.client_window_list_model()->on_activation = [this] (IRCClientWindow& window) { + m_container->set_active_widget(&window); + }; - m_subwindow_container = new GWidget(widget); - m_subwindow_container->set_layout(make(Orientation::Vertical)); - m_subwindow_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fill); + m_container = new GStackWidget(widget); create_subwindow(IRCClientWindow::Server, "Server"); } IRCClientWindow& IRCAppWindow::create_subwindow(IRCClientWindow::Type type, const String& name) { - return *new IRCClientWindow(m_client, type, name, m_subwindow_container); + return *new IRCClientWindow(m_client, type, name, m_container); } IRCClientWindow& IRCAppWindow::ensure_window(IRCClientWindow::Type type, const String& name) diff --git a/Applications/IRCClient/IRCAppWindow.h b/Applications/IRCClient/IRCAppWindow.h index fb57f7cd77..3dcfd89224 100644 --- a/Applications/IRCClient/IRCAppWindow.h +++ b/Applications/IRCClient/IRCAppWindow.h @@ -5,6 +5,8 @@ #include "IRCClient.h" #include "IRCClientWindow.h" +class GStackWidget; + class IRCAppWindow : public GWindow { public: IRCAppWindow(); @@ -19,5 +21,5 @@ private: IRCClient m_client; - GWidget* m_subwindow_container { nullptr }; + GStackWidget* m_container { nullptr }; }; diff --git a/Applications/IRCClient/IRCClient.cpp b/Applications/IRCClient/IRCClient.cpp index e36145d01b..b78f4c2a97 100644 --- a/Applications/IRCClient/IRCClient.cpp +++ b/Applications/IRCClient/IRCClient.cpp @@ -199,7 +199,7 @@ void IRCClient::join_channel(const String& channel_name) send(String::format("JOIN %s\r\n", channel_name.characters())); } -void IRCClient::handle(const Message& msg, const String& verbatim) +void IRCClient::handle(const Message& msg, const String&) { printf("IRCClient::execute: prefix='%s', command='%s', arguments=%d\n", msg.prefix.characters(), diff --git a/Applications/IRCClient/IRCClientWindowListModel.cpp b/Applications/IRCClient/IRCClientWindowListModel.cpp index 77a47b0019..3f2dcd45e5 100644 --- a/Applications/IRCClient/IRCClientWindowListModel.cpp +++ b/Applications/IRCClient/IRCClientWindowListModel.cpp @@ -52,6 +52,8 @@ void IRCClientWindowListModel::update() did_update(); } -void IRCClientWindowListModel::activate(const GModelIndex&) +void IRCClientWindowListModel::activate(const GModelIndex& index) { + if (on_activation) + on_activation(m_client.window_at(index.row())); } diff --git a/Applications/IRCClient/IRCClientWindowListModel.h b/Applications/IRCClient/IRCClientWindowListModel.h index 686a000f7a..3a549747e9 100644 --- a/Applications/IRCClient/IRCClientWindowListModel.h +++ b/Applications/IRCClient/IRCClientWindowListModel.h @@ -1,8 +1,10 @@ #pragma once #include +#include class IRCClient; +class IRCClientWindow; class IRCClientWindowListModel final : public GTableModel { public: @@ -21,6 +23,8 @@ public: virtual void update() override; virtual void activate(const GModelIndex&) override; + Function on_activation; + private: IRCClient& m_client; };