Mercurial > octave
diff libgui/graphics/annotation-dialog.cc @ 20095:c164cfc24bdd
QtHandles: add annotations dialog
* libgui/graphics/annotation-dialog.h: new file
* libgui/graphics/annotation-dialog.cc: new file
* libgui/graphics/annotation-dialog.ui: new file
* libgui/graphics/Canvas.cc
(canvasMousePressEvent): call annotation_dialog when in TextMode.
* libgui/graphics/module.mk: add annotation-dialog to build
author | John Donoghue <john.donoghue@ieee.org> |
---|---|
date | Sun, 19 Apr 2015 09:54:54 -0400 |
parents | |
children | 5a4717862648 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgui/graphics/annotation-dialog.cc Sun Apr 19 09:54:54 2015 -0400 @@ -0,0 +1,261 @@ +/* + +Copyright (C) 2015 John Donoghue + +This file is part of Octave. + +Octave 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. + +Octave 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 Octave; see the file COPYING. If not, see +<http://www.gnu.org/licenses/>. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "annotation-dialog.h" +#include "ui-annotation-dialog.h" + +#include "QtHandlesUtils.h" + +#include "resource-manager.h" + +#include <QColorDialog> +#include <QPushButton> +#include <QPalette> + +using namespace QtHandles; + +annotation_dialog::annotation_dialog (QWidget *p, const octave_value_list &pr): + QDialog (p), ui (new Ui::annotation_dialog) +{ + props = pr; + + init (); +} + +void +annotation_dialog::init () +{ + ui->setupUi (this); + + QSettings *settings = resource_manager::get_settings (); + + // restore last geometry + restoreGeometry (settings->value("annotation/geometry").toByteArray ()); + + // connect signals + connect (ui->button_box, SIGNAL (clicked (QAbstractButton *)), + this, SLOT (button_clicked (QAbstractButton *))); + + + connect (ui->edit_string, SIGNAL (textChanged (const QString&)), + this, SLOT (edit_string_changed (const QString&))); + + connect (ui->btn_color, SIGNAL (clicked ()), + this, SLOT (prompt_for_color ())); + + connect (ui->btn_background_color, SIGNAL (clicked ()), + this, SLOT (prompt_for_color ())); + + connect (ui->btn_edge_color, SIGNAL (clicked ()), + this, SLOT (prompt_for_color ())); + + // set gui element to default values + ui->cb_fit_box_to_text->setChecked (true); + ui->cb_horz_align->setCurrentIndex ( ui->cb_horz_align->findText("left") ); + ui->cb_vert_align->setCurrentIndex ( ui->cb_vert_align->findText("middle") ); + + // set gui elements to any values from input properties + set_gui_props (); +} + +annotation_dialog::~annotation_dialog () +{ + delete ui; +} + +// internal slots + +void +annotation_dialog::button_clicked (QAbstractButton *button) +{ + QDialogButtonBox::ButtonRole button_role = ui->button_box->buttonRole (button); + + QSettings *settings = resource_manager::get_settings (); + + // save position + settings->setValue ("annotation/geometry",saveGeometry ()); + + if (button_role == QDialogButtonBox::ApplyRole || + button_role == QDialogButtonBox::AcceptRole) + { + get_gui_props (); + } + + if (button_role == QDialogButtonBox::RejectRole || + button_role == QDialogButtonBox::AcceptRole) + close (); +} + +octave_value_list +annotation_dialog::get_properties () const +{ + return props; +} + +void +annotation_dialog::get_gui_props () +{ + // set props to the values of the gui + props = octave_value_list (); + + Matrix position(1,4); + position(0) = ui->sb_x->value (); + position(1) = ui->sb_y->value (); + position(2) = ui->sb_width->value (); + position(3) = ui->sb_height->value (); + props.append (ovl ("textbox", position)); + + props.append (ovl ("string", ui->edit_string->text ().toStdString ())); + props.append (ovl ("fitboxtotext", ui->cb_fit_box_to_text->isChecked() ? "on" : "off" )); + props.append (ovl ("units", ui->cb_units->currentText ().toStdString () )); + props.append (ovl ("horizontalalignment", ui->cb_horz_align->currentText ().toStdString () )); + props.append (ovl ("verticalalignment", ui->cb_vert_align->currentText ().toStdString () )); + props.append (ovl ("fontname", ui->cb_font_name->currentText ().toStdString())); + props.append (ovl ("fontsize", ui->sb_font_size->value ())); + props.append (ovl ("fontweight", ui->cb_font_bold->isChecked() ? "bold" : "normal" )); + props.append (ovl ("fontangle", ui->cb_font_italic->isChecked() ? "italic" : "normal" )); + props.append (ovl ("color", Utils::toRgb (ui->btn_color->palette ().color (QPalette::Button)))); +} + +void +annotation_dialog::set_gui_props () +{ + // set the gui to the values from the props + octave_idx_type len = props.length (); + + for (int i=0; i<len/2; i++) + { + std::string name = props(i*2).string_value (); + + if (name == "textbox") + { + Matrix position = props(2*i +1).matrix_value (); + int nels = position.numel(); + if (nels >= 2) + { + ui->sb_x->setValue (position(0)); + ui->sb_y->setValue (position(1)); + } + else + { + ui->sb_x->setValue (0); + ui->sb_y->setValue (0); + } + if (nels >= 4) + { + ui->sb_width->setValue (position(2)); + ui->sb_height->setValue (position(3)); + } + else + { + ui->sb_width->setValue (position(2)); + ui->sb_height->setValue (position(3)); + } + } + else if (name == "string") + { + // FIXME: handle if is array of strings ? + ui->edit_string->setText (props(2*i +1).string_value ().c_str ()); + } + else if (name == "fitboxtotext") + { + ui->cb_fit_box_to_text->setChecked ( props(1*i +1).string_value () == "on" ); + } + else if (name == "units") + { + ui->cb_units->setCurrentIndex ( ui->cb_units->findText(props(1*i +1).string_value ().c_str ()) ); + } + else if (name == "horizontalalignment") + { + ui->cb_horz_align->setCurrentIndex ( ui->cb_horz_align->findText(props(1*i +1).string_value ().c_str ()) ); + } + else if (name == "verticalalignment") + { + ui->cb_vert_align->setCurrentIndex ( ui->cb_vert_align->findText(props(1*i +1).string_value ().c_str ()) ); + } + else if (name == "fontname") + { + ui->cb_vert_align->setCurrentIndex ( ui->cb_font_name->findText(props(1*i +1).string_value ().c_str ()) ); + } + else if (name == "fontsize") + { + ui->sb_font_size->setValue ( props(1*i +1).float_value () ); + } + else if (name == "fontweight") + { + ui->cb_font_bold->setChecked ( props(1*i +1).string_value () == "bold" ); + } + else if (name == "fontangle") + { + ui->cb_font_italic->setChecked ( props(1*i +1).string_value () == "italic" ); + } + else if (name == "color") + { + QColor color; + if (props(1*i +1).is_matrix_type ()) + color = Utils::fromRgb (props(2*i +1).matrix_value ()); + else + color.setNamedColor (props(2*i +1).string_value ().c_str ()); + + if (color.isValid ()) + ui->btn_color->setPalette (QPalette (color)); + } + + } + + edit_string_changed (ui->edit_string->text ()); +} + +void +annotation_dialog::edit_string_changed (const QString &str) +{ + ui->button_box->button (QDialogButtonBox::Ok)->setEnabled (str.length () > 0); +} + +void +annotation_dialog::prompt_for_color () +{ + QWidget *widg = dynamic_cast<QWidget*> (sender ()); + if (widg) + { + QColor color = widg->palette ().color (QPalette::Button); + + color = QColorDialog::getColor(color, this); + + if (color.isValid ()) + { + widg->setPalette (QPalette (color)); + + QString css = QString ("background-color: %1; border: 1px solid %2;") + .arg (color.name ()) + .arg ("#000000"); + + widg->setStyleSheet (css); + widg->update (); + } + } +} +