[GTK3] Use a non-CSD filechooser dialog for PathChooser

My personal feeling is that GTK client-side decoration (CSD) putting
main dialog buttons in the titlebar is wrong so create a non-CSD dialog.

There was no simple way of changing GtkFileChooserDialog to play nice
with non-CSD buttons and resulting in these GTK warnings:
    Gtk-WARNING : Content added to the action area of a dialog using header bars

There is an unwanted dialog border with this custom filechooser dialog
with no apparent way to remove them. Would require switching to a
GtkWindow implementation.
This commit is contained in:
Calum Lind 2018-09-17 15:47:22 +01:00 committed by Calum Lind
parent 545aca9a4c
commit 8199928160
2 changed files with 149 additions and 146 deletions

View file

@ -498,6 +498,134 @@
<action-widget response="0">config_dialog_button_close</action-widget>
</action-widgets>
</object>
<object class="GtkWindow" id="combobox_window">
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkBox" id="entry_combobox_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">3</property>
<signal name="realize" handler="on_entry_combobox_hbox_realize" swapped="no"/>
<child>
<object class="GtkFileChooserButton" id="filechooser_button">
<property name="width_request">160</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="action">select-folder</property>
<property name="local_only">False</property>
<property name="preview_widget_active">False</property>
<property name="title" translatable="yes">Select a Directory</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_open_dialog">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_button_open_dialog_clicked" swapped="no"/>
<child>
<object class="GtkBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-open</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="folder_name_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_text">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">•</property>
<signal name="changed" handler="on_entry_text_changed" swapped="no"/>
<signal name="delete-text" handler="on_entry_text_delete_text" swapped="no"/>
<signal name="focus-out-event" handler="on_entry_text_focus_out_event" swapped="no"/>
<signal name="insert-text" handler="on_entry_text_insert_text" swapped="yes"/>
<signal name="key-press-event" handler="on_entry_text_key_press_event" swapped="no"/>
<signal name="scroll-event" handler="on_entry_text_scroll_event" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkToggleButton" id="button_toggle_dropdown">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="focus_on_click">False</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Saved paths</property>
<signal name="button-press-event" handler="on_button_toggle_dropdown_button_press_event" swapped="no"/>
<signal name="scroll-event" handler="on_button_toggle_dropdown_scroll_event" swapped="no"/>
<signal name="toggled" handler="on_button_toggle_dropdown_toggled" swapped="no"/>
<child>
<object class="GtkBox" id="vbox1">
<property name="height_request">15</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkArrow" id="arrow2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="arrow_type">down</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkListStore" id="completion_tree_store">
<columns>
<!-- column-name text -->
@ -577,26 +705,22 @@
</object>
</child>
</object>
<object class="GtkFileChooserDialog" id="filechooserdialog">
<object class="GtkDialog" id="filechooserdialog">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="role">GtkFileChooserDialog</property>
<property name="title" translatable="yes">Choose a folder</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="action">select-folder</property>
<property name="preview_widget_active">False</property>
<child>
<placeholder/>
</child>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox2">
<property name="visible">True</property>
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area2">
<property name="visible">True</property>
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
@ -628,13 +752,21 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
<object class="GtkFileChooserWidget" id="filechooser_widget">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action">select-folder</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
@ -867,133 +999,4 @@
</object>
</child>
</object>
<object class="GtkWindow" id="combobox_window">
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkBox" id="entry_combobox_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">3</property>
<signal name="realize" handler="on_entry_combobox_hbox_realize" swapped="no"/>
<child>
<object class="GtkFileChooserButton" id="filechooser_button">
<property name="width_request">160</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="action">select-folder</property>
<property name="local_only">False</property>
<property name="preview_widget_active">False</property>
<property name="title" translatable="yes">Select a Directory</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_open_dialog">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_button_open_dialog_clicked" swapped="no"/>
<child>
<object class="GtkBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-open</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="folder_name_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_text">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">•</property>
<!-- <property name="width_chars">-1</property> -->
<signal name="changed" handler="on_entry_text_changed" swapped="no"/>
<signal name="delete-text" handler="on_entry_text_delete_text" swapped="no"/>
<signal name="focus-out-event" handler="on_entry_text_focus_out_event" swapped="no"/>
<signal name="insert-text" handler="on_entry_text_insert_text" swapped="yes"/>
<signal name="key-press-event" handler="on_entry_text_key_press_event" swapped="no"/>
<signal name="scroll-event" handler="on_entry_text_scroll_event" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkToggleButton" id="button_toggle_dropdown">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="focus_on_click">False</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Saved paths</property>
<signal name="button-press-event" handler="on_button_toggle_dropdown_button_press_event" swapped="no"/>
<signal name="scroll-event" handler="on_button_toggle_dropdown_scroll_event" swapped="no"/>
<signal name="toggled" handler="on_button_toggle_dropdown_toggled" swapped="no"/>
<child>
<object class="GtkBox" id="vbox1">
<property name="height_request">15</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkArrow" id="arrow2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="arrow_type">down</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View file

@ -1157,6 +1157,7 @@ class PathChooserComboBox(GtkGI.Box, StoredValuesPopup, GObject.GObject):
self.filechooser_button = self.open_filechooser_dialog_button
self.filechooserdialog = self.builder.get_object('filechooserdialog')
self.filechooserdialog.set_transient_for(component.get('MainWindow').window)
self.filechooser_widget = self.builder.get_object('filechooser_widget')
self.folder_name_label = self.builder.get_object('folder_name_label')
self.default_text = None
self.button_properties = self.builder.get_object('button_properties')
@ -1417,14 +1418,13 @@ class PathChooserComboBox(GtkGI.Box, StoredValuesPopup, GObject.GObject):
self.set_path_entry_visible(self.path_entry_visible)
def _on_button_open_dialog_clicked(self, widget):
dialog = self.filechooserdialog
dialog.set_current_folder(self.get_text())
response_id = dialog.run()
self.filechooser_widget.set_current_folder(self.get_text())
response_id = self.filechooserdialog.run()
if response_id == 0:
text = self.filechooserdialog.get_filename()
self.set_text(text, trigger_event=True)
dialog.hide()
self.filechooserdialog.hide()
def _on_entry_text_key_press_event(self, widget, event):
"""