DatabaseWindow: UI changes

This commit is contained in:
zvon 2020-02-12 11:44:34 +01:00
parent 564c7b09e2
commit adeed21976
2 changed files with 121 additions and 23 deletions

View File

@ -1,36 +1,30 @@
#include <gtkmm/box.h> #include <gtkmm/box.h>
#include <gtkmm/button.h> #include <gtkmm/button.h>
#include <gtkmm/filechooserdialog.h>
#include <gtkmm/liststore.h>
#include <gtkmm/messagedialog.h> #include <gtkmm/messagedialog.h>
#include <gtkmm/scrolledwindow.h> #include <gtkmm/scrolledwindow.h>
#include <iostream>
#include <thread> #include <thread>
#include "databasewindow.hpp" #include "databasewindow.hpp"
#include "filesystem.hpp" #include "filesystem.hpp"
#include "functions.hpp" #include "functions.hpp"
#include "gtkfunctions.hpp"
#include "progresswindow.hpp" #include "progresswindow.hpp"
#include "tv_rename.hpp" #include "tv_rename.hpp"
DatabaseWindow::~DatabaseWindow() { DatabaseWindow::~DatabaseWindow() {
auto children = get_children(); auto children = get_children();
size_t max = children.size(); freeChildren( children );
size_t index{};
while ( index < max ) {
if ( auto *p = dynamic_cast< Gtk::Container * >( children[index] ) ) {
auto temp = p->get_children();
children.insert( children.end(), temp.begin(), temp.end() );
max = children.size();
}
index++;
}
for ( int i = max - 1; i >= 0; i-- ) {
delete children[i];
}
} }
DatabaseWindow::DatabaseWindow( bool _linux, DatabaseWindow::DatabaseWindow(
Glib::RefPtr< Gtk::Application > _app ) bool _linux, std::map< std::string, std::string > &_language_map,
: linux( _linux ), app( _app ) { Glib::RefPtr< Gtk::Application > _app )
: linux( _linux ), language_map( _language_map ), app( _app ) {
set_title( "Database" ); set_title( "Database" );
property_modal().set_value( true );
set_default_size( 550, 350 ); set_default_size( 550, 350 );
set_resizable( false ); set_resizable( false );
@ -87,19 +81,37 @@ DatabaseWindow::DatabaseWindow( bool _linux,
row[m_columns_database.m_col_show] = x["SHOW"]; row[m_columns_database.m_col_show] = x["SHOW"];
row[m_columns_database.m_col_path] = x["PATH"]; row[m_columns_database.m_col_path] = x["PATH"];
row[m_columns_database.m_col_lang] = x["LANGUAGE"]; row[m_columns_database.m_col_lang] = x["LANGUAGE"];
row[m_columns_database.m_col_lang_full] = language_map[x["LANGUAGE"]];
row[m_columns_database.m_col_show_id] = x["TVID"]; row[m_columns_database.m_col_show_id] = x["TVID"];
row[m_columns_database.m_col_dvd] = x["DVD"] == "1"; row[m_columns_database.m_col_dvd] = x["DVD"] == "1";
} }
m_tree_database->append_column( "Show", m_columns_database.m_col_show ); m_tree_database->append_column( "Show", m_columns_database.m_col_show );
m_tree_database->append_column_editable( "Path", m_tree_database->append_column( "Path", m_columns_database.m_col_path );
m_columns_database.m_col_path ); m_tree_database->append_column( "Language", m_combo_language );
m_tree_database->append_column_editable( "Language",
m_columns_database.m_col_lang );
m_tree_database->append_column_editable( "ID",
m_columns_database.m_col_show_id );
m_tree_database->append_column_editable( "DVD", m_tree_database->append_column_editable( "DVD",
m_columns_database.m_col_dvd ); m_columns_database.m_col_dvd );
m_tree_database->signal_button_press_event().connect(
sigc::mem_fun( *this, &DatabaseWindow::treeViewClick ) );
auto model = Gtk::ListStore::create( m_columns_language );
m_combo_language.property_model().set_value( model );
m_combo_language.property_editable().set_value( true );
m_combo_language.property_text_column().set_value( 1 );
m_combo_language.property_has_entry().set_value( false );
m_combo_language.signal_changed().connect(
sigc::mem_fun( *this, &DatabaseWindow::languageChange ) );
for ( const auto &x : language_map ) {
auto row = model->append();
( *row )[m_columns_language.m_col_code] = x.first;
( *row )[m_columns_language.m_col_language] = x.second;
}
// set text of m_combo_language to m_columns_database.m_col_lang_full
m_tree_database->get_column( 2 )->add_attribute(
m_combo_language, "text", m_columns_database.m_col_lang_full );
button_save->signal_clicked().connect( button_save->signal_clicked().connect(
sigc::mem_fun( *this, &DatabaseWindow::save ) ); sigc::mem_fun( *this, &DatabaseWindow::save ) );
@ -114,6 +126,64 @@ DatabaseWindow::DatabaseWindow( bool _linux,
show_all_children(); show_all_children();
} }
void DatabaseWindow::languageChange( const Glib::ustring &str,
const Gtk::TreeIter &it ) {
auto lang_row = *it;
auto database_row = *( m_model->get_iter( str ) );
database_row[m_columns_database.m_col_lang] =
std::string( lang_row[m_columns_language.m_col_code] );
database_row[m_columns_database.m_col_lang_full] =
std::string( lang_row[m_columns_language.m_col_language] );
}
bool DatabaseWindow::treeViewClick( GdkEventButton *event ) {
Gtk::TreeModel::Path path;
Gtk::TreeViewColumn *column;
// these variables are unused, but required for get_path_at_pos
int x_column, y_column;
m_tree_database->get_path_at_pos( event->x, event->y, path, column,
x_column, y_column );
if ( column->get_title() == "Show" ) {
// set default values
id_search = "_";
show_search = "_";
lang_search = "_";
sw.reset( new SearchWindow( show_search, id_search, lang_search,
language_map ) );
sw->signal_hide().connect(
sigc::mem_fun( *this, &DatabaseWindow::finishedSearch ) );
app->add_window( *sw );
sw->show();
} else if ( column->get_title() == "Path" ) {
Gtk::FileChooserDialog dialog( "Select a directory",
Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER );
dialog.set_transient_for( *this );
dialog.add_button( "_Cancel", Gtk::RESPONSE_CANCEL );
dialog.add_button( "Select", Gtk::RESPONSE_OK );
auto result = dialog.run();
if ( result == Gtk::RESPONSE_OK ) {
auto selection = m_tree_database->get_selection();
auto row = *( selection->get_selected() );
( *row )[m_columns_database.m_col_path] = dialog.get_filename();
}
}
return true;
}
void DatabaseWindow::finishedSearch() {
app->remove_window( *sw );
sw.reset();
if ( id_search == "_" || show_search == "_" || lang_search == "_" )
return;
auto selection = m_tree_database->get_selection();
auto row = *( selection->get_selected() );
( *row )[m_columns_database.m_col_show] = show_search;
( *row )[m_columns_database.m_col_show_id] = id_search;
( *row )[m_columns_database.m_col_lang] = lang_search;
( *row )[m_columns_database.m_col_lang_full] = language_map[lang_search];
}
void DatabaseWindow::save() { void DatabaseWindow::save() {
if ( changed_rows.size() == 0 ) if ( changed_rows.size() == 0 )
return; return;

View File

@ -1,15 +1,20 @@
#ifndef GTKMM_DATABASE_WINDOW #ifndef GTKMM_DATABASE_WINDOW
#define GTKMM_DATABASE_WINDOW #define GTKMM_DATABASE_WINDOW
#include <gtkmm/cellrenderercombo.h>
#include <gtkmm/treestore.h> #include <gtkmm/treestore.h>
#include <gtkmm/treeview.h> #include <gtkmm/treeview.h>
#include <gtkmm/window.h> #include <gtkmm/window.h>
#include <unordered_set> #include <unordered_set>
#include "searchwindow.hpp"
class DatabaseWindow : public Gtk::Window { class DatabaseWindow : public Gtk::Window {
public: public:
DatabaseWindow() = delete; DatabaseWindow() = delete;
DatabaseWindow( bool _linux, Glib::RefPtr< Gtk::Application > _app ); DatabaseWindow( bool _linux,
std::map< std::string, std::string > &_language_map,
Glib::RefPtr< Gtk::Application > _app );
virtual ~DatabaseWindow(); virtual ~DatabaseWindow();
private: private:
@ -18,6 +23,9 @@ private:
void changed( const Gtk::TreeModel::Path & /*UNUSED*/, void changed( const Gtk::TreeModel::Path & /*UNUSED*/,
const Gtk::TreeModel::iterator &row ); const Gtk::TreeModel::iterator &row );
void quit(); void quit();
bool treeViewClick( GdkEventButton *event );
void languageChange( const Glib::ustring &str, const Gtk::TreeIter &it );
void finishedSearch();
void errorPath( const std::string &path ); void errorPath( const std::string &path );
void errorID( const std::string &show_id ); void errorID( const std::string &show_id );
@ -28,6 +36,16 @@ private:
protected: protected:
Gtk::TreeView *m_tree_database = new Gtk::TreeView(); Gtk::TreeView *m_tree_database = new Gtk::TreeView();
class LanguageColumns : public Gtk::TreeModel::ColumnRecord {
public:
LanguageColumns() {
add( m_col_code );
add( m_col_language );
}
Gtk::TreeModelColumn< std::string > m_col_code;
Gtk::TreeModelColumn< std::string > m_col_language;
};
class DatabaseColumns : public Gtk::TreeModel::ColumnRecord { class DatabaseColumns : public Gtk::TreeModel::ColumnRecord {
public: public:
DatabaseColumns() { DatabaseColumns() {
@ -35,6 +53,7 @@ protected:
add( m_col_show ); add( m_col_show );
add( m_col_path ); add( m_col_path );
add( m_col_lang ); add( m_col_lang );
add( m_col_lang_full );
add( m_col_show_id ); add( m_col_show_id );
add( m_col_dvd ); add( m_col_dvd );
} }
@ -42,15 +61,24 @@ protected:
Gtk::TreeModelColumn< std::string > m_col_show; Gtk::TreeModelColumn< std::string > m_col_show;
Gtk::TreeModelColumn< std::string > m_col_path; Gtk::TreeModelColumn< std::string > m_col_path;
Gtk::TreeModelColumn< std::string > m_col_lang; Gtk::TreeModelColumn< std::string > m_col_lang;
Gtk::TreeModelColumn< std::string > m_col_lang_full;
Gtk::TreeModelColumn< std::string > m_col_show_id; Gtk::TreeModelColumn< std::string > m_col_show_id;
Gtk::TreeModelColumn< bool > m_col_dvd; Gtk::TreeModelColumn< bool > m_col_dvd;
}; };
DatabaseColumns m_columns_database; DatabaseColumns m_columns_database;
LanguageColumns m_columns_language;
Glib::RefPtr< Gtk::TreeStore > m_model; Glib::RefPtr< Gtk::TreeStore > m_model;
Gtk::CellRendererCombo m_combo_language;
bool linux; bool linux;
std::map< std::string, std::string > &language_map;
Glib::RefPtr< Gtk::Application > app; Glib::RefPtr< Gtk::Application > app;
std::unique_ptr< SearchWindow > sw{ nullptr };
std::string show_search;
std::string id_search;
std::string lang_search;
}; };
#endif // GTKMM_MAIN_WINDOW #endif // GTKMM_MAIN_WINDOW