2022-07-17 11:46:05 +00:00
# window.py
#
2022-07-19 17:41:02 +00:00
# Copyright 2022 Adwaita Manager Team
2022-07-17 11:46:05 +00:00
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name(s) of the above copyright
# holders shall not be used in advertising or otherwise to promote the sale,
# use or other dealings in this Software without prior written
# authorization.
2022-08-10 10:36:29 +00:00
from gi . repository import Gtk , Adw , Gio , Gdk
2022-07-21 19:03:18 +00:00
from . error import AdwcustomizerError
2022-08-02 12:08:12 +00:00
from . settings_schema import settings_schema
from . palette_shades import AdwcustomizerPaletteShades
from . option import AdwcustomizerOption
from . app_type_dialog import AdwcustomizerAppTypeDialog
from . custom_css_group import AdwcustomizerCustomCSSGroup
2022-08-11 09:17:40 +00:00
from material_color_utilities_python import *
2022-07-17 11:46:05 +00:00
2022-08-08 21:09:38 +00:00
@Gtk.Template ( resource_path = ' /com/github/AdwCustomizerTeam/AdwCustomizer/ui/window.ui ' )
2022-08-10 10:36:29 +00:00
class AdwcustomizerMainWindow ( Adw . ApplicationWindow ) :
2022-07-17 11:46:05 +00:00
__gtype_name__ = ' AdwcustomizerMainWindow '
content = Gtk . Template . Child ( )
2022-08-10 15:05:47 +00:00
toast_overlay = Gtk . Template . Child ( )
2022-08-10 14:57:45 +00:00
content_monet = Gtk . Template . Child ( " content_monet " )
2022-08-10 15:20:19 +00:00
content_plugins = Gtk . Template . Child ( " content_plugins " )
2022-08-01 19:42:42 +00:00
save_preset_button = Gtk . Template . Child ( " save-preset-button " )
2022-08-10 10:36:29 +00:00
main_menu = Gtk . Template . Child ( " main-menu " )
2022-07-17 19:27:57 +00:00
presets_dropdown = Gtk . Template . Child ( " presets-dropdown " )
2022-07-18 11:27:31 +00:00
presets_menu = Gtk . Template . Child ( " presets-menu " )
2022-07-18 19:20:02 +00:00
errors_button = Gtk . Template . Child ( " errors-button " )
errors_list = Gtk . Template . Child ( " errors-list " )
2022-07-17 11:46:05 +00:00
2022-08-01 09:31:36 +00:00
def __init__ ( self , * * kwargs ) :
super ( ) . __init__ ( * * kwargs )
self . presets_dropdown . get_popover ( ) . connect ( " show " , self . on_presets_dropdown_activate )
2022-08-10 14:57:45 +00:00
self . setup_monet_page ( )
2022-08-10 15:20:19 +00:00
self . setup_plugins_page ( )
2022-08-10 15:21:31 +00:00
self . setup_colors_page ( )
2022-08-10 15:51:43 +00:00
2022-08-10 09:08:55 +00:00
self . settings = Gio . Settings (
" com.github.AdwCustomizerTeam.AdwCustomizer " )
self . settings . bind (
" window-width " , self , " default-width " , Gio . SettingsBindFlags . DEFAULT
)
self . settings . bind (
" window-height " , self , " default-height " , Gio . SettingsBindFlags . DEFAULT
)
self . settings . bind (
" window-maximized " , self , " maximized " , Gio . SettingsBindFlags . DEFAULT
)
2022-08-10 09:14:26 +00:00
self . settings . bind (
2022-08-10 09:15:30 +00:00
" window-fullscreen " , self , " fullscreened " , Gio . SettingsBindFlags . DEFAULT
2022-08-10 09:14:26 +00:00
)
2022-08-10 14:57:45 +00:00
def on_file_picker_button_clicked ( self , * args ) :
self . monet_file_chooser_dialog . show ( )
def on_monet_file_chooser_response ( self , widget , response ) :
if response == Gtk . ResponseType . ACCEPT :
2022-08-11 09:49:04 +00:00
self . monet_image_file = self . monet_file_chooser_dialog . get_file ( )
image_basename = self . monet_image_file . get_basename ( )
2022-08-10 14:57:45 +00:00
self . monet_file_chooser_button . set_label ( image_basename )
self . monet_file_chooser_dialog . hide ( )
2022-08-11 10:21:48 +00:00
print ( dir ( self . monet_image_file ) )
2022-08-11 09:49:04 +00:00
self . monet_img = Image . open ( self . monet_image_file )
self . monet_theme = themeFromImage ( self . monet_img )
self . monet_palette = self . monet_theme [ " palette " ]
2022-08-11 10:19:28 +00:00
self . tone = self . tone_row . get_selected_item ( )
i = 0
"""
{ ' primary ' : < material_color_utilities_python . palettes . tonal_palette . TonalPalette object at 0x74ae01873130 > ,
' secondary ' : < material_color_utilities_python . palettes . tonal_palette . TonalPalette object at 0x74ae00b4f7f0 > ,
' tertiary ' : < material_color_utilities_python . palettes . tonal_palette . TonalPalette object at 0x74ae00b4f790 > ,
' neutral ' : < material_color_utilities_python . palettes . tonal_palette . TonalPalette object at 0x74ae00b4f730 > ,
' neutralVariant ' : < material_color_utilities_python . palettes . tonal_palette . TonalPalette object at 0x74ae00b4f6d0 > ,
' error ' : < material_color_utilities_python . palettes . tonal_palette . TonalPalette object at 0x74ae00b4f670 > }
"""
print ( self . monet_palette )
print ( self . monet_theme )
for color in self . monet_palette . values ( ) :
i + = 1
color = color . tone ( self . tone )
self . palette_pickers [ str ( i ) ] . set_rgba ( Gdk . RGBA ( red = redFromArgb ( color ) , green = greenFromArgb ( color ) , blue = blueFromArgb ( color ) , alpha = alphaFromArgb ( color ) ) )
#self.get_application().update_theme_from_monet(self.monet_theme)
2022-08-11 09:49:04 +00:00
2022-08-10 14:57:45 +00:00
def setup_monet_page ( self ) :
2022-08-11 09:17:40 +00:00
2022-08-11 09:17:00 +00:00
2022-08-10 14:57:45 +00:00
monet_pref_group = Adw . PreferencesGroup ( )
monet_pref_group . set_name ( " monet " )
monet_pref_group . set_title ( _ ( " Monet Engine " ) )
monet_pref_group . set_description ( _ ( " Monet is an engine that generates Material Design 3 palette from backgrounds color " ) )
self . monet_file_chooser_row = Adw . ActionRow ( )
self . monet_file_chooser_row . set_title ( _ ( " Background Image " ) )
self . monet_file_chooser_dialog = Gtk . FileChooserNative ( )
self . monet_file_chooser_dialog . set_transient_for ( self )
self . monet_file_chooser_button = Gtk . Button ( )
self . monet_file_chooser_button . set_label ( _ ( " Choose a file " ) )
self . monet_file_chooser_button . set_icon_name ( " folder-pictures-symbolic " )
self . monet_file_chooser_button . connect ( " clicked " , self . on_file_picker_button_clicked )
self . monet_file_chooser_dialog . connect ( " response " , self . on_monet_file_chooser_response )
self . monet_file_chooser_row . add_suffix ( self . monet_file_chooser_button )
monet_pref_group . add ( self . monet_file_chooser_row )
self . palette_picker = Adw . ActionRow ( )
self . palette_picker . set_name ( " monet_palette " )
self . palette_picker . set_title ( _ ( " Monet Palette " ) )
self . palette_picker
self . palette_pickers = { }
2022-08-11 10:19:28 +00:00
for i in range ( 6 ) :
2022-08-10 14:57:45 +00:00
i = i + 1
picker = Gtk . ColorButton ( )
picker . set_name ( str ( i ) )
picker . set_rgba ( Gdk . RGBA ( red = 0 , green = 0 , blue = 0 , alpha = 0 ) )
picker . set_valign ( Gtk . Align . CENTER )
self . palette_pickers [ str ( i ) ] = picker
self . palette_picker . add_suffix ( picker )
monet_pref_group . add ( self . palette_picker )
2022-08-11 09:49:04 +00:00
self . tone_row = Adw . ComboRow ( )
self . tone_row . set_title ( _ ( " Tone " ) )
2022-08-11 10:03:21 +00:00
2022-08-11 10:09:18 +00:00
store = Gtk . StringList ( )
2022-08-11 10:03:21 +00:00
store_values = [
" 1 " ,
" 5 " ,
" 10 " ,
" 15 " ,
" 20 " ,
" 25 " ,
2022-08-11 10:19:28 +00:00
" 30 "
2022-08-11 10:03:21 +00:00
]
2022-08-11 10:09:18 +00:00
for v in store_values :
2022-08-11 10:09:42 +00:00
store . append ( v )
2022-08-11 10:10:26 +00:00
self . tone_row . set_model ( store )
2022-08-11 10:11:47 +00:00
monet_pref_group . add ( self . tone_row )
self . content_monet . add ( monet_pref_group )
2022-08-11 09:49:04 +00:00
2022-08-10 15:20:19 +00:00
def setup_plugins_page ( self ) :
custom_css_group = AdwcustomizerCustomCSSGroup ( )
for app_type in settings_schema [ " custom_css_app_types " ] :
self . get_application ( ) . custom_css [ app_type ] = " "
custom_css_group . load_custom_css ( self . get_application ( ) . custom_css )
self . content_plugins . add ( custom_css_group )
self . get_application ( ) . custom_css_group = custom_css_group
2022-08-10 15:21:31 +00:00
def setup_colors_page ( self ) :
for group in settings_schema [ " groups " ] :
pref_group = Adw . PreferencesGroup ( )
pref_group . set_name ( group [ " name " ] )
pref_group . set_title ( group [ " title " ] )
pref_group . set_description ( group [ " description " ] )
for variable in group [ " variables " ] :
pref_variable = AdwcustomizerOption ( variable [ " name " ] ,
variable [ " title " ] ,
2022-08-10 19:16:44 +00:00
variable . get ( " explanation " ) ,
variable [ " adw_gtk3_support " ] )
2022-08-10 15:21:31 +00:00
pref_group . add ( pref_variable )
self . get_application ( ) . pref_variables [ variable [ " name " ] ] = pref_variable
self . content . add ( pref_group )
palette_pref_group = Adw . PreferencesGroup ( )
palette_pref_group . set_name ( " palette_colors " )
palette_pref_group . set_title ( _ ( " Palette Colors " ) )
palette_pref_group . set_description ( _ ( " Named palette colors used by some applications. Default colors follow the <a href= \" https://developer.gnome.org/hig/reference/palette.html \" >GNOME Human Interface Guidelines</a>. " ) )
for color in settings_schema [ " palette " ] :
palette_shades = AdwcustomizerPaletteShades ( color [ " prefix " ] ,
color [ " title " ] ,
color [ " n_shades " ] )
palette_pref_group . add ( palette_shades )
self . get_application ( ) . pref_palette_shades [ color [ " prefix " ] ] = palette_shades
self . content . add ( palette_pref_group )
2022-08-10 14:57:45 +00:00
2022-07-21 19:03:18 +00:00
def update_errors ( self , errors ) :
2022-07-18 19:20:02 +00:00
child = self . errors_list . get_row_at_index ( 0 )
while child is not None :
self . errors_list . remove ( child )
child = self . errors_list . get_row_at_index ( 0 )
2022-07-21 19:03:18 +00:00
self . errors_button . set_visible ( len ( errors ) > 0 )
for error in errors :
self . errors_list . append ( AdwcustomizerError ( error [ " error " ] , error [ " element " ] , error [ " line " ] ) )
2022-08-01 09:31:36 +00:00
def on_presets_dropdown_activate ( self , * args ) :
self . get_application ( ) . reload_user_defined_presets ( )