diff --git a/MANIFEST.in b/MANIFEST.in index 4fc7f4b..d2e8a03 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,6 @@ include protonvpn_linux_gui/resources/main.glade -include protonvpn_linux_gui/resources/*.png -include protonvpn_linux_gui/resources/flags/*.png +include protonvpn_linux_gui/resources/main.css +include protonvpn_linux_gui/resources/img/logo/*.png +include protonvpn_linux_gui/resources/img/utils/*.png +include protonvpn_linux_gui/resources/img/flags/large/*.jpg +include protonvpn_linux_gui/resources/img/flags/small/*.png \ No newline at end of file diff --git a/Pipfile b/Pipfile index 303888d..122664d 100644 --- a/Pipfile +++ b/Pipfile @@ -9,4 +9,5 @@ verify_ssl = true requests = "*" pycairo = "*" pygobject = "*" -protonvpn-cli = "==2.2.2" \ No newline at end of file +protonvpn-cli = "==2.2.2" +configparser = "==4.0.2" diff --git a/Pipfile.lock b/Pipfile.lock index fe26066..9eece8f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,12 +1,10 @@ { "_meta": { "hash": { - "sha256": "541236b320ff6ae8c57660779fb3aa6e2e86d817ddb2c8522971885fe8f36bbe" + "sha256": "1937a0e30719c92a5f2ec9dad6e2ea5e2f4525cf426f5ce9e98b8e5486462419" }, "pipfile-spec": 6, - "requires": { - "python_version": "3.8" - }, + "requires": {}, "sources": [ { "name": "pypi", @@ -18,10 +16,10 @@ "default": { "certifi": { "hashes": [ - "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", - "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" + "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304", + "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519" ], - "version": "==2019.11.28" + "version": "==2020.4.5.1" }, "chardet": { "hashes": [ @@ -30,6 +28,14 @@ ], "version": "==3.0.4" }, + "configparser": { + "hashes": [ + "sha256:254c1d9c79f60c45dfde850850883d5aaa7f19a23f13561243a050d5a7c3fe4c", + "sha256:c7d282687a5308319bf3d2e7706e575c635b0a470342641c93bea0ea3b5331df" + ], + "index": "pypi", + "version": "==4.0.2" + }, "docopt": { "hashes": [ "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" diff --git a/README.md b/README.md index 33c4656..bbf61cb 100644 --- a/README.md +++ b/README.md @@ -223,22 +223,22 @@ If you would like to launch the GUI without having to type in your sudo password # GUI Layout
- +
- +
- +
- +
- +
diff --git a/protonvpn_linux_gui/constants.py b/protonvpn_linux_gui/constants.py index 932cf78..f4f34ea 100644 --- a/protonvpn_linux_gui/constants.py +++ b/protonvpn_linux_gui/constants.py @@ -1,10 +1,16 @@ +import os try: - from protonvpn_cli.constants import VERSION as cli_version + from protonvpn_cli.constants import VERSION as cli_version, USER except: cli_version = "Not installed" -VERSION = "1.8.3" + +VERSION = "2.0.0" GITHUB_URL_RELEASE = "https://github.com/calexandru2018/protonvpn-linux-gui/releases/latest" +# GUI configurations +GUI_CONFIG_DIR = os.path.join(os.path.expanduser("~{0}".format(USER)), ".pvpn-gui") +GUI_CONFIG_FILE = os.path.join(GUI_CONFIG_DIR, "pvpn-gui.cfg") + # Tray configuration naming TRAY_CFG_SERVERLOAD = "display_serverload" TRAY_CFG_SERVENAME = "display_server" diff --git a/protonvpn_linux_gui/gui.py b/protonvpn_linux_gui/gui.py index 0e65be4..3ce5004 100644 --- a/protonvpn_linux_gui/gui.py +++ b/protonvpn_linux_gui/gui.py @@ -1,5 +1,6 @@ # Default package import import os +import re import sys import pathlib from threading import Thread @@ -7,12 +8,13 @@ try: # ProtonVPN base CLI package import - from protonvpn_cli.constants import (CONFIG_FILE, CONFIG_DIR) #noqa + from protonvpn_cli.constants import (CONFIG_FILE) #noqa # ProtonVPN helper funcitons - from protonvpn_cli.utils import check_root, get_config_value, change_file_owner #noqa + from protonvpn_cli.utils import check_root, get_config_value, change_file_owner, is_connected, set_config_value #noqa except: - sys.exit(1) + print("Unable to import from CLI, can not find CLI modules.") + pass # Import GUI logger from .gui_logger import gui_logger @@ -25,14 +27,16 @@ message_dialog, check_for_updates, get_gui_processes, - find_cli + find_cli, + get_gui_config, + set_gui_config ) # Import functions that are called with threads from .thread_functions import( quick_connect, + custom_quick_connect, disconnect, - refresh_server_list, random_connect, last_connect, connect_to_selected_server, @@ -46,19 +50,21 @@ purge_configurations, kill_duplicate_gui_process, load_content_on_start, - update_autoconnect, - tray_configurations + update_connect_preference, + tray_configurations, + update_split_tunneling_status, + reload_secure_core_servers ) # Import version -from .constants import VERSION, HELP_TEXT +from .constants import VERSION, HELP_TEXT, GUI_CONFIG_DIR # PyGObject import import gi # Gtk3 import gi.require_version('Gtk', '3.0') -from gi.repository import Gtk +from gi.repository import Gtk, Gdk class Handler: """Handler that has all callback functions. @@ -69,11 +75,20 @@ def __init__(self, interface): self.messagedialog_label = self.interface.get_object("message_dialog_label") self.messagedialog_sub_label = self.interface.get_object("message_dialog_sub_label") self.messagedialog_spinner = self.interface.get_object("message_dialog_spinner") + self.conn_disc_button_label = self.interface.get_object("main_conn_disc_button_label") self.messagedialog_sub_label.hide() + self.main_initial_tab = 0 + self.settings_initial_tab = 0 + try: + self.onload_dns_protection = get_config_value("USER", "dns_leak_protection") + self.onload_dns_custom = get_config_value("USER", "custom_dns") + except: + self.onload_dns_protection = 0 + self.onload_dns_custom = "none" # Login BUTTON HANDLER def on_login_button_clicked(self, button): - """Button/Event handler to intialize user account. Calls populate_server_list(server_list_object) to populate server list. + """Button/Event handler to intialize user account. Calls populate_server_list(server_tree_store) to populate server list. """ self.messagedialog_sub_label.hide() @@ -102,11 +117,11 @@ def server_filter_input_key_release(self, object, event): """Event handler, to filter servers after each key release """ user_filter_by = object.get_text() - server_list_object = self.interface.get_object("ServerTreeStore") - tree_view_object = self.interface.get_object("ServerList") + server_tree_store = self.interface.get_object("ServerTreeStore") + tree_view_object = self.interface.get_object("TreeViewServerList") # Creates a new filter from a ListStore/TreeStore - n_filter = server_list_object.filter_new() + n_filter = server_tree_store.filter_new() # set_visible_func: # first_param: filter function @@ -122,63 +137,15 @@ def server_filter_input_key_release(self, object, event): def column_filter(self, model, iter, data=None): """Filter by columns and returns the corresponding rows """ - treeview = self.interface.get_object("ServerList") + treeview = self.interface.get_object("TreeViewServerList") for col in range(0, treeview.get_n_columns()): - value = model.get_value(iter, col).lower(); - if data.lower() in value.lower(): - return True - else: - continue - - def connect_to_selected_server_button_clicked(self, button): - """Button/Event handler to connect to selected server - """ - self.messagedialog_sub_label.hide() - selected_server = { - "selected_server": False, - "selected_country": False - } - - # Get the server list object - server_list = self.interface.get_object("ServerList").get_selection() - - # Get the selected server - (model, pathlist) = server_list.get_selected_rows() - - for path in pathlist : - tree_iter = model.get_iter(path) - - # the second param of get_value() specifies the column number, starting at 0 - user_selected_server = model.get_value(tree_iter, 1) - - # Check if user selected a specific server - if len(user_selected_server) == 0: - selected_server["selected_country"] = model.get_value(tree_iter, 0) - else: - selected_server["selected_server"] = user_selected_server - - if not selected_server["selected_server"] and not selected_server["selected_country"]: - self.messagedialog_spinner.hide() - self.messagedialog_label.set_markup("No server was selected!\nPlease select a server before attempting to connect.") - gui_logger.debug("[!] No server was selected to be connected to.") - else: - # Set text and show spinner - if selected_server["selected_server"]: - msg = "Connecting to {0}.".format(selected_server["selected_server"]) - else: - msg = "Connecting to the quickest server in {0}.".format(selected_server["selected_country"]) - - self.messagedialog_label.set_markup(msg) - self.messagedialog_spinner.show() - - gui_logger.debug(">>> Starting \"connect_to_selected_server\" thread.") - - thread = Thread(target=connect_to_selected_server, args=[self.interface, selected_server, self.messagedialog_label, self.messagedialog_spinner]) - thread.daemon = True - thread.start() - - self.messagedialog_window.show() + value = model.get_value(iter, col); + if isinstance(value, str): + if data.lower() in value.lower(): + return True + else: + continue def quick_connect_button_clicked(self, button): """Button/Event handler to connect to the fastest server @@ -189,7 +156,10 @@ def quick_connect_button_clicked(self, button): gui_logger.debug(">>> Starting \"quick_connect\" thread.") - thread = Thread(target=quick_connect, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) + thread = Thread(target=quick_connect, args=[{ + "interface":self.interface, + "messagedialog_label": self.messagedialog_label, + "messagedialog_spinner": self.messagedialog_spinner}]) thread.daemon = True thread.start() @@ -229,7 +199,10 @@ def random_connect_button_clicked(self, button): gui_logger.debug(">>> Starting \"random_connect\" thread.") - thread = Thread(target=random_connect, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) + thread = Thread(target=random_connect, args=[{ + "interface":self.interface, + "messagedialog_label": self.messagedialog_label, + "messagedialog_spinner": self.messagedialog_spinner}]) thread.daemon = True thread.start() @@ -250,22 +223,6 @@ def disconnect_button_clicked(self, button): self.messagedialog_window.show() - def refresh_server_list_button_clicked(self, button): - """Button/Event handler to refresh/repopulate server list - - At the moment, will also refresh the Dashboard information, this will be fixed in the future. - """ - self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Refreshing server list...") - self.messagedialog_spinner.show() - - gui_logger.debug(">>> Starting \"refresh_server_list\" thread.") - - thread = Thread(target=refresh_server_list, args=[self.interface, self.messagedialog_window, self.messagedialog_spinner]) - thread.daemon = True - thread.start() - - self.messagedialog_window.show() - def about_menu_button_clicked(self, button): """Button /Event handler to open About dialog """ @@ -324,7 +281,7 @@ def configuration_menu_button_clicked(self, button): load_configurations(self.interface) # To avoid getting the ConfigurationsWindow destroyed and not being re-rendered again - def ConfigurationsWindow_delete_event(self, object, event): + def SettingsWindow_delete_event(self, object, event): """On Delete handler is used to hide the window so it renders next time the dialog is called -Returns:Boolean @@ -372,159 +329,488 @@ def update_user_pass_button_clicked(self, button): thread.start() self.messagedialog_window.show() - - # Disable custom DNS input if not selected custom DNS - def dns_preferens_combobox_changed(self, combobox): - """Button/Event handler that is triggered whenever combo box value is changed. - """ - # DNS ComboBox - # 0 - Leak Protection Enabled - # 1 - Custom DNS - # 2 - None - - dns_custom_input = self.interface.get_object("dns_custom_input") - - if combobox.get_active() == 0 or combobox.get_active() == 2: - dns_custom_input.set_property('sensitive', False) - else: - dns_custom_input.set_property('sensitive', True) - # Update DNS Configurations - def update_dns_button_clicked(self, button): - """Button/Event handler to update DNS protection + # Update Default OpenVPN protocol + def update_protocol_combobox_changed(self, object): + """Button/Event handler to update OpenVP Protocol """ - self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Updating DNS configurations...") - self.messagedialog_spinner.show() + autoconnect_setting = get_config_value("USER", "default_protocol") - gui_logger.debug(">>> Starting \"update_dns\" thread.") + tree_iter = object.get_active_iter() - thread = Thread(target=update_dns, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) - thread.daemon = True - thread.start() + if tree_iter is not None: + model = object.get_model() + index, protocol = model[tree_iter][:2] + protocol = protocol.lower() + if protocol.lower() != autoconnect_setting.lower(): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating default OpenVPN Protocol...") + self.messagedialog_spinner.show() - self.messagedialog_window.show() + gui_logger.debug(">>> Starting \"update_protocol_combobox_changed\" thread.") + + thread = Thread(target=update_def_protocol, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner, protocol]) + thread.daemon = True + thread.start() - # Update ProtonVPN Plan - def update_pvpn_plan_button_clicked(self, button): - """Button/Event handler to update ProtonVPN Plan + self.messagedialog_window.show() + + def update_split_tunneling_button_clicked(self, button): + """Button/Event handler to update Split Tunneling """ self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Updating ProtonVPN Plan...") + self.messagedialog_label.set_markup("Updating split tunneling configurations...") self.messagedialog_spinner.show() - gui_logger.debug(">>> Starting \"update_pvpn_plan\" thread.") + gui_logger.debug(">>> Starting \"update_split_tunneling\" thread.") - thread = Thread(target=update_pvpn_plan, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) + thread = Thread(target=update_split_tunneling, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) thread.daemon = True thread.start() - self.messagedialog_window.show() - - # Update Default OpenVPN protocol - def update_def_protocol_button_clicked(self, button): - """Button/Event handler to update OpenVP Protocol + self.messagedialog_window.show() + + def tray_data_tx_combobox_changed(self, object): + display_data_tx = get_gui_config("tray_tab", "display_data_tx") + tree_iter = object.get_active_iter() + if tree_iter is not None: + model = object.get_model() + option, display = model[tree_iter][:2] + if option != int(display_data_tx): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating tray settings...") + self.messagedialog_spinner.show() + gui_logger.debug(">>> Starting \"tray_data_tx_combobox_changed\" thread.") + thread = Thread(target=tray_configurations, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + option, + "tray_data_tx_combobox"]) + thread.daemon = True + thread.start() + self.messagedialog_window.show() + + def tray_servername_combobox_changed(self, object): + display_data_tx = get_gui_config("tray_tab", "display_server") + tree_iter = object.get_active_iter() + if tree_iter is not None: + model = object.get_model() + option, display = model[tree_iter][:2] + if option != int(display_data_tx): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating tray settings...") + self.messagedialog_spinner.show() + gui_logger.debug(">>> Starting \"tray_servername_combobox_changed\" thread.") + thread = Thread(target=tray_configurations, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + option, + "tray_servername_combobox"]) + thread.daemon = True + thread.start() + self.messagedialog_window.show() + + def tray_time_connected_combobox_changed(self, object): + display_data_tx = get_gui_config("tray_tab", "display_time_conn") + tree_iter = object.get_active_iter() + if tree_iter is not None: + model = object.get_model() + option, display = model[tree_iter][:2] + if option != int(display_data_tx): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating tray settings...") + self.messagedialog_spinner.show() + gui_logger.debug(">>> Starting \"tray_servername_combobox_changed\" thread.") + thread = Thread(target=tray_configurations, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + option, + "tray_time_connected_combobox"]) + thread.daemon = True + thread.start() + self.messagedialog_window.show() + + def tray_serverload_combobox_changed(self, object): + display_data_tx = get_gui_config("tray_tab", "display_serverload") + tree_iter = object.get_active_iter() + if tree_iter is not None: + model = object.get_model() + option, display = model[tree_iter][:2] + if option != int(display_data_tx): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating tray settings...") + self.messagedialog_spinner.show() + gui_logger.debug(">>> Starting \"tray_servername_combobox_changed\" thread.") + thread = Thread(target=tray_configurations, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + option, + "tray_serverload_combobox"]) + thread.daemon = True + thread.start() + self.messagedialog_window.show() + + def purge_configurations_button_clicked(self, button): + """Button/Event handler to purge configurations """ self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Updating default OpenVPN Protocol...") + self.messagedialog_label.set_markup("Purging configurations configurations...") self.messagedialog_spinner.show() - gui_logger.debug(">>> Starting \"update_def_protocol\" thread.") + gui_logger.debug(">>> Starting \"purge_configurations\" thread.") - thread = Thread(target=update_def_protocol, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) + thread = Thread(target=purge_configurations, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) thread.daemon = True thread.start() self.messagedialog_window.show() - - # Autoconnect on boot - def autoconnect_button_clicked(self, button): - """Button/Event handler to update autoconnect - """ - self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Updating autoconnect settings...") - self.messagedialog_spinner.show() - gui_logger.debug(">>> Starting \"autoconnect_button_clicked\" thread.") + def main_notebook_switch_page(self, notebook, selected_tab, actual_tab_index): + countries_tab = self.interface.get_object("countries_tab_label") + profiles_tab = self.interface.get_object("profiles_tab_label") + + countries_content_holder = self.interface.get_object("countries_content_holder") + profiles_content_holder = self.interface.get_object("profiles_content_holder") - thread = Thread(target=update_autoconnect, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) - thread.daemon = True - thread.start() + countries_tab_style = countries_tab.get_style_context() + profiles_tab_style = profiles_tab.get_style_context() + + countries_content_holder_style = countries_content_holder.get_style_context() + profiles_content_holder_style = profiles_content_holder.get_style_context() - self.messagedialog_window.show() + if self.main_initial_tab < actual_tab_index: + # Profiles selected + countries_tab_style.remove_class("active_tab") + countries_tab_style.add_class("inactive_tab") - # Kill Switch - def killswitch_combobox_changed(self, combobox): - """Event handler that reactes when the combobox value changes - - If killswitch is enabled, then it disables the split tunneling input and button - """ - if combobox.get_active() == 0: - self.interface.get_object("split_tunneling_textview").set_property('sensitive', True) - self.interface.get_object("update_split_tunneling_button").set_property('sensitive', True) + profiles_tab_style.remove_class("inactive_tab") + profiles_tab_style.add_class("active_tab") else: - self.interface.get_object("split_tunneling_textview").set_property('sensitive', False) - self.interface.get_object("update_split_tunneling_button").set_property('sensitive', False) + # Countries selected + countries_tab_style.remove_class("inactive_tab") + countries_tab_style.add_class("active_tab") - def update_killswitch_button_clicked(self, button): - """Button/Event handler to update Killswitch - """ - self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Updating killswitch configurations...") - self.messagedialog_spinner.show() + profiles_tab_style.remove_class("active_tab") + profiles_tab_style.add_class("inactive_tab") - gui_logger.debug(">>> Starting \"update_killswitch\" thread.") + def settings_notebook_switch_page(self, notebook, selected_tab, actual_tab_index): + general_tab = self.interface.get_object("general_tab_label") + general_content_holder = self.interface.get_object("general_content_holder") + + sys_tray_tab = self.interface.get_object("sys_tray_tab_label") + sys_tray_content_holder = self.interface.get_object("sys_tray_content_holder") - thread = Thread(target=update_killswitch, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) - thread.daemon = True - thread.start() + connection_tab = self.interface.get_object("connection_tab_label") + connection_content_holder = self.interface.get_object("connection_content_holder") - self.messagedialog_window.show() + account_tab = self.interface.get_object("account_tab_label") + account_content_holder = self.interface.get_object("account_content_holder") - def update_split_tunneling_button_clicked(self, button): - """Button/Event handler to update Split Tunneling - """ - self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Updating split tunneling configurations...") - self.messagedialog_spinner.show() + general_tab_style = general_tab.get_style_context() + sys_tray_tab_style = sys_tray_tab.get_style_context() + connection_tab_style = connection_tab.get_style_context() + account_tab_style = account_tab.get_style_context() - gui_logger.debug(">>> Starting \"update_split_tunneling\" thread.") + if actual_tab_index == 0: + # General selected + general_tab_style.add_class("active_tab") + general_tab_style.remove_class("inactive_tab") + + sys_tray_tab_style.remove_class("active_tab") + sys_tray_tab_style.add_class("inactive_tab") - thread = Thread(target=update_split_tunneling, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) - thread.daemon = True - thread.start() + connection_tab_style.add_class("inactive_tab") + connection_tab_style.remove_class("active_tab") + + account_tab_style.add_class("inactive_tab") + account_tab_style.remove_class("active_tab") + + elif actual_tab_index == 1: + # System tray selected + # General selected + general_tab_style.remove_class("active_tab") + general_tab_style.add_class("inactive_tab") + + sys_tray_tab_style.add_class("active_tab") + sys_tray_tab_style.remove_class("inactive_tab") - self.messagedialog_window.show() - - def update_tray_configurations_button_clicked(self, button): - """Button/Event handler to update Tray display configurations + connection_tab_style.add_class("inactive_tab") + connection_tab_style.remove_class("active_tab") + + account_tab_style.add_class("inactive_tab") + account_tab_style.remove_class("active_tab") + + elif actual_tab_index == 2: + # Connection selected + general_tab_style.remove_class("active_tab") + general_tab_style.add_class("inactive_tab") + + sys_tray_tab_style.remove_class("active_tab") + sys_tray_tab_style.add_class("inactive_tab") + + connection_tab_style.remove_class("inactive_tab") + connection_tab_style.add_class("active_tab") + + account_tab_style.add_class("inactive_tab") + account_tab_style.remove_class("active_tab") + + elif actual_tab_index == 3: + # Account selected + general_tab_style.remove_class("active_tab") + general_tab_style.add_class("inactive_tab") + + sys_tray_tab_style.remove_class("active_tab") + sys_tray_tab_style.add_class("inactive_tab") + + connection_tab_style.add_class("inactive_tab") + connection_tab_style.remove_class("active_tab") + + account_tab_style.remove_class("inactive_tab") + account_tab_style.add_class("active_tab") + + def main_conn_disc_button_label(self, button): + """Button/Event handler to connect to the fastest server """ self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Updating tray display configurations...") - self.messagedialog_spinner.show() - gui_logger.debug(">>> Starting \"tray_configurations\" thread.") + gui_logger.debug(">>> Starting \"main_conn_disc_button_label\" thread.") + + server_list = self.interface.get_object("TreeViewServerList").get_selection() + (model, pathlist) = server_list.get_selected_rows() + + user_selected_server = False + + for path in pathlist : + tree_iter = model.get_iter(path) + # the second param of get_value() specifies the column number, starting at 0 + user_selected_server = model.get_value(tree_iter, 1) + + server_list.unselect_all() + + target = custom_quick_connect + message = "Connecting to the fastest server..." + + if get_gui_config("conn_tab","quick_connect") != "dis": + message = "Connecting to custom quick connect..." + + if is_connected() and not user_selected_server: + target = disconnect + message = "Disconnecting..." - thread = Thread(target=tray_configurations, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) + if user_selected_server: + target = connect_to_selected_server + message = "Connecting to {}".format(user_selected_server) + + self.messagedialog_label.set_markup(message) + self.messagedialog_spinner.show() + + thread = Thread(target=target, args=[{ + "interface":self.interface, + "user_selected_server": user_selected_server, + "messagedialog_label": self.messagedialog_label, + "messagedialog_spinner": self.messagedialog_spinner}]) thread.daemon = True thread.start() self.messagedialog_window.show() - def purge_configurations_button_clicked(self, button): - """Button/Event handler to purge configurations - """ + def TreeViewServerList_cursor_changed(self, treeview): self.messagedialog_sub_label.hide() - self.messagedialog_label.set_markup("Purging configurations configurations...") - self.messagedialog_spinner.show() - gui_logger.debug(">>> Starting \"purge_configurations\" thread.") + # Get the selected server + (model, pathlist) = treeview.get_selection().get_selected_rows() - thread = Thread(target=purge_configurations, args=[self.interface, self.messagedialog_label, self.messagedialog_spinner]) - thread.daemon = True - thread.start() + for path in pathlist : + tree_iter = model.get_iter(path) + # the second param of get_value() specifies the column number, starting at 0 + user_selected_server = model.get_value(tree_iter, 1) - self.messagedialog_window.show() + try: + self.conn_disc_button_label.set_markup("Connecto to {}".format(user_selected_server)) + except UnboundLocalError: + self.conn_disc_button_label.set_markup("Quick Connect") + + def update_dns_leak_switch_changed(self, object, state): + dns_protection = get_config_value("USER", "dns_leak_protection") + # dns_custom = get_config_value("USER", "custom_dns") + if dns_protection == "0": + update_to = "1" + elif dns_protection != "0": + update_to = "0" + + if (state and dns_protection == "0") or (not state and dns_protection != "0"): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating DNS leak settings...") + self.messagedialog_spinner.show() + # set_config_value("USER", "dns_leak_protection", "0") + thread = Thread(target=update_dns, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + update_to]) + thread.daemon = True + thread.start() + + self.messagedialog_window.show() + def update_killswitch_switch_changed(self, object, state): + killswitch_protection = get_config_value("USER", "killswitch") + if killswitch_protection == "0": + update_to = "1" + else: + update_to = "0" + + if (state and killswitch_protection == "0") or (not state and killswitch_protection != "0"): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating Killswitch settings...") + self.messagedialog_spinner.show() + # set_config_value("USER", "dns_leak_protection", "0") + thread = Thread(target=update_killswitch, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + update_to]) + thread.daemon = True + thread.start() + + self.messagedialog_window.show() + + def update_autoconnect_combobox_changed(self, object): + autoconnect_setting = get_gui_config("conn_tab", "autoconnect") + + tree_iter = object.get_active_iter() + + if tree_iter is not None: + model = object.get_model() + country_command, country_display = model[tree_iter][:2] + + if country_command != autoconnect_setting: + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating autoconnect settings...") + self.messagedialog_spinner.show() + + gui_logger.debug(">>> Starting \"update_autoconnect_combobox_changed\" thread.") + + thread = Thread(target=update_connect_preference, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + country_command, + country_display]) + thread.daemon = True + thread.start() + + self.messagedialog_window.show() + + def update_quick_connect_combobox_changed(self, object): + autoconnect_setting = get_gui_config("conn_tab", "quick_connect") + + tree_iter = object.get_active_iter() + + if tree_iter is not None: + model = object.get_model() + country_command, country_display = model[tree_iter][:2] + + if country_command != autoconnect_setting: + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating quick connect settings...") + self.messagedialog_spinner.show() + + gui_logger.debug(">>> Starting \"update_quick_connect_combobox_changed\" thread.") + + thread = Thread(target=update_connect_preference, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + country_command, + country_display, + True]) + thread.daemon = True + thread.start() + + self.messagedialog_window.show() + + def split_tunneling_switch_changed(self, object, state): + split_tunnel_grid = self.interface.get_object("split_tunneling_grid") + split_tunnel = get_config_value("USER", "split_tunnel") + + if split_tunnel == "0": + update_to = "1" + else: + update_to = "0" + + if state: + split_tunnel_grid.show() + else: + + split_tunnel_grid.hide() + + if (state and split_tunnel == "0") or (not state and split_tunnel != "0"): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating split tunneling settings...") + self.messagedialog_spinner.show() + thread = Thread(target=update_split_tunneling_status, args=[ + self.messagedialog_label, + self.messagedialog_spinner, + update_to]) + thread.daemon = True + thread.start() + + self.messagedialog_window.show() + + def update_tier_combobox_changed(self, object): + tier = int(get_config_value("USER", "tier")) + + tree_iter = object.get_active_iter() + + if tree_iter is not None: + model = object.get_model() + selected_tier, tier_display = model[tree_iter][:2] + + if selected_tier != tier: + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Updating ProtoVPN plan...") + self.messagedialog_spinner.show() + + gui_logger.debug(">>> Starting \"update_tier_combobox_changed\" thread.") + + thread = Thread(target=update_pvpn_plan, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + int(selected_tier+1), + tier_display]) + thread.daemon = True + thread.start() + + self.messagedialog_window.show() + + def secure_core_switch_changed(self, object, state): + display_secure_core = get_gui_config("connections", "display_secure_core") + + if display_secure_core == "False": + update_to = "True" + else: + update_to = "False" + + if (state and display_secure_core == "False") or (not state and display_secure_core != "False"): + self.messagedialog_sub_label.hide() + self.messagedialog_label.set_markup("Loading {} servers...".format("secure-core" if update_to == "True" else "non secure-core")) + self.messagedialog_spinner.show() + thread = Thread(target=reload_secure_core_servers, args=[ + self.interface, + self.messagedialog_label, + self.messagedialog_spinner, + update_to]) + thread.daemon = True + thread.start() + + self.messagedialog_window.show() + def initialize_gui(): """Initializes the GUI --- @@ -549,9 +835,20 @@ def initialize_gui(): else: glade_path = glade_path + path + "/" - + interface.add_from_file(glade_path[:-1]) + css = re.sub("main.glade", "main.css", glade_path) + + style_provider = Gtk.CssProvider() + style_provider.load_from_path(css[:-1]) + + Gtk.StyleContext.add_provider_for_screen( + Gdk.Screen.get_default(), + style_provider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ) + messagedialog_window = interface.get_object("MessageDialog") messagedialog_label = interface.get_object("message_dialog_label") messagedialog_spinner = interface.get_object("message_dialog_spinner") @@ -582,13 +879,17 @@ def initialize_gui(): interface.connect_signals(Handler(interface)) check_root() + + if not os.path.isdir(GUI_CONFIG_DIR): + os.mkdir(GUI_CONFIG_DIR) + gui_logger.debug("Config Directory created") + change_file_owner(GUI_CONFIG_DIR) + gui_logger.debug("\n______________________________________\n\n\tINITIALIZING NEW GUI WINDOW\n______________________________________\n") - try: - change_file_owner(os.path.join(CONFIG_DIR, "protonvpn-gui.log")) - except NameError: - gui_logger.debug("[!] Could not CONFIG_DIR.") - sys.exit(1) + change_file_owner(os.path.join(GUI_CONFIG_DIR, "protonvpn-gui.log")) + except: + pass if len(get_gui_processes()) > 1: gui_logger.debug("[!] Two processes were found. Displaying MessageDialog to inform user.") @@ -609,13 +910,13 @@ def initialize_gui(): messagedialog_label.set_markup(response['message']) messagedialog_spinner.hide() + - if not os.path.isfile(CONFIG_FILE): + if not os.path.isfile(CONFIG_FILE): gui_logger.debug(">>> Loading LoginWindow") window = interface.get_object("LoginWindow") dashboard = interface.get_object("DashboardWindow") dashboard.connect("destroy", Gtk.main_quit) - window.show() else: window = interface.get_object("DashboardWindow") gui_logger.debug(">>> Loading DashboardWindow") @@ -640,9 +941,6 @@ def initialize_gui(): thread = Thread(target=load_content_on_start, args=[objects]) thread.daemon = True thread.start() - - # indicator(Gtk) window.show() - Gtk.main() diff --git a/protonvpn_linux_gui/gui_logger.py b/protonvpn_linux_gui/gui_logger.py index b3a5e4c..9a9f97b 100644 --- a/protonvpn_linux_gui/gui_logger.py +++ b/protonvpn_linux_gui/gui_logger.py @@ -2,21 +2,21 @@ import os from logging.handlers import RotatingFileHandler -try: - from protonvpn_cli.constants import CONFIG_DIR -except: - pass +from .constants import GUI_CONFIG_DIR def get_logger(): """Create the logger. """ + if not os.path.isdir(GUI_CONFIG_DIR): + os.mkdir(GUI_CONFIG_DIR) + formatter = logging.Formatter("%(asctime)s — %(name)s — %(levelname)s — %(funcName)s:%(lineno)d — %(message)s") log = logging.getLogger("protonvpn-linux-gui") log.setLevel(logging.DEBUG) #logging.basicConfig(filename=LOG_FILE, level=logging.DEBUG) try: - LOGFILE = os.path.join(CONFIG_DIR, "protonvpn-gui.log") + LOGFILE = os.path.join(GUI_CONFIG_DIR, "protonvpn-gui.log") file_handler = RotatingFileHandler(LOGFILE, maxBytes=3145728, backupCount=1) file_handler.setFormatter(formatter) log.addHandler(file_handler) diff --git a/protonvpn_linux_gui/resources/flags/__init__.py b/protonvpn_linux_gui/resources/img/__init__.py similarity index 100% rename from protonvpn_linux_gui/resources/flags/__init__.py rename to protonvpn_linux_gui/resources/img/__init__.py diff --git a/protonvpn_linux_gui/resources/img/flags/__init__.py b/protonvpn_linux_gui/resources/img/flags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/protonvpn_linux_gui/resources/img/flags/large/__init__.py b/protonvpn_linux_gui/resources/img/flags/large/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/protonvpn_linux_gui/resources/img/flags/large/ad.jpg b/protonvpn_linux_gui/resources/img/flags/large/ad.jpg new file mode 100644 index 0000000..bead8a9 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ad.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ae.jpg b/protonvpn_linux_gui/resources/img/flags/large/ae.jpg new file mode 100644 index 0000000..87c2c21 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ae.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/af.jpg b/protonvpn_linux_gui/resources/img/flags/large/af.jpg new file mode 100644 index 0000000..a6c9fa5 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/af.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ag.jpg b/protonvpn_linux_gui/resources/img/flags/large/ag.jpg new file mode 100644 index 0000000..c8eef79 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ag.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/al.jpg b/protonvpn_linux_gui/resources/img/flags/large/al.jpg new file mode 100644 index 0000000..e68c7f5 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/al.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/am.jpg b/protonvpn_linux_gui/resources/img/flags/large/am.jpg new file mode 100644 index 0000000..49e89ad Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/am.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ao.jpg b/protonvpn_linux_gui/resources/img/flags/large/ao.jpg new file mode 100644 index 0000000..443b1f7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ao.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ar.jpg b/protonvpn_linux_gui/resources/img/flags/large/ar.jpg new file mode 100644 index 0000000..257bdfe Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ar.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/at.jpg b/protonvpn_linux_gui/resources/img/flags/large/at.jpg new file mode 100644 index 0000000..360af32 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/at.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/au.jpg b/protonvpn_linux_gui/resources/img/flags/large/au.jpg new file mode 100644 index 0000000..66e65ed Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/au.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/az.jpg b/protonvpn_linux_gui/resources/img/flags/large/az.jpg new file mode 100644 index 0000000..2940e10 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/az.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ba.jpg b/protonvpn_linux_gui/resources/img/flags/large/ba.jpg new file mode 100644 index 0000000..7f19d4b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ba.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bb.jpg b/protonvpn_linux_gui/resources/img/flags/large/bb.jpg new file mode 100644 index 0000000..3da8637 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bb.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bd.jpg b/protonvpn_linux_gui/resources/img/flags/large/bd.jpg new file mode 100644 index 0000000..a5b829b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bd.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/be.jpg b/protonvpn_linux_gui/resources/img/flags/large/be.jpg new file mode 100644 index 0000000..3663645 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/be.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bf.jpg b/protonvpn_linux_gui/resources/img/flags/large/bf.jpg new file mode 100644 index 0000000..83a97f8 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bf.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bg.jpg b/protonvpn_linux_gui/resources/img/flags/large/bg.jpg new file mode 100644 index 0000000..a78ae7c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bh.jpg b/protonvpn_linux_gui/resources/img/flags/large/bh.jpg new file mode 100644 index 0000000..e00e2fc Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bh.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bi.jpg b/protonvpn_linux_gui/resources/img/flags/large/bi.jpg new file mode 100644 index 0000000..39646ac Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bi.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bj.jpg b/protonvpn_linux_gui/resources/img/flags/large/bj.jpg new file mode 100644 index 0000000..9e0d559 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bj.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bn.jpg b/protonvpn_linux_gui/resources/img/flags/large/bn.jpg new file mode 100644 index 0000000..baa793b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bo.jpg b/protonvpn_linux_gui/resources/img/flags/large/bo.jpg new file mode 100644 index 0000000..00546c2 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bo.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/br.jpg b/protonvpn_linux_gui/resources/img/flags/large/br.jpg new file mode 100644 index 0000000..1b348c7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/br.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bs.jpg b/protonvpn_linux_gui/resources/img/flags/large/bs.jpg new file mode 100644 index 0000000..8b9737f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bs.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bt.jpg b/protonvpn_linux_gui/resources/img/flags/large/bt.jpg new file mode 100644 index 0000000..33a40c2 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bt.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bw.jpg b/protonvpn_linux_gui/resources/img/flags/large/bw.jpg new file mode 100644 index 0000000..a96f576 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bw.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/by.jpg b/protonvpn_linux_gui/resources/img/flags/large/by.jpg new file mode 100644 index 0000000..11fa16f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/by.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/bz.jpg b/protonvpn_linux_gui/resources/img/flags/large/bz.jpg new file mode 100644 index 0000000..3f28257 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/bz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ca.jpg b/protonvpn_linux_gui/resources/img/flags/large/ca.jpg new file mode 100644 index 0000000..add9055 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ca.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cd.jpg b/protonvpn_linux_gui/resources/img/flags/large/cd.jpg new file mode 100644 index 0000000..125e6d0 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cd.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cf.jpg b/protonvpn_linux_gui/resources/img/flags/large/cf.jpg new file mode 100644 index 0000000..8cf7539 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cf.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cg.jpg b/protonvpn_linux_gui/resources/img/flags/large/cg.jpg new file mode 100644 index 0000000..6dfe5f4 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ch.jpg b/protonvpn_linux_gui/resources/img/flags/large/ch.jpg new file mode 100644 index 0000000..5be3725 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ch.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ci.jpg b/protonvpn_linux_gui/resources/img/flags/large/ci.jpg new file mode 100644 index 0000000..4d2b358 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ci.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ck.jpg b/protonvpn_linux_gui/resources/img/flags/large/ck.jpg new file mode 100644 index 0000000..aa2fc38 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ck.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cl.jpg b/protonvpn_linux_gui/resources/img/flags/large/cl.jpg new file mode 100644 index 0000000..5c5841f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cl.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cm.jpg b/protonvpn_linux_gui/resources/img/flags/large/cm.jpg new file mode 100644 index 0000000..1abb3b4 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cn.jpg b/protonvpn_linux_gui/resources/img/flags/large/cn.jpg new file mode 100644 index 0000000..4dc8c36 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/co.jpg b/protonvpn_linux_gui/resources/img/flags/large/co.jpg new file mode 100644 index 0000000..fad4920 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/co.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cr.jpg b/protonvpn_linux_gui/resources/img/flags/large/cr.jpg new file mode 100644 index 0000000..c7ff9dc Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cu.jpg b/protonvpn_linux_gui/resources/img/flags/large/cu.jpg new file mode 100644 index 0000000..48b69bf Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cu.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cv.jpg b/protonvpn_linux_gui/resources/img/flags/large/cv.jpg new file mode 100644 index 0000000..ca0a180 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cv.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cy.jpg b/protonvpn_linux_gui/resources/img/flags/large/cy.jpg new file mode 100644 index 0000000..0f772aa Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cy.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/cz.jpg b/protonvpn_linux_gui/resources/img/flags/large/cz.jpg new file mode 100644 index 0000000..d0b6bdf Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/cz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/de.jpg b/protonvpn_linux_gui/resources/img/flags/large/de.jpg new file mode 100644 index 0000000..5282f91 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/de.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/dj.jpg b/protonvpn_linux_gui/resources/img/flags/large/dj.jpg new file mode 100644 index 0000000..f90c7c6 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/dj.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/dk.jpg b/protonvpn_linux_gui/resources/img/flags/large/dk.jpg new file mode 100644 index 0000000..94a500c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/dk.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/dm.jpg b/protonvpn_linux_gui/resources/img/flags/large/dm.jpg new file mode 100644 index 0000000..fdaa18b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/dm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/do.jpg b/protonvpn_linux_gui/resources/img/flags/large/do.jpg new file mode 100644 index 0000000..f051ccd Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/do.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/dz.jpg b/protonvpn_linux_gui/resources/img/flags/large/dz.jpg new file mode 100644 index 0000000..4be9041 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/dz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ec.jpg b/protonvpn_linux_gui/resources/img/flags/large/ec.jpg new file mode 100644 index 0000000..3649a0f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ec.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ee.jpg b/protonvpn_linux_gui/resources/img/flags/large/ee.jpg new file mode 100644 index 0000000..521ab8a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ee.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/eg.jpg b/protonvpn_linux_gui/resources/img/flags/large/eg.jpg new file mode 100644 index 0000000..5821641 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/eg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/eh.jpg b/protonvpn_linux_gui/resources/img/flags/large/eh.jpg new file mode 100644 index 0000000..26b7b1b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/eh.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/er.jpg b/protonvpn_linux_gui/resources/img/flags/large/er.jpg new file mode 100644 index 0000000..c74f416 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/er.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/es.jpg b/protonvpn_linux_gui/resources/img/flags/large/es.jpg new file mode 100644 index 0000000..720cc8f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/es.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/et.jpg b/protonvpn_linux_gui/resources/img/flags/large/et.jpg new file mode 100644 index 0000000..0b66a05 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/et.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/fi.jpg b/protonvpn_linux_gui/resources/img/flags/large/fi.jpg new file mode 100644 index 0000000..3b231ce Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/fi.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/fj.jpg b/protonvpn_linux_gui/resources/img/flags/large/fj.jpg new file mode 100644 index 0000000..8418a49 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/fj.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/fm.jpg b/protonvpn_linux_gui/resources/img/flags/large/fm.jpg new file mode 100644 index 0000000..674e302 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/fm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/fr.jpg b/protonvpn_linux_gui/resources/img/flags/large/fr.jpg new file mode 100644 index 0000000..d80419f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/fr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ga.jpg b/protonvpn_linux_gui/resources/img/flags/large/ga.jpg new file mode 100644 index 0000000..e8ed011 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ga.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gb.jpg b/protonvpn_linux_gui/resources/img/flags/large/gb.jpg new file mode 100644 index 0000000..a3a8ffb Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gb.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gd.jpg b/protonvpn_linux_gui/resources/img/flags/large/gd.jpg new file mode 100644 index 0000000..99901d0 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gd.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ge.jpg b/protonvpn_linux_gui/resources/img/flags/large/ge.jpg new file mode 100644 index 0000000..32ddeee Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ge.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gh.jpg b/protonvpn_linux_gui/resources/img/flags/large/gh.jpg new file mode 100644 index 0000000..f13a812 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gh.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gm.jpg b/protonvpn_linux_gui/resources/img/flags/large/gm.jpg new file mode 100644 index 0000000..9636ed7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gn.jpg b/protonvpn_linux_gui/resources/img/flags/large/gn.jpg new file mode 100644 index 0000000..901b2d8 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gq.jpg b/protonvpn_linux_gui/resources/img/flags/large/gq.jpg new file mode 100644 index 0000000..c0fdc41 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gq.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gr.jpg b/protonvpn_linux_gui/resources/img/flags/large/gr.jpg new file mode 100644 index 0000000..dd02d9c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gt.jpg b/protonvpn_linux_gui/resources/img/flags/large/gt.jpg new file mode 100644 index 0000000..42cd87e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gt.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gw.jpg b/protonvpn_linux_gui/resources/img/flags/large/gw.jpg new file mode 100644 index 0000000..b3647b3 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gw.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/gy.jpg b/protonvpn_linux_gui/resources/img/flags/large/gy.jpg new file mode 100644 index 0000000..3f10704 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/gy.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/hn.jpg b/protonvpn_linux_gui/resources/img/flags/large/hn.jpg new file mode 100644 index 0000000..d6561d7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/hn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/hr.jpg b/protonvpn_linux_gui/resources/img/flags/large/hr.jpg new file mode 100644 index 0000000..d32a28b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/hr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ht.jpg b/protonvpn_linux_gui/resources/img/flags/large/ht.jpg new file mode 100644 index 0000000..1617392 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ht.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/hu.jpg b/protonvpn_linux_gui/resources/img/flags/large/hu.jpg new file mode 100644 index 0000000..f39c42b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/hu.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/id.jpg b/protonvpn_linux_gui/resources/img/flags/large/id.jpg new file mode 100644 index 0000000..a364167 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/id.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ie.jpg b/protonvpn_linux_gui/resources/img/flags/large/ie.jpg new file mode 100644 index 0000000..47eda2a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ie.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/il.jpg b/protonvpn_linux_gui/resources/img/flags/large/il.jpg new file mode 100644 index 0000000..f9ecd19 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/il.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/in.jpg b/protonvpn_linux_gui/resources/img/flags/large/in.jpg new file mode 100644 index 0000000..c022fb9 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/in.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/iq.jpg b/protonvpn_linux_gui/resources/img/flags/large/iq.jpg new file mode 100644 index 0000000..6a4c91e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/iq.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ir.jpg b/protonvpn_linux_gui/resources/img/flags/large/ir.jpg new file mode 100644 index 0000000..e63ee3c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ir.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/is.jpg b/protonvpn_linux_gui/resources/img/flags/large/is.jpg new file mode 100644 index 0000000..dc88315 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/is.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/it.jpg b/protonvpn_linux_gui/resources/img/flags/large/it.jpg new file mode 100644 index 0000000..4be0968 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/it.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/jm.jpg b/protonvpn_linux_gui/resources/img/flags/large/jm.jpg new file mode 100644 index 0000000..21c55ff Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/jm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/jo.jpg b/protonvpn_linux_gui/resources/img/flags/large/jo.jpg new file mode 100644 index 0000000..afdbaf2 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/jo.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/jp.jpg b/protonvpn_linux_gui/resources/img/flags/large/jp.jpg new file mode 100644 index 0000000..161e33b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/jp.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ke.jpg b/protonvpn_linux_gui/resources/img/flags/large/ke.jpg new file mode 100644 index 0000000..e21eeed Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ke.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/kg.jpg b/protonvpn_linux_gui/resources/img/flags/large/kg.jpg new file mode 100644 index 0000000..b9d378f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/kg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/kh.jpg b/protonvpn_linux_gui/resources/img/flags/large/kh.jpg new file mode 100644 index 0000000..23bc05a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/kh.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ki.jpg b/protonvpn_linux_gui/resources/img/flags/large/ki.jpg new file mode 100644 index 0000000..07a1a85 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ki.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/km.jpg b/protonvpn_linux_gui/resources/img/flags/large/km.jpg new file mode 100644 index 0000000..63cd536 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/km.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/kn.jpg b/protonvpn_linux_gui/resources/img/flags/large/kn.jpg new file mode 100644 index 0000000..0700ba9 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/kn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/kp.jpg b/protonvpn_linux_gui/resources/img/flags/large/kp.jpg new file mode 100644 index 0000000..fbfa233 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/kp.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/kr.jpg b/protonvpn_linux_gui/resources/img/flags/large/kr.jpg new file mode 100644 index 0000000..68aec1a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/kr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/kw.jpg b/protonvpn_linux_gui/resources/img/flags/large/kw.jpg new file mode 100644 index 0000000..f518984 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/kw.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/kz.jpg b/protonvpn_linux_gui/resources/img/flags/large/kz.jpg new file mode 100644 index 0000000..12c3fc3 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/kz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/la.jpg b/protonvpn_linux_gui/resources/img/flags/large/la.jpg new file mode 100644 index 0000000..3b3b0bd Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/la.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/lb.jpg b/protonvpn_linux_gui/resources/img/flags/large/lb.jpg new file mode 100644 index 0000000..1d937b6 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/lb.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/lc.jpg b/protonvpn_linux_gui/resources/img/flags/large/lc.jpg new file mode 100644 index 0000000..e71912d Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/lc.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/li.jpg b/protonvpn_linux_gui/resources/img/flags/large/li.jpg new file mode 100644 index 0000000..c05db10 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/li.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/lk.jpg b/protonvpn_linux_gui/resources/img/flags/large/lk.jpg new file mode 100644 index 0000000..be8bf0b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/lk.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/lr.jpg b/protonvpn_linux_gui/resources/img/flags/large/lr.jpg new file mode 100644 index 0000000..975498a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/lr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ls.jpg b/protonvpn_linux_gui/resources/img/flags/large/ls.jpg new file mode 100644 index 0000000..e76cf12 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ls.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/lt.jpg b/protonvpn_linux_gui/resources/img/flags/large/lt.jpg new file mode 100644 index 0000000..861de5d Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/lt.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/lu.jpg b/protonvpn_linux_gui/resources/img/flags/large/lu.jpg new file mode 100644 index 0000000..395fa0b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/lu.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/lv.jpg b/protonvpn_linux_gui/resources/img/flags/large/lv.jpg new file mode 100644 index 0000000..b32d47a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/lv.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ly.jpg b/protonvpn_linux_gui/resources/img/flags/large/ly.jpg new file mode 100644 index 0000000..020dcff Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ly.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ma.jpg b/protonvpn_linux_gui/resources/img/flags/large/ma.jpg new file mode 100644 index 0000000..743f43d Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ma.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mc.jpg b/protonvpn_linux_gui/resources/img/flags/large/mc.jpg new file mode 100644 index 0000000..309e28a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mc.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/md.jpg b/protonvpn_linux_gui/resources/img/flags/large/md.jpg new file mode 100644 index 0000000..b1cf5bb Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/md.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/me.jpg b/protonvpn_linux_gui/resources/img/flags/large/me.jpg new file mode 100644 index 0000000..861b759 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/me.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mg.jpg b/protonvpn_linux_gui/resources/img/flags/large/mg.jpg new file mode 100644 index 0000000..7186f24 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mh.jpg b/protonvpn_linux_gui/resources/img/flags/large/mh.jpg new file mode 100644 index 0000000..19a3d12 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mh.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mk.jpg b/protonvpn_linux_gui/resources/img/flags/large/mk.jpg new file mode 100644 index 0000000..7730bb4 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mk.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ml.jpg b/protonvpn_linux_gui/resources/img/flags/large/ml.jpg new file mode 100644 index 0000000..9bf5d45 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ml.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mm.jpg b/protonvpn_linux_gui/resources/img/flags/large/mm.jpg new file mode 100644 index 0000000..aa5e80e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mn.jpg b/protonvpn_linux_gui/resources/img/flags/large/mn.jpg new file mode 100644 index 0000000..7e418c4 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mr.jpg b/protonvpn_linux_gui/resources/img/flags/large/mr.jpg new file mode 100644 index 0000000..6c3e97c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mt.jpg b/protonvpn_linux_gui/resources/img/flags/large/mt.jpg new file mode 100644 index 0000000..776bbb6 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mt.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mu.jpg b/protonvpn_linux_gui/resources/img/flags/large/mu.jpg new file mode 100644 index 0000000..6cf8691 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mu.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mv.jpg b/protonvpn_linux_gui/resources/img/flags/large/mv.jpg new file mode 100644 index 0000000..160a000 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mv.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mw.jpg b/protonvpn_linux_gui/resources/img/flags/large/mw.jpg new file mode 100644 index 0000000..9c49dd9 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mw.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mx.jpg b/protonvpn_linux_gui/resources/img/flags/large/mx.jpg new file mode 100644 index 0000000..83d3e3a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mx.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/my.jpg b/protonvpn_linux_gui/resources/img/flags/large/my.jpg new file mode 100644 index 0000000..55bf07e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/my.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/mz.jpg b/protonvpn_linux_gui/resources/img/flags/large/mz.jpg new file mode 100644 index 0000000..ac3f76b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/mz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/na.jpg b/protonvpn_linux_gui/resources/img/flags/large/na.jpg new file mode 100644 index 0000000..76d417e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/na.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ne.jpg b/protonvpn_linux_gui/resources/img/flags/large/ne.jpg new file mode 100644 index 0000000..db79425 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ne.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ng.jpg b/protonvpn_linux_gui/resources/img/flags/large/ng.jpg new file mode 100644 index 0000000..afbbac8 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ng.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ni.jpg b/protonvpn_linux_gui/resources/img/flags/large/ni.jpg new file mode 100644 index 0000000..0fb3238 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ni.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/nl.jpg b/protonvpn_linux_gui/resources/img/flags/large/nl.jpg new file mode 100644 index 0000000..c9ffacc Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/nl.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/no.jpg b/protonvpn_linux_gui/resources/img/flags/large/no.jpg new file mode 100644 index 0000000..ba470e6 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/no.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/np.jpg b/protonvpn_linux_gui/resources/img/flags/large/np.jpg new file mode 100644 index 0000000..bbde4ad Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/np.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/nr.jpg b/protonvpn_linux_gui/resources/img/flags/large/nr.jpg new file mode 100644 index 0000000..234076a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/nr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/nu.jpg b/protonvpn_linux_gui/resources/img/flags/large/nu.jpg new file mode 100644 index 0000000..cd6087e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/nu.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/nz.jpg b/protonvpn_linux_gui/resources/img/flags/large/nz.jpg new file mode 100644 index 0000000..a6bf83d Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/nz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/om.jpg b/protonvpn_linux_gui/resources/img/flags/large/om.jpg new file mode 100644 index 0000000..37c9421 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/om.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/pa.jpg b/protonvpn_linux_gui/resources/img/flags/large/pa.jpg new file mode 100644 index 0000000..32bc201 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/pa.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/pe.jpg b/protonvpn_linux_gui/resources/img/flags/large/pe.jpg new file mode 100644 index 0000000..e5bb5e7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/pe.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/pg.jpg b/protonvpn_linux_gui/resources/img/flags/large/pg.jpg new file mode 100644 index 0000000..79d2e3a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/pg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ph.jpg b/protonvpn_linux_gui/resources/img/flags/large/ph.jpg new file mode 100644 index 0000000..caa3b6d Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ph.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/pk.jpg b/protonvpn_linux_gui/resources/img/flags/large/pk.jpg new file mode 100644 index 0000000..02c81c7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/pk.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/pl.jpg b/protonvpn_linux_gui/resources/img/flags/large/pl.jpg new file mode 100644 index 0000000..be16cbc Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/pl.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ps.jpg b/protonvpn_linux_gui/resources/img/flags/large/ps.jpg new file mode 100644 index 0000000..45b02bb Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ps.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/pt.jpg b/protonvpn_linux_gui/resources/img/flags/large/pt.jpg new file mode 100644 index 0000000..5405868 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/pt.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/pw.jpg b/protonvpn_linux_gui/resources/img/flags/large/pw.jpg new file mode 100644 index 0000000..dfc1ac7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/pw.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/py.jpg b/protonvpn_linux_gui/resources/img/flags/large/py.jpg new file mode 100644 index 0000000..2a17d6b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/py.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/qa.jpg b/protonvpn_linux_gui/resources/img/flags/large/qa.jpg new file mode 100644 index 0000000..bb60905 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/qa.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ro.jpg b/protonvpn_linux_gui/resources/img/flags/large/ro.jpg new file mode 100644 index 0000000..c3b11c2 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ro.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/rs.jpg b/protonvpn_linux_gui/resources/img/flags/large/rs.jpg new file mode 100644 index 0000000..30e7488 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/rs.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ru.jpg b/protonvpn_linux_gui/resources/img/flags/large/ru.jpg new file mode 100644 index 0000000..0a041ad Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ru.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/rw.jpg b/protonvpn_linux_gui/resources/img/flags/large/rw.jpg new file mode 100644 index 0000000..cece4cf Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/rw.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sa.jpg b/protonvpn_linux_gui/resources/img/flags/large/sa.jpg new file mode 100644 index 0000000..c59bbaf Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sa.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sb.jpg b/protonvpn_linux_gui/resources/img/flags/large/sb.jpg new file mode 100644 index 0000000..e338d0e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sb.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sc.jpg b/protonvpn_linux_gui/resources/img/flags/large/sc.jpg new file mode 100644 index 0000000..00d7ed4 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sc.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sd.jpg b/protonvpn_linux_gui/resources/img/flags/large/sd.jpg new file mode 100644 index 0000000..1feb7d4 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sd.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/se.jpg b/protonvpn_linux_gui/resources/img/flags/large/se.jpg new file mode 100644 index 0000000..50f6162 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/se.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sg.jpg b/protonvpn_linux_gui/resources/img/flags/large/sg.jpg new file mode 100644 index 0000000..2f79988 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/si.jpg b/protonvpn_linux_gui/resources/img/flags/large/si.jpg new file mode 100644 index 0000000..d87d557 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/si.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sk.jpg b/protonvpn_linux_gui/resources/img/flags/large/sk.jpg new file mode 100644 index 0000000..d78f785 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sk.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sl.jpg b/protonvpn_linux_gui/resources/img/flags/large/sl.jpg new file mode 100644 index 0000000..75600e0 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sl.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sm.jpg b/protonvpn_linux_gui/resources/img/flags/large/sm.jpg new file mode 100644 index 0000000..3c4f5bf Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sn.jpg b/protonvpn_linux_gui/resources/img/flags/large/sn.jpg new file mode 100644 index 0000000..4288f37 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/so.jpg b/protonvpn_linux_gui/resources/img/flags/large/so.jpg new file mode 100644 index 0000000..933079f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/so.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sr.jpg b/protonvpn_linux_gui/resources/img/flags/large/sr.jpg new file mode 100644 index 0000000..e78256c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ss.jpg b/protonvpn_linux_gui/resources/img/flags/large/ss.jpg new file mode 100644 index 0000000..e27acb6 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ss.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/st.jpg b/protonvpn_linux_gui/resources/img/flags/large/st.jpg new file mode 100644 index 0000000..0bf6234 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/st.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sv.jpg b/protonvpn_linux_gui/resources/img/flags/large/sv.jpg new file mode 100644 index 0000000..a7a35e8 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sv.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sy.jpg b/protonvpn_linux_gui/resources/img/flags/large/sy.jpg new file mode 100644 index 0000000..699ee17 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sy.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/sz.jpg b/protonvpn_linux_gui/resources/img/flags/large/sz.jpg new file mode 100644 index 0000000..100fa69 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/sz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/td.jpg b/protonvpn_linux_gui/resources/img/flags/large/td.jpg new file mode 100644 index 0000000..9a9d40a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/td.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tg.jpg b/protonvpn_linux_gui/resources/img/flags/large/tg.jpg new file mode 100644 index 0000000..686985b Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tg.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/th.jpg b/protonvpn_linux_gui/resources/img/flags/large/th.jpg new file mode 100644 index 0000000..3cb7233 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/th.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tj.jpg b/protonvpn_linux_gui/resources/img/flags/large/tj.jpg new file mode 100644 index 0000000..3a07ac8 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tj.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tl.jpg b/protonvpn_linux_gui/resources/img/flags/large/tl.jpg new file mode 100644 index 0000000..d5b470e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tl.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tm.jpg b/protonvpn_linux_gui/resources/img/flags/large/tm.jpg new file mode 100644 index 0000000..1f8c477 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tn.jpg b/protonvpn_linux_gui/resources/img/flags/large/tn.jpg new file mode 100644 index 0000000..70e48eb Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/to.jpg b/protonvpn_linux_gui/resources/img/flags/large/to.jpg new file mode 100644 index 0000000..da10eb2 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/to.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tr.jpg b/protonvpn_linux_gui/resources/img/flags/large/tr.jpg new file mode 100644 index 0000000..4a2247d Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tr.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tt.jpg b/protonvpn_linux_gui/resources/img/flags/large/tt.jpg new file mode 100644 index 0000000..6f626bc Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tt.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tv.jpg b/protonvpn_linux_gui/resources/img/flags/large/tv.jpg new file mode 100644 index 0000000..a21912f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tv.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tw.jpg b/protonvpn_linux_gui/resources/img/flags/large/tw.jpg new file mode 100644 index 0000000..1d1ddd3 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tw.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/tz.jpg b/protonvpn_linux_gui/resources/img/flags/large/tz.jpg new file mode 100644 index 0000000..204bc80 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/tz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ua.jpg b/protonvpn_linux_gui/resources/img/flags/large/ua.jpg new file mode 100644 index 0000000..f2e575e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ua.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ug.jpg b/protonvpn_linux_gui/resources/img/flags/large/ug.jpg new file mode 100644 index 0000000..30abd62 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ug.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/us.jpg b/protonvpn_linux_gui/resources/img/flags/large/us.jpg new file mode 100644 index 0000000..c6f437f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/us.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/uy.jpg b/protonvpn_linux_gui/resources/img/flags/large/uy.jpg new file mode 100644 index 0000000..61e572f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/uy.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/uz.jpg b/protonvpn_linux_gui/resources/img/flags/large/uz.jpg new file mode 100644 index 0000000..acb9da4 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/uz.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/va.jpg b/protonvpn_linux_gui/resources/img/flags/large/va.jpg new file mode 100644 index 0000000..8e1e43a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/va.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/vc.jpg b/protonvpn_linux_gui/resources/img/flags/large/vc.jpg new file mode 100644 index 0000000..6776ecb Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/vc.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ve.jpg b/protonvpn_linux_gui/resources/img/flags/large/ve.jpg new file mode 100644 index 0000000..60e0681 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ve.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/vn.jpg b/protonvpn_linux_gui/resources/img/flags/large/vn.jpg new file mode 100644 index 0000000..6f1f98c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/vn.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/vu.jpg b/protonvpn_linux_gui/resources/img/flags/large/vu.jpg new file mode 100644 index 0000000..2f6a58a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/vu.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ws.jpg b/protonvpn_linux_gui/resources/img/flags/large/ws.jpg new file mode 100644 index 0000000..bf2bb5f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ws.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/xk.jpg b/protonvpn_linux_gui/resources/img/flags/large/xk.jpg new file mode 100644 index 0000000..527fa5c Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/xk.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/ye.jpg b/protonvpn_linux_gui/resources/img/flags/large/ye.jpg new file mode 100644 index 0000000..724dcdb Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/ye.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/za.jpg b/protonvpn_linux_gui/resources/img/flags/large/za.jpg new file mode 100644 index 0000000..0f45e5f Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/za.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/zm.jpg b/protonvpn_linux_gui/resources/img/flags/large/zm.jpg new file mode 100644 index 0000000..de4ada9 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/zm.jpg differ diff --git a/protonvpn_linux_gui/resources/img/flags/large/zw.jpg b/protonvpn_linux_gui/resources/img/flags/large/zw.jpg new file mode 100644 index 0000000..7c3c7f2 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/flags/large/zw.jpg differ diff --git a/protonvpn_linux_gui/resources/flags/Afghanistan.png b/protonvpn_linux_gui/resources/img/flags/small/Afghanistan.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Afghanistan.png rename to protonvpn_linux_gui/resources/img/flags/small/Afghanistan.png diff --git a/protonvpn_linux_gui/resources/flags/Albania.png b/protonvpn_linux_gui/resources/img/flags/small/Albania.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Albania.png rename to protonvpn_linux_gui/resources/img/flags/small/Albania.png diff --git a/protonvpn_linux_gui/resources/flags/Algeria.png b/protonvpn_linux_gui/resources/img/flags/small/Algeria.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Algeria.png rename to protonvpn_linux_gui/resources/img/flags/small/Algeria.png diff --git a/protonvpn_linux_gui/resources/flags/Andorra.png b/protonvpn_linux_gui/resources/img/flags/small/Andorra.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Andorra.png rename to protonvpn_linux_gui/resources/img/flags/small/Andorra.png diff --git a/protonvpn_linux_gui/resources/flags/Argentina.png b/protonvpn_linux_gui/resources/img/flags/small/Argentina.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Argentina.png rename to protonvpn_linux_gui/resources/img/flags/small/Argentina.png diff --git a/protonvpn_linux_gui/resources/flags/Armenia.png b/protonvpn_linux_gui/resources/img/flags/small/Armenia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Armenia.png rename to protonvpn_linux_gui/resources/img/flags/small/Armenia.png diff --git a/protonvpn_linux_gui/resources/flags/Australia.png b/protonvpn_linux_gui/resources/img/flags/small/Australia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Australia.png rename to protonvpn_linux_gui/resources/img/flags/small/Australia.png diff --git a/protonvpn_linux_gui/resources/flags/Austria.png b/protonvpn_linux_gui/resources/img/flags/small/Austria.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Austria.png rename to protonvpn_linux_gui/resources/img/flags/small/Austria.png diff --git a/protonvpn_linux_gui/resources/flags/Azerbaijan.png b/protonvpn_linux_gui/resources/img/flags/small/Azerbaijan.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Azerbaijan.png rename to protonvpn_linux_gui/resources/img/flags/small/Azerbaijan.png diff --git a/protonvpn_linux_gui/resources/flags/Bahamas.png b/protonvpn_linux_gui/resources/img/flags/small/Bahamas.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Bahamas.png rename to protonvpn_linux_gui/resources/img/flags/small/Bahamas.png diff --git a/protonvpn_linux_gui/resources/flags/Bangladesh.png b/protonvpn_linux_gui/resources/img/flags/small/Bangladesh.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Bangladesh.png rename to protonvpn_linux_gui/resources/img/flags/small/Bangladesh.png diff --git a/protonvpn_linux_gui/resources/flags/Belarus.png b/protonvpn_linux_gui/resources/img/flags/small/Belarus.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Belarus.png rename to protonvpn_linux_gui/resources/img/flags/small/Belarus.png diff --git a/protonvpn_linux_gui/resources/flags/Belgium.png b/protonvpn_linux_gui/resources/img/flags/small/Belgium.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Belgium.png rename to protonvpn_linux_gui/resources/img/flags/small/Belgium.png diff --git a/protonvpn_linux_gui/resources/flags/Bosnia and Herzegovina.png b/protonvpn_linux_gui/resources/img/flags/small/Bosnia and Herzegovina.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Bosnia and Herzegovina.png rename to protonvpn_linux_gui/resources/img/flags/small/Bosnia and Herzegovina.png diff --git a/protonvpn_linux_gui/resources/flags/Brazil.png b/protonvpn_linux_gui/resources/img/flags/small/Brazil.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Brazil.png rename to protonvpn_linux_gui/resources/img/flags/small/Brazil.png diff --git a/protonvpn_linux_gui/resources/flags/Bulgaria.png b/protonvpn_linux_gui/resources/img/flags/small/Bulgaria.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Bulgaria.png rename to protonvpn_linux_gui/resources/img/flags/small/Bulgaria.png diff --git a/protonvpn_linux_gui/resources/flags/Cameroon.png b/protonvpn_linux_gui/resources/img/flags/small/Cameroon.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Cameroon.png rename to protonvpn_linux_gui/resources/img/flags/small/Cameroon.png diff --git a/protonvpn_linux_gui/resources/flags/Canada.png b/protonvpn_linux_gui/resources/img/flags/small/Canada.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Canada.png rename to protonvpn_linux_gui/resources/img/flags/small/Canada.png diff --git a/protonvpn_linux_gui/resources/flags/Chile.png b/protonvpn_linux_gui/resources/img/flags/small/Chile.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Chile.png rename to protonvpn_linux_gui/resources/img/flags/small/Chile.png diff --git a/protonvpn_linux_gui/resources/flags/China.png b/protonvpn_linux_gui/resources/img/flags/small/China.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/China.png rename to protonvpn_linux_gui/resources/img/flags/small/China.png diff --git a/protonvpn_linux_gui/resources/flags/Colombia.png b/protonvpn_linux_gui/resources/img/flags/small/Colombia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Colombia.png rename to protonvpn_linux_gui/resources/img/flags/small/Colombia.png diff --git a/protonvpn_linux_gui/resources/flags/Costa Rica.png b/protonvpn_linux_gui/resources/img/flags/small/Costa Rica.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Costa Rica.png rename to protonvpn_linux_gui/resources/img/flags/small/Costa Rica.png diff --git a/protonvpn_linux_gui/resources/flags/Croatia.png b/protonvpn_linux_gui/resources/img/flags/small/Croatia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Croatia.png rename to protonvpn_linux_gui/resources/img/flags/small/Croatia.png diff --git a/protonvpn_linux_gui/resources/flags/Cuba.png b/protonvpn_linux_gui/resources/img/flags/small/Cuba.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Cuba.png rename to protonvpn_linux_gui/resources/img/flags/small/Cuba.png diff --git a/protonvpn_linux_gui/resources/flags/Cyprus.png b/protonvpn_linux_gui/resources/img/flags/small/Cyprus.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Cyprus.png rename to protonvpn_linux_gui/resources/img/flags/small/Cyprus.png diff --git a/protonvpn_linux_gui/resources/flags/Czech Republic.png b/protonvpn_linux_gui/resources/img/flags/small/Czech Republic.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Czech Republic.png rename to protonvpn_linux_gui/resources/img/flags/small/Czech Republic.png diff --git a/protonvpn_linux_gui/resources/flags/Denmark.png b/protonvpn_linux_gui/resources/img/flags/small/Denmark.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Denmark.png rename to protonvpn_linux_gui/resources/img/flags/small/Denmark.png diff --git a/protonvpn_linux_gui/resources/flags/Ecuador.png b/protonvpn_linux_gui/resources/img/flags/small/Ecuador.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Ecuador.png rename to protonvpn_linux_gui/resources/img/flags/small/Ecuador.png diff --git a/protonvpn_linux_gui/resources/flags/Egypt.png b/protonvpn_linux_gui/resources/img/flags/small/Egypt.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Egypt.png rename to protonvpn_linux_gui/resources/img/flags/small/Egypt.png diff --git a/protonvpn_linux_gui/resources/flags/Estonia.png b/protonvpn_linux_gui/resources/img/flags/small/Estonia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Estonia.png rename to protonvpn_linux_gui/resources/img/flags/small/Estonia.png diff --git a/protonvpn_linux_gui/resources/flags/Finland.png b/protonvpn_linux_gui/resources/img/flags/small/Finland.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Finland.png rename to protonvpn_linux_gui/resources/img/flags/small/Finland.png diff --git a/protonvpn_linux_gui/resources/flags/France.png b/protonvpn_linux_gui/resources/img/flags/small/France.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/France.png rename to protonvpn_linux_gui/resources/img/flags/small/France.png diff --git a/protonvpn_linux_gui/resources/flags/Georgia.png b/protonvpn_linux_gui/resources/img/flags/small/Georgia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Georgia.png rename to protonvpn_linux_gui/resources/img/flags/small/Georgia.png diff --git a/protonvpn_linux_gui/resources/flags/Germany.png b/protonvpn_linux_gui/resources/img/flags/small/Germany.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Germany.png rename to protonvpn_linux_gui/resources/img/flags/small/Germany.png diff --git a/protonvpn_linux_gui/resources/flags/Greece.png b/protonvpn_linux_gui/resources/img/flags/small/Greece.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Greece.png rename to protonvpn_linux_gui/resources/img/flags/small/Greece.png diff --git a/protonvpn_linux_gui/resources/flags/Hong Kong.png b/protonvpn_linux_gui/resources/img/flags/small/Hong Kong.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Hong Kong.png rename to protonvpn_linux_gui/resources/img/flags/small/Hong Kong.png diff --git a/protonvpn_linux_gui/resources/flags/Hungary.png b/protonvpn_linux_gui/resources/img/flags/small/Hungary.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Hungary.png rename to protonvpn_linux_gui/resources/img/flags/small/Hungary.png diff --git a/protonvpn_linux_gui/resources/flags/Iceland.png b/protonvpn_linux_gui/resources/img/flags/small/Iceland.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Iceland.png rename to protonvpn_linux_gui/resources/img/flags/small/Iceland.png diff --git a/protonvpn_linux_gui/resources/flags/India.png b/protonvpn_linux_gui/resources/img/flags/small/India.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/India.png rename to protonvpn_linux_gui/resources/img/flags/small/India.png diff --git a/protonvpn_linux_gui/resources/flags/Indonesia.png b/protonvpn_linux_gui/resources/img/flags/small/Indonesia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Indonesia.png rename to protonvpn_linux_gui/resources/img/flags/small/Indonesia.png diff --git a/protonvpn_linux_gui/resources/flags/Ireland.png b/protonvpn_linux_gui/resources/img/flags/small/Ireland.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Ireland.png rename to protonvpn_linux_gui/resources/img/flags/small/Ireland.png diff --git a/protonvpn_linux_gui/resources/flags/Israel.png b/protonvpn_linux_gui/resources/img/flags/small/Israel.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Israel.png rename to protonvpn_linux_gui/resources/img/flags/small/Israel.png diff --git a/protonvpn_linux_gui/resources/flags/Italy.png b/protonvpn_linux_gui/resources/img/flags/small/Italy.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Italy.png rename to protonvpn_linux_gui/resources/img/flags/small/Italy.png diff --git a/protonvpn_linux_gui/resources/flags/Jamaica.png b/protonvpn_linux_gui/resources/img/flags/small/Jamaica.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Jamaica.png rename to protonvpn_linux_gui/resources/img/flags/small/Jamaica.png diff --git a/protonvpn_linux_gui/resources/flags/Japan.png b/protonvpn_linux_gui/resources/img/flags/small/Japan.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Japan.png rename to protonvpn_linux_gui/resources/img/flags/small/Japan.png diff --git a/protonvpn_linux_gui/resources/flags/Latvia.png b/protonvpn_linux_gui/resources/img/flags/small/Latvia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Latvia.png rename to protonvpn_linux_gui/resources/img/flags/small/Latvia.png diff --git a/protonvpn_linux_gui/resources/flags/Libya.png b/protonvpn_linux_gui/resources/img/flags/small/Libya.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Libya.png rename to protonvpn_linux_gui/resources/img/flags/small/Libya.png diff --git a/protonvpn_linux_gui/resources/flags/Lithuania.png b/protonvpn_linux_gui/resources/img/flags/small/Lithuania.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Lithuania.png rename to protonvpn_linux_gui/resources/img/flags/small/Lithuania.png diff --git a/protonvpn_linux_gui/resources/flags/Luxembourg.png b/protonvpn_linux_gui/resources/img/flags/small/Luxembourg.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Luxembourg.png rename to protonvpn_linux_gui/resources/img/flags/small/Luxembourg.png diff --git a/protonvpn_linux_gui/resources/flags/Macedonia, Republic of.png b/protonvpn_linux_gui/resources/img/flags/small/Macedonia, Republic of.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Macedonia, Republic of.png rename to protonvpn_linux_gui/resources/img/flags/small/Macedonia, Republic of.png diff --git a/protonvpn_linux_gui/resources/flags/Malaysia.png b/protonvpn_linux_gui/resources/img/flags/small/Malaysia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Malaysia.png rename to protonvpn_linux_gui/resources/img/flags/small/Malaysia.png diff --git a/protonvpn_linux_gui/resources/flags/Mexico.png b/protonvpn_linux_gui/resources/img/flags/small/Mexico.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Mexico.png rename to protonvpn_linux_gui/resources/img/flags/small/Mexico.png diff --git a/protonvpn_linux_gui/resources/flags/Moldova.png b/protonvpn_linux_gui/resources/img/flags/small/Moldova.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Moldova.png rename to protonvpn_linux_gui/resources/img/flags/small/Moldova.png diff --git a/protonvpn_linux_gui/resources/flags/Myanmar.png b/protonvpn_linux_gui/resources/img/flags/small/Myanmar.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Myanmar.png rename to protonvpn_linux_gui/resources/img/flags/small/Myanmar.png diff --git a/protonvpn_linux_gui/resources/flags/Netherlands.png b/protonvpn_linux_gui/resources/img/flags/small/Netherlands.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Netherlands.png rename to protonvpn_linux_gui/resources/img/flags/small/Netherlands.png diff --git a/protonvpn_linux_gui/resources/flags/New Zealand.png b/protonvpn_linux_gui/resources/img/flags/small/New Zealand.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/New Zealand.png rename to protonvpn_linux_gui/resources/img/flags/small/New Zealand.png diff --git a/protonvpn_linux_gui/resources/flags/Norway.png b/protonvpn_linux_gui/resources/img/flags/small/Norway.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Norway.png rename to protonvpn_linux_gui/resources/img/flags/small/Norway.png diff --git a/protonvpn_linux_gui/resources/flags/Philippines.png b/protonvpn_linux_gui/resources/img/flags/small/Philippines.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Philippines.png rename to protonvpn_linux_gui/resources/img/flags/small/Philippines.png diff --git a/protonvpn_linux_gui/resources/flags/Poland.png b/protonvpn_linux_gui/resources/img/flags/small/Poland.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Poland.png rename to protonvpn_linux_gui/resources/img/flags/small/Poland.png diff --git a/protonvpn_linux_gui/resources/flags/Portugal.png b/protonvpn_linux_gui/resources/img/flags/small/Portugal.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Portugal.png rename to protonvpn_linux_gui/resources/img/flags/small/Portugal.png diff --git a/protonvpn_linux_gui/resources/flags/Romania.png b/protonvpn_linux_gui/resources/img/flags/small/Romania.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Romania.png rename to protonvpn_linux_gui/resources/img/flags/small/Romania.png diff --git a/protonvpn_linux_gui/resources/flags/Russia.png b/protonvpn_linux_gui/resources/img/flags/small/Russia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Russia.png rename to protonvpn_linux_gui/resources/img/flags/small/Russia.png diff --git a/protonvpn_linux_gui/resources/flags/Serbia.png b/protonvpn_linux_gui/resources/img/flags/small/Serbia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Serbia.png rename to protonvpn_linux_gui/resources/img/flags/small/Serbia.png diff --git a/protonvpn_linux_gui/resources/flags/Singapore.png b/protonvpn_linux_gui/resources/img/flags/small/Singapore.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Singapore.png rename to protonvpn_linux_gui/resources/img/flags/small/Singapore.png diff --git a/protonvpn_linux_gui/resources/flags/Slovakia.png b/protonvpn_linux_gui/resources/img/flags/small/Slovakia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Slovakia.png rename to protonvpn_linux_gui/resources/img/flags/small/Slovakia.png diff --git a/protonvpn_linux_gui/resources/flags/Slovenia.png b/protonvpn_linux_gui/resources/img/flags/small/Slovenia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Slovenia.png rename to protonvpn_linux_gui/resources/img/flags/small/Slovenia.png diff --git a/protonvpn_linux_gui/resources/flags/South Africa.png b/protonvpn_linux_gui/resources/img/flags/small/South Africa.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/South Africa.png rename to protonvpn_linux_gui/resources/img/flags/small/South Africa.png diff --git a/protonvpn_linux_gui/resources/flags/South Korea.png b/protonvpn_linux_gui/resources/img/flags/small/South Korea.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/South Korea.png rename to protonvpn_linux_gui/resources/img/flags/small/South Korea.png diff --git a/protonvpn_linux_gui/resources/flags/Spain.png b/protonvpn_linux_gui/resources/img/flags/small/Spain.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Spain.png rename to protonvpn_linux_gui/resources/img/flags/small/Spain.png diff --git a/protonvpn_linux_gui/resources/flags/Sweden.png b/protonvpn_linux_gui/resources/img/flags/small/Sweden.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Sweden.png rename to protonvpn_linux_gui/resources/img/flags/small/Sweden.png diff --git a/protonvpn_linux_gui/resources/flags/Switzerland.png b/protonvpn_linux_gui/resources/img/flags/small/Switzerland.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Switzerland.png rename to protonvpn_linux_gui/resources/img/flags/small/Switzerland.png diff --git a/protonvpn_linux_gui/resources/flags/Taiwan.png b/protonvpn_linux_gui/resources/img/flags/small/Taiwan.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Taiwan.png rename to protonvpn_linux_gui/resources/img/flags/small/Taiwan.png diff --git a/protonvpn_linux_gui/resources/flags/Thailand.png b/protonvpn_linux_gui/resources/img/flags/small/Thailand.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Thailand.png rename to protonvpn_linux_gui/resources/img/flags/small/Thailand.png diff --git a/protonvpn_linux_gui/resources/flags/Tunisia.png b/protonvpn_linux_gui/resources/img/flags/small/Tunisia.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Tunisia.png rename to protonvpn_linux_gui/resources/img/flags/small/Tunisia.png diff --git a/protonvpn_linux_gui/resources/flags/Turkey.png b/protonvpn_linux_gui/resources/img/flags/small/Turkey.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Turkey.png rename to protonvpn_linux_gui/resources/img/flags/small/Turkey.png diff --git a/protonvpn_linux_gui/resources/flags/Ukraine.png b/protonvpn_linux_gui/resources/img/flags/small/Ukraine.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Ukraine.png rename to protonvpn_linux_gui/resources/img/flags/small/Ukraine.png diff --git a/protonvpn_linux_gui/resources/flags/United Arab Emirates.png b/protonvpn_linux_gui/resources/img/flags/small/United Arab Emirates.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/United Arab Emirates.png rename to protonvpn_linux_gui/resources/img/flags/small/United Arab Emirates.png diff --git a/protonvpn_linux_gui/resources/flags/United Kingdom.png b/protonvpn_linux_gui/resources/img/flags/small/United Kingdom.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/United Kingdom.png rename to protonvpn_linux_gui/resources/img/flags/small/United Kingdom.png diff --git a/protonvpn_linux_gui/resources/flags/United States.png b/protonvpn_linux_gui/resources/img/flags/small/United States.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/United States.png rename to protonvpn_linux_gui/resources/img/flags/small/United States.png diff --git a/protonvpn_linux_gui/resources/flags/Unknown.png b/protonvpn_linux_gui/resources/img/flags/small/Unknown.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Unknown.png rename to protonvpn_linux_gui/resources/img/flags/small/Unknown.png diff --git a/protonvpn_linux_gui/resources/flags/Viet Nam.png b/protonvpn_linux_gui/resources/img/flags/small/Viet Nam.png similarity index 100% rename from protonvpn_linux_gui/resources/flags/Viet Nam.png rename to protonvpn_linux_gui/resources/img/flags/small/Viet Nam.png diff --git a/protonvpn_linux_gui/resources/img/flags/small/__init__.py b/protonvpn_linux_gui/resources/img/flags/small/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/protonvpn_linux_gui/resources/img/logo/__init__.py b/protonvpn_linux_gui/resources/img/logo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/protonvpn_linux_gui/resources/img/logo/protonvpn-logo-white.png b/protonvpn_linux_gui/resources/img/logo/protonvpn-logo-white.png new file mode 100644 index 0000000..7088c5e Binary files /dev/null and b/protonvpn_linux_gui/resources/img/logo/protonvpn-logo-white.png differ diff --git a/protonvpn_linux_gui/resources/protonvpn_logo.png b/protonvpn_linux_gui/resources/img/logo/protonvpn_logo.png similarity index 100% rename from protonvpn_linux_gui/resources/protonvpn_logo.png rename to protonvpn_linux_gui/resources/img/logo/protonvpn_logo.png diff --git a/protonvpn_linux_gui/resources/protonvpn_logo_alt.png b/protonvpn_linux_gui/resources/img/logo/protonvpn_logo_alt.png similarity index 100% rename from protonvpn_linux_gui/resources/protonvpn_logo_alt.png rename to protonvpn_linux_gui/resources/img/logo/protonvpn_logo_alt.png diff --git a/protonvpn_linux_gui/resources/protonvpn_logo_full.png b/protonvpn_linux_gui/resources/img/logo/protonvpn_logo_full.png similarity index 100% rename from protonvpn_linux_gui/resources/protonvpn_logo_full.png rename to protonvpn_linux_gui/resources/img/logo/protonvpn_logo_full.png diff --git a/protonvpn_linux_gui/resources/img/logo/protonvpn_sign_green.png b/protonvpn_linux_gui/resources/img/logo/protonvpn_sign_green.png new file mode 100644 index 0000000..2c622fa Binary files /dev/null and b/protonvpn_linux_gui/resources/img/logo/protonvpn_sign_green.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/__init__.py b/protonvpn_linux_gui/resources/img/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/protonvpn_linux_gui/resources/img/utils/bitrate-download-arrow.png b/protonvpn_linux_gui/resources/img/utils/bitrate-download-arrow.png new file mode 100644 index 0000000..5c02402 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/bitrate-download-arrow.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/bitrate-upload-arrow.png b/protonvpn_linux_gui/resources/img/utils/bitrate-upload-arrow.png new file mode 100644 index 0000000..15a11c0 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/bitrate-upload-arrow.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/fastest.png b/protonvpn_linux_gui/resources/img/utils/fastest.png new file mode 100644 index 0000000..1d915e7 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/fastest.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/hamburger-menu-icon (copy).png b/protonvpn_linux_gui/resources/img/utils/hamburger-menu-icon (copy).png new file mode 100644 index 0000000..cdb21f3 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/hamburger-menu-icon (copy).png differ diff --git a/protonvpn_linux_gui/resources/img/utils/hamburger-menu-icon.png b/protonvpn_linux_gui/resources/img/utils/hamburger-menu-icon.png new file mode 100644 index 0000000..1f4dc72 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/hamburger-menu-icon.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/info-green.png b/protonvpn_linux_gui/resources/img/utils/info-green.png new file mode 100644 index 0000000..e67e83a Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/info-green.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/normal.png b/protonvpn_linux_gui/resources/img/utils/normal.png new file mode 100755 index 0000000..74e9147 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/normal.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/p2p-arrows.png b/protonvpn_linux_gui/resources/img/utils/p2p-arrows.png new file mode 100755 index 0000000..089e026 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/p2p-arrows.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/plus-server.png b/protonvpn_linux_gui/resources/img/utils/plus-server.png new file mode 100755 index 0000000..bd008f5 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/plus-server.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/random.png b/protonvpn_linux_gui/resources/img/utils/random.png new file mode 100644 index 0000000..88afef9 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/random.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/search.png b/protonvpn_linux_gui/resources/img/utils/search.png new file mode 100644 index 0000000..e28e0b6 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/search.png differ diff --git a/protonvpn_linux_gui/resources/img/utils/tor-onion.png b/protonvpn_linux_gui/resources/img/utils/tor-onion.png new file mode 100755 index 0000000..a383c35 Binary files /dev/null and b/protonvpn_linux_gui/resources/img/utils/tor-onion.png differ diff --git a/protonvpn_linux_gui/resources/main.css b/protonvpn_linux_gui/resources/main.css new file mode 100644 index 0000000..a6408d8 --- /dev/null +++ b/protonvpn_linux_gui/resources/main.css @@ -0,0 +1,174 @@ +headerbar.default-decoration { + padding-top: 3px; + padding-bottom: 3px; + min-height: 0px; + font-size: 0.8em; + background-color: green; +} + +.default_background{ + background-color: rgba(62, 68, 73, 1); + color: white; +} +.overlay_background{ + background-color: rgba(52, 58, 63, 1); + color: white; +} + +.white_text{ + color: white; +} + +.top_menu_hamburger{ + margin-top: 2px; + margin-bottom: 2px; +} + +.text_hamburger_identation{ + margin-left: -20px; +} + +.initialize_profile_btn{ + background-color: transparent; + color: white; + padding: 10px 50px; + border-style: solid; + border-width: 2px; + border-radius: 20px; + transition: all .115s ease-in-out; +} + +.initialize_profile_btn:hover { + border-color: transparent; + background-color: rgb(86, 179, 102); +} + + +.banner_shadow{ + box-shadow: 64px 64px 12px 40px rgba(0,0,0,0.4); +} + +.default_main_tab_conf{ + padding: 20px 70px; + background-color: red; + color: white; + margin-top: -6px; + margin-bottom: -6px; + transition: all .115s ease-in-out; +} + +.test{ + background-color: red; + color: red; +} +.active_tab{ + color: white; + background-color: rgba(62, 68, 73, 1); +} + +.inactive_tab{ + background-color: rgba(55, 61, 66, 1); + color: gray; +} + +.left_tab{ + /* border-top-right-radius: 80px; */ + margin-left: -20px; + margin-right: -25px; + +} +.right_tab{ + /* border-top-left-radius: 80px; */ + margin-right: -20px; +} + +.countries_content_style{ + padding: 5px 10px; + /* transition: all 5s ease-in-out; */ +} + +.profiles_tab_content{ + padding: 10px 15px; +} + +.profile_grid{ + padding: 20px; +} + +.profile_buttons{ + padding: 5px 5px; + color: white; + background-color: rgba(68, 73, 78, 1); +} + +.server_list_bakground_row_selected{ + background-color: black; +} + +.server_list_bakground_row:hover, .menu_list_hover:hover{ + background-color: rgb(86, 179, 102); +} + +/* +|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +----------------------- Settings Window ----------------------- +||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +*/ + +.settings_label_bg{ + background-color: rgba(45, 51, 56, 1); +} +.settings_label{ + padding: 30px 50px; +} + +.settings_notebook_grid{ + padding: 30px 100px; + padding-bottom: 200px; +} + +.default_settings_tab_conf{ + padding: 15px 40px; + /* background-color: transparent; */ + margin-top: -6px; + margin-bottom: -6px; + transition: all .115s ease-in-out; +} + +.settings_left_tab{ + /* border-top-left-radius: 20px; */ + /* border-top-right-radius: 20px; */ + margin-left: -20px; + /* padding-right: 60px; */ +} + +.settings_center_left_tab{ + margin-left: -24px; + /* border-top-left-radius: 20px; + border-top-right-radius: 20px; */ +} +.settings_center_right_tab{ + margin-left: -24px; + /* border-top-left-radius: 20px; + border-top-right-radius: 20px; */ +} + +.settings_right_tab{ + /* border-top-left-radius: 20px; */ + /* border-top-right-radius: 20px; */ + margin-left: -24px; + margin-right: -20px; + /* padding-left: 60px; */ +} + +.split_tunnling_list{ + background-color: rgba(52, 58, 63, 1); + color: white; + padding: 10px 10px; + /* border-radius: 5px; */ +} +.split_tunnling_list text{ + background-color: rgba(52, 58, 63, 1); + color: white; + /* border-radius: 5px; */ +} diff --git a/protonvpn_linux_gui/resources/main.glade b/protonvpn_linux_gui/resources/main.glade index 343baab..3956cda 100644 --- a/protonvpn_linux_gui/resources/main.glade +++ b/protonvpn_linux_gui/resources/main.glade @@ -1,36 +1,204 @@ - +