#!/usr/bin/env ruby
#
# Copyright (C) 2023 Ruby-GNOME Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Example from:
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/exampleapp.c
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/exampleappwin.c
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/window.ui
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/gears-menu.ui
# License: LGPL2.1-or-later
require "gtk4"
class ExampleAppWindow < Gtk::ApplicationWindow
type_register
class << self
def init
template = <<~TEMPLATE
Example Application600400vertical
TEMPLATE
set_template(data: template)
bind_template_child("stack")
bind_template_child("gears")
end
end
def initialize(application)
menu_ui = <<~MENU
MENU
super(application: application)
builder = Gtk::Builder.new(string: menu_ui)
gears.menu_model = builder["menu"]
end
def open(file)
basename = file.basename
scrolled = Gtk::ScrolledWindow.new
scrolled.hexpand = true
scrolled.vexpand = true
view = Gtk::TextView.new
view.editable = false
view.cursor_visible = false
scrolled.child = view
stack.add_titled(scrolled, basename, basename)
buffer = view.buffer
file.read do |stream|
buffer.text = stream.read.force_encoding(Encoding::UTF_8)
end
end
end
class ExampleApp < Gtk::Application
def initialize
super("org.gtk.exampleapp", :handles_open)
signal_connect "startup" do |application|
[
"preferences",
"quit"
].each do |action_name|
action = Gio::SimpleAction.new(action_name)
action.signal_connect("activate") do |_action, _parameter|
__send__("#{action_name}_activated")
end
application.add_action(action)
end
application.set_accels_for_action("app.quit", ["Q"])
end
signal_connect "activate" do |application|
window = ExampleAppWindow.new(application)
window.present
end
signal_connect "open" do |application, files, hint|
window = application.windows[0] || ExampleAppWindow.new(application)
files.each do |file|
window.open(file)
end
window.present
end
end
private
def preferences_activated
end
def quit_activated
quit
end
end
app = ExampleApp.new
# Gtk::Application#run needs C style argv ([prog, arg1, arg2, ...,argn]).
# The ARGV ruby variable only contains the arguments ([arg1, arg2, ...,argb])
# and not the program name. We have to add it explicitly.
app.run([$PROGRAM_NAME] + ARGV)