/* PIKA - Photo and Image Kooker Application
 * a rebranding of The GNU Image Manipulation Program (created with heckimp)
 * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio
 *
 * Original copyright, applying to most contents (license remains unchanged): 
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef __PIKA_STATUSBAR_H__
#define __PIKA_STATUSBAR_H__

G_BEGIN_DECLS


/*  maximal length of the format string for the cursor-coordinates  */
#define CURSOR_FORMAT_LENGTH 32


#define PIKA_TYPE_STATUSBAR            (pika_statusbar_get_type ())
#define PIKA_STATUSBAR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIKA_TYPE_STATUSBAR, PikaStatusbar))
#define PIKA_STATUSBAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), PIKA_TYPE_STATUSBAR, PikaStatusbarClass))
#define PIKA_IS_STATUSBAR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIKA_TYPE_STATUSBAR))
#define PIKA_IS_STATUSBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIKA_TYPE_STATUSBAR))
#define PIKA_STATUSBAR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), PIKA_TYPE_STATUSBAR, PikaStatusbarClass))

typedef struct _PikaStatusbarClass PikaStatusbarClass;

struct _PikaStatusbar
{
  GtkFrame             parent_instance;

  Pika                *pika;
  PikaDisplayShell    *shell;
  PikaImage           *image;

  GSList              *messages;
  GHashTable          *context_ids;
  guint                seq_context_id;

  guint                statusbar_pos_redraw_idle_id;
  gchar               *cursor_string_todraw;
  gchar               *cursor_string_last;

  GdkPixbuf           *icon;
  GHashTable          *icon_hash;
  gint                 icon_space_width;

  guint                temp_context_id;
  guint                temp_timeout_id;
  PikaMessageSeverity  temp_severity;

  gchar                cursor_format_str[CURSOR_FORMAT_LENGTH];
  gchar                cursor_format_str_f[CURSOR_FORMAT_LENGTH];
  gchar                length_format_str[CURSOR_FORMAT_LENGTH];
  PikaCursorPrecision  cursor_precision;
  gint                 cursor_w_digits;
  gint                 cursor_h_digits;


  GtkWidget           *cursor_label;
  GtkWidget           *unit_combo;
  GtkWidget           *scale_combo;
  GtkWidget           *rotate_widget;
  GtkWidget           *rotate_label;
  GtkWidget           *horizontal_flip_icon;
  GtkWidget           *vertical_flip_icon;
  GtkWidget           *label; /* same as GtkStatusbar->label */

  GtkWidget           *progressbar;
  GtkWidget           *cancel_button;
  gboolean             progress_active;
  gboolean             progress_shown;
  gdouble              progress_value;
  guint64              progress_last_update_time;

  GtkWidget           *soft_proof_button;
  GtkWidget           *soft_proof_container;
  GtkWidget           *soft_proof_popover;
  GtkWidget           *proof_colors_toggle;
  GtkWidget           *profile_label;
  GtkWidget           *profile_combo;
  GtkWidget           *rendering_intent_combo;
  GtkWidget           *bpc_toggle;
  GtkWidget           *optimize_combo;
  GtkWidget           *out_of_gamut_toggle;

  GSList              *size_widgets;
};

struct _PikaStatusbarClass
{
  GtkFrameClass parent_class;
};


GType       pika_statusbar_get_type              (void) G_GNUC_CONST;
GtkWidget * pika_statusbar_new                   (void);

void        pika_statusbar_set_shell             (PikaStatusbar       *statusbar,
                                                  PikaDisplayShell    *shell);

gboolean    pika_statusbar_get_visible           (PikaStatusbar       *statusbar);
void        pika_statusbar_set_visible           (PikaStatusbar       *statusbar,
                                                  gboolean             visible);
void        pika_statusbar_empty                 (PikaStatusbar       *statusbar);
void        pika_statusbar_fill                  (PikaStatusbar       *statusbar);

void        pika_statusbar_override_window_title (PikaStatusbar       *statusbar);
void        pika_statusbar_restore_window_title  (PikaStatusbar       *statusbar);

void        pika_statusbar_push                  (PikaStatusbar       *statusbar,
                                                  const gchar         *context,
                                                  const gchar         *icon_name,
                                                  const gchar         *format,
                                                  ...) G_GNUC_PRINTF (4, 5);
void        pika_statusbar_push_valist           (PikaStatusbar       *statusbar,
                                                  const gchar         *context,
                                                  const gchar         *icon_name,
                                                  const gchar         *format,
                                                  va_list              args) G_GNUC_PRINTF (4, 0);
void        pika_statusbar_push_coords           (PikaStatusbar       *statusbar,
                                                  const gchar         *context,
                                                  const gchar         *icon_name,
                                                  PikaCursorPrecision  precision,
                                                  const gchar         *title,
                                                  gdouble              x,
                                                  const gchar         *separator,
                                                  gdouble              y,
                                                  const gchar         *help);
void        pika_statusbar_push_length           (PikaStatusbar       *statusbar,
                                                  const gchar         *context,
                                                  const gchar         *icon_name,
                                                  const gchar         *title,
                                                  PikaOrientationType  axis,
                                                  gdouble              value,
                                                  const gchar         *help);
void        pika_statusbar_replace               (PikaStatusbar       *statusbar,
                                                  const gchar         *context,
                                                  const gchar         *icon_name,
                                                  const gchar         *format,
                                                  ...) G_GNUC_PRINTF (4, 5);
void        pika_statusbar_replace_valist        (PikaStatusbar       *statusbar,
                                                  const gchar         *context,
                                                  const gchar         *icon_name,
                                                  const gchar         *format,
                                                  va_list              args) G_GNUC_PRINTF (4, 0);
const gchar * pika_statusbar_peek                (PikaStatusbar       *statusbar,
                                                  const gchar         *context);
void        pika_statusbar_pop                   (PikaStatusbar       *statusbar,
                                                  const gchar         *context);

void        pika_statusbar_push_temp             (PikaStatusbar       *statusbar,
                                                  PikaMessageSeverity  severity,
                                                  const gchar         *icon_name,
                                                  const gchar         *format,
                                                  ...) G_GNUC_PRINTF (4, 5);
void        pika_statusbar_push_temp_valist      (PikaStatusbar       *statusbar,
                                                  PikaMessageSeverity  severity,
                                                  const gchar         *icon_name,
                                                  const gchar         *format,
                                                  va_list              args) G_GNUC_PRINTF (4, 0);
void        pika_statusbar_pop_temp              (PikaStatusbar       *statusbar);

void        pika_statusbar_update_cursor         (PikaStatusbar       *statusbar,
                                                  PikaCursorPrecision  precision,
                                                  gdouble              x,
                                                  gdouble              y);
void        pika_statusbar_clear_cursor          (PikaStatusbar       *statusbar);


G_END_DECLS

#endif /* __PIKA_STATUSBAR_H__ */
