1/*  This file is part of PLGI.
    2
    3    Copyright (C) 2015 Keri Harris <keri@gentoo.org>
    4
    5    PLGI is free software: you can redistribute it and/or modify
    6    it under the terms of the GNU Lesser General Public License as
    7    published by the Free Software Foundation, either version 2.1
    8    of the License, or (at your option) any later version.
    9
   10    PLGI is distributed in the hope that it will be useful,
   11    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   13    GNU General Public License for more details.
   14
   15    You should have received a copy of the GNU General Public License
   16    along with PLGI.  If not, see <http://www.gnu.org/licenses/>.
   17*/
   18
   19:- module('Gtk_overrides',
   20          [
   21            gtk_builder_add_from_string/3,
   22            gtk_builder_add_objects_from_string/4,
   23            gtk_builder_connect_signals/2,
   24            gtk_dialog_new_with_buttons/5,
   25            gtk_file_chooser_dialog_new/5,
   26            gtk_list_store_new/2,
   27            gtk_message_dialog_format_secondary_markup/2,
   28            gtk_message_dialog_format_secondary_text/2,
   29            gtk_message_dialog_new/6,
   30            gtk_tree_store_new/2,
   31            gtk_widget_hide_on_delete/4
   32          ]).   33
   34
   35
   36/* GtkBuilder */
   37
   38gtk_builder_add_from_string(Builder, String, Length0) :-
   39	( Length0 == -1
   40	->  atom_length(String, Length1)
   41	;   Length1 = Length0
   42	),
   43	'Gtk':gtk_builder_add_from_string(Builder, String, Length1).
   44
   45gtk_builder_add_objects_from_string(Builder, String, Length0, ObjectIds) :-
   46	( Length0 == -1
   47	->  atom_length(String, Length1)
   48	;   Length1 = Length0
   49	),
   50	'Gtk':gtk_builder_add_objects_from_string(Builder, String, Length1, ObjectIds).
   51
   52gtk_builder_connect_signals(Builder, UserData) :-
   53	Marshaller = 'Gtk_overrides':gtk_builder_signal_connect_marshaller/7,
   54	gtk_builder_connect_signals_full(Builder, Marshaller, UserData).
   55
   56gtk_builder_signal_connect_marshaller(_Builder, Object, SignalName, HandlerName, ConnectObject, Flags, UserData) :-
   57	term_to_atom(HandlerTerm, HandlerName),
   58	(   HandlerTerm = _:_/_
   59	->  SignalHandler = HandlerTerm
   60	;   HandlerTerm = _/_
   61	->  SignalHandler = HandlerTerm
   62	;   SignalHandler = HandlerTerm/_
   63	),
   64	(   ConnectObject \== {null}
   65	->  Data = ConnectObject
   66	;   Data = UserData
   67	),
   68	(   current_predicate(SignalHandler)
   69	->  g_signal_connect_data(Object, SignalName, SignalHandler, Data, Flags, _)
   70	).
   71
   72
   73
   74/* GtkDialog */
   75gtk_dialog_new_with_buttons(Title, Parent, Flags, Buttons, Dialog) :-
   76	gtk_dialog_new(Dialog),
   77	(   Title \== {null}
   78	->  gtk_window_set_title(Dialog, Title)
   79	;   true
   80	),
   81	(   Parent \== {null}
   82	->  gtk_window_set_transient_for(Dialog, Parent)
   83	;   true
   84	),
   85	(   memberchk('GTK_DIALOG_USE_HEADER_BAR', Flags)
   86	->  g_object_set_property(Dialog, 'use-header-bar', 1)
   87	;   true
   88	),
   89	(   memberchk('GTK_DIALOG_MODAL', Flags)
   90	->  gtk_window_set_modal(Dialog, true)
   91	;   true
   92	),
   93	(   memberchk('GTK_DIALOG_DESTROY_WITH_PARENT', Flags)
   94	->  gtk_window_set_destroy_with_parent(Dialog, true)
   95	;   true
   96	),
   97	forall(member(Text-ResponseId, Buttons),
   98	       gtk_dialog_add_button(Dialog, Text, ResponseId, _)).
   99
  100
  101
  102/* GtkFileChooserDialog */
  103gtk_file_chooser_dialog_new(Title, Parent, Action, Buttons, Dialog) :-
  104	g_object_new('GtkFileChooserDialog',
  105	             ['title'=Title,
  106	              'action'=Action],
  107	             Dialog),
  108	g_object_ref(Dialog, _), % Refbump to offset eventual gtk_widget_destroy/1
  109	(   Parent \== {null}
  110	->  gtk_window_set_transient_for(Dialog, Parent)
  111	;   true
  112	),
  113	forall(member(Text-ResponseId, Buttons),
  114	       gtk_dialog_add_button(Dialog, Text, ResponseId, _)).
  115
  116
  117
  118/* GtkListStore */
  119gtk_list_store_new(Types, ListStore) :-
  120	gtk_list_store_newv(Types, ListStore).
  121
  122
  123
  124/* GtkMessageDialog */
  125gtk_message_dialog_new(Parent, Flags, MessageType, Buttons, Message, Dialog) :-
  126	g_object_new('GtkMessageDialog',
  127	             ['use-header-bar'=0,
  128	              'message-type'=MessageType,
  129	              'buttons'=Buttons],
  130	             Dialog),
  131	g_object_ref(Dialog, _), % Refbump to offset eventual gtk_widget_destroy/1
  132	(   Message \== {null}
  133	->  g_object_set_property(Dialog, 'text', Message)
  134	;   true
  135	),
  136	(   Parent \== {null}
  137	->  gtk_window_set_transient_for(Dialog, Parent)
  138	;   true
  139	),
  140	(   memberchk('GTK_DIALOG_MODAL', Flags)
  141	->  gtk_window_set_modal(Dialog, true)
  142	;   true
  143	),
  144	(   memberchk('GTK_DIALOG_DESTROY_WITH_PARENT', Flags)
  145	->  gtk_window_set_destroy_with_parent(Dialog, true)
  146	;   true
  147	).
  148
  149gtk_message_dialog_format_secondary_text(Dialog, Text) :-
  150	g_object_set_property(Dialog, 'secondary-text', Text),
  151	g_object_set_property(Dialog, 'secondary-use-markup', false).
  152
  153gtk_message_dialog_format_secondary_markup(Dialog, Markup) :-
  154	g_object_set_property(Dialog, 'secondary-text', Markup),
  155	g_object_set_property(Dialog, 'secondary-use-markup', true).
  156
  157
  158
  159/* GtkTreeStore */
  160gtk_tree_store_new(Types, ListStore) :-
  161	gtk_tree_store_newv(Types, ListStore).
  162
  163
  164
  165/* GtkWidget */
  166gtk_widget_hide_on_delete(Widget, _Event, _UserData, Return) :-
  167	gtk_widget_hide_on_delete(Widget, Return).
  168
  169
  170
  171:- ( current_prolog_flag(os_argv, Argv),
  172     'Gtk':gtk_init_check(Argv, _, _)
  173   ).