summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorAlexander Valavanis <valavanisalex@gmail.com>2019-06-05 19:30:04 +0000
committerAlexander Valavanis <valavanisalex@gmail.com>2019-06-05 19:30:04 +0000
commiteed14fb877f4bee4d59c622d8186f87b895bff54 (patch)
tree524435fc6a3bd5bd08416468b147492930dc107d /src/widgets
parentTextToolbar: Migrate FontStyle widget (diff)
downloadinkscape-eed14fb877f4bee4d59c622d8186f87b895bff54.tar.gz
inkscape-eed14fb877f4bee4d59c622d8186f87b895bff54.zip
Finish TextToolbar migration
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/CMakeLists.txt2
-rw-r--r--src/widgets/ink-comboboxentry-action.cpp683
-rw-r--r--src/widgets/ink-comboboxentry-action.h155
3 files changed, 0 insertions, 840 deletions
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
index 9f770f450..4c0617167 100644
--- a/src/widgets/CMakeLists.txt
+++ b/src/widgets/CMakeLists.txt
@@ -9,7 +9,6 @@ set(widgets_SRC
gradient-selector.cpp
gradient-vector.cpp
ink-action.cpp
- ink-comboboxentry-action.cpp
ink-toggle-action.cpp
paint-selector.cpp
sp-attribute-widget.cpp
@@ -32,7 +31,6 @@ set(widgets_SRC
gradient-selector.h
gradient-vector.h
ink-action.h
- ink-comboboxentry-action.h
ink-toggle-action.h
paint-selector.h
sp-attribute-widget.h
diff --git a/src/widgets/ink-comboboxentry-action.cpp b/src/widgets/ink-comboboxentry-action.cpp
deleted file mode 100644
index 10b6b708e..000000000
--- a/src/widgets/ink-comboboxentry-action.cpp
+++ /dev/null
@@ -1,683 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * A subclass of GtkAction that wraps a GtkComboBoxEntry.
- * Features:
- * Setting GtkEntryBox width in characters.
- * Passing a function for formatting cells.
- * Displaying a warning if entry text isn't in list.
- * Check comma separated values in text against list. (Useful for font-family fallbacks.)
- * Setting names for GtkComboBoxEntry and GtkEntry (actionName_combobox, actionName_entry)
- * to allow setting resources.
- *
- * Author(s):
- * Tavmjong Bah
- * Jon A. Cruz <jon@joncruz.org>
- *
- * Copyright (C) 2010 Authors
- *
- * Released under GNU GPL v2+, read the file 'COPYING' for more information.
- */
-
-/*
- * We must provide for both a toolbar item and a menu item.
- * As we don't know which widgets are used (or even constructed),
- * we must keep track of things like active entry ourselves.
- */
-
-#include <iostream>
-#include <cstring>
-#include <glibmm/ustring.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdkmm/display.h>
-
-#include "widgets/ink-comboboxentry-action.h"
-#include "ui/icon-names.h"
-
-static GQuark gDataName = 0;
-
- //gDataName = g_quark_from_string("ink_comboboxentry-action");
-
-namespace Inkscape {
-namespace UI {
-namespace Widget {
-
-ComboBoxEntryToolItem::ComboBoxEntryToolItem(Glib::ustring name,
- Glib::ustring label,
- Glib::ustring tooltip,
- GtkTreeModel *model,
- gint entry_width,
- gint extra_width,
- void *cell_data_func,
- void *separator_func,
- GtkWidget *focusWidget)
- : _label(std::move(label)),
- _tooltip(std::move(tooltip)),
- _model(model),
- _entry_width(entry_width),
- _extra_width(extra_width),
- _cell_data_func(cell_data_func),
- _separator_func(separator_func),
- _focusWidget(focusWidget),
- _active(-1),
- _text(strdup("")),
- _entry_completion(nullptr),
- _indicator(nullptr),
- _popup(false),
- _info(nullptr),
- _info_cb(nullptr),
- _info_cb_id(0),
- _info_cb_blocked(false),
- _warning(nullptr),
- _warning_cb(nullptr),
- _warning_cb_id(0),
- _warning_cb_blocked(false),
- _altx_name(nullptr)
-{
- set_name(name);
-
- gchar *action_name = g_strdup( get_name().c_str() );
- gchar *combobox_name = g_strjoin( nullptr, action_name, "_combobox", NULL );
- gchar *entry_name = g_strjoin( nullptr, action_name, "_entry", NULL );
- g_free( action_name );
-
- GtkWidget* comboBoxEntry = gtk_combo_box_new_with_model_and_entry (_model);
- gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (comboBoxEntry), 0);
-
- // Name it so we can muck with it using an RC file
- gtk_widget_set_name( comboBoxEntry, combobox_name );
- g_free( combobox_name );
-
- {
- gtk_widget_set_halign(comboBoxEntry, GTK_ALIGN_START);
- gtk_widget_set_hexpand(comboBoxEntry, FALSE);
- gtk_widget_set_vexpand(comboBoxEntry, FALSE);
- add(*Glib::wrap(comboBoxEntry));
- }
-
- _combobox = GTK_COMBO_BOX (comboBoxEntry);
-
- //gtk_combo_box_set_active( GTK_COMBO_BOX( comboBoxEntry ), ink_comboboxentry_action->active );
- gtk_combo_box_set_active( GTK_COMBO_BOX( comboBoxEntry ), 0 );
-
- g_signal_connect( G_OBJECT(comboBoxEntry), "changed", G_CALLBACK(combo_box_changed_cb), this );
-
- // Optionally add separator function...
- if( _separator_func != nullptr ) {
- gtk_combo_box_set_row_separator_func( _combobox,
- GtkTreeViewRowSeparatorFunc (_separator_func),
- nullptr, nullptr );
- }
-
- // FIXME: once gtk3 migration is done this can be removed
- // https://bugzilla.gnome.org/show_bug.cgi?id=734915
- gtk_widget_show_all (comboBoxEntry);
-
- // Optionally add formatting...
- if( _cell_data_func != nullptr ) {
- GtkCellRenderer *cell = gtk_cell_renderer_text_new();
- gtk_cell_layout_clear( GTK_CELL_LAYOUT( comboBoxEntry ) );
- gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( comboBoxEntry ), cell, true );
- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT( comboBoxEntry ), cell,
- GtkCellLayoutDataFunc (_cell_data_func),
- nullptr, nullptr );
- }
-
- // Optionally widen the combobox width... which widens the drop-down list in list mode.
- if( _extra_width > 0 ) {
- GtkRequisition req;
- gtk_widget_get_preferred_size(GTK_WIDGET(_combobox), &req, nullptr);
- gtk_widget_set_size_request( GTK_WIDGET( _combobox ),
- req.width + _extra_width, -1 );
- }
-
- // Get reference to GtkEntry and fiddle a bit with it.
- GtkWidget *child = gtk_bin_get_child( GTK_BIN(comboBoxEntry) );
-
- // Name it so we can muck with it using an RC file
- gtk_widget_set_name( child, entry_name );
- g_free( entry_name );
-
- if( child && GTK_IS_ENTRY( child ) ) {
-
- _entry = GTK_ENTRY(child);
-
- // Change width
- if( _entry_width > 0 ) {
- gtk_entry_set_width_chars (GTK_ENTRY (child), _entry_width );
- }
-
- // Add pop-up entry completion if required
- if( _popup ) {
- popup_enable();
- }
-
- // Add altx_name if required
- if( _altx_name ) {
- g_object_set_data( G_OBJECT( child ), _altx_name, _entry );
- }
-
- // Add signal for GtkEntry to check if finished typing.
- g_signal_connect( G_OBJECT(child), "activate", G_CALLBACK(entry_activate_cb), this );
- g_signal_connect( G_OBJECT(child), "key-press-event", G_CALLBACK(keypress_cb), this );
- }
-
- set_tooltip(tooltip.c_str());
-
- show_all();
-}
-
-// Setters/Getters ---------------------------------------------------
-
-gchar*
-ComboBoxEntryToolItem::get_active_text()
-{
- gchar* text = g_strdup( _text );
- return text;
-}
-
-/*
- * For the font-family list we need to handle two cases:
- * Text is in list store:
- * In this case we use row number as the font-family list can have duplicate
- * entries, one in the document font part and one in the system font part. In
- * order that scrolling through the list works properly we must distinguish
- * between the two.
- * Text is not in the list store (i.e. default font-family is not on system):
- * In this case we have a row number of -1, and the text must be set by hand.
- */
-gboolean
-ComboBoxEntryToolItem::set_active_text(const gchar* text, int row)
-{
- if( strcmp( _text, text ) != 0 ) {
- g_free( _text );
- _text = g_strdup( text );
- }
-
- // Get active row or -1 if none
- if( row < 0 ) {
- row = get_active_row_from_text(this, _text);
- }
- _active = row;
-
- // Set active row, check that combobox has been created.
- if( _combobox ) {
- gtk_combo_box_set_active( GTK_COMBO_BOX( _combobox ), _active );
- }
-
- // Fiddle with entry
- if( _entry ) {
-
- // Explicitly set text in GtkEntry box (won't be set if text not in list).
- gtk_entry_set_text( _entry, text );
-
- // Show or hide warning -- this might be better moved to text-toolbox.cpp
- if( _info_cb_id != 0 &&
- !_info_cb_blocked ) {
- g_signal_handler_block (G_OBJECT(_entry),
- _info_cb_id );
- _info_cb_blocked = true;
- }
- if( _warning_cb_id != 0 &&
- !_warning_cb_blocked ) {
- g_signal_handler_block (G_OBJECT(_entry),
- _warning_cb_id );
- _warning_cb_blocked = true;
- }
-
- bool set = false;
- if( _warning != nullptr ) {
- Glib::ustring missing = check_comma_separated_text();
- if( !missing.empty() ) {
- gtk_entry_set_icon_from_icon_name( _entry,
- GTK_ENTRY_ICON_SECONDARY,
- INKSCAPE_ICON("dialog-warning") );
- // Can't add tooltip until icon set
- Glib::ustring warning = _warning;
- warning += ": ";
- warning += missing;
- gtk_entry_set_icon_tooltip_text( _entry,
- GTK_ENTRY_ICON_SECONDARY,
- warning.c_str() );
-
- if( _warning_cb ) {
-
- // Add callback if we haven't already
- if( _warning_cb_id == 0 ) {
- _warning_cb_id =
- g_signal_connect( G_OBJECT(_entry),
- "icon-press",
- G_CALLBACK(_warning_cb),
- this);
- }
- // Unblock signal
- if( _warning_cb_blocked ) {
- g_signal_handler_unblock (G_OBJECT(_entry),
- _warning_cb_id );
- _warning_cb_blocked = false;
- }
- }
- set = true;
- }
- }
-
- if( !set && _info != nullptr ) {
- gtk_entry_set_icon_from_icon_name( GTK_ENTRY(_entry),
- GTK_ENTRY_ICON_SECONDARY,
- INKSCAPE_ICON("edit-select-all") );
- gtk_entry_set_icon_tooltip_text( _entry,
- GTK_ENTRY_ICON_SECONDARY,
- _info );
-
- if( _info_cb ) {
- // Add callback if we haven't already
- if( _info_cb_id == 0 ) {
- _info_cb_id =
- g_signal_connect( G_OBJECT(_entry),
- "icon-press",
- G_CALLBACK(_info_cb),
- this);
- }
- // Unblock signal
- if( _info_cb_blocked ) {
- g_signal_handler_unblock (G_OBJECT(_entry),
- _info_cb_id );
- _info_cb_blocked = false;
- }
- }
- set = true;
- }
-
- if( !set ) {
- gtk_entry_set_icon_from_icon_name( GTK_ENTRY(_entry),
- GTK_ENTRY_ICON_SECONDARY,
- nullptr );
- }
- }
-
- // Return if active text in list
- gboolean found = ( _active != -1 );
- return found;
-}
-
-void
-ComboBoxEntryToolItem::set_entry_width(gint entry_width)
-{
- _entry_width = entry_width;
-
- // Clamp to limits
- if(entry_width < -1) entry_width = -1;
- if(entry_width > 100) entry_width = 100;
-
- // Widget may not have been created....
- if( _entry ) {
- gtk_entry_set_width_chars( GTK_ENTRY(_entry), entry_width );
- }
-}
-
-void
-ComboBoxEntryToolItem::set_extra_width( gint extra_width )
-{
- _extra_width = extra_width;
-
- // Clamp to limits
- if(extra_width < -1) extra_width = -1;
- if(extra_width > 500) extra_width = 500;
-
- // Widget may not have been created....
- if( _combobox ) {
- GtkRequisition req;
- gtk_widget_get_preferred_size(GTK_WIDGET(_combobox), &req, nullptr);
- gtk_widget_set_size_request( GTK_WIDGET( _combobox ), req.width + _extra_width, -1 );
- }
-}
-
-void
-ComboBoxEntryToolItem::popup_enable()
-{
- _popup = true;
-
- // Widget may not have been created....
- if( _entry ) {
-
- // Check we don't already have a GtkEntryCompletion
- if( _entry_completion ) return;
-
- _entry_completion = gtk_entry_completion_new();
-
- gtk_entry_set_completion( _entry, _entry_completion );
- gtk_entry_completion_set_model( _entry_completion, _model );
- gtk_entry_completion_set_text_column( _entry_completion, 0 );
- gtk_entry_completion_set_popup_completion( _entry_completion, true );
- gtk_entry_completion_set_inline_completion( _entry_completion, false );
- gtk_entry_completion_set_inline_selection( _entry_completion, true );
-
- g_signal_connect (G_OBJECT (_entry_completion), "match-selected", G_CALLBACK (match_selected_cb), this);
- }
-}
-
-void
-ComboBoxEntryToolItem::popup_disable()
-{
- _popup = false;
-
- if( _entry_completion ) {
- gtk_widget_destroy(GTK_WIDGET(_entry_completion));
- _entry_completion = nullptr;
- }
-}
-
-void
-ComboBoxEntryToolItem::set_tooltip(const gchar* tooltip)
-{
- set_tooltip_text(tooltip);
- gtk_widget_set_tooltip_text ( GTK_WIDGET(_combobox), tooltip);
-
- // Widget may not have been created....
- if( _entry ) {
- gtk_widget_set_tooltip_text ( GTK_WIDGET(_entry), tooltip);
- }
-}
-
-void
-ComboBoxEntryToolItem::set_info(const gchar* info)
-{
- g_free( _info );
- _info = g_strdup( info );
-
- // Widget may not have been created....
- if( _entry ) {
- gtk_entry_set_icon_tooltip_text( GTK_ENTRY(_entry),
- GTK_ENTRY_ICON_SECONDARY,
- _info );
- }
-}
-
-void
-ComboBoxEntryToolItem::set_info_cb(gpointer info_cb)
-{
- _info_cb = info_cb;
-}
-
-void
-ComboBoxEntryToolItem::set_warning(const gchar* warning)
-{
- g_free( _warning );
- _warning = g_strdup( warning );
-
- // Widget may not have been created....
- if( _entry ) {
- gtk_entry_set_icon_tooltip_text( GTK_ENTRY(_entry),
- GTK_ENTRY_ICON_SECONDARY,
- _warning );
- }
-}
-
-void
-ComboBoxEntryToolItem::set_warning_cb(gpointer warning_cb)
-{
- _warning_cb = warning_cb;
-}
-
-void
-ComboBoxEntryToolItem::set_altx_name(const gchar* altx_name)
-{
- g_free(_altx_name);
- _altx_name = g_strdup( altx_name );
-
- // Widget may not have been created....
- if(_entry) {
- g_object_set_data( G_OBJECT(_entry), _altx_name, _entry );
- }
-}
-
-// Internal ---------------------------------------------------
-
-// Return row of active text or -1 if not found. If exclude is true,
-// use 3d colunm if available to exclude row from checking (useful to
-// skip rows added for font-families included in doc and not on
-// system)
-gint
-ComboBoxEntryToolItem::get_active_row_from_text(ComboBoxEntryToolItem *action,
- const gchar *target_text,
- gboolean exclude,
- gboolean ignore_case )
-{
- // Check if text in list
- gint row = 0;
- gboolean found = false;
- GtkTreeIter iter;
- gboolean valid = gtk_tree_model_get_iter_first( action->_model, &iter );
- while ( valid ) {
-
- // See if we should exclude a row
- gboolean check = true; // If true, font-family is on system.
- if( exclude && gtk_tree_model_get_n_columns( action->_model ) > 2 ) {
- gtk_tree_model_get( action->_model, &iter, 2, &check, -1 );
- }
-
- if( check ) {
- // Get text from list entry
- gchar* text = nullptr;
- gtk_tree_model_get( action->_model, &iter, 0, &text, -1 ); // Column 0
-
- if( !ignore_case ) {
- // Case sensitive compare
- if( strcmp( target_text, text ) == 0 ){
- found = true;
- break;
- }
- } else {
- // Case insensitive compare
- gchar* target_text_casefolded = g_utf8_casefold( target_text, -1 );
- gchar* text_casefolded = g_utf8_casefold( text, -1 );
- gboolean equal = (strcmp( target_text_casefolded, text_casefolded ) == 0 );
- g_free( text_casefolded );
- g_free( target_text_casefolded );
- if( equal ) {
- found = true;
- break;
- }
- }
- }
-
- ++row;
- valid = gtk_tree_model_iter_next( action->_model, &iter );
- }
-
- if( !found ) row = -1;
-
- return row;
-}
-
-// Checks if all comma separated text fragments are in the list and
-// returns a ustring with a list of missing fragments.
-// This is useful for checking if all fonts in a font-family fallback
-// list are available on the system.
-//
-// This routine could also create a Pango Markup string to show which
-// fragments are invalid in the entry box itself. See:
-// http://developer.gnome.org/pango/stable/PangoMarkupFormat.html
-// However... it appears that while one can retrieve the PangoLayout
-// for a GtkEntry box, it is only a copy and changing it has no effect.
-// PangoLayout * pl = gtk_entry_get_layout( entry );
-// pango_layout_set_markup( pl, "NEW STRING", -1 ); // DOESN'T WORK
-Glib::ustring
-ComboBoxEntryToolItem::check_comma_separated_text()
-{
- Glib::ustring missing;
-
- // Parse fallback_list using a comma as deliminator
- gchar** tokens = g_strsplit( _text, ",", 0 );
-
- gint i = 0;
- while( tokens[i] != nullptr ) {
-
- // Remove any surrounding white space.
- g_strstrip( tokens[i] );
-
- if( get_active_row_from_text( this, tokens[i], true, true ) == -1 ) {
- missing += tokens[i];
- missing += ", ";
- }
- ++i;
- }
- g_strfreev( tokens );
-
- // Remove extra comma and space from end.
- if( missing.size() >= 2 ) {
- missing.resize( missing.size()-2 );
- }
- return missing;
-}
-
-// Callbacks ---------------------------------------------------
-
-void
-ComboBoxEntryToolItem::combo_box_changed_cb( GtkComboBox* widget, gpointer data )
-{
- // Two things can happen to get here:
- // An item is selected in the drop-down menu.
- // Text is typed.
- // We only react here if an item is selected.
-
- // Get action
- auto action = reinterpret_cast<ComboBoxEntryToolItem *>( data );
-
- // Check if item selected:
- gint newActive = gtk_combo_box_get_active(widget);
- if( newActive >= 0 && newActive != action->_active ) {
-
- action->_active = newActive;
-
- GtkTreeIter iter;
- if( gtk_combo_box_get_active_iter( GTK_COMBO_BOX( action->_combobox ), &iter ) ) {
-
- gchar* text = nullptr;
- gtk_tree_model_get( action->_model, &iter, 0, &text, -1 );
- gtk_entry_set_text( action->_entry, text );
-
- g_free( action->_text );
- action->_text = text;
- }
-
- // Now let the world know
- action->_signal_changed.emit();
- }
-}
-
-void
-ComboBoxEntryToolItem::entry_activate_cb( GtkEntry *widget,
- gpointer data )
-{
- // Get text from entry box.. check if it matches a menu entry.
-
- // Get action
- auto action = reinterpret_cast<ComboBoxEntryToolItem*>( data );
-
- // Get text
- g_free( action->_text );
- action->_text = g_strdup( gtk_entry_get_text( widget ) );
-
- // Get row
- action->_active =
- get_active_row_from_text( action, action->_text );
-
- // Set active row
- gtk_combo_box_set_active( GTK_COMBO_BOX( action->_combobox), action->_active );
-
- // Now let the world know
- action->_signal_changed.emit();
-}
-
-gboolean
-ComboBoxEntryToolItem::match_selected_cb( GtkEntryCompletion* /*widget*/, GtkTreeModel* model, GtkTreeIter* iter, gpointer data )
-{
- // Get action
- auto action = reinterpret_cast<ComboBoxEntryToolItem*>(data);
- GtkEntry *entry = action->_entry;
-
- if( entry) {
- gchar *family = nullptr;
- gtk_tree_model_get(model, iter, 0, &family, -1);
-
- // Set text in GtkEntry
- gtk_entry_set_text (GTK_ENTRY (entry), family );
-
- // Set text in GtkAction
- g_free( action->_text );
- action->_text = family;
-
- // Get row
- action->_active =
- get_active_row_from_text( action, action->_text );
-
- // Set active row
- gtk_combo_box_set_active( GTK_COMBO_BOX( action->_combobox), action->_active );
-
- // Now let the world know
- action->_signal_changed.emit();
-
- return true;
- }
- return false;
-}
-
-void
-ComboBoxEntryToolItem::defocus()
-{
- if ( _focusWidget ) {
- gtk_widget_grab_focus( _focusWidget );
- }
-}
-
-gboolean
-ComboBoxEntryToolItem::keypress_cb( GtkWidget * /*widget*/, GdkEventKey *event, gpointer data )
-{
- gboolean wasConsumed = FALSE; /* default to report event not consumed */
- guint key = 0;
- auto action = reinterpret_cast<ComboBoxEntryToolItem*>(data);
- gdk_keymap_translate_keyboard_state( Gdk::Display::get_default()->get_keymap(),
- event->hardware_keycode, (GdkModifierType)event->state,
- 0, &key, nullptr, nullptr, nullptr );
-
- switch ( key ) {
-
- // TODO Add bindings for Tab/LeftTab
- case GDK_KEY_Escape:
- {
- //gtk_spin_button_set_value( GTK_SPIN_BUTTON(widget), action->private_data->lastVal );
- action->defocus();
- wasConsumed = TRUE;
- }
- break;
-
- case GDK_KEY_Return:
- case GDK_KEY_KP_Enter:
- {
- action->defocus();
- //wasConsumed = TRUE;
- }
- break;
-
-
- }
-
- return wasConsumed;
-}
-
-}
-}
-}
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/widgets/ink-comboboxentry-action.h b/src/widgets/ink-comboboxentry-action.h
deleted file mode 100644
index 70c8e94e7..000000000
--- a/src/widgets/ink-comboboxentry-action.h
+++ /dev/null
@@ -1,155 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * A subclass of GtkAction that wraps a GtkComboBoxEntry.
- * Features:
- * Setting GtkEntryBox width in characters.
- * Passing a function for formatting cells.
- * Displaying a warning if text isn't in list.
- * Setting names for GtkComboBoxEntry and GtkEntry (actionName_combobox, actionName_entry)
- * to allow setting resources.
- *
- * Author(s):
- * Tavmjong Bah
- * Jon A. Cruz <jon@joncruz.org>
- *
- * Copyright (C) 2010 Authors
- *
- * Released under GNU GPL v2+, read the file 'COPYING' for more information.
- */
-
-#ifndef SEEN_INK_COMBOBOXENTRY_ACTION
-#define SEEN_INK_COMBOBOXENTRY_ACTION
-
-#include <gtkmm/toolitem.h>
-
-namespace Inkscape {
-namespace UI {
-namespace Widget {
-
-/**
- * Creates a Gtk::ToolItem subclass that wraps a Gtk::ComboBox object.
- */
-class ComboBoxEntryToolItem : public Gtk::ToolItem {
-private:
- Glib::ustring _tooltip;
- Glib::ustring _label;
- GtkTreeModel *_model; ///< Tree Model
- GtkComboBox *_combobox;
- GtkEntry *_entry;
- gint _entry_width;// Width of GtkEntry in characters.
- gint _extra_width;// Extra Width of GtkComboBox.. to widen drop-down list in list mode.
- gpointer _cell_data_func; // drop-down menu format
- gpointer _separator_func;
- gboolean _popup; // Do we pop-up an entry-completion dialog?
- GtkEntryCompletion *_entry_completion;
- GtkWidget *_focusWidget; ///< The widget to return focus to
-
- GtkWidget *_indicator;
- gint _active; // Index of active menu item (-1 if not in list).
- gchar *_text; // Text of active menu item or entry box.
- gchar *_info; // Text for tooltip info about entry.
- gpointer _info_cb; // Callback for clicking info icon.
- gint _info_cb_id;
- gboolean _info_cb_blocked;
- gchar *_warning; // Text for tooltip warning that entry isn't in list.
- gpointer _warning_cb; // Callback for clicking warning icon.
- gint _warning_cb_id;
- gboolean _warning_cb_blocked;
- gchar *_altx_name; // Target for Alt-X keyboard shortcut.
-
- // Signals
- sigc::signal<void> _signal_changed;
-
- void (*changed) (ComboBoxEntryToolItem* action);
- void (*activated) (ComboBoxEntryToolItem* action);
-
- static gint get_active_row_from_text(ComboBoxEntryToolItem *action,
- const gchar *target_text,
- gboolean exclude = false,
- gboolean ignore_case = false);
- void defocus();
-
- static void combo_box_changed_cb( GtkComboBox* widget, gpointer data );
- static void entry_activate_cb( GtkEntry *widget,
- gpointer data );
- static gboolean match_selected_cb( GtkEntryCompletion *widget,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data);
- static gboolean keypress_cb( GtkWidget *widget,
- GdkEventKey *event,
- gpointer data );
-
- Glib::ustring check_comma_separated_text();
-
-public:
- ComboBoxEntryToolItem(const Glib::ustring name,
- const Glib::ustring label,
- const Glib::ustring tooltip,
- GtkTreeModel *model,
- gint entry_width = -1,
- gint extra_width = -1,
- gpointer cell_data_func = nullptr,
- gpointer separator_func = nullptr,
- GtkWidget* focusWidget = nullptr);
-
- gchar* get_active_text();
- gboolean set_active_text(const gchar* text, int row=-1);
-
- void set_entry_width(gint entry_width);
- void set_extra_width(gint extra_width);
-
- void popup_enable();
- void popup_disable();
-
- void set_info( const gchar* info );
- void set_info_cb( gpointer info_cb );
- void set_warning( const gchar* warning_cb );
- void set_warning_cb(gpointer warning );
- void set_tooltip( const gchar* tooltip );
-
- void set_altx_name( const gchar* altx_name );
-
- // Accessor methods
- decltype(_model) get_model() const {return _model;}
- decltype(_combobox) get_combobox() const {return _combobox;}
- decltype(_entry) get_entry() const {return _entry;}
- decltype(_entry_width) get_entry_width() const {return _entry_width;}
- decltype(_extra_width) get_extra_width() const {return _extra_width;}
- decltype(_cell_data_func) get_cell_data_func() const {return _cell_data_func;}
- decltype(_separator_func) get_separator_func() const {return _separator_func;}
- decltype(_popup) get_popup() const {return _popup;}
- decltype(_focusWidget) get_focus_widget() const {return _focusWidget;}
-
- decltype(_active) get_active() const {return _active;}
-
- decltype(_signal_changed) signal_changed() {return _signal_changed;}
-
- // Mutator methods
- void set_model (decltype(_model) model) {_model = model;}
- void set_combobox (decltype(_combobox) combobox) {_combobox = combobox;}
- void set_entry (decltype(_entry) entry) {_entry = entry;}
- void set_cell_data_func(decltype(_cell_data_func) cell_data_func) {_cell_data_func = cell_data_func;}
- void set_separator_func(decltype(_separator_func) separator_func) {_separator_func = separator_func;}
- void set_popup (decltype(_popup) popup) {_popup = popup;}
- void set_focus_widget (decltype(_focusWidget) focus_widget) {_focusWidget = focus_widget;}
-
- // This doesn't seem right... surely we should set the active row in the Combobox too?
- void set_active (decltype(_active) active) {_active = active;}
-};
-
-}
-}
-}
-#endif /* SEEN_INK_COMBOBOXENTRY_ACTION */
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :