Adding plus button to headerbar

This commit is contained in:
Selim Mustafaev 2022-05-17 00:30:36 +03:00
parent 28b18aa67b
commit 856d7ff67f
8 changed files with 76 additions and 59 deletions

View File

@ -6,22 +6,12 @@
namespace gtkpp { namespace gtkpp {
void clickedCallback(GtkButton*, void* data) {
auto button = reinterpret_cast<Button*>(data);
button->_signalClicked.emit();
}
Button::Button() : Widget() { Button::Button() : Widget() {
_widget = gtk_button_new(); _widget = gtk_button_new();
g_signal_connect(_widget, "clicked", G_CALLBACK(clickedCallback), this);
} }
void Button::setTitle(const std::string &title) { void Button::setTitle(const std::string &title) {
gtk_button_set_label(GTK_BUTTON(_widget), title.c_str()); gtk_button_set_label(GTK_BUTTON(_widget), title.c_str());
} }
void Button::onClick(const std::function<void()> &callback) {
_signalClicked.connect(callback);
}
} }

View File

@ -7,21 +7,14 @@
#include "Widget.h" #include "Widget.h"
#include <string> #include <string>
#include <sigc++/sigc++.h>
namespace gtkpp { namespace gtkpp {
class Button: public Widget { class Button: public Widget {
private:
sigc::signal<void()> _signalClicked;
private:
friend void clickedCallback(GtkButton*, void* data);
public: public:
using Widget::Widget;
Button(); Button();
void setTitle(const std::string& title); void setTitle(const std::string& title);
void onClick(const std::function<void()>& callback);
}; };
} }

View File

@ -4,35 +4,57 @@
#include "Widget.h" #include "Widget.h"
GtkWidget *gtkpp::Widget::gobj() const { namespace gtkpp {
void clickedCallback(GtkButton*, void* data) {
auto widget = reinterpret_cast<Widget*>(data);
widget->_signalClicked.emit();
}
void Widget::onClick(const std::function<void()> &callback) {
_signalClicked.connect(callback);
}
Widget::Widget() {
_widget = nullptr;
}
Widget::Widget(GtkBuilder *builder, const char *id) {
_widget = GTK_WIDGET(gtk_builder_get_object(builder, id));
g_signal_connect(_widget, "clicked", G_CALLBACK(clickedCallback), this);
}
GtkWidget *Widget::gobj() const {
return _widget; return _widget;
} }
void gtkpp::Widget::setMargins(int margin) { void Widget::setMargins(int margin) {
gtk_widget_set_margin_top(_widget, margin); gtk_widget_set_margin_top(_widget, margin);
gtk_widget_set_margin_bottom(_widget, margin); gtk_widget_set_margin_bottom(_widget, margin);
gtk_widget_set_margin_start(_widget, margin); gtk_widget_set_margin_start(_widget, margin);
gtk_widget_set_margin_end(_widget, margin); gtk_widget_set_margin_end(_widget, margin);
} }
void gtkpp::Widget::setVAlign(GtkAlign align) { void Widget::setVAlign(GtkAlign align) {
gtk_widget_set_valign(_widget, align); gtk_widget_set_valign(_widget, align);
} }
void gtkpp::Widget::setVExpand(bool expand) { void Widget::setVExpand(bool expand) {
gtk_widget_set_vexpand(_widget, expand); gtk_widget_set_vexpand(_widget, expand);
} }
void gtkpp::Widget::setHorizontalMargins(int margin) { void Widget::setHorizontalMargins(int margin) {
gtk_widget_set_margin_start(_widget, margin); gtk_widget_set_margin_start(_widget, margin);
gtk_widget_set_margin_end(_widget, margin); gtk_widget_set_margin_end(_widget, margin);
} }
void gtkpp::Widget::setVerticalMargins(int margin) { void Widget::setVerticalMargins(int margin) {
gtk_widget_set_margin_top(_widget, margin); gtk_widget_set_margin_top(_widget, margin);
gtk_widget_set_margin_bottom(_widget, margin); gtk_widget_set_margin_bottom(_widget, margin);
} }
void gtkpp::Widget::setEnabled(bool enabled) { void Widget::setEnabled(bool enabled) {
gtk_widget_set_sensitive(_widget, enabled); gtk_widget_set_sensitive(_widget, enabled);
}
} }

View File

@ -6,6 +6,7 @@
#define AUTOCAT_GNOME_WIDGET_H #define AUTOCAT_GNOME_WIDGET_H
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <sigc++/sigc++.h>
namespace gtkpp { namespace gtkpp {
@ -13,7 +14,18 @@ namespace gtkpp {
protected: protected:
GtkWidget* _widget; GtkWidget* _widget;
private:
sigc::signal<void()> _signalClicked;
private:
friend void clickedCallback(GtkButton*, void* data);
public: public:
void onClick(const std::function<void()>& callback);
public:
Widget();
Widget(GtkBuilder* builder, const char* id);
[[nodiscard]] GtkWidget* gobj() const; [[nodiscard]] GtkWidget* gobj() const;
void setMargins(int margin); void setMargins(int margin);
void setVerticalMargins(int margin); void setVerticalMargins(int margin);

View File

@ -23,14 +23,6 @@ namespace gtkpp {
Window::Window(std::shared_ptr<Application> app, const char* resourceName) { Window::Window(std::shared_ptr<Application> app, const char* resourceName) {
_app = app; _app = app;
// _builder = gtk_builder_new();
//
// GError* error = nullptr;
// gtk_builder_add_from_resource(_builder, resourceName, &error);
// if(error) {
// throw std::runtime_error(error->message);
// }
_builder = gtk_builder_new_from_resource(resourceName); _builder = gtk_builder_new_from_resource(resourceName);
_window = GTK_WINDOW(gtk_builder_get_object(_builder, "adw_main_window")); _window = GTK_WINDOW(gtk_builder_get_object(_builder, "adw_main_window"));
} }

View File

@ -3,15 +3,15 @@
// //
#include "MainWindow.h" #include "MainWindow.h"
#include "../gtkpp/Box.h"
#include "../gtkpp/HeaderBar.h" #include "../gtkpp/HeaderBar.h"
MainWindow::MainWindow(std::shared_ptr<gtkpp::Application> app): gtkpp::Window(std::move(app), "/gui/MainWindow.xml") { #include <iostream>
// gtkpp::Box rootBox(GTK_ORIENTATION_VERTICAL, 0); MainWindow::MainWindow(std::shared_ptr<gtkpp::Application> app):
// rootBox.append(gtkpp::HeaderBar("Main")); gtkpp::Window(std::move(app), "/gui/MainWindow.xml"),
// _addNumberButton(_builder, "add_number_button") {
// _leaflet.append(&rootBox);
// _addNumberButton.onClick([this] {
// adw_application_window_set_content(ADW_APPLICATION_WINDOW(_window), _leaflet.gobj()); std::cout << "Add clicked" << std::endl;
});
} }

View File

@ -7,10 +7,12 @@
#include "../gtkpp/Window.h" #include "../gtkpp/Window.h"
#include "../gtkpp/Leaflet.h" #include "../gtkpp/Leaflet.h"
#include "../gtkpp/Button.h"
class MainWindow: public gtkpp::Window { class MainWindow: public gtkpp::Window {
private: private:
gtkpp::Leaflet _leaflet; gtkpp::Leaflet _leaflet;
gtkpp::Button _addNumberButton;
public: public:
explicit MainWindow(std::shared_ptr<gtkpp::Application> app); explicit MainWindow(std::shared_ptr<gtkpp::Application> app);

View File

@ -31,6 +31,12 @@
</object> </object>
</property> </property>
<child type="start">
<object class="GtkButton" id="add_number_button">
<property name="icon-name">list-add</property>
</object>
</child>
<child type="end"> <child type="end">
<object class="GtkMenuButton" id="gtk_btnHeaderHelp"> <object class="GtkMenuButton" id="gtk_btnHeaderHelp">
<property name="direction">none</property> <property name="direction">none</property>