EVO-melroy-winegui/include/main_window.h

195 lines
10 KiB
C++

/**
* Copyright (c) 2019-2024 WineGUI
*
* \file main_window.h
* \brief Main WineGUI window
* \author Melroy van den Berg <webmaster1989@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "app_list_model_column.h"
#include "app_list_struct.h"
#include "bottle_item.h"
#include "bottle_new_assistant.h"
#include "busy_dialog.h"
#include "general_config_struct.h"
#include "menu.h"
#include <gtkmm.h>
#include <iostream>
#include <list>
#include <string>
#include <thread>
using std::cout;
using std::endl;
using std::string;
/**
* \class MainWindow
* \brief Main GTK+ Window class
*/
class MainWindow : public Gtk::Window
{
public:
// Signals
sigc::signal<void, Glib::ustring&> finished_new_bottle; /*!< Finished signal after the bottle is created, with the new bottle name */
sigc::signal<void, BottleItem*> active_bottle; /*!< Set the active bottle in manager, based on the selected bottle */
sigc::signal<void> show_edit_window; /*!< show Edit window signal */
sigc::signal<void> show_clone_window; /*!< show Clone window signal */
sigc::signal<void> show_configure_window; /*!< show Settings window signal */
sigc::signal<void> show_add_app_window; /*!< show add application window signal */
sigc::signal<void> show_remove_app_window; /*!< show remove application window signal */
sigc::signal<void, Glib::ustring&, BottleTypes::Windows, BottleTypes::Bit, Glib::ustring&, bool&, BottleTypes::AudioDriver>
new_bottle; /*!< Create new Wine Bottle Signal */
sigc::signal<void, string, bool> run_executable; /*!< Run an EXE or MSI application in Wine with provided filename */
sigc::signal<void, string> run_program; /*!< Run program in Wine */
sigc::signal<void> open_c_drive; /*!< Open C: drive signal */
sigc::signal<void> reboot_bottle; /*!< Emulate reboot signal */
sigc::signal<void> update_bottle; /*!< Update Wine bottle signal */
sigc::signal<void> open_log_file; /*!< Open log file signal */
sigc::signal<void> kill_running_processes; /*!< Kill all running processes signal */
sigc::signal<bool, GdkEventButton*> right_click_menu; /*!< Right-mouse click in list box signal */
explicit MainWindow(Menu& menu);
virtual ~MainWindow();
void set_wine_bottles(std::list<BottleItem>& bottles);
void select_row_bottle(BottleItem& bottle);
void reset_detailed_info();
void reset_application_list();
void set_general_config(const GeneralConfigData& config_data);
void show_info_message(const Glib::ustring& message, bool markup = false);
void show_warning_message(const Glib::ustring& message, bool markup = false);
void show_error_message(const Glib::ustring& message, bool markup = false);
bool show_confirm_dialog(const Glib::ustring& message, bool markup = false);
void show_busy_install_dialog(const Glib::ustring& message);
void show_busy_install_dialog(Gtk::Window& parent, const Glib::ustring& message);
void close_busy_dialog();
// Signal handlers
virtual void on_new_bottle_button_clicked();
virtual void on_new_bottle_created();
virtual void on_run_button_clicked();
virtual void on_refresh_app_list_button_clicked();
virtual void on_hide_window();
virtual void on_give_feedback();
virtual void on_check_version();
virtual void on_exec_failure();
protected:
// Signal handlers
void on_error_message_check_version();
void on_info_message_check_version();
void on_new_version_available();
bool on_delete_window(GdkEventAny* any_event);
Glib::RefPtr<Gio::Settings> window_settings; /*!< Window settings to store our window settings, even during restarts */
AppListModelColumns app_list_columns; /*!< Application list model columns for app tree view */
// Child widgets
Gtk::Box vbox; /*!< The main vertical box */
Gtk::Paned paned; /*!< The main paned panel (horizontal) */
// Left widgets
Gtk::ScrolledWindow scrolled_window_listbox; /*!< Scrolled Window container, which contains the listbox */
Gtk::ListBox listbox; /*!< Listbox in the left panel */
// Right widgets
Gtk::ScrolledWindow detail_grid_scrolled_window_detail; /*!< Scrolled Window container for the detail grid */
Gtk::ScrolledWindow app_list_scrolled_window; /*!< Scrolled Window container for app list */
Gtk::Box right_vbox; /*!< Right panel vertical box */
Gtk::Box app_list_vbox; /*!< Application list vertical box */
Gtk::Box app_list_top_hbox; /*!< Horizontal box above the app list */
Gtk::SearchEntry app_list_search_entry; /*!< Application list search entry */
Gtk::Paned container_paned; /*!< Main container horizontal paned panel */
Glib::RefPtr<Gtk::ListStore> app_list_tree_model; /*!< Application list tree model (using a liststore) */
Glib::RefPtr<Gtk::TreeModelFilter> app_list_filter; /*!< Tree model filter for app list */
Gtk::Toolbar toolbar; /*!< Toolbar at top */
Gtk::Separator separator1; /*!< Separator */
Gtk::Grid detail_grid; /*!< Grid layout container to have multiple rows & columns below the toolbar */
Gtk::TreeView application_list_treeview; /*!< List of applications put inside a tree view */
// Test
Gtk::CellRendererText name_desc_renderer_text;
Gtk::TreeView::Column name_desc_column;
// Detailed info labels on the right panel
Gtk::Label name_label; /*!< Bottle name */
Gtk::Label folder_name_label; /*!< Folder name */
Gtk::Label window_version_label; /*!< Windows version text */
Gtk::Label c_drive_location_label; /*!< C:\ drive location text */
Gtk::Label wine_version_label; /*!< Wine version text */
Gtk::Label wine_location_label; /*!< Wine location text */
Gtk::Label debug_log_level_label; /*!< Debug log level text */
Gtk::Label wine_last_changed_label; /*!< Last changed text */
Gtk::Label audio_driver_label; /*!< Audio driver text */
Gtk::Label virtual_desktop_label; /*!< Virtual desktop text */
Gtk::Label description_label; /*!< description text */
// Toolbar buttons
Gtk::ToolButton new_button; /*!< New toolbar button */
Gtk::ToolButton edit_button; /*!< Edit toolbar button */
Gtk::ToolButton clone_button; /*!< Clone toolbar button */
Gtk::ToolButton configure_button; /*!< Configure toolbar button */
Gtk::ToolButton run_button; /*!< Run... toolbar button */
Gtk::ToolButton open_c_driver_button; /*!< Open C:\ drive toolbar button */
Gtk::ToolButton reboot_button; /*!< Reboot toolbar button */
Gtk::ToolButton update_button; /*!< Update toolbar button */
Gtk::ToolButton open_log_file_button; /*!< Open log file toolbar button */
Gtk::ToolButton kill_processes_button; /*!< Kill processes toolbar button */
// Other various buttons
Gtk::Button add_app_list_button; /*!< Button that add shortcut item to application list */
Gtk::Button remove_app_list_button; /*!< Button that remove shortcut item to application list */
Gtk::Button refresh_app_list_button; /*!< Button that refreshes the application list */
// Busy dialog
BusyDialog busy_dialog_; /*!< Busy dialog, when the user should wait until install is finished */
private:
mutable std::mutex info_message_mutex_; /*!< Synchronizes access to info message using mutex */
mutable std::mutex error_message_mutex_; /*!< Synchronizes access to error message using mutex */
mutable std::mutex new_version_mutex_; /*!< Synchronizes access to new version using mutex */
Glib::ustring info_message_;
Glib::ustring error_message_;
string new_version_;
BottleNewAssistant new_bottle_assistant_; /*!< New bottle wizard (behind the "new" toolbar button) */
GeneralConfigData general_config_data_;
std::thread* thread_check_version_; /*!< Thread for checking version */
// Dispatchers for handling signals from the thread towards a GUI thread
Glib::Dispatcher error_message_check_version_dispatcher_;
Glib::Dispatcher info_message_check_version_dispatcher_;
Glib::Dispatcher new_version_available_dispatcher_;
Glib::Dispatcher check_version_finished_dispatcher_;
// Signal handlers
virtual void on_bottle_row_clicked(Gtk::ListBoxRow* row);
virtual void on_app_list_changed();
virtual void on_application_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */);
virtual void on_new_bottle_apply();
// Private methods
void set_detailed_info(const BottleItem& bottle);
void set_application_list(const string& prefix_path, const std::map<int, ApplicationData>& app_List);
void add_application(const string& name, const string& description, const string& command, const string& icon_name, bool is_icon_full_path = false);
void cleanup_check_version_thread();
void check_version_update(bool show_equal_or_error = false);
void check_version(bool show_equal_or_error);
void load_stored_window_settings();
void create_left_panel();
void create_right_panel();
void set_sensitive_toolbar_buttons(bool sensitive);
static void cc_list_box_update_header_func(Gtk::ListBoxRow* list_box_row, Gtk::ListBoxRow* before);
bool app_list_visible_func(const Gtk::TreeModel::const_iterator& iter);
void treeview_set_cell_data_name_desc(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter);
};