13 #ifndef HAS_LIVES_WIDGET_HELPER_QT_H 14 #define HAS_LIVES_WIDGET_HELPER_QT_H 26 #include <QtCore/QLinkedList> 28 #include <QtGui/QScreen> 29 #include <QtGui/QWindow> 30 #include <QtGui/QTextCursor> 31 #include <QtGui/QTextDocumentFragment> 32 #include <QtGui/QShortcutEvent> 33 #include <QtGui/QWheelEvent> 34 #include <QtGui/QImageWriter> 35 #include <QtGui/QImageReader> 36 #include <QtCore/QDebug> 37 #include <QtCore/QTime> 38 #include <QtGui/QFont> 39 #include <QtGui/QFontDatabase> 40 #include <QtCore/QStandardPaths> 41 #include <QtCore/QLocale> 42 #include <QtCore/QMutableLinkedListIterator> 44 #include <QtWidgets/QApplication> 45 #include <QtWidgets/QDesktopWidget> 46 #include <QtWidgets/QCompleter> 47 #include <QtWidgets/QLabel> 48 #include <QtWidgets/QColorDialog> 49 #include <QtWidgets/QWidget> 50 #include <QtWidgets/QWidgetAction> 51 #include <QtWidgets/QStyledItemDelegate> 52 #include <QtWidgets/QHeaderView> 53 #include <QtWidgets/QSplitter> 54 #include <QtWidgets/QLineEdit> 55 #include <QtWidgets/QPushButton> 56 #include <QtWidgets/QToolButton> 57 #include <QtWidgets/QToolBar> 58 #include <QtWidgets/QTableWidget> 59 #include <QtWidgets/QDialog> 60 #include <QtWidgets/QMessageBox> 61 #include <QtWidgets/QDialogButtonBox> 62 #include <QtWidgets/QBoxLayout> 63 #include <QtWidgets/QComboBox> 64 #include <QtWidgets/QMenu> 65 #include <QtWidgets/QMenuBar> 66 #include <QtWidgets/QLabel> 67 #include <QtWidgets/QMainWindow> 68 #include <QtWidgets/QFileDialog> 69 #include <QtWidgets/QLayout> 70 #include <QtWidgets/QTextEdit> 71 #include <QtWidgets/QTreeWidget> 72 #include <QtWidgets/QRadioButton> 73 #include <QtWidgets/QButtonGroup> 74 #include <QtWidgets/QProgressBar> 75 #include <QtWidgets/QDoubleSpinBox> 76 #include <QtWidgets/QCheckBox> 77 #include <QtWidgets/QShortcut> 78 #include <QtWidgets/QGridLayout> 79 #include <QtWidgets/QFrame> 80 #include <QtWidgets/QGroupBox> 81 #include <QtWidgets/QScrollArea> 82 #include <QtWidgets/QScrollBar> 84 #include <QtGui/QColor> 85 #include <QtCore/QAbstractItemModel> 86 #include <QtWidgets/QAbstractSlider> 87 #include <QtWidgets/QAbstractButton> 88 #include <QtCore/QSharedPointer> 89 #include <QtGui/QStandardItemModel> 90 #include <QtCore/QModelIndex> 91 #include <QtCore/QTimer> 92 #include <QtCore/QThread> 93 #include <QtCore/QProcess> 94 #include <QtCore/QAbstractNativeEventFilter> 95 #include <QtCore/QCoreApplication> 100 #define GTK_CHECK_VERSION(a,b,c) 1 102 #define LIVES_LITTLE_ENDIAN 0 103 #define LIVES_BIG_ENDIAN 1 105 #define LIVES_MAXINT INT_MAX 106 #define LIVES_MAXUINT32 UINT32_MAX 107 #define LIVES_MAXSIZE SIZE_MAX 108 #define LIVES_MAXFLOAT FLT_MAX 110 #define LIVES_UNLIKELY(a) Q_UNLIKELY(a) 111 #define LIVES_LIKELY(a) Q_LIKELY(a) 113 #define MAX_CURSOR_WIDTH 32 115 #define G_GNUC_MALLOC 119 typedef void *livespointer;
120 typedef const void *livesconstpointer;
122 #define LIVES_INT_TO_POINTER(a) lives_int_to_pointer(a) 123 #define LIVES_UINT_TO_POINTER(a) lives_uint_to_pointer(a) 124 #define LIVES_POINTER_TO_INT(a) lives_pointer_to_int(a) 126 LIVES_INLINE livespointer lives_int_to_pointer(int32_t a) {
127 return (livespointer)a;
130 LIVES_INLINE livespointer lives_uint_to_pointer(uint32_t a) {
131 return (livespointer)a;
134 LIVES_INLINE int32_t lives_pointer_to_int(livesconstpointer p) {
135 uint64_t xint = (uint64_t)p;
136 return (int32_t)(xint & 0xFFFF);
140 livespointer(*malloc)(
size_t n_bytes);
141 livespointer(*realloc)(livespointer mem,
143 void (*free)(livespointer mem);
145 livespointer(*calloc)(
size_t n_blocks,
146 size_t n_block_bytes);
147 livespointer(*try_malloc)(
size_t n_bytes);
148 livespointer(*try_realloc)(livespointer mem,
152 LiVESMemVTable *static_alt_vtable;
155 livespointer(*lives_malloc)(
size_t size);
156 livespointer(*lives_realloc)(livespointer ptr,
size_t new_size);
157 livespointer(*lives_try_malloc)(
size_t size);
158 livespointer(*lives_try_realloc)(livespointer ptr,
size_t new_size);
159 livespointer(_lives_calloc)(
size_t n_blocks,
size_t n_block_bytes);
162 livespointer malloc_wrapper(
size_t size) {
163 livespointer ptr = (static_alt_vtable->malloc)(size);
164 Q_ASSERT(ptr != NULL);
169 livespointer realloc_wrapper(livespointer old_ptr,
size_t new_size) {
170 livespointer ptr = (static_alt_vtable->realloc)(old_ptr,new_size);
171 Q_ASSERT(ptr != NULL);
176 livespointer try_malloc_wrapper(
size_t size) {
177 return (static_alt_vtable->malloc)(size);
181 livespointer try_realloc_wrapper(livespointer old_ptr,
size_t new_size) {
182 return (static_alt_vtable->realloc)(old_ptr,new_size);
187 livespointer ptr = (static_alt_vtable->calloc)(1,size);
188 Q_ASSERT(ptr != NULL);
193 LIVES_INLINE livespointer lives_try_malloc0(
size_t size) {
194 return (static_alt_vtable->calloc)(1,size);
198 LIVES_INLINE livespointer lives_try_malloc0_n(
size_t nmemb,
size_t nmemb_bytes) {
199 return (static_alt_vtable->calloc)(nmemb,nmemb_bytes);
207 extern char *trString;
210 char *translate(
const char *String) {
212 if (strlen(String)) {
213 QString qs = QString::fromLocal8Bit(
dgettext(PACKAGE, String));
214 trString = strdup(qs.toUtf8().constData());
215 }
else trString=strdup(String);
219 char *translate_with_plural(
const char *String,
const char *StringPlural,
unsigned long int n) {
221 if (strlen(String)) {
222 QString qs = QString::fromLocal8Bit(
dngettext(PACKAGE, String, StringPlural, n));
223 trString = strdup(qs.toUtf8().constData());
224 }
else trString=strdup(String);
229 int lives_printerr(
const char *format, ...) {
232 va_start(args, format);
233 int r = vasprintf(&buff, format, args);
242 #define lives_strdup(a) strdup(a) 243 #define lives_strndup(a,b) strndup(a,b) 245 char *lives_strdup_printf(
const char *format, ...) {
248 va_start(args, format);
249 int r = vasprintf(&buff, format, args);
255 int lives_snprintf(
char *buff,
size_t len,
const char *format, ...) {
257 va_start(args, format);
258 int r = vsnprintf(buff, len, format, args);
264 void lives_strfreev(
char **str_array) {
266 for (
int i = 0; str_array[i] != NULL; i++)
272 #define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') 273 #define TOLOWER(c) (ISUPPER (c) ? (c) - 'A' + 'a' : (c)) 275 int lives_ascii_strcasecmp(
const char *s1,
const char *s2) {
279 c1 = (int)(uint8_t) TOLOWER(*s1);
280 c2 = (int)(uint8_t) TOLOWER(*s2);
286 return (((
int)(uint8_t) *s1) - ((
int)(uint8_t) *s2));
290 int lives_ascii_strncasecmp(
const char *s1,
const char *s2,
size_t len) {
293 while (len && *s1 && *s2) {
295 c1 = (int)(uint8_t) TOLOWER(*s1);
296 c2 = (int)(uint8_t) TOLOWER(*s2);
302 if (len)
return (((
int)(uint8_t) *s1) - ((
int)(uint8_t) *s2));
307 char *lives_strconcat(
const char *string1, ...) {
315 l = 1 + strlen(string1);
316 va_start(args, string1);
317 s = va_arg(args,
char *);
320 s = va_arg(args,
char *);
323 concat = (
char *)malloc(l);
325 ptr = stpcpy(ptr, string1);
326 va_start(args, string1);
327 s = va_arg(args,
char *);
329 ptr = stpcpy(ptr, s);
330 s = va_arg(args,
char *);
338 char *lives_build_filename(
const char *first, ...) {
339 char *fname = strdup(
""), *tmp;
345 va_start(args, first);
347 piece = va_arg(args,
char *);
348 if (piece == NULL)
break;
349 if (strstr(piece,
"\\")) {
357 va_start(args, first);
359 piece = va_arg(args,
char *);
360 if (piece == NULL)
break;
361 tmp = lives_strdup_printf(
"%s%s%s",fname,sep,piece);
370 fname = strdup(QDir::cleanPath(qs).toUtf8().constData());
372 fname = strdup(QDir::cleanPath(qs).toLocal8Bit().constData());
378 char *lives_strstrip(
char *
string) {
379 QString qs = QString::fromUtf8(
string);
381 memcpy(
string,qs.toUtf8().constData(),qs.toUtf8().size());
386 char *lives_strrstr(
const char *haystack,
const char *needle) {
391 needle_len = strlen(needle);
392 haystack_len = strlen(haystack);
394 return (
char *)haystack;
395 if (haystack_len < needle_len)
397 p = haystack + haystack_len - needle_len;
398 while (p >= haystack) {
399 for (i = 0; i < needle_len; i++)
400 if (p[i] != needle[i])
411 LIVES_INLINE char *lives_filename_to_utf8(
const char *ostr, ssize_t len,
size_t *bytes_read,
size_t *bytes_written,
void *error) {
413 QString qs = QString::fromLocal8Bit(ostr);
414 return strdup(qs.toUtf8().constData());
420 LIVES_INLINE char *lives_filename_from_utf8(
const char *ostr, ssize_t len,
size_t *bytes_read,
size_t *bytes_written,
void *error) {
422 QString qs = QString::fromUtf8(ostr);
423 return strdup(qs.toLocal8Bit().constData());
429 char *L2U8(
const char *local_string) {
431 QString qs = QString::fromLocal8Bit(local_string);
432 return strdup(qs.toUtf8().constData());
438 char *U82L(
const char *utf8_string) {
440 QString qs = QString::fromUtf8(utf8_string);
441 return strdup(qs.toLocal8Bit().constData());
448 char *lives_utf8_strdown(
char *
string,
size_t len) {
449 QString qs = QString::fromUtf8(
string);
451 return strdup(qs.toUtf8().constData());
456 #define ABS(a) qAbs(a) 459 char *lives_find_program_in_path(
const char *prog) {
460 QString qs = QStandardPaths::findExecutable(prog);
461 if (qs ==
"")
return NULL;
462 return strdup(qs.toLocal8Bit().constData());
475 typedef boolean(*LiVESWidgetSourceFunc)(livespointer data);
477 typedef int (*LiVESCompareFunc)(livesconstpointer a, livesconstpointer b);
489 uint32_t
lives_timer_add(uint32_t interval, LiVESWidgetSourceFunc
function, livespointer data);
492 #define G_PRIORITY_LOW 0 493 #define G_PRIORITY_HIGH 1 495 LIVES_INLINE uint32_t lives_idle_add_full(
int prio, LiVESWidgetSourceFunc
function, livespointer data, livespointer destnot) {
500 LIVES_INLINE uint32_t lives_idle_add(LiVESWidgetSourceFunc
function, livespointer data) {
505 #define g_object_freeze_notify(a) (a) 506 #define g_object_thaw_notify(a) (a) 509 LIVES_INLINE void lives_set_application_name(
const char *name) {
510 qapp->setApplicationName(QString::fromUtf8(name));
515 return qapp->applicationName().toLocal8Bit().constData();
519 class SleeperThread :
public QThread {
521 static void msleep(
unsigned long msecs) {
522 QThread::msleep(msecs);
527 SleeperThread::msleep(microsec);
531 LIVES_INLINE int lives_mkdir_with_parents(
const char *name,
int mode) {
533 mode_t omask = umask(mode);
535 QString qs = QString::fromUtf8(name);
537 bool ret = qd.mkpath(qs);
545 #define lives_strtod(a,b) strtod(a,b) 547 char *lives_path_get_basename(
const char *path) {
549 QString qs = qf.fileName();
550 return strdup(qs.toUtf8().constData());
553 char *lives_path_get_dirname(
const char *path) {
556 QString qs = dir.path();
557 return strdup(qs.toUtf8().constData());
561 typedef int LiVESFileTest;
562 #define LIVES_FILE_TEST_EXISTS 1 563 #define LIVES_FILE_TEST_IS_DIR 2 564 #define LIVES_FILE_TEST_IS_REGULAR 3 567 boolean lives_file_test(
const char *fname, LiVESFileTest test) {
569 if (test == LIVES_FILE_TEST_EXISTS) {
572 if (test == LIVES_FILE_TEST_IS_DIR) {
575 if (test == LIVES_FILE_TEST_IS_REGULAR) {
582 char *lives_get_current_dir() {
583 QString qs = QDir::current().path();
585 return strdup(qs.toUtf8().constData());
587 return strdup(qs.toLocal8Bit().constData());
597 typedef LiVESClosure LiVESWidgetClosure;
604 typedef void (*LiVESPixbufDestroyNotify)(uchar *, livespointer);
607 typedef int lives_painter_content_t;
618 if (error->message != NULL) free(error->message);
622 #define lives_strerror(a) strerror(a) 625 typedef QScreen LiVESXScreen;
626 typedef QScreen LiVESXDisplay;
627 typedef QScreen LiVESXDevice;
633 typedef QFile LiVESIOChannel;
641 typedef QStyle::StateFlag LiVESWidgetState;
643 #define LIVES_WIDGET_STATE_NORMAL QStyle::State_Enabled 644 #define LIVES_WIDGET_STATE_ACTIVE QStyle::State_Active 645 #define LIVES_WIDGET_STATE_PRELIGHT QStyle::State_MouseOver 646 #define LIVES_WIDGET_STATE_SELECTED QStyle::State_Selected 648 #define LIVES_WIDGET_STATE_INSENSITIVE QStyle::State_None 650 #define LIVES_WIDGET_STATE_FOCUSED QStyle::State_HasFocus 655 #define LIVES_WIDGET_COLOR_HAS_ALPHA (1) 656 #define LIVES_WIDGET_COLOR_SCALE(x) (x) 657 #define LIVES_WIDGET_COLOR_SCALE_255(x) ((double)x/255.) 660 typedef Qt::KeyboardModifiers LiVESXModifierType;
662 #define LIVES_CONTROL_MASK Qt::ControlModifier 663 #define LIVES_ALT_MASK Qt::AltModifier 664 #define LIVES_SHIFT_MASK Qt::ShiftModifier 665 #define LIVES_LOCK_MASK Qt::ShiftModifier 668 #define LIVES_KEY_Left (static_cast<uint32_t>(Qt::Key_Left)) 669 #define LIVES_KEY_Right (static_cast<uint32_t>(Qt::Key_Right)) 670 #define LIVES_KEY_Up (static_cast<uint32_t>(Qt::Key_Up)) 671 #define LIVES_KEY_Down (static_cast<uint32_t>(Qt::Key_Down)) 673 #define LIVES_KEY_BackSpace (static_cast<uint32_t>(Qt::Key_Backspace)) 674 #define LIVES_KEY_Return (static_cast<uint32_t>(Qt::Key_Return)) 675 #define LIVES_KEY_Tab (static_cast<uint32_t>(Qt::Key_Tab)) 676 #define LIVES_KEY_Home (static_cast<uint32_t>(Qt::Key_Home)) 677 #define LIVES_KEY_End (static_cast<uint32_t>(Qt::Key_End)) 678 #define LIVES_KEY_Slash (static_cast<uint32_t>(Qt::Key_Slash)) 679 #define LIVES_KEY_Space (static_cast<uint32_t>(Qt::Key_Space)) 680 #define LIVES_KEY_Plus (static_cast<uint32_t>(Qt::Key_Plus)) 681 #define LIVES_KEY_Minus (static_cast<uint32_t>(Qt::Key_Minus)) 682 #define LIVES_KEY_Equal (static_cast<uint32_t>(Qt::Key_Equal)) 684 #define LIVES_KEY_1 (static_cast<uint32_t>(Qt::Key_1)) 685 #define LIVES_KEY_2 (static_cast<uint32_t>(Qt::Key_2)) 686 #define LIVES_KEY_3 (static_cast<uint32_t>(Qt::Key_3)) 687 #define LIVES_KEY_4 (static_cast<uint32_t>(Qt::Key_4)) 688 #define LIVES_KEY_5 (static_cast<uint32_t>(Qt::Key_5)) 689 #define LIVES_KEY_6 (static_cast<uint32_t>(Qt::Key_6)) 690 #define LIVES_KEY_7 (static_cast<uint32_t>(Qt::Key_7)) 691 #define LIVES_KEY_8 (static_cast<uint32_t>(Qt::Key_8)) 692 #define LIVES_KEY_9 (static_cast<uint32_t>(Qt::Key_9)) 693 #define LIVES_KEY_0 (static_cast<uint32_t>(Qt::Key_0)) 695 #define LIVES_KEY_a (static_cast<uint32_t>(Qt::Key_A)) 696 #define LIVES_KEY_b (static_cast<uint32_t>(Qt::Key_B)) 697 #define LIVES_KEY_c (static_cast<uint32_t>(Qt::Key_C)) 698 #define LIVES_KEY_d (static_cast<uint32_t>(Qt::Key_D)) 699 #define LIVES_KEY_e (static_cast<uint32_t>(Qt::Key_E)) 700 #define LIVES_KEY_f (static_cast<uint32_t>(Qt::Key_F)) 701 #define LIVES_KEY_g (static_cast<uint32_t>(Qt::Key_G)) 702 #define LIVES_KEY_h (static_cast<uint32_t>(Qt::Key_H)) 703 #define LIVES_KEY_i (static_cast<uint32_t>(Qt::Key_I)) 704 #define LIVES_KEY_j (static_cast<uint32_t>(Qt::Key_J)) 705 #define LIVES_KEY_k (static_cast<uint32_t>(Qt::Key_K)) 706 #define LIVES_KEY_l (static_cast<uint32_t>(Qt::Key_L)) 707 #define LIVES_KEY_m (static_cast<uint32_t>(Qt::Key_M)) 708 #define LIVES_KEY_n (static_cast<uint32_t>(Qt::Key_N)) 709 #define LIVES_KEY_o (static_cast<uint32_t>(Qt::Key_O)) 710 #define LIVES_KEY_p (static_cast<uint32_t>(Qt::Key_P)) 711 #define LIVES_KEY_q (static_cast<uint32_t>(Qt::Key_Q)) 712 #define LIVES_KEY_r (static_cast<uint32_t>(Qt::Key_R)) 713 #define LIVES_KEY_s (static_cast<uint32_t>(Qt::Key_S)) 714 #define LIVES_KEY_t (static_cast<uint32_t>(Qt::Key_T)) 715 #define LIVES_KEY_u (static_cast<uint32_t>(Qt::Key_U)) 716 #define LIVES_KEY_v (static_cast<uint32_t>(Qt::Key_V)) 717 #define LIVES_KEY_w (static_cast<uint32_t>(Qt::Key_W)) 718 #define LIVES_KEY_x (static_cast<uint32_t>(Qt::Key_X)) 719 #define LIVES_KEY_y (static_cast<uint32_t>(Qt::Key_Y)) 720 #define LIVES_KEY_z (static_cast<uint32_t>(Qt::Key_Z)) 722 #define LIVES_KEY_F1 (static_cast<uint32_t>(Qt::Key_F1)) 723 #define LIVES_KEY_F2 (static_cast<uint32_t>(Qt::Key_F2)) 724 #define LIVES_KEY_F3 (static_cast<uint32_t>(Qt::Key_F3)) 725 #define LIVES_KEY_F4 (static_cast<uint32_t>(Qt::Key_F4)) 726 #define LIVES_KEY_F5 (static_cast<uint32_t>(Qt::Key_F5)) 727 #define LIVES_KEY_F6 (static_cast<uint32_t>(Qt::Key_F6)) 728 #define LIVES_KEY_F7 (static_cast<uint32_t>(Qt::Key_F7)) 729 #define LIVES_KEY_F8 (static_cast<uint32_t>(Qt::Key_F8)) 730 #define LIVES_KEY_F9 (static_cast<uint32_t>(Qt::Key_F9)) 731 #define LIVES_KEY_F10 (static_cast<uint32_t>(Qt::Key_F10)) 732 #define LIVES_KEY_F11 (static_cast<uint32_t>(Qt::Key_F11)) 733 #define LIVES_KEY_F12 (static_cast<uint32_t>(Qt::Key_F12)) 735 #define LIVES_KEY_Page_Up (static_cast<uint32_t>(Qt::Key_PageUp)) 736 #define LIVES_KEY_Page_Down (static_cast<uint32_t>(Qt::Key_PageDown)) 738 #define LIVES_KEY_Escape (static_cast<uint32_t>(Qt::Key_Escape)) 740 typedef int LiVESAccelFlags;
742 typedef class LiVESAccelGroup LiVESAccelGroup;
743 typedef class LiVESWidget LiVESWidget;
746 typedef void LiVESXEvent;
747 typedef void LiVESXXEvent;
748 typedef void LiVESXEventMotion;
749 typedef void LiVESXEventFocus;
751 typedef QCursor LiVESXCursor;
754 #define LIVES_SCROLL_UP 1 755 #define LIVES_SCROLL_DOWN 2 759 LiVESXModifierType state;
783 #define LIVES_BUTTON_PRESS 1 784 #define LIVES_BUTTON_RELEASE 2 785 #define LIVES_BUTTON2_PRESS 3 788 typedef void LiVESXEventCrossing;
789 typedef void LiVESXEventConfigure;
790 typedef void LiVESXEventDelete;
793 typedef class LiVESObject LiVESObject;
795 typedef void (*LiVESWidgetCallback)(LiVESWidget *widget, livespointer data);
797 LiVESClosure *lives_cclosure_new(
ulong func, livespointer data, livespointer dest_func) {
798 LiVESClosure *cl =
new LiVESClosure;
799 cl->function = (
ulong)func;
806 typedef boolean(*LiVESScrollEventCallback)(LiVESWidget *widget, LiVESXEventScroll *, livespointer data);
807 typedef boolean(*LiVESExposeEventCallback)(LiVESWidget *widget, LiVESXEventExpose *, livespointer data);
808 typedef boolean(*LiVESEnterEventCallback)(LiVESWidget *widget, LiVESXEventCrossing *, livespointer data);
809 typedef boolean(*LiVESButtonEventCallback)(LiVESWidget *widget, LiVESXEventButton *, livespointer data);
810 typedef boolean(*LiVESConfigureEventCallback)(LiVESWidget *widget, LiVESXEventConfigure *, livespointer data);
811 typedef boolean(*LiVESDeleteEventCallback)(LiVESWidget *widget, LiVESXEventDelete *, livespointer data);
812 typedef boolean(*LiVESAccelCallback)(LiVESAccelGroup *group, LiVESObject *obj, uint32_t keyval, LiVESXModifierType mod, livespointer data);
814 #define LIVES_GUI_CALLBACK(a) (ulong)(a) 817 typedef void LiVESTargetEntry;
819 typedef bool LiVESFilterReturn;
821 #define LIVES_FILTER_REMOVE true 822 #define LIVES_FILTER_CONTINUE false 828 LiVESAccelFlags flags;
829 LiVESAccelGroup *group;
834 const char *signal_name;
835 LiVESClosure *closure;
850 boolean return_true() {
855 typedef uint32_t LiVESEventMask;
856 #define LIVES_EXPOSURE_MASK (1<<0) 857 #define LIVES_POINTER_MOTION_MASK (1<<1) 858 #define LIVES_POINTER_MOTION_HINT_MASK (1<<2) 859 #define LIVES_BUTTON_MOTION_MASK (1<<3) 860 #define LIVES_BUTTON1_MOTION_MASK (1<<4) 861 #define LIVES_BUTTON2_MOTION_MASK (1<<5) 862 #define LIVES_BUTTON3_MOTION_MASK (1<<6) 863 #define LIVES_BUTTON_PRESS_MASK (1<<7) 864 #define LIVES_BUTTON_RELEASE_MASK (1<<8) 865 #define LIVES_KEY_PRESS_MASK (1<<9) 866 #define LIVES_KEY_RELEASE_MASK (1<<10) 867 #define LIVES_ENTER_NOTIFY_MASK (1<<11) 868 #define LIVES_LEAVE_NOTIFY_MASK (1<<12) 869 #define LIVES_FOCUS_CHANGE_MASK (1<<13) 870 #define LIVES_STRUCTURE_MASK (1<<14) 871 #define LIVES_PROPERTY_CHANGE_MASK (1<<15) 872 #define LIVES_VISIBILITY_NOTIFY_MASK (1<<16) 873 #define LIVES_PROXIMITY_IN_MASK (1<<17) 874 #define LIVES_PROXIMITY_OUT_MASK (1<<18) 875 #define LIVES_SUBSTRUCTURE_MASK (1<<19) 876 #define LIVES_SCROLL_MASK (1<<20) 877 #define LIVES_TOUCH_MASK (1<<21) 878 #define LIVES_SMOOTH_SCROLL_MASK (1<<22) 880 #define LIVES_ALL_EVENTS_MASK 0xFFFF 883 #define LIVES_WIDGET_EXPOSE_EVENT "update" 884 #define LIVES_WIDGET_SCROLL_EVENT "scroll_event" 885 #define LIVES_WIDGET_ENTER_EVENT "enter-event" 886 #define LIVES_WIDGET_BUTTON_PRESS_EVENT "button-press-event" 887 #define LIVES_WIDGET_CONFIGURE_EVENT "resize" 888 #define LIVES_WIDGET_DELETE_EVENT "close-event" 894 #define LIVES_WIDGET_CLICKED_EVENT "clicked" 895 #define LIVES_WIDGET_TOGGLED_EVENT "toggled" 896 #define LIVES_WIDGET_CHANGED_EVENT "changed" 897 #define LIVES_WIDGET_ACTIVATE_EVENT "activate" 898 #define LIVES_WIDGET_VALUE_CHANGED_EVENT "value-changed" 899 #define LIVES_WIDGET_SELECTION_CHANGED_EVENT "selection-changed" 900 #define LIVES_WIDGET_CURRENT_FOLDER_CHANGED_EVENT "current-folder-changed" 901 #define LIVES_WIDGET_RESPONSE_EVENT "response" 909 static QString make_col(LiVESWidgetColor *col) {
910 QString qc = QString(
"rgba(%1,%2,%3,%4)")
912 .arg(col->green*255.)
914 .arg(col->alpha*255.);
920 LIVES_OBJECT_TYPE_UNKNOWN,
921 LIVES_OBJECT_TYPE_TIMER,
922 LIVES_WIDGET_TYPE_BUTTON,
923 LIVES_WIDGET_TYPE_SPIN_BUTTON,
924 LIVES_WIDGET_TYPE_RADIO_BUTTON,
925 LIVES_WIDGET_TYPE_CHECK_BUTTON,
926 LIVES_WIDGET_TYPE_COLOR_BUTTON,
927 LIVES_WIDGET_TYPE_TOOL_BUTTON,
928 LIVES_WIDGET_TYPE_TOOLBAR,
929 LIVES_WIDGET_TYPE_BUTTON_BOX,
930 LIVES_WIDGET_TYPE_TEXT_VIEW,
931 LIVES_WIDGET_TYPE_SCALE,
932 LIVES_WIDGET_TYPE_SCROLLBAR,
933 LIVES_WIDGET_TYPE_SCROLLED_WINDOW,
934 LIVES_WIDGET_TYPE_PROGRESS_BAR,
935 LIVES_WIDGET_TYPE_PANED,
936 LIVES_WIDGET_TYPE_MENU,
937 LIVES_WIDGET_TYPE_MENU_ITEM,
938 LIVES_WIDGET_TYPE_TOOL_ITEM,
939 LIVES_WIDGET_TYPE_RADIO_MENU_ITEM,
940 LIVES_WIDGET_TYPE_CHECK_MENU_ITEM,
941 LIVES_WIDGET_TYPE_MENU_TOOL_BUTTON,
942 LIVES_WIDGET_TYPE_MENU_BAR,
943 LIVES_WIDGET_TYPE_ENTRY,
944 LIVES_WIDGET_TYPE_FRAME,
945 LIVES_WIDGET_TYPE_FILE_CHOOSER,
946 LIVES_WIDGET_TYPE_ARROW,
947 LIVES_WIDGET_TYPE_RULER,
948 LIVES_WIDGET_TYPE_COMBO,
949 LIVES_WIDGET_TYPE_TABLE,
950 LIVES_WIDGET_TYPE_DIALOG,
951 LIVES_WIDGET_TYPE_MESSAGE_DIALOG,
952 LIVES_WIDGET_TYPE_ALIGNMENT,
953 LIVES_WIDGET_TYPE_IMAGE,
954 LIVES_WIDGET_TYPE_LABEL,
955 LIVES_WIDGET_TYPE_NOTEBOOK,
956 LIVES_WIDGET_TYPE_TREE_VIEW,
957 LIVES_WIDGET_TYPE_HSEPARATOR,
958 LIVES_WIDGET_TYPE_VSEPARATOR,
959 LIVES_WIDGET_TYPE_MAIN_WINDOW,
960 LIVES_WIDGET_TYPE_SUB_WINDOW,
961 LIVES_WIDGET_TYPE_EVENT_BOX,
962 LIVES_WIDGET_TYPE_DRAWING_AREA,
963 LIVES_WIDGET_TYPE_HBOX,
964 LIVES_WIDGET_TYPE_VBOX,
968 LIVES_INLINE QKeySequence make_qkey_sequence(uint32_t key, LiVESXModifierType mods) {
969 return static_cast<Qt::Key
>(key) | mods;
972 LIVES_INLINE uint32_t qkeysequence_get_key(QKeySequence ks) {
973 return ks[0] & 0x01FFFFFF;
977 LIVES_INLINE LiVESXModifierType qkeysequence_get_mod(QKeySequence ks) {
978 return static_cast<LiVESXModifierType
>(ks[0] & 0xF2000000);
982 class evFilter :
public QObject {
986 bool eventFilter(QObject *obj, QEvent *
event);
993 class nevfilter :
public QAbstractNativeEventFilter {
996 virtual bool nativeEventFilter(
const QByteArray &eventType, livespointer message,
long *);
1002 class LiVESObject :
public QWidget {
1007 void block_signal(
ulong handler_id);
1008 void block_signals(
const char *signame);
1009 void block_signals(
ulong func, livespointer data);
1010 void unblock_signal(
ulong handler_id);
1011 void unblock_signals(
const char *signame);
1012 void unblock_signals(
ulong func, livespointer data);
1013 void disconnect_signal(
ulong handler_id);
1015 void add_accel(LiVESAccel *accel);
1016 void add_accel(
ulong handler_id,
const char *signal_name,
ulong funcptr, livespointer data);
1017 void add_accel(
const char *signal_name, LiVESAccelGroup *group, uint32_t key, LiVESXModifierType mod, LiVESAccelFlags flags);
1019 boolean remove_accel(LiVESAccel *accel);
1020 boolean remove_accels(LiVESAccelGroup *, uint32_t key, LiVESXModifierType mod);
1022 boolean remove_accel_group(LiVESAccelGroup *group);
1023 void add_accel_group(LiVESAccelGroup *group);
1025 QList<LiVESAccelGroup *> get_accel_groups();
1027 QList<LiVESAccel *> get_accels_for(LiVESAccelGroup *group, QKeySequence ks);
1028 QList<LiVESAccel *> get_accels_for(
ulong func, livespointer data);
1029 QList<LiVESAccel *> get_accels_for(
const char *signame);
1030 LiVESAccel *get_accel_for(
ulong handler_id);
1032 boolean activate_accel(uint32_t key, LiVESXModifierType mod);
1033 boolean activate_accel(QKeySequence ks);
1035 void remove_all_accels();
1042 LiVESObject(
const LiVESObject &xobj) {
1048 if (floating) floating =
false;
1049 else inc_refcount();
1052 void inc_refcount() {
1056 void dec_refcount() {
1057 if (--refcount == 0) {
1062 void no_refcount() {
1067 void set_type(LiVESObjectType xtype) {
1071 LiVESObjectType get_type() {
1079 QList<LiVESAccel *>accels;
1080 QList<LiVESAccelGroup *>accel_groups;
1081 LiVESObjectType type;
1084 eFilter =
new evFilter();
1085 (
static_cast<QObject *
>(
this))->installEventFilter(eFilter);
1087 type = LIVES_OBJECT_TYPE_UNKNOWN;
1090 void finalise(
void) {
1091 (
static_cast<QObject *
>(
this))->deleteLater();
1094 while (accel_groups.size() > 0) {
1095 remove_accel_group(accel_groups[0]);
1098 remove_all_accels();
1104 typedef struct LiVESList LiVESList;
1107 livesconstpointer data;
1113 typedef struct LiVESSList LiVESSList;
1116 livesconstpointer data;
1120 typedef LiVESList LiVESDList;
1123 LIVES_INLINE livesconstpointer lives_list_nth_data(LiVESList *list, uint32_t n) {
1124 for (
unsigned int i = 0; i < n && list != NULL; i++) list = list->next;
1125 if (list == NULL)
return NULL;
1126 livesconstpointer data = list->data;
1130 LIVES_INLINE LiVESList *lives_list_nth(LiVESList *list, uint32_t n) {
1131 for (
unsigned int i = 0; i < n && list != NULL; i++) list = list->next;
1135 LIVES_INLINE livesconstpointer lives_slist_nth_data(LiVESSList *list, uint32_t n) {
1136 for (
unsigned int i = 0; i < n && list != NULL; i++) list = list->next;
1137 if (list == NULL)
return NULL;
1138 livesconstpointer data = list->data;
1144 for (i = 0; list != NULL; i++) list = list->next;
1148 LIVES_INLINE int lives_slist_length(LiVESSList *list) {
1150 for (i = 0; list != NULL; i++) list = list->next;
1156 LIVES_INLINE LiVESList *lives_list_remove(LiVESList *list, livesconstpointer data) {
1157 LiVESList *olist = list;
1158 for (
int i = 0; list->data != data && list != NULL; i++) list = list->next;
1159 if (list == NULL)
return NULL;
1160 if (list->prev != NULL) list->prev->next = list->next;
1161 else olist = list->next;
1162 if (list->next != NULL) list->next->prev = list->prev;
1164 list->next = list->prev = NULL;
1170 LIVES_INLINE LiVESList *lives_list_remove_link(LiVESList *olist, LiVESList *list) {
1171 if (olist == NULL)
return NULL;
1173 if (list->prev != NULL) list->prev->next = list->next;
1174 else olist = list->next;
1175 if (list->next != NULL) list->next->prev = list->prev;
1177 list->next = list->prev = NULL;
1183 LIVES_INLINE LiVESSList *lives_slist_remove(LiVESSList *list, livesconstpointer data) {
1184 LiVESSList *olist = list, *xlist = list;
1185 for (
int i = 0; list->data != data && list != NULL; i++) {
1189 if (list == NULL)
return NULL;
1191 xlist->next = list->next;
1193 if (list == olist) olist = list->next;
1201 LIVES_INLINE LiVESList *lives_list_append(LiVESList *list, livesconstpointer data) {
1202 LiVESList *olist=NULL, *xlist=list;
1204 while (list != NULL) {
1209 LiVESList *elem = (LiVESList *)malloc(
sizeof(LiVESList));
1214 if (olist == NULL) xlist = elem;
1219 LIVES_INLINE LiVESSList *lives_slist_append(LiVESSList *list, livesconstpointer data) {
1220 LiVESSList *olist=NULL, *xlist=list;
1222 while (list != NULL) {
1227 LiVESSList *elem = (LiVESSList *)malloc(
sizeof(LiVESSList));
1231 if (olist == NULL) xlist = elem;
1236 LIVES_INLINE LiVESList *lives_list_prepend(LiVESList *list, livesconstpointer data) {
1237 LiVESList *elem = (LiVESList *)malloc(
sizeof(LiVESList));
1245 LIVES_INLINE LiVESSList *lives_slist_prepend(LiVESSList *list, livesconstpointer data) {
1246 LiVESSList *elem = (LiVESSList *)malloc(
sizeof(LiVESSList));
1253 LIVES_INLINE LiVESList *lives_list_insert(LiVESList *list, livespointer data,
int pos) {
1254 if (pos == 0)
return lives_list_prepend(list, data);
1256 LiVESList *xlist = list, *olist = NULL;
1258 while (list != NULL && pos != 0) {
1264 LiVESList *elem = (LiVESList *)malloc(
sizeof(LiVESList));
1266 elem->next = olist->next;
1268 if (elem->next != NULL) elem->next->prev = elem;
1271 if (xlist == NULL) xlist = elem;
1278 LIVES_INLINE LiVESList *lives_list_find(LiVESList *list, livesconstpointer data) {
1279 while (list != NULL) {
1280 if (list->data == data)
return list;
1287 LIVES_INLINE LiVESList *lives_list_find_custom(LiVESList *list, livesconstpointer data, LiVESCompareFunc func) {
1288 while (list != NULL) {
1289 if (! func(list->data, data))
1300 while (list != NULL) {
1310 while (list != NULL) {
1318 LIVES_INLINE LiVESList *lives_list_previous(LiVESList *list) {
1319 if (list == NULL)
return NULL;
1324 LIVES_INLINE LiVESList *lives_list_last(LiVESList *list) {
1325 if (list == NULL)
return NULL;
1326 while (list->next != NULL) list=list->next;
1332 LIVES_INLINE LiVESList *lives_list_delete_link(LiVESList *list, LiVESList *link) {
1333 list = lives_list_remove_link(list, link);
1339 LIVES_INLINE LiVESList *lives_list_copy(LiVESList *list) {
1340 LiVESList *new_list = NULL;
1341 while (list != NULL) {
1342 lives_list_append(new_list, list->data);
1349 LIVES_INLINE LiVESList *lives_list_concat(LiVESList *a, LiVESList *b) {
1350 LiVESList *xlist = lives_list_last(a);
1358 char **lives_strsplit(
const char *
string,
const char *delimiter,
int max_tokens) {
1359 LiVESSList *string_list = NULL,*slist;
1363 const char *remainder;
1365 max_tokens = INT_MAX;
1367 s = strstr(remainder, delimiter);
1369 size_t delimiter_len = strlen(delimiter);
1370 while (--max_tokens && s) {
1372 len = s - remainder;
1373 string_list = lives_slist_prepend(string_list, lives_strndup(remainder, len));
1375 remainder = s + delimiter_len;
1376 s = strstr(remainder, delimiter);
1381 string_list = lives_slist_prepend(string_list,
lives_strdup(remainder));
1383 str_array = (
char **)lives_malloc((n + 1) *
sizeof(
char *));
1384 str_array[n--] = NULL;
1385 for (slist = string_list; slist; slist = slist->next)
1386 str_array[n--] = (
char *)slist->data;
1387 lives_slist_free(string_list);
1393 char *lives_strdelimit(
char *
string,
const char *delimiters,
char new_delim) {
1395 for (c =
string; *c; c++) {
1396 if (strchr(delimiters, *c))
1405 char *lives_strstr_len(
const char *haystack, ssize_t haystack_len,
const char *needle) {
1406 if (haystack_len < 0)
1407 return (
char *)strstr(haystack, needle);
1409 const char *p = haystack;
1410 size_t needle_len = strlen(needle);
1413 if (needle_len == 0)
1414 return (
char *)haystack;
1415 if (haystack_len < needle_len)
1417 end = haystack + haystack_len - needle_len;
1418 while (p <= end && *p) {
1419 for (i = 0; i < needle_len; i++)
1420 if (p[i] != needle[i])
1432 #define ICON_SCALE(a) ((int)(1.0 * a)) 1433 typedef QSize LiVESIconSize;
1434 #define LIVES_ICON_SIZE_INVALID QSize(0,0) 1435 #define LIVES_ICON_SIZE_MENU QSize(ICON_SCALE(16),ICON_SCALE(16)) 1436 #define LIVES_ICON_SIZE_SMALL_TOOLBAR QSize(ICON_SCALE(16),ICON_SCALE(16)) 1437 #define LIVES_ICON_SIZE_LARGE_TOOLBAR QSize(ICON_SCALE(24),ICON_SCALE(24)) 1438 #define LIVES_ICON_SIZE_BUTTON QSize(ICON_SCALE(16),ICON_SCALE(16)) 1439 #define LIVES_ICON_SIZE_DND QSize(ICON_SCALE(32),ICON_SCALE(32)) 1440 #define LIVES_ICON_SIZE_DIALOG QSize(ICON_SCALE(48),ICON_SCALE(48)) 1443 typedef Qt::TransformationMode LiVESInterpType;
1444 #define LIVES_INTERP_BEST Qt::SmoothTransformation 1445 #define LIVES_INTERP_NORMAL Qt::SmoothTransformation 1446 #define LIVES_INTERP_FAST Qt::FastTransformation 1448 typedef int LiVESResponseType;
1449 #define LIVES_RESPONSE_NONE QDialogButtonBox::InvalidRole 1450 #define LIVES_RESPONSE_OK QDialogButtonBox::AcceptRole 1451 #define LIVES_RESPONSE_CANCEL QDialogButtonBox::RejectRole 1453 #define LIVES_RESPONSE_ACCEPT QDialogButtonBox::AcceptRole 1455 #define LIVES_RESPONSE_YES QDialogButtonBox::YesRole 1456 #define LIVES_RESPONSE_NO QDialogButtonBox::NoRole 1458 #define LIVES_RESPONSE_INVALID QDialogButtonBox::InvalidRole 1459 #define LIVES_RESPONSE_SHOW_DETAILS 100 1461 #define LIVES_RESPONSE_RETRY 101 1462 #define LIVES_RESPONSE_ABORT 102 1463 #define LIVES_RESPONSE_RESET 103 1465 typedef QStyle::StandardPixmap LiVESArrowType;
1466 #define LIVES_ARROW_UP QStyle::SP_ArrowUp 1467 #define LIVES_ARROW_DOWN QStyle::SP_ArrowDown 1468 #define LIVES_ARROW_LEFT QStyle::SP_ArrowLeft 1469 #define LIVES_ARROW_RIGHT QStyle::SP_ArrowRight 1470 #define LIVES_ARROW_NONE -1 1472 class LiVESWidget :
public LiVESObject {
1477 Q_PROPERTY(
bool prelight READ get_prelight WRITE set_prelight)
1479 void set_prelight(
bool val) {
1480 (
static_cast<QObject *
>(
static_cast<QWidget *
>(
this)))->setProperty(
"prelight", val);
1483 bool get_prelight() {
1484 QVariant qv = (
static_cast<QObject *
>(
static_cast<QWidget *
>(
this)))->property(
"prelight");
1485 return qv.value<
bool>();
1488 void set_fg_color(LiVESWidgetState state,
const LiVESWidgetColor *col);
1489 void set_bg_color(LiVESWidgetState state,
const LiVESWidgetColor *col);
1490 void set_base_color(LiVESWidgetState state,
const LiVESWidgetColor *col);
1491 void set_text_color(LiVESWidgetState state,
const LiVESWidgetColor *col);
1493 LiVESWidgetColor *get_fg_color(LiVESWidgetState state);
1494 LiVESWidgetColor *get_bg_color(LiVESWidgetState state);
1496 void update_stylesheet();
1499 LiVESWidget() : parent(NULL) {
1501 QVariant qv = QVariant::fromValue(static_cast<LiVESObject *>(
this));
1502 (
static_cast<QWidget *
>(
this))->setProperty(
"LiVESObject", qv);
1504 fg_norm=bg_norm=base_norm=text_norm=NULL;
1505 fg_act=bg_act=base_act=text_act=NULL;
1506 fg_insen=bg_insen=base_insen=text_insen=NULL;
1507 fg_hover=bg_hover=base_hover=text_hover=NULL;
1508 fg_sel=bg_sel=base_sel=text_sel=NULL;
1509 state = LIVES_WIDGET_STATE_NORMAL;
1511 events_mask = LIVES_EXPOSURE_MASK;
1512 onetime_events_mask = 0;
1514 static_cast<QObject *
>(
static_cast<QWidget *
>(
this))->connect(static_cast<QObject *>(static_cast<QWidget *>(
this)),
1515 SIGNAL(destroyed()),
1516 static_cast<QObject *>(static_cast<QWidget *>(
this)),
1517 SLOT(onDestroyed()));
1522 void onDestroyed() {
1534 void add_child(LiVESWidget *child) {
1535 if (child->parent != NULL)
return;
1536 child->set_parent(
this);
1538 children = lives_list_append(children,child);
1541 void remove_child(LiVESWidget *child) {
1542 children = lives_list_remove(children,child);
1543 child->set_parent(NULL);
1544 child->dec_refcount();
1547 void set_parent(LiVESWidget *new_parent) {
1548 parent = new_parent;
1551 LiVESWidget *get_parent() {
1555 QString get_name() {
1559 void set_events(uint32_t mask) {
1563 void add_onetime_event_block(uint32_t mask) {
1564 onetime_events_mask |= mask;
1567 void remove_onetime_event_block(uint32_t mask) {
1568 if (onetime_events_mask & mask) onetime_events_mask ^= mask;
1571 uint32_t get_onetime_events_block() {
1572 return onetime_events_mask;
1575 uint32_t get_events() {
1579 int count_children() {
1580 return lives_list_length(children);
1583 LiVESList *get_children() {
1587 void set_children(LiVESList *xchildren) {
1588 lives_list_free(children);
1589 children = xchildren;
1592 LiVESWidget *get_child(
int index) {
1593 return (LiVESWidget *)lives_list_nth_data(children,index);
1597 int get_child_index(LiVESWidget *child) {
1598 LiVESList *xchildren = children;
1600 for (i = 0; xchildren != NULL; i++) {
1601 if (xchildren->data == child)
return i;
1606 LiVESWidgetState get_state() {
1610 void set_state(LiVESWidgetState xstate) {
1613 if (state & LIVES_WIDGET_STATE_INSENSITIVE) {
1620 if (state & LIVES_WIDGET_STATE_PRELIGHT) {
1621 if (!get_prelight()) set_prelight(
true);
1623 if (get_prelight()) set_prelight(
false);
1630 void cb_wrapper_clicked() {
1632 call_accels_for(LIVES_WIDGET_CLICKED_EVENT);
1635 void cb_wrapper_toggled() {
1637 call_accels_for(LIVES_WIDGET_CLICKED_EVENT);
1641 void cb_wrapper_changed() {
1643 call_accels_for(LIVES_WIDGET_CHANGED_EVENT);
1647 void cb_wrapper_value_changed() {
1649 call_accels_for(LIVES_WIDGET_VALUE_CHANGED_EVENT);
1652 void cb_wrapper_selection_changed() {
1654 call_accels_for(LIVES_WIDGET_SELECTION_CHANGED_EVENT);
1657 void cb_wrapper_current_folder_changed() {
1659 call_accels_for(LIVES_WIDGET_CURRENT_FOLDER_CHANGED_EVENT);
1662 void cb_wrapper_activate() {
1664 call_accels_for(LIVES_WIDGET_ACTIVATE_EVENT);
1667 void cb_wrapper_response() {
1669 call_accels_for(LIVES_WIDGET_RESPONSE_EVENT);
1673 LiVESList *children;
1674 LiVESWidget *parent;
1677 LiVESWidgetColor *fg_norm,*bg_norm,*base_norm,*text_norm;
1678 LiVESWidgetColor *fg_act,*bg_act,*base_act,*text_act;
1679 LiVESWidgetColor *fg_insen,*bg_insen,*base_insen,*text_insen;
1680 LiVESWidgetColor *fg_hover,*bg_hover,*base_hover,*text_hover;
1681 LiVESWidgetColor *fg_sel,*bg_sel,*base_sel,*text_sel;
1683 LiVESWidgetState state;
1685 uint32_t events_mask;
1686 uint32_t onetime_events_mask;
1688 void call_accels_for(
const char *type) {
1689 QList<LiVESAccel *> ql = get_accels_for(type);
1690 for (
int i=0; i < ql.size(); i++) {
1691 LiVESWidgetCallback *cb = (LiVESWidgetCallback *)ql[i]->closure->function;
1692 (*cb)(
this, ql[i]->closure->data);
1699 #define LIVES_IS_WIDGET_OBJECT(a) 1 1700 #define LIVES_IS_WIDGET(a) 1 1701 #define LIVES_IS_CONTAINER(a) 1 1702 #define LIVES_IS_XWINDOW(a) 1 1704 #define LIVES_IS_BUTTON(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_BUTTON || \ 1705 static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_CHECK_BUTTON) 1706 #define LIVES_IS_PUSH_BUTTON(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_BUTTON || \ 1707 static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_RADIO_BUTTON) 1708 #define LIVES_IS_RANGE(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_SCALE || \ 1709 static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_SCROLLBAR) 1710 #define LIVES_IS_LABEL(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_LABEL) 1711 #define LIVES_IS_TOGGLE_BUTTON(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_CHECK_BUTTON) 1712 #define LIVES_IS_HBOX(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_HBOX) 1713 #define LIVES_IS_VBOX(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_VBOX) 1714 #define LIVES_IS_COMBO(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_COMBO) 1715 #define LIVES_IS_ENTRY(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_ENTRY) 1716 #define LIVES_IS_MENU(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_MENU) 1717 #define LIVES_IS_MENU_BAR(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_MENU_BAR) 1718 #define LIVES_IS_MENU_ITEM(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_MENU_ITEM) 1719 #define LIVES_IS_TOOLBAR(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_TOOLBAR) 1720 #define LIVES_IS_FILE_CHOOSER(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_FILE_CHOOSER) 1721 #define LIVES_IS_SCALE(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_SCALE) 1722 #define LIVES_IS_FRAME(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_FRAME) 1723 #define LIVES_IS_TOOL_ITEM(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_TOOL_ITEM) 1724 #define LIVES_IS_WINDOW(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_MAIN_WINDOW) 1725 #define LIVES_IS_DIALOG(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_SUB_WINDOW || \ 1726 static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_MESSAGE_DIALOG) 1727 #define LIVES_IS_PANED(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_PANED) 1728 #define LIVES_IS_TABLE(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_TABLE) 1729 #define LIVES_IS_IMAGE(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_IMAGE) 1730 #define LIVES_IS_PIXBUF(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_IMAGE) 1731 #define LIVES_IS_NOTEBOOK(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_NOTEBOOK) 1732 #define LIVES_IS_SPIN_BUTTON(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_SPIN_BUTTON) 1733 #define LIVES_IS_SCROLLBAR(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_SCROLLBAR) 1734 #define LIVES_IS_TREE_VIEW(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_TREE_VIEW) 1735 #define LIVES_IS_TEXT_VIEW(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_TEXT_VIEW) 1736 #define LIVES_IS_TEXT_BUFFER(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_TEXT_BUFFER) 1737 #define LIVES_IS_SCROLLED_WINDOW(a) (static_cast<LiVESObject *>(a)->get_type() == LIVES_WIDGET_TYPE_SCROLLED_WINDOW) 1740 bool evFilter::eventFilter(QObject *obj, QEvent *
event) {
1748 switch (event->type()) {
1750 case (QEvent::Shortcut): {
1751 QShortcutEvent *qevent =
static_cast<QShortcutEvent *
>(event);
1752 QKeySequence ks = qevent->key();
1753 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1754 object->activate_accel(ks);
1758 case (QEvent::Wheel): {
1759 QWheelEvent *qevent =
static_cast<QWheelEvent *
>(event);
1760 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1761 LiVESWidget *widget =
static_cast<LiVESWidget *
>(object);
1762 if (!(widget->get_events() & LIVES_SCROLL_MASK))
return true;
1763 if (!(widget->get_onetime_events_block() & LIVES_SCROLL_MASK)) {
1764 widget->remove_onetime_event_block(LIVES_SCROLL_MASK);
1768 QList<LiVESAccel *>accels =
object->get_accels_for(LIVES_WIDGET_SCROLL_EVENT);
1769 LiVESXEventScroll *scrollevent = NULL;
1770 if (qevent->angleDelta().y() > 0) scrollevent->direction = LIVES_SCROLL_UP;
1771 else scrollevent->direction = LIVES_SCROLL_DOWN;
1773 scrollevent->state = QApplication::queryKeyboardModifiers();
1775 for (
int i=0; i < accels.size(); i++) {
1776 LiVESScrollEventCallback *cb = (LiVESScrollEventCallback *)accels[i]->closure->function;
1777 bool ret = (*cb)(widget, scrollevent, accels[i]->closure->data);
1778 if (ret)
return true;
1782 case (QEvent::Paint): {
1783 QPaintEvent *qevent =
static_cast<QPaintEvent *
>(event);
1784 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1785 LiVESWidget *widget =
static_cast<LiVESWidget *
>(object);
1786 if (!(widget->get_events() & LIVES_EXPOSURE_MASK))
return true;
1787 if (!(widget->get_onetime_events_block() & LIVES_EXPOSURE_MASK)) {
1788 widget->remove_onetime_event_block(LIVES_EXPOSURE_MASK);
1792 QList<LiVESAccel *>accels =
object->get_accels_for(LIVES_WIDGET_EXPOSE_EVENT);
1793 LiVESXEventExpose *exposeevent = NULL;
1794 QRect qr = qevent->rect();
1795 exposeevent->area.x = qr.x();
1796 exposeevent->area.y = qr.y();
1797 exposeevent->area.width = qr.width();
1798 exposeevent->area.height = qr.height();
1800 exposeevent->count = 0;
1802 for (
int i=0; i < accels.size(); i++) {
1803 LiVESExposeEventCallback *cb = (LiVESExposeEventCallback *)accels[i]->closure->function;
1804 bool ret = (*cb)(widget, exposeevent, accels[i]->closure->data);
1805 if (ret)
return true;
1809 case (QEvent::Enter): {
1811 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1812 LiVESWidget *widget =
static_cast<LiVESWidget *
>(object);
1813 if (!(widget->get_events() & LIVES_ENTER_NOTIFY_MASK))
return true;
1814 if (!(widget->get_onetime_events_block() & LIVES_ENTER_NOTIFY_MASK)) {
1815 widget->remove_onetime_event_block(LIVES_ENTER_NOTIFY_MASK);
1819 QList<LiVESAccel *>accels =
object->get_accels_for(LIVES_WIDGET_ENTER_EVENT);
1820 LiVESXEventCrossing *crossingevent = NULL;
1822 for (
int i=0; i < accels.size(); i++) {
1823 LiVESEnterEventCallback *cb = (LiVESEnterEventCallback *)accels[i]->closure->function;
1824 bool ret = (*cb)(widget, crossingevent, accels[i]->closure->data);
1825 if (ret)
return true;
1829 case (QEvent::MouseButtonPress): {
1830 QMouseEvent *qevent =
static_cast<QMouseEvent *
>(event);
1831 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1832 LiVESWidget *widget =
static_cast<LiVESWidget *
>(object);
1833 if (!(widget->get_events() & LIVES_BUTTON_PRESS_MASK))
return true;
1834 if (!(widget->get_onetime_events_block() & LIVES_BUTTON_PRESS_MASK)) {
1835 widget->remove_onetime_event_block(LIVES_BUTTON_PRESS_MASK);
1839 QList<LiVESAccel *>accels =
object->get_accels_for(LIVES_WIDGET_BUTTON_PRESS_EVENT);
1841 LiVESXEventButton *buttonevent = NULL;
1842 if (qevent->button() == Qt::LeftButton) buttonevent->button = 1;
1843 if (qevent->button() == Qt::MidButton) buttonevent->button = 2;
1844 if (qevent->button() == Qt::RightButton) buttonevent->button = 3;
1846 buttonevent->type = LIVES_BUTTON_PRESS;
1847 buttonevent->time = qtime->elapsed();
1849 for (
int i=0; i < accels.size(); i++) {
1850 LiVESButtonEventCallback *cb = (LiVESButtonEventCallback *)accels[i]->closure->function;
1851 bool ret = (*cb)(widget, buttonevent, accels[i]->closure->data);
1852 if (ret)
return true;
1856 case (QEvent::MouseButtonDblClick): {
1857 QMouseEvent *qevent =
static_cast<QMouseEvent *
>(event);
1858 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1859 LiVESWidget *widget =
static_cast<LiVESWidget *
>(object);
1860 if (!(widget->get_events() & LIVES_BUTTON_PRESS_MASK))
return true;
1861 if (!(widget->get_onetime_events_block() & LIVES_BUTTON_PRESS_MASK)) {
1862 widget->remove_onetime_event_block(LIVES_BUTTON_PRESS_MASK);
1866 QList<LiVESAccel *>accels =
object->get_accels_for(LIVES_WIDGET_BUTTON_PRESS_EVENT);
1868 LiVESXEventButton *buttonevent = NULL;
1869 if (qevent->button() == Qt::LeftButton) buttonevent->button = 1;
1870 if (qevent->button() == Qt::MidButton) buttonevent->button = 2;
1871 if (qevent->button() == Qt::RightButton) buttonevent->button = 3;
1873 buttonevent->type = LIVES_BUTTON2_PRESS;
1875 for (
int i=0; i < accels.size(); i++) {
1876 LiVESButtonEventCallback *cb = (LiVESButtonEventCallback *)accels[i]->closure->function;
1877 bool ret = (*cb)(widget, buttonevent, accels[i]->closure->data);
1878 if (ret)
return true;
1882 case (QEvent::Resize): {
1884 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1885 LiVESWidget *widget =
static_cast<LiVESWidget *
>(object);
1886 QList<LiVESAccel *>accels =
object->get_accels_for(LIVES_WIDGET_CONFIGURE_EVENT);
1887 LiVESXEventConfigure *configureevent = NULL;
1889 for (
int i=0; i < accels.size(); i++) {
1890 LiVESConfigureEventCallback *cb = (LiVESConfigureEventCallback *)accels[i]->closure->function;
1891 bool ret = (*cb)(widget, configureevent, accels[i]->closure->data);
1892 if (ret)
return true;
1896 case (QEvent::Close): {
1898 LiVESObject *
object =
static_cast<LiVESObject *
>(obj);
1899 LiVESWidget *widget =
static_cast<LiVESWidget *
>(object);
1900 QList<LiVESAccel *>accels =
object->get_accels_for(LIVES_WIDGET_DELETE_EVENT);
1901 LiVESXEventDelete *deleteevent = NULL;
1903 for (
int i=0; i < accels.size(); i++) {
1904 LiVESDeleteEventCallback *cb = (LiVESDeleteEventCallback *)accels[i]->closure->function;
1905 bool ret = (*cb)(widget, deleteevent, accels[i]->closure->data);
1906 if (ret)
return true;
1921 void LiVESWidget::update_stylesheet() {
1922 QWidget *qw =
static_cast<QWidget *
>(
this);
1926 stylesheet =
"QWidget#" + widgetName +
" {color: ";
1927 col=make_col(fg_norm);
1929 stylesheet +=
"; background-color: ";
1930 col=make_col(bg_norm);
1932 stylesheet +=
"; selection-background-color: ";
1933 col=make_col(bg_sel);
1935 stylesheet +=
"; selection-color: ";
1936 col=make_col(fg_sel);
1938 stylesheet +=
" } ";
1939 stylesheet =
"QWidget#" + widgetName +
":active {color: ";
1940 col=make_col(fg_act);
1942 stylesheet +=
"; background-color: ";
1943 col=make_col(bg_act);
1945 stylesheet +=
" } ";
1946 stylesheet =
"QWidget#" + widgetName +
":[prelight=true] {color: ";
1947 col=make_col(fg_hover);
1949 stylesheet +=
"; background-color: ";
1950 col=make_col(bg_hover);
1952 stylesheet +=
" } ";
1953 stylesheet =
"QWidget#" + widgetName +
":hover {color: ";
1954 col=make_col(fg_hover);
1956 stylesheet +=
"; background-color: ";
1957 col=make_col(bg_hover);
1959 stylesheet +=
" } ";
1960 stylesheet =
"QWidget#" + widgetName +
":disabled {color: ";
1961 col=make_col(fg_insen);
1963 stylesheet +=
"; background-color: ";
1964 col=make_col(bg_insen);
1966 stylesheet +=
" } ";
1968 qw->setStyleSheet(stylesheet);
1974 void LiVESWidget::set_fg_color(LiVESWidgetState state,
const LiVESWidgetColor *col) {
1976 case (LIVES_WIDGET_STATE_NORMAL):
1979 case (LIVES_WIDGET_STATE_ACTIVE):
1982 case (LIVES_WIDGET_STATE_INSENSITIVE):
1985 case (LIVES_WIDGET_STATE_PRELIGHT):
1988 case (LIVES_WIDGET_STATE_SELECTED):
1994 update_stylesheet();
1998 void LiVESWidget::set_bg_color(LiVESWidgetState state,
const LiVESWidgetColor *col) {
2000 case (LIVES_WIDGET_STATE_NORMAL):
2003 case (LIVES_WIDGET_STATE_ACTIVE):
2006 case (LIVES_WIDGET_STATE_INSENSITIVE):
2009 case (LIVES_WIDGET_STATE_PRELIGHT):
2012 case (LIVES_WIDGET_STATE_SELECTED):
2018 update_stylesheet();
2022 void LiVESWidget::set_base_color(LiVESWidgetState state,
const LiVESWidgetColor *col) {
2024 case (LIVES_WIDGET_STATE_NORMAL):
2027 case (LIVES_WIDGET_STATE_ACTIVE):
2030 case (LIVES_WIDGET_STATE_INSENSITIVE):
2033 case (LIVES_WIDGET_STATE_PRELIGHT):
2036 case (LIVES_WIDGET_STATE_SELECTED):
2042 update_stylesheet();
2046 void LiVESWidget::set_text_color(LiVESWidgetState state,
const LiVESWidgetColor *col) {
2048 case (LIVES_WIDGET_STATE_NORMAL):
2051 case (LIVES_WIDGET_STATE_ACTIVE):
2054 case (LIVES_WIDGET_STATE_INSENSITIVE):
2057 case (LIVES_WIDGET_STATE_PRELIGHT):
2060 case (LIVES_WIDGET_STATE_SELECTED):
2066 update_stylesheet();
2070 LiVESWidgetColor *LiVESWidget::get_fg_color(LiVESWidgetState state) {
2072 case (LIVES_WIDGET_STATE_NORMAL):
2075 case (LIVES_WIDGET_STATE_ACTIVE):
2078 case (LIVES_WIDGET_STATE_INSENSITIVE):
2081 case (LIVES_WIDGET_STATE_PRELIGHT):
2084 case (LIVES_WIDGET_STATE_SELECTED):
2094 LiVESWidgetColor *LiVESWidget::get_bg_color(LiVESWidgetState state) {
2096 case (LIVES_WIDGET_STATE_NORMAL):
2099 case (LIVES_WIDGET_STATE_ACTIVE):
2102 case (LIVES_WIDGET_STATE_INSENSITIVE):
2105 case (LIVES_WIDGET_STATE_PRELIGHT):
2108 case (LIVES_WIDGET_STATE_SELECTED):
2122 object->add_accel(handler_id, signal_name, funcptr, data);
2124 if (!strcmp(signal_name, LIVES_WIDGET_CLICKED_EVENT)) {
2125 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2127 static_cast<QObject *>(
object),
2128 SLOT(cb_wrapper_clicked()));
2129 }
else if (!strcmp(signal_name, LIVES_WIDGET_TOGGLED_EVENT)) {
2130 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2132 static_cast<QObject *>(
object),
2133 SLOT(cb_wrapper_toggled()));
2134 }
else if (!strcmp(signal_name, LIVES_WIDGET_CHANGED_EVENT)) {
2136 if (LIVES_IS_COMBO(
object))
2137 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2138 SIGNAL(currentTextChanged()),
2139 static_cast<QObject *>(
object),
2140 SLOT(cb_wrapper_changed()));
2142 else if (LIVES_IS_ENTRY(
object))
2143 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2144 SIGNAL(textChanged()),
2145 static_cast<QObject *>(
object),
2146 SLOT(cb_wrapper_changed()));
2149 QTreeWidget *qtw =
dynamic_cast<QTreeWidget *
>(object);
2151 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2152 SIGNAL(itemSelectionChanged()),
2153 static_cast<QObject *>(
object),
2154 SLOT(cb_wrapper_changed()));
2158 }
else if (!strcmp(signal_name, LIVES_WIDGET_VALUE_CHANGED_EVENT)) {
2160 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2161 SIGNAL(valueChanged()),
2162 static_cast<QObject *>(
object),
2163 SLOT(cb_wrapper_value_changed()));
2165 }
else if (!strcmp(signal_name, LIVES_WIDGET_SELECTION_CHANGED_EVENT)) {
2167 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2168 SIGNAL(currentChanged()),
2169 static_cast<QObject *>(
object),
2170 SLOT(cb_wrapper_selection_changed()));
2172 }
else if (!strcmp(signal_name, LIVES_WIDGET_CURRENT_FOLDER_CHANGED_EVENT)) {
2174 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2175 SIGNAL(currentUrlChanged()),
2176 static_cast<QObject *>(
object),
2177 SLOT(cb_wrapper_current_folder_changed()));
2179 }
else if (!strcmp(signal_name, LIVES_WIDGET_ACTIVATE_EVENT)) {
2181 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2182 SIGNAL(triggered()),
2183 static_cast<QObject *>(
object),
2184 SLOT(cb_wrapper_activate()));
2186 }
else if (!strcmp(signal_name, LIVES_WIDGET_RESPONSE_EVENT)) {
2188 (
static_cast<QObject *
>(object))->connect(static_cast<QObject *>(
object),
2190 static_cast<QObject *>(
object),
2191 SLOT(cb_wrapper_response()));
2200 LIVES_INLINE void lives_widget_object_set_data(LiVESObject *widget,
const char *prop, livespointer value) {
2201 QVariant v = qVariantFromValue((livespointer) value);
2202 widget->setProperty(prop, v);
2206 LIVES_INLINE livespointer lives_widget_object_get_data(LiVESObject *widget,
const char *prop) {
2207 QVariant v = widget->property(prop);
2208 return v.value<livespointer>();
2214 #define lives_signal_connect_after(a,b,c,d) lives_signal_connect(a,b,c,d) 2218 void LiVESObject::add_accel(LiVESAccel *accel) {
2219 accels.push_back(accel);
2226 void LiVESObject::add_accel(
ulong handler_id,
const char *signal_name,
ulong funcptr, livespointer data) {
2227 LiVESAccel *accel =
new LiVESAccel;
2228 accel->handler_id = handler_id;
2229 accel->signal_name = strdup(signal_name);
2230 LiVESClosure *cl =
new LiVESClosure;
2231 cl->function = funcptr;
2233 accel->closure = cl;
2238 void LiVESObject::add_accel(
const char *signal_name, LiVESAccelGroup *group, uint32_t key, LiVESXModifierType mod, LiVESAccelFlags flags) {
2239 LiVESAccel *accel =
new LiVESAccel;
2240 accel->handler_id = 0;
2241 accel->signal_name = strdup(signal_name);
2242 accel->closure = NULL;
2243 accel->group = group;
2244 accel->ks = make_qkey_sequence(key, mod);
2245 accel->flags = flags;
2250 boolean LiVESObject::remove_accel(LiVESAccel *accel) {
2251 QList<LiVESAccel *>::iterator it = accels.begin();
2253 while (it != accels.end()) {
2254 if (((LiVESAccel *)*it) == accel) {
2255 delete accel->shortcut;
2256 delete accel->signal_name;
2257 delete accel->closure;
2268 boolean LiVESObject::activate_accel(uint32_t key, LiVESXModifierType mod) {
2269 return activate_accel(make_qkey_sequence(key, mod));
2273 boolean LiVESObject::activate_accel(QKeySequence ks) {
2274 for (
int j=0; j < accel_groups.size(); j++) {
2275 QList<LiVESAccel *> ql = get_accels_for(accel_groups.at(j), ks);
2276 for (
int i=0; i < ql.size(); i++) {
2277 LiVESAccel *accel = ql.at(i);
2278 if (accel->closure != NULL) {
2279 LiVESAccelCallback *cb = (LiVESAccelCallback *)accel->closure->function;
2280 uint32_t key = qkeysequence_get_key(ks);
2281 LiVESXModifierType mod = qkeysequence_get_mod(ks);
2282 (*cb)(accel->group,
this, key, mod, accel->closure->data);
2284 if (!strcmp(accel->signal_name, LIVES_WIDGET_CLICKED_EVENT)) {
2285 QAbstractButton *widget =
dynamic_cast<QAbstractButton *
>(
this);
2286 if (widget != NULL) widget->click();
2289 if (!strcmp(accel->signal_name, LIVES_WIDGET_TOGGLED_EVENT)) {
2290 QAbstractButton *widget =
dynamic_cast<QAbstractButton *
>(
this);
2291 if (widget != NULL) widget->toggle();
2303 void LiVESObject::remove_all_accels() {
2304 QList<LiVESAccel *>::iterator it = accels.begin();
2305 while (it != accels.end()) {
2306 remove_accel((LiVESAccel *)*it);
2311 QList<LiVESAccel *> LiVESObject::get_accels_for(
ulong func, livespointer data) {
2312 QList<LiVESAccel *> ql;
2313 for (
int i=0; i < accels.size(); i++) {
2314 if (accels[i]->closure == NULL)
continue;
2315 if (accels[i]->closure->function == func && accels[i]->closure->data == data) ql.push_back(accels[i]);
2321 QList<LiVESAccel *> LiVESObject::get_accels_for(
const char *signame) {
2322 QList<LiVESAccel *> ql;
2323 for (
int i=0; i < accels.size(); i++) {
2324 if (accels[i]->signal_name == signame) ql.push_back(accels[i]);
2330 LiVESAccel *LiVESObject::get_accel_for(
ulong handler_id) {
2331 for (
int i=0; i < accels.size(); i++) {
2332 if (accels[i]->handler_id == handler_id) {
2340 void LiVESObject::block_signal(
ulong handler_id) {
2341 LiVESAccel *accel = get_accel_for(handler_id);
2342 accel->blocked =
true;
2346 void LiVESObject::block_signals(
const char *signame) {
2347 QList<LiVESAccel *>ql = get_accels_for(signame);
2348 for (
int i=0; i < ql.size(); i++) {
2349 ql[i]->blocked =
true;
2353 void LiVESObject::block_signals(
ulong func, livespointer data) {
2354 QList<LiVESAccel *>ql = get_accels_for(func,data);
2355 for (
int i=0; i < ql.size(); i++) {
2356 ql[i]->blocked =
true;
2361 void LiVESObject::unblock_signal(
ulong handler_id) {
2362 LiVESAccel *accel = get_accel_for(handler_id);
2363 accel->blocked =
false;
2367 void LiVESObject::unblock_signals(
const char *signame) {
2368 QList<LiVESAccel *>ql = get_accels_for(signame);
2369 for (
int i=0; i < ql.size(); i++) {
2370 ql[i]->blocked =
false;
2375 void LiVESObject::unblock_signals(
ulong func, livespointer data) {
2376 QList<LiVESAccel *>ql = get_accels_for(func,data);
2377 for (
int i=0; i < ql.size(); i++) {
2378 ql[i]->blocked =
false;
2383 void LiVESObject::disconnect_signal(
ulong handler_id) {
2384 LiVESAccel *accel = get_accel_for(handler_id);
2385 remove_accel(accel);
2389 QList<LiVESAccelGroup *> LiVESObject::get_accel_groups() {
2390 return accel_groups;
2395 class LiVESBox :
public LiVESWidget {};
2398 class LiVESHBox :
public LiVESBox,
public QHBoxLayout {
2401 set_type(LIVES_WIDGET_TYPE_HBOX);
2406 class LiVESEventBox :
public LiVESBox,
public QHBoxLayout {
2409 set_type(LIVES_WIDGET_TYPE_EVENT_BOX);
2414 class LiVESDrawingArea :
public LiVESBox,
public QHBoxLayout {
2416 LiVESDrawingArea() {
2417 set_type(LIVES_WIDGET_TYPE_DRAWING_AREA);
2422 class LiVESVBox :
public LiVESBox,
public QVBoxLayout {
2425 set_type(LIVES_WIDGET_TYPE_VBOX);
2430 typedef class LiVESRange LiVESRange;
2432 class LiVESAdjustment :
public LiVESObject {
2436 LiVESAdjustment(
double xval,
double low,
double upp,
double step_i,
double page_i,
double page_s) :
2437 value(xval), lower(low), upper(upp), step_increment(step_i), page_increment(page_i), page_size(page_s), frozen(
FALSE) {};
2439 void set_value(
double newval);
2440 void set_lower(
double newval);
2442 void set_upper(
double newval);
2443 void set_step_increment(
double newval);
2444 void set_page_increment(
double newval);
2445 void set_page_size(
double newval);
2447 void set_owner(LiVESWidget *widget) {
2451 LiVESWidget *get_owner() {
2456 double get_value() {
2461 double get_upper() {
2466 double get_lower() {
2470 double get_step_increment() {
2471 return step_increment;
2474 double get_page_increment() {
2475 return page_increment;
2478 double get_page_size() {
2494 double step_increment;
2495 double page_increment;
2505 qlabel = qlabel.replace(
'&',
"&&");
2506 qlabel = qlabel.replace(
'_',
'&');
2512 qlabel = qlabel.replace(
'&',
'_');
2513 qlabel = qlabel.replace(
"__",
"&");
2518 class LiVESButtonBase :
public LiVESWidget {
2524 LiVESButtonBase(QString qs) {
2528 void set_use_underline(
bool use) {
2529 QAbstractButton *qab =
dynamic_cast<QAbstractButton *
>(
this);
2531 if (use && !use_underline) {
2533 qab->setText(qmake_mnemonic(qab->text()));
2534 }
else if (!use && use_underline) {
2535 qab->setText(qmake_underline(qab->text()));
2538 use_underline = use;
2541 bool get_use_underline() {
2542 return use_underline;
2549 use_underline =
false;
2556 class LiVESToggleButton :
public LiVESButtonBase,
public QCheckBox {};
2561 class LiVESButton :
public LiVESButtonBase,
public QPushButton {
2568 LiVESButton(QString qs) {
2572 LiVESWidget *get_layout() {
2573 if (layout == NULL) {
2574 layout =
new LiVESVBox;
2575 (
static_cast<QPushButton *
>(
this))->setLayout(dynamic_cast<QLayout *>(layout));
2576 if ((static_cast<LiVESWidget *>(
this))->isVisible()) layout->setVisible(
true);
2583 LiVESWidget *layout;
2585 set_type(LIVES_WIDGET_TYPE_BUTTON);
2593 class LiVESSpinButton :
public LiVESButtonBase,
public QDoubleSpinBox {
2596 LiVESSpinButton(LiVESAdjustment *xadj,
double climb_rate, uint32_t digits) : adj(xadj) {
2599 adj->set_owner(
this);
2601 setDecimals(digits);
2602 setSingleStep(climb_rate);
2604 setValue(adj->get_value());
2605 setMinimum(adj->get_lower());
2606 setMaximum(adj->get_upper());
2610 LiVESAdjustment *get_adj() {
2614 void valueChanged(
double value) {
2616 adj->set_value(value);
2621 LiVESAdjustment *adj;
2624 set_type(LIVES_WIDGET_TYPE_SPIN_BUTTON);
2632 class LiVESRadioButton :
public LiVESButtonBase,
public QRadioButton {
2634 LiVESRadioButton() {
2638 LiVESRadioButton(QString qs) {
2642 void set_group(LiVESSList *xlist) {
2646 LiVESSList *get_list() {
2651 ~LiVESRadioButton() {
2652 QButtonGroup *qbg = (QButtonGroup *)lives_slist_nth_data(slist, 0);
2653 QList<QAbstractButton *> ql = qbg->buttons();
2654 if (ql.size() == 1) lives_slist_remove(slist, (livesconstpointer)qbg);
2662 set_type(LIVES_WIDGET_TYPE_RADIO_BUTTON);
2669 class LiVESCheckButton :
public LiVESToggleButton {
2672 LiVESCheckButton() {
2676 LiVESCheckButton(QString qs) {
2682 set_type(LIVES_WIDGET_TYPE_CHECK_BUTTON);
2689 class LiVESButtonBox :
public LiVESWidget,
public QDialogButtonBox {
2692 set_type(LIVES_WIDGET_TYPE_BUTTON_BOX);
2699 class LiVESMenuBar :
public LiVESWidget,
public QMenuBar {
2702 set_type(LIVES_WIDGET_TYPE_MENU_BAR);
2706 void reorder_child(LiVESWidget *child,
int pos) {
2707 LiVESList *children = get_children();
2708 LiVESList *new_children;
2709 QMenuBar *qmenu =
static_cast<QMenuBar *
>(
this);
2711 for (
int i = 0; children != NULL; i++) {
2712 if (i==pos) lives_list_append(new_children,child);
2713 else if (children->data != (livespointer)child) lives_list_append(new_children,children->data);
2714 qmenu->removeAction((QAction *)(children->data));
2715 children = children->next;
2718 children = new_children;
2720 for (
int i = 0; new_children != NULL; i++) {
2721 qmenu->addAction((QAction *)(new_children->data));
2722 new_children = new_children->next;
2725 set_children(new_children);
2735 class LiVESMenu :
public LiVESWidget,
public QMenu {
2738 set_type(LIVES_WIDGET_TYPE_MENU);
2741 void reorder_child(LiVESWidget *child,
int pos) {
2742 LiVESList *children = get_children();
2743 LiVESList *new_children;
2744 QMenu *qmenu =
static_cast<QMenu *
>(
this);
2746 for (
int i = 0; children != NULL; i++) {
2747 if (i==pos) lives_list_append(new_children,child);
2748 else if (children->data != (livespointer)child) lives_list_append(new_children,children->data);
2749 qmenu->removeAction((QAction *)(children->data));
2750 children = children->next;
2753 children = new_children;
2755 for (
int i = 0; new_children != NULL; i++) {
2756 qmenu->addAction((QAction *)(new_children->data));
2757 new_children = new_children->next;
2760 set_children(new_children);
2766 class LiVESTornOffMenu :
public LiVESMenu {
2768 LiVESTornOffMenu(LiVESMenu *menu) {
2769 QWidget *qmenu =
static_cast<QWidget *
>(
static_cast<QMenu *
>(menu));
2770 QWidget *parentWidget = qmenu->parentWidget();
2771 QWidget *qwidget = (
static_cast<QWidget *
>(
static_cast<QMenu *
>(
this)));
2772 qwidget->setParent(parentWidget, Qt::Window | Qt::Tool);
2773 qwidget->setAttribute(Qt::WA_DeleteOnClose,
true);
2774 qwidget->setAttribute(Qt::WA_X11NetWmWindowTypeMenu,
true);
2775 qwidget->setWindowTitle(qmenu->windowTitle());
2776 qwidget->setEnabled(qmenu->isEnabled());
2778 QList<QAction *> items = qmenu->actions();
2779 for (
int i = 0; i < items.count(); i++)
2780 qwidget->addAction(items.at(i));
2782 set_parent(menu->get_parent());
2784 if (qmenu->isVisible()) {
2786 qwidget->setVisible(
true);
2796 class LiVESMenuItem :
public LiVESWidget,
public QAction {
2798 LiVESMenuItem(LiVESWidget *parent) : QAction(static_cast<QObject *>(static_cast<LiVESObject *>(parent))) {
2799 set_type(LIVES_WIDGET_TYPE_MENU_ITEM);
2802 LiVESMenuItem(
const QString &text, LiVESWidget *parent) : QAction(text, static_cast<QObject *>(static_cast<LiVESObject *>(parent))) {
2803 set_type(LIVES_WIDGET_TYPE_MENU_ITEM);
2804 this->setText(text);
2813 class LiVESToolItem :
public LiVESWidget,
public QHBoxLayout {
2819 LiVESWidget *get_layout() {
2820 if (layout == NULL) {
2821 layout =
new LiVESVBox;
2822 (
static_cast<QHBoxLayout *
>(
this))->addLayout(dynamic_cast<QLayout *>(layout));
2823 if ((static_cast<LiVESWidget *>(
this))->isVisible()) layout->setVisible(
true);
2830 LiVESWidget *layout;
2833 set_type(LIVES_WIDGET_TYPE_TOOL_ITEM);
2840 typedef LiVESMenuItem LiVESImageMenuItem;
2844 class LiVESMenuToolButton :
public LiVESToolItem,
public QWidgetAction {
2847 LiVESMenuToolButton(
const QString &text, LiVESWidget *parent, LiVESWidget *icon) :
2848 QWidgetAction(static_cast<QObject *>(static_cast<LiVESObject *>(parent))) {
2849 QPushButton *qbutton =
new QPushButton(text);
2850 set_type(LIVES_WIDGET_TYPE_MENU_TOOL_BUTTON);
2851 setDefaultWidget(qbutton);
2860 class LiVESCheckMenuItem :
public LiVESWidget,
public QAction {
2862 LiVESCheckMenuItem(LiVESWidget *parent) : QAction(static_cast<QObject *>(static_cast<LiVESObject *>(parent))) {
2865 LiVESCheckMenuItem(
const QString &text, LiVESWidget *parent) : QAction(text, static_cast<QObject *>(static_cast<LiVESObject *>(parent))) {
2871 set_type(LIVES_WIDGET_TYPE_CHECK_MENU_ITEM);
2879 class LiVESRadioMenuItem :
public LiVESMenuItem {
2882 LiVESRadioMenuItem(LiVESWidget *parent) : LiVESMenuItem(parent) {
2886 LiVESRadioMenuItem(
const QString &text, LiVESWidget *parent) : LiVESMenuItem(text, parent) {
2892 void set_group(LiVESSList *xlist) {
2896 LiVESSList *get_list() {
2901 ~LiVESRadioMenuItem() {
2902 QActionGroup *qag =
const_cast<QActionGroup *
>(
static_cast<const QActionGroup *
>(lives_slist_nth_data(slist, 0)));
2903 QList<QAction *> ql = qag->actions();
2904 if (ql.size() == 1) lives_slist_remove(slist, (livesconstpointer)qag);
2912 set_type(LIVES_WIDGET_TYPE_RADIO_MENU_ITEM);
2919 class LiVESCombo :
public LiVESWidget,
public QComboBox {
2922 set_type(LIVES_WIDGET_TYPE_COMBO);
2927 class LiVESHSeparator :
public LiVESWidget,
public QHBoxLayout {
2930 QFrame *line =
new QFrame();
2931 line->setFrameShape(QFrame::HLine);
2932 line->setFrameShadow(QFrame::Sunken);
2934 set_type(LIVES_WIDGET_TYPE_HSEPARATOR);
2940 class LiVESVSeparator :
public LiVESWidget,
public QVBoxLayout {
2943 QFrame *line =
new QFrame();
2944 line->setFrameShape(QFrame::VLine);
2945 line->setFrameShadow(QFrame::Sunken);
2947 set_type(LIVES_WIDGET_TYPE_VSEPARATOR);
2953 class LiVESTextBuffer :
public LiVESWidget,
public QTextDocument {
2957 insert = QTextCursor(
this);
2960 QTextCursor get_cursor() {
2971 class LiVESTextView :
public LiVESWidget,
public QTextEdit {
2975 buff =
new LiVESTextBuffer();
2979 LiVESTextView(LiVESTextBuffer *xbuff) : QTextEdit(), buff(xbuff) {
2980 set_type(LIVES_WIDGET_TYPE_TEXT_VIEW);
2989 LiVESTextBuffer *get_buffer() {
2994 LiVESTextBuffer *buff;
2997 set_type(LIVES_WIDGET_TYPE_TEXT_VIEW);
3006 class LiVESTextMark :
public LiVESObject,
public QTextCursor {
3009 LiVESTextMark(LiVESTextBuffer *tbuff,
const char *mark_name,
3010 int where,
boolean left_gravity) : QTextCursor(tbuff), name(mark_name), lgrav(left_gravity) {
3011 (
static_cast<QTextCursor *
>(
this))->setPosition(where);
3018 QString get_name() {
3030 class LiVESRange :
public LiVESWidget {
3034 LiVESRange(LiVESAdjustment *adj) {
3038 virtual void init(LiVESAdjustment *adj) {}
3040 LiVESAdjustment *get_adj() {
3045 void valueChanged(
int value) {
3047 adj->set_value(value);
3052 LiVESAdjustment *adj;
3057 class LiVESScale :
public LiVESRange,
public QSlider {
3060 LiVESScale(Qt::Orientation, LiVESAdjustment *xadj) : LiVESRange(xadj) {
3061 set_type(LIVES_WIDGET_TYPE_SCALE);
3064 void init(LiVESAdjustment *adj) {
3065 adj->set_owner(
this);
3066 setMinimum(adj->get_lower());
3067 setMaximum(adj->get_upper());
3068 setValue(adj->get_value());
3069 setSingleStep(adj->get_step_increment());
3070 setPageStep(adj->get_page_increment());
3075 class LiVESScrollbar :
public LiVESRange,
public QScrollBar {
3077 LiVESScrollbar(Qt::Orientation, LiVESAdjustment *xadj) : LiVESRange(xadj) {
3078 set_type(LIVES_WIDGET_TYPE_SCROLLBAR);
3081 void init(LiVESAdjustment *adj) {
3082 adj->set_owner(
this);
3083 setMinimum(adj->get_lower());
3084 setMaximum(adj->get_upper());
3085 setValue(adj->get_value());
3086 setSingleStep(adj->get_step_increment());
3087 setPageStep(adj->get_page_increment());
3092 typedef LiVESScrollbar LiVESHScrollbar;
3095 class LiVESEntry :
public LiVESWidget,
public QLineEdit {
3098 set_type(LIVES_WIDGET_TYPE_ENTRY);
3103 class LiVESProgressBar :
public LiVESWidget,
public QProgressBar {
3105 LiVESProgressBar() {
3106 set_type(LIVES_WIDGET_TYPE_PROGRESS_BAR);
3111 class LiVESPaned :
public LiVESWidget,
public QSplitter {
3115 set_type(LIVES_WIDGET_TYPE_PANED);
3120 class LiVESLabel :
public LiVESWidget,
public QLabel {
3122 LiVESLabel(QString qstring) {
3123 set_type(LIVES_WIDGET_TYPE_LABEL);
3126 LiVESWidget *get_mnemonic_widget() {
3130 void set_mnemonic_widget(LiVESWidget *widget) {
3134 void set_owner(LiVESWidget *xowner) {
3138 LiVESWidget *get_owner() {
3142 void set_text(QString text) {
3149 LiVESWidget *mnemonicw;
3154 class LiVESRuler :
public LiVESWidget,
public QSlider {
3157 set_type(LIVES_WIDGET_TYPE_RULER);
3164 class LiVESScrolledWindow :
public LiVESWidget,
public QScrollArea {
3166 LiVESScrolledWindow(LiVESAdjustment *xhadj, LiVESAdjustment *xvadj) : hadj(xhadj), vadj(xvadj) {
3167 set_type(LIVES_WIDGET_TYPE_SCROLLED_WINDOW);
3168 hadj->set_owner(
this);
3169 vadj->set_owner(
this);
3171 QScrollBar *hs = horizontalScrollBar();
3172 hs->setMinimum(hadj->get_lower());
3173 hs->setMaximum(hadj->get_upper());
3174 hs->setValue(hadj->get_value());
3175 hs->setSingleStep(hadj->get_step_increment());
3176 hs->setPageStep(hadj->get_page_increment());
3178 QScrollBar *vs = verticalScrollBar();
3179 vs->setMinimum(vadj->get_lower());
3180 vs->setMaximum(vadj->get_upper());
3181 vs->setValue(vadj->get_value());
3182 vs->setSingleStep(vadj->get_step_increment());
3183 vs->setPageStep(vadj->get_page_increment());
3187 LiVESAdjustment *get_hadj() {
3191 LiVESAdjustment *get_vadj() {
3196 LiVESAdjustment *hadj;
3197 LiVESAdjustment *vadj;
3205 class LiVESToolButton :
public LiVESToolItem,
public QToolButton {
3208 LiVESToolButton(LiVESWidget *icon_widget,
const char *label) {
3209 set_type(LIVES_WIDGET_TYPE_TOOL_BUTTON);
3210 set_icon_widget(icon_widget);
3211 layout =
new LiVESVBox;
3212 QBoxLayout *ql =
static_cast<QVBoxLayout *
>(layout);
3213 ql->setParent(static_cast<QToolButton *>(
this));
3215 if (label != NULL) {
3216 LiVESWidget *widget =
new LiVESLabel(label);
3217 layout->add_child(widget);
3218 label_widget =
dynamic_cast<LiVESLabel *
>(widget);
3219 (
static_cast<QBoxLayout *
>(layout))->addWidget(static_cast<QLabel *>(label_widget));
3220 }
else label_widget = NULL;
3224 void set_icon_widget(LiVESWidget *widget) {
3225 if (icon_widget != NULL) remove_child(icon_widget);
3228 if (widget != NULL) qim =
dynamic_cast<QImage *
>(widget);
3230 QPixmap *qpx =
new QPixmap();
3231 qpx->convertFromImage(*qim);
3232 QIcon *qi =
new QIcon(*qpx);
3234 setIconSize(LIVES_ICON_SIZE_SMALL_TOOLBAR);
3235 icon_widget = widget;
3241 void set_label_widget(LiVESWidget *widget) {
3242 if (label_widget != NULL) {
3243 layout->remove_child(static_cast<LiVESWidget *>(label_widget));
3244 layout->removeWidget(static_cast<LiVESWidget *>(label_widget));
3246 if (widget != NULL) {
3247 layout->addWidget(widget);
3248 label_widget =
dynamic_cast<LiVESLabel *
>(widget);
3249 layout->add_child(label_widget);
3250 label_widget->set_owner(
this);
3251 }
else label_widget = NULL;
3255 void set_use_underline(
bool use) {
3256 QAbstractButton *qab =
dynamic_cast<QAbstractButton *
>(
this);
3258 if (use && !use_underline) {
3260 qab->setText(qmake_mnemonic(qab->text()));
3261 }
else if (!use && use_underline) {
3262 qab->setText(qmake_underline(qab->text()));
3265 use_underline = use;
3268 bool get_use_underline() {
3269 return use_underline;
3276 use_underline =
false;
3280 LiVESWidget *icon_widget;
3281 LiVESLabel *label_widget;
3292 typedef class LiVESWindow LiVESWindow;
3294 class LiVESAccelGroup {
3296 void add_all_accelerators(LiVESObject *window);
3297 void add_widget(LiVESObject *window);
3298 void remove_all_accelerators(LiVESObject *window);
3299 void remove_widget(LiVESObject *window);
3301 void connect(uint32_t key, LiVESXModifierType mod, LiVESAccelFlags flags, LiVESWidgetClosure *closure);
3302 void disconnect(LiVESWidgetClosure *closure);
3307 QList<LiVESObject *>widgets;
3308 QList<LiVESAccel *>accels;
3316 void LiVESObject::add_accel_group(LiVESAccelGroup *group) {
3317 accel_groups.push_back(group);
3318 group->add_all_accelerators(
this);
3319 group->add_widget(
this);
3324 boolean LiVESObject::remove_accel_group(LiVESAccelGroup *group) {
3325 if (accel_groups.removeAll(group) > 0) {
3326 group->remove_all_accelerators(
this);
3327 group->remove_widget(
this);
3335 boolean LiVESObject::remove_accels(LiVESAccelGroup *group, uint32_t key, LiVESXModifierType mods) {
3337 QKeySequence ks = make_qkey_sequence(key, mods);
3339 QList<LiVESAccel *>::iterator it = accels.begin();
3340 while (it != accels.end()) {
3341 if (((LiVESAccel *)*it)->group == group && ((LiVESAccel *)*it)->ks == ks) {
3342 remove_accel((LiVESAccel *)*it);
3351 QList<LiVESAccel *> LiVESObject::get_accels_for(LiVESAccelGroup *group, QKeySequence ks) {
3352 QList<LiVESAccel *> ql;
3353 for (
int i=0; i < accels.size(); i++) {
3354 if (accels[i]->group == group && accels[i]->ks == ks) ql.push_back(accels[i]);
3361 class LiVESWindow :
public LiVESWidget {};
3363 typedef int LiVESWindowPosition;
3364 #define LIVES_WIN_POS_DEFAULT 0 3365 #define LIVES_WIN_POS_CENTER_ALWAYS 1 3368 class LiVESMainWindow :
public LiVESWindow,
public QMainWindow {
3371 set_type(LIVES_WIDGET_TYPE_MAIN_WINDOW);
3372 set_position(LIVES_WIN_POS_DEFAULT);
3375 LiVESWidget *get_layout() {
3376 if (layout == NULL) {
3377 layout =
new LiVESVBox;
3378 (
static_cast<QMainWindow *
>(
this))->setLayout(dynamic_cast<QLayout *>(layout));
3379 if ((static_cast<LiVESWidget *>(
this))->isVisible()) layout->setVisible(
true);
3385 void set_position(LiVESWindowPosition xpos) {
3389 LiVESWindowPosition get_position() {
3395 LiVESWidget *layout;
3396 LiVESWindowPosition pos;
3402 void LiVESAccelGroup::add_all_accelerators(LiVESObject *
object) {
3403 for (
int i=0; i < accels.size(); i++) {
3404 object->add_accel(accels.at(i));
3408 void LiVESAccelGroup::add_widget(LiVESObject *window) {
3409 widgets.push_back(window);
3413 void LiVESAccelGroup::remove_all_accelerators(LiVESObject *
object) {
3414 while (accels.size() > 0) {
3415 object->remove_accel(accels.at(0));
3420 void LiVESAccelGroup::remove_widget(LiVESObject *window) {
3421 widgets.removeAll(window);
3425 LiVESAccelGroup::~LiVESAccelGroup() {
3426 while (widgets.size() > 0) {
3427 remove_all_accelerators(widgets.at(0));
3432 class LiVESVLayout:
public LiVESWidget,
public QVBoxLayout {};
3434 class LiVESDialog :
public LiVESWindow,
public QDialog {
3437 QDialog *qd =
static_cast<QDialog *
>(
this);
3438 QVBoxLayout *layout =
new QVBoxLayout;
3439 layout->setMargin(0);
3440 qd->setLayout(layout);
3442 contentArea =
new LiVESVLayout();
3443 QVBoxLayout *ca =
dynamic_cast<QVBoxLayout *
>(contentArea);
3445 layout->insertLayout(0, ca);
3447 actionArea =
new LiVESButtonBox;
3448 QDialogButtonBox *bb =
dynamic_cast<QDialogButtonBox *
>(actionArea);
3449 bb->setContentsMargins(0, 0, 0, 0);
3450 layout->addWidget(bb);
3452 set_type(LIVES_WIDGET_TYPE_DIALOG);
3454 add_child(actionArea);
3455 add_child(contentArea);
3459 LiVESWidget *get_content_area() {
3463 LiVESWidget *get_action_area() {
3467 LiVESWidget *get_layout() {
3468 if (layout == NULL) {
3469 layout =
new LiVESVBox;
3470 (
static_cast<QDialog *
>(
this))->setLayout(dynamic_cast<QLayout *>(layout));
3471 if ((static_cast<LiVESWidget *>(
this))->isVisible()) layout->setVisible(
true);
3478 LiVESWidget *layout;
3479 LiVESWidget *contentArea;
3480 LiVESWidget *actionArea;
3484 typedef int LiVESDialogFlags;
3485 typedef QMessageBox::Icon LiVESMessageType;
3487 #define LIVES_MESSAGE_INFO QMessageBox::Information 3488 #define LIVES_MESSAGE_WARNING QMessageBox::Warning 3489 #define LIVES_MESSAGE_QUESTION QMessageBox::Question 3490 #define LIVES_MESSAGE_ERROR QMessageBox::Warning 3491 #define LIVES_MESSAGE_OTHER QMessageBox::NoIcon 3493 typedef int LiVESButtonsType;
3494 #define LIVES_BUTTONS_NONE 0 3496 class LiVESMessageDialog :
public LiVESWindow,
public QMessageBox {
3498 LiVESMessageDialog() {
3499 QMessageBox *qd =
static_cast<QMessageBox *
>(
this);
3500 QVBoxLayout *layout =
new QVBoxLayout;
3501 layout->setMargin(0);
3502 qd->setLayout(layout);
3504 contentArea =
new LiVESVLayout();
3505 QVBoxLayout *ca =
dynamic_cast<QVBoxLayout *
>(contentArea);
3507 layout->insertLayout(0, ca);
3509 actionArea =
new LiVESButtonBox;
3510 QDialogButtonBox *bb =
dynamic_cast<QDialogButtonBox *
>(actionArea);
3511 bb->setContentsMargins(0, 0, 0, 0);
3512 layout->addWidget(bb);
3514 set_type(LIVES_WIDGET_TYPE_DIALOG);
3516 add_child(actionArea);
3517 add_child(contentArea);
3521 LiVESWidget *get_content_area() {
3525 LiVESWidget *get_action_area() {
3529 LiVESWidget *get_layout() {
3530 if (layout == NULL) {
3531 layout =
new LiVESVBox;
3532 (
static_cast<QDialog *
>(
this))->setLayout(dynamic_cast<QLayout *>(layout));
3533 if ((static_cast<LiVESWidget *>(
this))->isVisible()) layout->setVisible(
true);
3540 LiVESWidget *layout;
3541 LiVESWidget *contentArea;
3542 LiVESWidget *actionArea;
3546 typedef void LiVESAboutDialog;
3549 class LiVESAlignment:
public LiVESWidget,
public QGridLayout {
3551 float xalign, yalign, xscale, yscale;
3553 LiVESAlignment(
float xxalign,
float yyalign,
float xxscale,
float yyscale) :
3558 set_type(LIVES_WIDGET_TYPE_ALIGNMENT);
3561 void set_alignment(
float xxalign,
float yyalign,
float xxscale,
float yyscale) {
3576 class LiVESImage :
public LiVESWidget,
public QImage {
3583 LiVESImage(QImage *lim) {
3587 LiVESImage(
int width,
int height, QImage::Format fmt) {
3591 LiVESImage(uint8_t *data,
int width,
int height,
int bpl, QImage::Format fmt, QImageCleanupFunction cleanupFunction,
3592 livespointer cleanupInfo) {
3598 set_type(LIVES_WIDGET_TYPE_IMAGE);
3606 class LiVESArrow :
public LiVESImage {
3608 LiVESArrow(QImage *image) {
3609 set_type(LIVES_WIDGET_TYPE_ARROW);
3614 #define LIVES_CELL_RENDERER_TEXT 1 3615 #define LIVES_CELL_RENDERER_SPIN 2 3616 #define LIVES_CELL_RENDERER_TOGGLE 3 3617 #define LIVES_CELL_RENDERER_PIXBUF 4 3625 typedef QHeaderView::ResizeMode LiVESTreeViewColumnSizing;
3627 #define LIVES_TREE_VIEW_COLUMN_GROW_ONLY QHeaderView::Stretch 3628 #define LIVES_TREE_VIEW_COLUMN_AUTOSIZE QHeaderView::ResizeToContents 3629 #define LIVES_TREE_VIEW_COLUMN_FIXED QHeaderView::Fixed 3631 typedef class LiVESTreeView LiVESTreeView;
3632 typedef LiVESTreeView LiVESTreeSelection;
3635 class LiVESTreeViewColumn :
public LiVESObject,
public QStyledItemDelegate {
3636 friend LiVESTreeView;
3640 LiVESTreeViewColumn(
int rendertype) {
3644 void set_title(
const char *xtitle) {
3645 title = strdup(xtitle);
3648 void set_expand(
boolean xexpand) {
3652 void add_attribute(
const char *attr,
int col) {
3653 tvattrcol *attrcol =
new tvattrcol;
3654 attrcol->attr = strdup(attr);
3656 attributes.push_back(attrcol);
3659 void set_sizing(LiVESTreeViewColumnSizing xsizing) {
3664 void set_fixed_width(
int xfwidth) {
3669 QList<tvattrcol *> get_attributes() {
3674 ~LiVESTreeViewColumn() {
3676 for (
int i=0; i < attributes.size(); i++) {
3677 delete attributes[i]->attr;
3685 LiVESTreeViewColumnSizing sizing;
3686 QList<tvattrcol *>attributes;
3692 typedef LiVESTreeViewColumn LiVESCellRenderer;
3695 typedef QAbstractItemView::SelectionMode LiVESSelectionMode;
3696 #define LIVES_SELECTION_NONE QAbstractItemView::NoSelection 3697 #define LIVES_SELECTION_SINGLE QAbstractItemView::SingleSelection 3698 #define LIVES_SELECTION_MULTIPLE QAbstractItemView::MultiSelection 3701 typedef class LiVESTreeStore LiVESTreeStore;
3704 class LiVESTreeModel :
public LiVESObject,
public QStandardItemModel {
3705 friend LiVESTreeStore;
3709 QStandardItemModel *to_qsimodel() {
3710 QStandardItemModel *qsim =
static_cast<QStandardItemModel *
>(
this);
3711 QVariant qv = QVariant::fromValue(static_cast<LiVESObject *>(
this));
3712 qsim->setProperty(
"LiVESObject", qv);
3716 int get_coltype(
int index) {
3717 return coltypes[index];
3720 void set_tree_widget(LiVESTreeView *twidget);
3721 QTreeWidget *get_qtree_widget();
3724 void set_coltypes(
int ncols,
int *types) {
3725 for (
int i = 0; i < ncols; i++) {
3726 coltypes.append(types[i]);
3732 LiVESTreeView *widget;
3733 QList<int> coltypes;
3738 typedef LiVESTreeModel LiVESListModel;
3741 class LiVESTreeView :
public LiVESWidget,
public QTreeWidget {
3746 set_type(LIVES_WIDGET_TYPE_TREE_VIEW);
3748 QAbstractSlider *sbar =
static_cast<QAbstractSlider *
>(horizontalScrollBar());
3749 hadj =
new LiVESAdjustment(sbar->value(), sbar->minimum(), sbar->maximum(), sbar->singleStep(), sbar->pageStep(), -1.);
3750 hadj->set_owner(
this);
3751 sbar->connect(sbar, SIGNAL(valueChanged(
int)), static_cast<QObject *>(static_cast<LiVESObject *>(
this)), SLOT(hvalue_changed(
int)));
3753 sbar =
static_cast<QAbstractSlider *
>(verticalScrollBar());
3754 vadj =
new LiVESAdjustment(sbar->value(), sbar->minimum(), sbar->maximum(), sbar->singleStep(), sbar->pageStep(), -1.);
3755 vadj->set_owner(
this);
3756 sbar->connect(sbar, SIGNAL(valueChanged(
int)), static_cast<QObject *>(static_cast<LiVESObject *>(
this)), SLOT(vvalue_changed(
int)));
3760 void set_model(LiVESTreeModel *xmodel) {
3762 xmodel->set_tree_widget(
this);
3763 QStandardItemModel *qmodel = xmodel->to_qsimodel();
3764 (
static_cast<QAbstractItemView *
>(
this))->setModel(static_cast<QAbstractItemModel *>(qmodel));
3767 LiVESTreeModel *get_model() {
3773 void append_column(LiVESTreeViewColumn *col) {
3777 QList<tvattrcol *> ql = col->get_attributes();
3778 QList<QStandardItem *> qvals;
3779 QStandardItemModel *qmodel = model->to_qsimodel();
3783 for (
int i=0; i < ql.size(); i++) {
3784 attrcol = ql[i]->col;
3785 if (!strcmp(ql[i]->attr,
"text")) {
3788 qmodel->appendColumn(qvals);
3791 else if (!strcmp(ql[i]->attr,
"pixbuf")) {
3793 qmodel->appendColumn(qvals);
3796 else if (!strcmp(ql[i]->attr,
"active")) {
3798 qmodel->appendColumn(qvals);
3802 int newcol = qmodel->columnCount();
3803 QTreeView *qtv =
static_cast<QTreeView *
>(
this);
3804 if (col->fwidth != -1) {
3805 qtv->setColumnWidth(newcol, col->fwidth);
3808 QHeaderView *qv = (
static_cast<QTreeView *
>(
this))->header();
3809 qv->setSectionResizeMode(newcol, col->sizing);
3815 LiVESAdjustment *get_hadj() {
3819 LiVESAdjustment *get_vadj() {
3840 LiVESTreeModel *model;
3841 LiVESAdjustment *hadj, *vadj;
3845 #define LIVES_COL_TYPE_STRING 1 3846 #define LIVES_COL_TYPE_INT 2 3847 #define LIVES_COL_TYPE_UINT 3 3848 #define LIVES_COL_TYPE_BOOLEAN 4 3849 #define LIVES_COL_TYPE_PIXBUF 5 3852 typedef QTreeWidgetItem LiVESTreeIter;
3854 void LiVESTreeModel::set_tree_widget(LiVESTreeView *twidget) {
3858 QTreeWidget *LiVESTreeModel::get_qtree_widget() {
3859 return static_cast<QTreeWidget *
>(widget);
3864 class LiVESTreeStore :
public LiVESTreeModel {
3866 LiVESTreeStore(
int ncols,
int *types) {}
3871 class LiVESListStore :
public LiVESListModel {
3873 LiVESListStore(
int ncols,
int *types) {}
3881 void LiVESAdjustment::set_value(
double newval) {
3882 if (newval != value) {
3887 if (LIVES_IS_SCALE(owner)) {
3888 (
dynamic_cast<QAbstractSlider *
>(owner))->setValue(newval);
3889 }
else if (LIVES_IS_SCROLLBAR(owner)) {
3890 (
dynamic_cast<QScrollBar *
>(owner))->setValue(newval);
3891 }
else if (LIVES_IS_SPIN_BUTTON(owner)) {
3893 (
dynamic_cast<QDoubleSpinBox *
>(owner))->setValue(newval);
3894 }
else if (LIVES_IS_TREE_VIEW(owner)) {
3895 if (
this == (dynamic_cast<LiVESTreeView *>(owner))->get_hadj()) {
3896 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setValue(newval);
3898 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setValue(newval);
3900 }
else if (LIVES_IS_SCROLLED_WINDOW(owner)) {
3901 if (
this == (dynamic_cast<LiVESScrolledWindow *>(owner))->get_hadj()) {
3902 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setValue(newval);
3904 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setValue(newval);
3911 void LiVESAdjustment::set_upper(
double newval) {
3912 if (newval != upper) {
3917 if (LIVES_IS_SCALE(owner)) {
3918 (
dynamic_cast<QAbstractSlider *
>(owner))->setMaximum(newval);
3919 }
else if (LIVES_IS_SCROLLBAR(owner)) {
3921 (
dynamic_cast<QScrollBar *
>(owner))->setMaximum(newval);
3922 }
else if (LIVES_IS_SPIN_BUTTON(owner)) {
3924 (
dynamic_cast<QDoubleSpinBox *
>(owner))->setMaximum(newval);
3925 }
else if (LIVES_IS_TREE_VIEW(owner)) {
3926 if (
this == (dynamic_cast<LiVESTreeView *>(owner))->get_hadj()) {
3927 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setMaximum(newval);
3929 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setMaximum(newval);
3931 }
else if (LIVES_IS_SCROLLED_WINDOW(owner)) {
3932 if (
this == (dynamic_cast<LiVESScrolledWindow *>(owner))->get_hadj()) {
3933 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setMaximum(newval);
3935 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setMaximum(newval);
3945 void LiVESAdjustment::set_lower(
double newval) {
3946 if (newval != lower) {
3950 if (LIVES_IS_SCALE(owner)) {
3951 (
dynamic_cast<QAbstractSlider *
>(owner))->setMinimum(newval);
3952 }
else if (LIVES_IS_SCROLLBAR(owner)) {
3954 (
dynamic_cast<QScrollBar *
>(owner))->setMinimum(newval);
3955 }
else if (LIVES_IS_SPIN_BUTTON(owner)) {
3957 (
dynamic_cast<QDoubleSpinBox *
>(owner))->setMinimum(newval);
3958 }
else if (LIVES_IS_TREE_VIEW(owner)) {
3959 if (
this == (dynamic_cast<LiVESTreeView *>(owner))->get_hadj()) {
3960 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setMinimum(newval);
3962 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setMinimum(newval);
3964 }
else if (LIVES_IS_SCROLLED_WINDOW(owner)) {
3965 if (
this == (dynamic_cast<LiVESScrolledWindow *>(owner))->get_hadj()) {
3966 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setMinimum(newval);
3968 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setMinimum(newval);
3976 void LiVESAdjustment::set_step_increment(
double newval) {
3977 if (newval != step_increment) {
3978 step_increment = newval;
3982 if (LIVES_IS_SCALE(owner)) {
3983 (
dynamic_cast<QAbstractSlider *
>(owner))->setSingleStep(newval);
3984 }
else if (LIVES_IS_SCROLLBAR(owner)) {
3986 (
dynamic_cast<QScrollBar *
>(owner))->setSingleStep(newval);
3987 }
else if (LIVES_IS_SPIN_BUTTON(owner)) {
3989 (
dynamic_cast<QDoubleSpinBox *
>(owner))->setSingleStep(newval);
3990 }
else if (LIVES_IS_TREE_VIEW(owner)) {
3991 if (
this == (dynamic_cast<LiVESTreeView *>(owner))->get_hadj()) {
3992 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setSingleStep(newval);
3994 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setSingleStep(newval);
3996 }
else if (LIVES_IS_SCROLLED_WINDOW(owner)) {
3997 if (
this == (dynamic_cast<LiVESScrolledWindow *>(owner))->get_hadj()) {
3998 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setSingleStep(newval);
4000 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setSingleStep(newval);
4007 void LiVESAdjustment::set_page_increment(
double newval) {
4008 if (newval != page_increment) {
4009 page_increment = newval;
4013 if (LIVES_IS_SCALE(owner)) {
4014 (
dynamic_cast<QAbstractSlider *
>(owner))->setPageStep(newval);
4015 }
else if (LIVES_IS_SCROLLBAR(owner)) {
4017 (
dynamic_cast<QScrollBar *
>(owner))->setPageStep(newval);
4018 }
else if (LIVES_IS_TREE_VIEW(owner)) {
4019 if (
this == (dynamic_cast<LiVESTreeView *>(owner))->get_hadj()) {
4020 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setPageStep(newval);
4022 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setPageStep(newval);
4024 }
else if (LIVES_IS_SCROLLED_WINDOW(owner)) {
4025 if (
this == (dynamic_cast<LiVESScrolledWindow *>(owner))->get_hadj()) {
4026 (
dynamic_cast<QAbstractScrollArea *
>(owner))->horizontalScrollBar()->setPageStep(newval);
4028 (
dynamic_cast<QAbstractScrollArea *
>(owner))->verticalScrollBar()->setPageStep(newval);
4035 void LiVESAdjustment::set_page_size(
double newval) {
4037 if (newval != page_size) {
4046 class LiVESTable :
public LiVESWidget,
public QGridLayout {
4050 set_type(LIVES_WIDGET_TYPE_TABLE);
4055 LiVESWidget *layout;
4060 typedef QWindow LiVESXWindow;
4062 typedef class LiVESImage LiVESPixbuf;
4064 typedef LiVESWidget LiVESEditable;
4065 typedef LiVESWidget LiVESContainer;
4066 typedef LiVESWidget LiVESMenuShell;
4067 typedef LiVESWidget LiVESBin;
4069 typedef QSlider LiVESScaleButton;
4070 typedef void LiVESExpander;
4073 void qt_jpeg_save(LiVESPixbuf *pixbuf,
const char *fname, LiVESError **errptr,
int quality) {
4075 QImageWriter qiw(QString::fromUtf8(fname),
"jpeg");
4077 QImageWriter qiw(QString::fromLocal8Bit(fname),
"jpeg");
4079 qiw.setQuality(quality);
4080 if (!qiw.write(static_cast<QImage>(*pixbuf))) {
4081 if (errptr != NULL) {
4082 *errptr = (LiVESError *)malloc(
sizeof(LiVESError));
4083 (*errptr)->code = qiw.error();
4084 (*errptr)->message = strdup(qiw.errorString().toUtf8().constData());
4090 void qt_png_save(LiVESPixbuf *pixbuf,
const char *fname, LiVESError **errptr,
int cmp) {
4092 QImageWriter qiw(QString::fromUtf8(fname),
"png");
4094 QImageWriter qiw(QString::fromLocal8Bit(fname),
"png");
4096 qiw.setCompression(cmp);
4097 if (!qiw.write(static_cast<QImage>(*pixbuf))) {
4098 if (errptr != NULL) {
4099 *errptr = (LiVESError *)malloc(
sizeof(LiVESError));
4100 (*errptr)->code = qiw.error();
4101 (*errptr)->message = strdup(qiw.errorString().toUtf8().constData());
4109 typedef Qt::ScrollBarPolicy LiVESPolicyType;
4110 #define LIVES_POLICY_AUTOMATIC Qt::ScrollBarAsNeeded 4111 #define LIVES_POLICY_NEVER Qt::ScrollBarAlwaysOff 4112 #define LIVES_POLICY_ALWAYS Qt::ScrollBarAlwaysOn 4115 class LiVESFrame :
public LiVESWidget,
public QGroupBox {
4117 LiVESFrame(QString text) {
4118 set_type(LIVES_WIDGET_TYPE_FRAME);
4120 LiVESWidget *label_widget =
new LiVESLabel(text);
4121 set_label_widget(label_widget);
4125 void set_label(QString text) {
4126 label_widget->set_text(text);
4130 void set_label_widget(LiVESWidget *widget) {
4131 if (label_widget != NULL) {
4132 remove_child(static_cast<LiVESWidget *>(label_widget));
4134 if (widget != NULL) {
4135 add_child(label_widget);
4136 label_widget =
dynamic_cast<LiVESLabel *
>(widget);
4137 label_widget->set_owner(
this);
4138 setTitle(label_widget->text());
4140 label_widget = NULL;
4146 LiVESWidget *get_label_widget() {
4147 return static_cast<LiVESWidget *
>(label_widget);
4152 LiVESWidget *get_layout() {
4153 if (layout == NULL) {
4154 layout =
new LiVESVBox;
4155 (
static_cast<QGroupBox *
>(
this))->setLayout(dynamic_cast<QLayout *>(layout));
4156 if ((static_cast<LiVESWidget *>(
this))->isVisible()) layout->setVisible(
true);
4164 LiVESWidget *layout;
4165 LiVESLabel *label_widget;
4171 class LiVESFileChooser :
public LiVESWidget,
public QFileDialog {
4173 LiVESFileChooser() {
4174 set_type(LIVES_WIDGET_TYPE_FILE_CHOOSER);
4180 typedef int LiVESFileChooserAction;
4181 #define LIVES_FILE_CHOOSER_ACTION_OPEN 1 4182 #define LIVES_FILE_CHOOSER_ACTION_SAVE 2 4183 #define LIVES_FILE_CHOOSER_ACTION_SELECT_FOLDER 3 4184 #define LIVES_FILE_CHOOSER_ACTION_CREATE_FOLDER 4 4185 #define LIVES_FILE_CHOOSER_ACTION_SELECT_DEVICE 5 4188 class LiVESNotebook :
public LiVESWidget,
public QTabWidget {
4192 set_type(LIVES_WIDGET_TYPE_NOTEBOOK);
4196 for (
int i = 0; i < label_widgets.size(); i++) {
4197 label_widgets[i]->dec_refcount();
4201 void set_tab_label(LiVESWidget *child, LiVESWidget *xlabel) {
4202 int i = get_child_index(child);
4203 if (i == -1)
return;
4205 if (xlabel != NULL) {
4206 label_widgets[i]->dec_refcount();
4207 LiVESLabel *label =
dynamic_cast<LiVESLabel *
>(xlabel);
4208 label_widgets[i] = label;
4209 label->set_owner(
this);
4210 QLabel *qlabel =
static_cast<QLabel *
>(label);
4211 setTabText(i, qlabel->text());
4216 void append_page() {
4217 LiVESWidget *label_widget =
new LiVESLabel(NULL);
4218 label_widgets.append(label_widget);
4222 QList <LiVESWidget *> label_widgets;
4229 class LiVESToolbar :
public LiVESWidget,
public QToolBar {
4233 set_type(LIVES_WIDGET_TYPE_TOOLBAR);
4236 void add_action(QAction *act,
int pos) {
4237 actions.insert(pos, act);
4240 QAction *get_action(
int pos) {
4241 return actions.at(pos);
4245 return actions.size();
4249 QList<QAction *>actions;
4256 class LiVESColorButton :
public LiVESButtonBase,
public QPushButton {
4261 LiVESColorButton(
const LiVESWidgetColor *col) {
4262 set_type(LIVES_WIDGET_TYPE_COLOR_BUTTON);
4263 static_cast<QObject *
>(
static_cast<QPushButton *
>(
this))->connect(static_cast<QObject *>(static_cast<QPushButton *>(
this)),
4265 static_cast<QObject *>(static_cast<QPushButton *>(
this)),
4272 void set_colour(
const LiVESWidgetColor *col) {
4273 QColor xcolor(col->red * 255., col->green * 255., col->blue * 255., col->alpha * 255.);
4277 void set_colour(QColor xcolour) {
4278 if (colour != xcolour) {
4280 QPushButton *qpb =
static_cast<QPushButton *
>(
this);
4281 QPalette p = qpb->palette();
4282 QColor mycolour = xcolour;
4283 if (!use_alpha) mycolour.setAlpha(255);
4284 p.setColor(QPalette::Button, mycolour);
4292 QColor get_colour() {
4296 void get_colour(LiVESWidgetColor *col) {
4297 col->red = (float)colour.red() / 255.;
4298 col->green = (float)colour.green() / 255.;
4299 col->blue = (float)colour.blue() / 255.;
4300 col->alpha = (float)colour.alpha() / 255.;
4304 void set_title(
const char *xtitle) {
4305 title = QString::fromUtf8(xtitle);
4308 void set_use_alpha(
boolean val) {
4338 class LiVESTimer :
public LiVESObject,
public QTimer {
4341 LiVESTimer(uint32_t interval, LiVESWidgetSourceFunc xfunc, livespointer data);
4343 uint32_t get_handle() {
4354 LiVESWidgetSourceFunc func;
4359 static QList<LiVESTimer *> static_timers;
4362 LiVESTimer::LiVESTimer(uint32_t interval, LiVESWidgetSourceFunc xfunc, livespointer data) {
4363 set_type(LIVES_OBJECT_TYPE_TIMER);
4364 static_timers.append(
this);
4366 static_cast<QObject *
>(
static_cast<QTimer *
>(
this))->connect(static_cast<QObject *>(static_cast<QTimer *>(
this)),
4368 static_cast<QObject *>(static_cast<QTimer *>(
this)),
4375 void LiVESTimer::update() {
4377 boolean ret = (func)(data);
4380 static_timers.removeOne(
this);
4385 void remove_static_timer(uint32_t handle) {
4386 for (
int i = 0; i < static_timers.size(); i++) {
4387 if (static_timers.at(i)->get_handle() == handle) {
4388 static_timers.removeOne(static_timers.at(i));
4395 typedef Qt::ToolButtonStyle LiVESToolbarStyle;
4396 #define LIVES_TOOLBAR_ICONS Qt::ToolButtonIconOnly 4397 #define LIVES_TOOLBAR_TEXT Qt::ToolButtonTextOnly 4399 typedef QSize LiVESRequisition;
4401 typedef int LiVESTextIter;
4403 class LiVESTreePath {
4406 LiVESTreePath(
const char *
string) {
4408 QStringList qsl = qs.split(
":");
4411 for (
int i=0; i < qsl.size(); i++) {
4412 qli.append(qsl.at(i).toInt());
4418 LiVESTreePath(QList<int> qli) {
4432 int *get_indices() {
4440 void init(QList<int> qli) {
4442 indices = (
int *)(malloc(cnt *
sizeof(
int)));
4443 for (
int i=0; i < cnt; i++) {
4444 indices[i] = qli.at(i);
4451 typedef Qt::Orientation LiVESOrientation;
4452 #define LIVES_ORIENTATION_HORIZONTAL Qt::Horizontal 4453 #define LIVES_ORIENTATION_VERTICAL Qt::Vertical 4455 typedef int LiVESButtonBoxStyle;
4456 #define LIVES_BUTTONBOX_DEFAULT_STYLE 0 4457 #define LIVES_BUTTONBOX_SPREAD 1 4458 #define LIVES_BUTTONBOX_EDGE 2 4459 #define LIVES_BUTTONBOX_START 3 4460 #define LIVES_BUTTONBOX_END 4 4461 #define LIVES_BUTTONBOX_CENTER 5 4463 typedef int LiVESReliefStyle;
4465 #define LIVES_RELIEF_NORMAL 2 4466 #define LIVES_RELIEF_HALF 1 4467 #define LIVES_RELIEF_NONE 0 4469 #define LIVES_ACCEL_VISIBLE 1 4471 typedef int LiVESWindowType;
4472 #define LIVES_WINDOW_TOPLEVEL Qt::Window 4473 #define LIVES_WINDOW_POPUP Qt::Popup 4475 typedef QFrame::Shadow LiVESShadowType;
4476 #define LIVES_SHADOW_NONE QFrame::Plain 4477 #define LIVES_SHADOW_IN QFrame::Raised 4478 #define LIVES_SHADOW_OUT QFrame::Sunken 4479 #define LIVES_SHADOW_ETCHED_IN QFrame::Raised 4480 #define LIVES_SHADOW_ETCHED_OUT QFrame::Sunken 4484 typedef int LiVESPositionType;
4485 #define LIVES_POS_LEFT 1 4486 #define LIVES_POS_RIGHT 2 4487 #define LIVES_POS_TOP 3 4488 #define LIVES_POS_BOTTOM 4 4491 #define LIVES_WIDGET(a) ((LiVESWidget *)a) 4494 #define LIVES_EDITABLE(a) (a) 4496 #define LIVES_CONTAINER(a) LIVES_WIDGET(a) 4497 #define LIVES_GUI_OBJECT(a) LIVES_WIDGET(a) 4498 #define LIVES_EXPANDER(a) LIVES_WIDGET(a) 4499 #define LIVES_BIN(a) LIVES_WIDGET(a) 4500 #define LIVES_MENU_SHELL(a) LIVES_WIDGET(a) 4502 #define LIVES_WIDGET_OBJECT(a) ((LiVESObject *)a) 4503 #define LIVES_COMBO(a) ((LiVESCombo *)a) 4504 #define LIVES_HBOX(a) ((LiVESHBox *)a) 4505 #define LIVES_VBOX(a) ((LiVESVBox *)a) 4506 #define LIVES_BOX(a) ((LiVESBox *)a) 4507 #define LIVES_ALIGNMENT(a) ((LiVESAlignment *)a) 4508 #define LIVES_TOOLBAR(a) ((LiVESToolbar *)a) 4509 #define LIVES_TOOL_BUTTON(a) ((LiVESToolButton *)a) 4510 #define LIVES_EVENT_BOX(a) ((LiVESEventBox *)a) 4511 #define LIVES_DRAWING_AREA(a) ((LiVESDrawingArea *)a) 4512 #define LIVES_TEXT_VIEW(a) ((LiVESTextView *)a) 4513 #define LIVES_TEXT_BUFFER(a) ((LiVESTextBuffer *)a) 4514 #define LIVES_BUTTON_BOX(a) ((LiVESButtonBox *)a) 4515 #define LIVES_FRAME(a) ((LiVESFrame *)a) 4516 #define LIVES_SCALE(a) ((LiVESScale *)a) 4517 #define LIVES_RANGE(a) ((LiVESRange *)a) 4518 #define LIVES_ADJUSTMENT(a) ((LiVESAdjustment *)a) 4519 #define LIVES_TABLE(a) ((LiVESTable *)a) 4520 #define LIVES_NOTEBOOK(a) ((LiVESNotebook *)a) 4521 #define LIVES_MENU(a) ((LiVESMenu *)a) 4522 #define LIVES_MENU_ITEM(a) ((LiVESMenuItem *)a) 4523 #define LIVES_MENU_TOOL_ITEM(a) ((LiVESMenuToolItem *)a) 4524 #define LIVES_MENU_TOOL_BUTTON(a) ((LiVESMenuToolButton *)a) 4525 #define LIVES_RULER(a) ((LiVESRuler *)a) 4526 #define LIVES_CHECK_MENU_ITEM(a) ((LiVESCheckMenuItem *)a) 4527 #define LIVES_IMAGE(a) ((LiVESImage *)a) 4528 #define LIVES_PROGRESS_BAR(a) ((LiVESProgressBar *)a) 4529 #define LIVES_BUTTON(a) ((LiVESButton *)a) 4530 #define LIVES_SPIN_BUTTON(a) ((LiVESSpinButton *)a) 4531 #define LIVES_SCALE_BUTTON(a) ((LiVESScaleButton *)a) 4532 #define LIVES_TOGGLE_BUTTON(a) ((LiVESToggleButton *)a) 4533 #define LIVES_RADIO_BUTTON(a) ((LiVESRadioButton *)a) 4534 #define LIVES_RADIO_MENU_ITEM(a) ((LiVESRadioMenuItem *)a) 4535 #define LIVES_COLOR_BUTTON(a) ((LiVESColorButton *)a) 4536 #define LIVES_DIALOG(a) ((LiVESDialog *)a) 4537 #define LIVES_LABEL(a) ((LiVESLabel *)a) 4538 #define LIVES_ENTRY(a) ((LiVESEntry *)a) 4539 #define LIVES_PANED(a) ((LiVESPaned *)a) 4540 #define LIVES_FILE_CHOOSER(a) ((LiVESFileChooser *)a) 4541 #define LIVES_ACCEL_GROUP(a) ((LiVESAccelGroup *)a) 4542 #define LIVES_WINDOW(a) ((LiVESWindow *)a) 4543 #define LIVES_SCROLLED_WINDOW(a) ((LiVESScrolledWindow *)a) 4544 #define LIVES_TREE_MODEL(a) ((LiVESTreeModel *)a) 4545 #define LIVES_TREE_VIEW(a) ((LiVESTreeView *)a) 4546 #define LIVES_LIST_STORE(a) ((LiVESListStore *)a) 4547 #define LIVES_TOOL_ITEM(a) ((LiVESToolItem *)a) 4550 #define LIVES_STOCK_UNDO "edit-undo" 4551 #define LIVES_STOCK_REDO "edit-redo" 4552 #define LIVES_STOCK_ADD "list-add" 4553 #define LIVES_STOCK_REMOVE "list-remove" 4554 #define LIVES_STOCK_NO "media-record" 4555 #define LIVES_STOCK_QUIT "application-exit" 4556 #define LIVES_STOCK_OPEN "document-open" 4557 #define LIVES_STOCK_CLOSE "window-close" 4558 #define LIVES_STOCK_CLEAR "edit-clear" 4559 #define LIVES_STOCK_DELETE "edit-delete" 4560 #define LIVES_STOCK_SAVE_AS "document-save-as" 4561 #define LIVES_STOCK_SAVE "document-save" 4562 #define LIVES_STOCK_REFRESH "view-refresh" 4563 #define LIVES_STOCK_REVERT_TO_SAVED "document-revert" 4564 #define LIVES_STOCK_GO_BACK "go-previous" 4565 #define LIVES_STOCK_GO_FORWARD "go-next" 4566 #define LIVES_STOCK_REFRESH "view-refresh" 4567 #define LIVES_STOCK_MEDIA_PLAY "media-playback-start" 4568 #define LIVES_STOCK_MEDIA_STOP "media-playback-stop" 4569 #define LIVES_STOCK_MEDIA_REWIND "media-seek-backward" 4570 #define LIVES_STOCK_MEDIA_RECORD "media-record" 4571 #define LIVES_STOCK_MEDIA_PAUSE "media-pause" 4572 #define LIVES_STOCK_PREFERENCES "preferences-system" 4573 #define LIVES_STOCK_DIALOG_INFO "dialog-information" 4574 #define LIVES_STOCK_MISSING_IMAGE "image-missing" 4577 #define LIVES_STOCK_YES "gtk-yes" // non-standard image ? 4578 #define LIVES_STOCK_APPLY "gtk-apply" // non-standard image ? 4579 #define LIVES_STOCK_CANCEL "gtk-cancel" // non-standard image ? 4580 #define LIVES_STOCK_OK "gtk-ok" // non-standard image ? 4583 char LIVES_STOCK_LABEL_CANCEL[32];
4584 char LIVES_STOCK_LABEL_OK[32];
4585 char LIVES_STOCK_LABEL_YES[32];
4586 char LIVES_STOCK_LABEL_NO[32];
4587 char LIVES_STOCK_LABEL_SAVE[32];
4588 char LIVES_STOCK_LABEL_SAVE_AS[32];
4589 char LIVES_STOCK_LABEL_OPEN[32];
4590 char LIVES_STOCK_LABEL_QUIT[32];
4591 char LIVES_STOCK_LABEL_APPLY[32];
4592 char LIVES_STOCK_LABEL_CLOSE[32];
4593 char LIVES_STOCK_LABEL_REVERT[32];
4594 char LIVES_STOCK_LABEL_REFRESH[32];
4595 char LIVES_STOCK_LABEL_DELETE[32];
4596 char LIVES_STOCK_LABEL_GO_FORWARD[32];
4599 typedef int LiVESAttachOptions;
4600 #define LIVES_EXPAND 1 4601 #define LIVES_SHRINK 2 4602 #define LIVES_FILL 3 4609 typedef bool LiVESWrapMode;
4610 #define LIVES_WRAP_NONE false 4611 #define LIVES_WRAP_WORD true 4613 typedef Qt::Alignment LiVESJustification;
4615 #define LIVES_JUSTIFY_LEFT Qt::AlignLeft 4616 #define LIVES_JUSTIFY_RIGHT Qt::AlignRight 4617 #define LIVES_JUSTIFY_CENTER Qt::AlignHCenter 4618 #define LIVES_JUSTIFY_FILL Qt::AlignJustify 4625 LiVESWidget::~LiVESWidget() {
4626 if (LIVES_IS_SPIN_BUTTON(
this)) {
4627 LiVESAdjustment *adj = (
static_cast<LiVESSpinButton *
>(
this))->get_adj();
4628 adj->dec_refcount();
4631 if (LIVES_IS_RANGE(
this)) {
4632 LiVESAdjustment *adj = (
dynamic_cast<LiVESRange *
>(
this))->get_adj();
4633 adj->dec_refcount();
4636 if (LIVES_IS_TREE_VIEW(
this)) {
4637 LiVESAdjustment *adj = (
static_cast<LiVESTreeView *
>(
this))->get_hadj();
4638 adj->dec_refcount();
4639 adj = (
static_cast<LiVESTreeView *
>(
this))->get_vadj();
4640 adj->dec_refcount();
4643 if (LIVES_IS_SCROLLED_WINDOW(
this)) {
4644 LiVESAdjustment *adj = (
static_cast<LiVESScrolledWindow *
>(
this))->get_hadj();
4645 adj->dec_refcount();
4646 adj = (
static_cast<LiVESScrolledWindow *
>(
this))->get_vadj();
4647 adj->dec_refcount();
4651 if (parent != NULL) {
4653 parent->remove_child(
this);
4656 LiVESList *xchildren = children;
4659 while (xchildren != NULL) {
4661 xchildren = xchildren->next;
4664 lives_list_free(children);
4667 #define LINGO_ALIGN_LEFT Qt::AlignLeft 4668 #define LINGO_ALIGN_RIGHT Qt::AlignRight 4669 #define LINGO_ALIGN_CENTER Qt::AlignHCenter 4671 #define LINGO_SCALE 1 4673 typedef class lives_painter_t lives_painter_t;
4675 class LingoLayout :
public LiVESObject {
4677 LingoLayout(
const char *xtext,
const char *xfont,
double fsize) {
4678 text = QString::fromUtf8(xtext);
4679 font = QFont(QString::fromUtf8(xfont));
4680 font.setPointSizeF((
float)fsize);
4681 align = LINGO_ALIGN_LEFT;
4684 void set_alignment(
int xalign) {
4688 void set_text(
const char *xtext, ssize_t len) {
4689 text = QString::fromUtf8(xtext, len);
4692 void get_size(
int *bwidth,
int *bheight,
int pwidth,
int pheight);
4694 void set_coords(
int xx,
int xy,
int xwidth,
int xheight) {
4701 void render_text(lives_painter_t *painter);
4708 int x,y,width,height;
4711 LIVES_INLINE void lingo_layout_set_alignment(LingoLayout *l,
int alignment) {
4712 l->set_alignment(alignment);
4716 LIVES_INLINE void lingo_layout_set_text(LingoLayout *l,
const char *text, ssize_t len) {
4717 l->set_text(text, len);
4721 LIVES_INLINE void lingo_layout_set_coords(LingoLayout *l,
int x,
int y,
int width,
int height) {
4722 l->set_coords(x, y, width, height);
4726 LIVES_INLINE void lingo_layout_get_size(LingoLayout *l,
int *rw,
int *rh,
int width,
int height) {
4727 l->get_size(rw, rh, width, height);
4731 LIVES_INLINE void lingo_painter_show_layout(lives_painter_t *painter, LingoLayout *l) {
4732 l->render_text(painter);
4739 #ifdef PAINTER_QPAINTER 4740 # include <QtGui/QPainter> 4744 static void imclean(livespointer data) {
4748 typedef QImage::Format lives_painter_format_t;
4749 #define LIVES_PAINTER_FORMAT_A1 QImage::Format_Mono 4750 #define LIVES_PAINTER_FORMAT_A8 QImage::Format_Indexed8 4751 #define LIVES_PAINTER_FORMAT_ARGB32 QImage::Format_ARGB32_Premultiplied 4754 class lives_painter_surface_t :
public QImage,
public LiVESObject {
4758 lives_painter_surface_t(
int width,
int height, QImage::Format fmt) : QImage(width, height, fmt) {
4762 lives_painter_surface_t (uint8_t *data, lives_painter_format_t fmt,
int width,
int height,
int stride)
4763 : QImage(data,width,height,stride,fmt,imclean,(livespointer)data) {
4773 class lives_painter_t :
public QPainter {
4776 lives_painter_surface_t *target;
4780 lives_painter_t(QWidget *widget) : QPainter(widget) {
4785 lives_painter_t(lives_painter_surface_t *surf) : QPainter() {
4791 ~lives_painter_t() {
4800 p =
new QPainterPath();
4809 #define LIVES_PAINTER_CONTENT_COLOR 0 4811 typedef QPainter::CompositionMode lives_painter_operator_t;
4813 #define LIVES_PAINTER_OPERATOR_UNKNOWN QPainter::CompositionMode_SourceOver 4814 #define LIVES_PAINTER_OPERATOR_DEFAULT QPainter::CompositionMode_SourceOver 4816 #define LIVES_PAINTER_OPERATOR_DEST_OUT QPainter::CompositionMode_DestinationOut 4818 #define LIVES_PAINTER_OPERATOR_DIFFERENCE QPainter::CompositionMode_Difference 4819 #define LIVES_PAINTER_OPERATOR_OVERLAY QPainter::CompositionMode_Overlay 4821 typedef Qt::FillRule lives_painter_fill_rule_t;
4823 #define LIVES_PAINTER_FILL_RULE_WINDING Qt::WindingFill 4824 #define LIVES_PAINTER_FILL_RULE_EVEN_ODD Qt::OddEvenFill 4829 void LingoLayout::get_size(
int *bwidth,
int *bheight,
int pwidth,
int pheight) {
4831 QRect rect = qp.boundingRect(0, 0, pwidth, pheight, Qt::AlignLeft | Qt::AlignTop, text);
4832 *bwidth = rect.width();
4833 *bheight = rect.height();
4837 void LingoLayout::render_text(lives_painter_t *painter) {
4838 painter->drawText(x, y, width, height, align, text);
4846 #include "moc_widget-helper-qt.cpp"
#define lives_free(a)
Definition: support.h:14
int boolean
Definition: videoplugin.h:50
#define lives_strdup(a)
Definition: support.h:13
#define dgettext(Domain, Message)
Definition: support.h:39
#define dngettext(Domain, Message, MsgPlur, n)
Definition: support.h:40
#define ulong
Definition: main.h:150
#define TRUE
Definition: videoplugin.h:55
#define LIVES_INLINE
Definition: main.h:275
#define FALSE
Definition: videoplugin.h:56