1
0
Fork 0
mirror of synced 2024-04-27 17:22:13 +12:00

Add about dialog (#226)

This commit is contained in:
Rafał Mikrut 2021-01-24 12:01:02 +01:00 committed by GitHub
parent 052590d246
commit 49ddc041ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 314 additions and 12 deletions

View file

@ -1312,7 +1312,6 @@ fn delete_files(vector: &[FileEntry], delete_method: &DeleteMethod, warnings: &m
}
fn save_hashes_to_file(hashmap: &HashMap<String, FileEntry>, text_messages: &mut Messages, type_of_hash: &HashType) {
println!("Trying to save {} files", hashmap.len());
if let Some(proj_dirs) = ProjectDirs::from("pl", "Qarmin", "Czkawka") {
let cache_dir = PathBuf::from(proj_dirs.cache_dir());
if cache_dir.exists() {

View file

@ -32,6 +32,122 @@ Author: Rafał Mikrut
<!-- interface-name Czkawka -->
<!-- interface-description Czkawka is simple and fast app to find duplicates, empty folders, similar images etc. -->
<!-- interface-authors Rafa\305\202 Mikrut -->
<object class="GtkAboutDialog" id="about_dialog">
<property name="can_focus">False</property>
<property name="window_position">center</property>
<property name="type_hint">dialog</property>
<property name="program_name">Czkawka</property>
<property name="version">2.3.2</property>
<property name="comments" translatable="yes">2020 - 2021 Rafał Mikrut(qarmin)
This program is free to use and will always be.
</property>
<property name="authors">Rafał Mikrut(qarmin)</property>
<property name="logo">data/icons/com.github.qarmin.czkawka.svg</property>
<property name="license_type">mit-x11</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="button_repository">
<property name="label" translatable="yes">Repository</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_instruction">
<property name="label" translatable="yes">Instruction</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_donation">
<property name="label" translatable="yes">Donation</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<placeholder/>
</child>
</object>
<object class="GtkDialog" id="dialog_progress">
<property name="can_focus">False</property>
<property name="type_hint">dialog</property>
@ -2442,6 +2558,7 @@ Author: Rafał Mikrut
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="monospace">True</property>
</object>
</child>
</object>
@ -2455,7 +2572,59 @@ Author: Rafał Mikrut
</object>
</child>
<child type="titlebar">
<placeholder/>
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_close_button">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkButton" id="button_settings">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">settings-app-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_app_info">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">dialog-information</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View file

@ -0,0 +1,30 @@
extern crate gtk;
use crate::gui_data::GuiData;
use gtk::prelude::*;
const SPONSOR_SITE: &str = "https://github.com/sponsors/qarmin";
const REPOSITORY_SITE: &str = "https://github.com/qarmin/czkawka";
const INSTRUCTION_SITE: &str = "https://github.com/qarmin/czkawka/blob/master/instructions/Instruction.md";
pub fn connect_about_buttons(gui_data: &GuiData) {
let button_donation = gui_data.about.button_donation.clone();
button_donation.connect_clicked(move |_| {
if open::that(SPONSOR_SITE).is_err() {
println!("Failed to open sponsor site: {}", SPONSOR_SITE)
};
});
let button_instruction = gui_data.about.button_instruction.clone();
button_instruction.connect_clicked(move |_| {
if open::that(INSTRUCTION_SITE).is_err() {
println!("Failed to open instruction site: {}", INSTRUCTION_SITE)
};
});
let button_repository = gui_data.about.button_repository.clone();
button_repository.connect_clicked(move |_| {
if open::that(REPOSITORY_SITE).is_err() {
println!("Failed to open repository site: {}", REPOSITORY_SITE)
};
});
}

View file

@ -0,0 +1,18 @@
extern crate gtk;
use crate::gui_data::GuiData;
use gtk::prelude::*;
use gtk::{ResponseType, WindowPosition};
pub fn connect_button_about(gui_data: &GuiData) {
let about_dialog = gui_data.about.about_dialog.clone();
let button_app_info = gui_data.header.button_app_info.clone();
button_app_info.connect_clicked(move |_| {
about_dialog.set_position(WindowPosition::Center); // Not working
about_dialog.show();
let response = about_dialog.run();
if response != ResponseType::None {
about_dialog.hide();
}
});
}

View file

@ -0,0 +1,27 @@
use gtk::prelude::*;
#[derive(Clone)]
pub struct GUIAbout {
pub about_dialog: gtk::AboutDialog,
pub button_repository: gtk::Button,
pub button_donation: gtk::Button,
pub button_instruction: gtk::Button,
}
impl GUIAbout {
pub fn create_from_builder(builder: &gtk::Builder) -> Self {
let about_dialog: gtk::AboutDialog = builder.get_object("about_dialog").unwrap();
let button_repository: gtk::Button = builder.get_object("button_repository").unwrap();
let button_donation: gtk::Button = builder.get_object("button_donation").unwrap();
let button_instruction: gtk::Button = builder.get_object("button_instruction").unwrap();
Self {
about_dialog,
button_repository,
button_donation,
button_instruction,
}
}
}

View file

@ -1,6 +1,9 @@
extern crate gtk;
use crate::gui_about::GUIAbout;
use crate::gui_bottom_buttons::GUIBottomButtons;
use crate::gui_header::GUIHeader;
use crate::gui_main_notebook::GUIMainNotebook;
use crate::gui_options::GUIOptions;
use crate::gui_popovers::GUIPopovers;
use crate::gui_progress_dialog::GUIProgressDialog;
use crate::gui_upper_notepad::GUIUpperNotebook;
@ -36,6 +39,9 @@ pub struct GuiData {
pub popovers: GUIPopovers,
pub bottom_buttons: GUIBottomButtons,
pub progress_dialog: GUIProgressDialog,
pub about: GUIAbout,
pub options: GUIOptions,
pub header: GUIHeader,
// Buttons state
pub shared_buttons: Rc<RefCell<HashMap<NotebookMainEnum, HashMap<String, bool>>>>,
@ -83,6 +89,9 @@ impl GuiData {
let popovers = GUIPopovers::create_from_builder(&builder);
let bottom_buttons = GUIBottomButtons::create_from_builder(&builder);
let progress_dialog = GUIProgressDialog::create_from_builder(&builder);
let options = GUIOptions::create_from_builder(&builder);
let about = GUIAbout::create_from_builder(&builder);
let header = GUIHeader::create_from_builder(&builder);
////////////////////////////////////////////////////////////////////////////////////////////////
@ -134,6 +143,7 @@ impl GuiData {
//// Bottom
let text_view_errors: gtk::TextView = builder.get_object("text_view_errors").unwrap();
let scrolled_window_errors: gtk::ScrolledWindow = builder.get_object("scrolled_window_errors").unwrap();
scrolled_window_errors.show_all(); // Not sure why needed, but without it text view errors sometimes hide itself
// Used for sending stop signal to thread
let (stop_sender, stop_receiver): (crossbeam_channel::Sender<()>, crossbeam_channel::Receiver<()>) = unbounded();
@ -147,6 +157,9 @@ impl GuiData {
popovers,
bottom_buttons,
progress_dialog,
about,
options,
header,
shared_buttons,
shared_upper_notebooks,
shared_duplication_state,

View file

@ -0,0 +1,15 @@
use gtk::prelude::*;
#[derive(Clone)]
pub struct GUIHeader {
pub button_settings: gtk::Button,
pub button_app_info: gtk::Button,
}
impl GUIHeader {
pub fn create_from_builder(builder: &gtk::Builder) -> Self {
let button_settings: gtk::Button = builder.get_object("button_settings").unwrap();
let button_app_info: gtk::Button = builder.get_object("button_app_info").unwrap();
Self { button_settings, button_app_info }
}
}

View file

@ -0,0 +1,10 @@
#[derive(Clone)]
pub struct GUIOptions {}
impl GUIOptions {
pub fn create_from_builder(_builder: &gtk::Builder) -> Self {
// let notebook_main: gtk::Notebook = builder.get_object("notebook_main").unwrap();
Self {}
}
}

View file

@ -13,13 +13,28 @@ use std::fs;
use std::path::Path;
pub fn initialize_gui(gui_data: &mut GuiData) {
//// Setup default look(duplicate finder)
//// Initialize button
{
let buttons_search = gui_data.bottom_buttons.buttons_search.clone();
let buttons_save = gui_data.bottom_buttons.buttons_save.clone();
let buttons_delete = gui_data.bottom_buttons.buttons_delete.clone();
let buttons_select = gui_data.bottom_buttons.buttons_select.clone();
let buttons_symlink = gui_data.bottom_buttons.buttons_symlink.clone();
// Disable and show buttons - only search button should be visible
buttons_search.show();
buttons_save.hide();
buttons_delete.hide();
buttons_select.hide();
buttons_symlink.hide();
// TODO Add Option window
let button_settings = gui_data.header.button_settings.clone();
button_settings.hide();
}
//// Initialize main scrolled view with notebook
{
let scrolled_window_duplicate_finder = gui_data.main_notebook.scrolled_window_duplicate_finder.clone();
let scrolled_window_empty_folder_finder = gui_data.main_notebook.scrolled_window_empty_folder_finder.clone();
let scrolled_window_empty_files_finder = gui_data.main_notebook.scrolled_window_empty_files_finder.clone();
@ -30,20 +45,11 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
let scrolled_window_invalid_symlinks = gui_data.main_notebook.scrolled_window_invalid_symlinks.clone();
let scrolled_window_zeroed_files_finder = gui_data.main_notebook.scrolled_window_zeroed_files_finder.clone();
let scrolled_window_broken_files = gui_data.main_notebook.scrolled_window_broken_files.clone();
let scrolled_window_included_directories = gui_data.upper_notebook.scrolled_window_included_directories.clone();
let scrolled_window_excluded_directories = gui_data.upper_notebook.scrolled_window_excluded_directories.clone();
let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone();
let check_button_settings_show_preview_similar_images = gui_data.upper_notebook.check_button_settings_show_preview_similar_images.clone();
let text_view_errors = gui_data.text_view_errors.clone();
// Disable and show buttons
buttons_search.show();
buttons_save.hide();
buttons_delete.hide();
buttons_select.hide();
buttons_symlink.hide();
// Set Main Scrolled Window Treeviews
{
// Duplicate Files
@ -379,6 +385,12 @@ pub fn initialize_gui(gui_data: &mut GuiData) {
});
}
}
}
//// Initialize upper notebook
{
let scrolled_window_included_directories = gui_data.upper_notebook.scrolled_window_included_directories.clone();
let scrolled_window_excluded_directories = gui_data.upper_notebook.scrolled_window_excluded_directories.clone();
// Set Included Directory
{

View file

@ -1,6 +1,7 @@
// Remove console window in Windows OS
#![windows_subsystem = "windows"]
mod connect_about_buttons;
mod connect_button_delete;
mod connect_button_save;
mod connect_button_search;
@ -8,6 +9,7 @@ mod connect_button_select;
mod connect_button_stop;
mod connect_button_symlink;
mod connect_compute_results;
mod connect_header_buttons;
mod connect_hide_text_view_errors;
mod connect_notebook_tabs;
mod connect_popovers;
@ -16,9 +18,12 @@ mod connect_selection_of_directories;
mod connect_settings;
mod create_tree_view;
mod double_click_opening;
mod gui_about;
mod gui_bottom_buttons;
mod gui_data;
mod gui_header;
mod gui_main_notebook;
mod gui_options;
mod gui_popovers;
mod gui_progress_dialog;
mod gui_upper_notepad;
@ -30,6 +35,7 @@ mod saving_loading;
use czkawka_core::*;
extern crate gtk;
use crate::connect_about_buttons::*;
use crate::connect_button_delete::*;
use crate::connect_button_save::*;
use crate::connect_button_search::*;
@ -37,6 +43,7 @@ use crate::connect_button_select::*;
use crate::connect_button_stop::*;
use crate::connect_button_symlink::*;
use crate::connect_compute_results::*;
use crate::connect_header_buttons::*;
use crate::connect_hide_text_view_errors::*;
use crate::connect_notebook_tabs::*;
use crate::connect_popovers::*;
@ -127,6 +134,8 @@ fn main() {
);
connect_hide_text_view_errors(&gui_data);
connect_settings(&gui_data);
connect_button_about(&gui_data);
connect_about_buttons(&gui_data);
// Quit the program when X in main window was clicked
{