diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2020-12-29 16:09:43 +0100 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2020-12-29 16:39:54 +0100 | 
| commit | 645250e1cd8ce9bc1faea599df7a1b05836bfeb8 (patch) | |
| tree | c6311afab3900d2dd2aecbfbe1ac348d0e48c428 /plugingui | |
| parent | dce64999d3325c5b55499d6ba657066efa48fbff (diff) | |
Split UI code into application/plugin UI and UI library.
Diffstat (limited to 'plugingui')
126 files changed, 110 insertions, 14389 deletions
diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am index ab2e076..706b3c9 100644 --- a/plugingui/Makefile.am +++ b/plugingui/Makefile.am @@ -1,8 +1,8 @@  SUBDIRS = locale  DISTDIRS = locale -noinst_PROGRAMS = plugingui rcgen -noinst_LTLIBRARIES = libdggui.la +noinst_PROGRAMS = plugingui +noinst_LTLIBRARIES = libplugingui.la  # If you add a file here, remember to add it to plugin/Makefile.mingw32.in  RES = \ @@ -70,14 +70,14 @@ BUILT_SOURCES = \  	resource_data.cc \  	$(NLS_RES) -resource_data.cc: rcgen$(EXEEXT) $(RES) $(NLS_RES) -	$(rcgen_verbose)./rcgen$(EXEEXT) -s $(top_srcdir)/plugingui/ -s $(top_builddir)/plugingui/ -o $@ $(RES) $(NLS_RES) +resource_data.cc: $(top_builddir)/dggui/rcgen$(EXEEXT) $(RES) $(NLS_RES) +	$(rcgen_verbose)$(top_builddir)/dggui/rcgen$(EXEEXT) -s $(top_srcdir)/plugingui/ -s $(top_builddir)/plugingui/ -o $@ $(RES) $(NLS_RES)  CLEANFILES = \  	resource_data.cc \  	$(NLS_RES) -libdggui_la_CPPFLAGS = \ +libplugingui_la_CPPFLAGS = \  	$(DEBUG_FLAGS) \  	-I$(top_srcdir) \  	$(GUI_CPPFLAGS) \ @@ -90,205 +90,64 @@ libdggui_la_CPPFLAGS = \  	-DLODEPNG_NO_COMPILE_ERROR_TEXT \  	-DLODEPNG_NO_COMPILE_CPP -libdggui_la_CFLAGS = +libplugingui_la_CFLAGS = -libdggui_la_LIBTOOLFLAGS=--tag=CC +libplugingui_la_LIBTOOLFLAGS=--tag=CC -libdggui_la_LIBADD = \ +libplugingui_la_LIBADD = \ +	$(top_builddir)/dggui/libdggui.la \  	$(GUI_LIBS) $(PTHREAD_LIBS)  # If you add a file here, remember to add it to plugin/Makefile.mingw32.in  GUI_SRC = \  	abouttab.cc \  	bleedcontrolframecontent.cc \ -	button.cc \ -	button_base.cc \ -	checkbox.cc \ -	colour.cc \ -	combobox.cc \ -	dialog.cc \  	diskstreamingframecontent.cc \  	drumkitframecontent.cc \  	drumkittab.cc \ -	eventhandler.cc \  	filebrowser.cc \ -	font.cc \ -	frame.cc \ -	helpbutton.cc \ -	humanizerframecontent.cc \  	humaniservisualiser.cc \ -	image.cc \ -	imagecache.cc \ -	knob.cc \ -	label.cc \ -	layout.cc \ -	led.cc \ -	lineedit.cc \ -	listbox.cc \ -	listboxbasic.cc \ -	listboxthin.cc \ +	humanizerframecontent.cc \  	maintab.cc \  	mainwindow.cc \ -	painter.cc \ -	pixelbuffer.cc \  	pluginconfig.cc \ -	powerbutton.cc \  	powerwidget.cc \ -	progressbar.cc \  	resamplingframecontent.cc \ -	resource.cc \  	sampleselectionframecontent.cc \ -	scrollbar.cc \ -	slider.cc \ -	stackedwidget.cc \  	statusframecontent.cc \ -	tabbutton.cc \ -	tabwidget.cc \ -	textedit.cc \ -	texture.cc \ -	texturedbox.cc \  	timingframecontent.cc \ -	toggle.cc \ -	tooltip.cc \ -	uitranslation.cc \ -	utf8.cc \ -	verticalline.cc \  	visualizerframecontent.cc \ -	voicelimitframecontent.cc \ -	widget.cc \ -	window.cc +	voicelimitframecontent.cc  GUI_HDR = \  	abouttab.h \  	bleedcontrolframecontent.h \ -	button.h \ -	button_base.h \ -	canvas.h \ -	checkbox.h \ -	colour.h \ -	combobox.h \ -	dialog.h \  	diskstreamingframecontent.h \ -	drawable.h \  	drumkitframecontent.h \  	drumkittab.h \ -	eventhandler.h \  	filebrowser.h \ -	font.h \ -	frame.h \ -	guievent.h \ -	helpbutton.h \  	humaniservisualiser.h \  	humanizerframecontent.h \ -	image.h \ -	imagecache.h \ -	knob.h \ -	label.h \  	labeledcontrol.h \ -	layout.h \ -	led.h \ -	lineedit.h \ -	listbox.h \ -	listboxbasic.h \ -	listboxthin.h \  	maintab.h \  	mainwindow.h \ -	nativewindow.h \ -	nativewindow_cocoa.h \ -	nativewindow_cocoa.mm \ -	nativewindow_pugl.h \ -	nativewindow_pugl.cc \ -	nativewindow_win32.h \ -	nativewindow_win32.cc \ -	nativewindow_x11.h \ -	nativewindow_x11.cc \ -	painter.h \ -	pixelbuffer.h \  	pluginconfig.h \ -	powerbutton.h \  	powerwidget.h \ -	progressbar.h \  	resamplingframecontent.h \ -	resource.h \ -	resource_data.h \  	sampleselectionframecontent.h \ -	scrollbar.h \ -	slider.h \ -	stackedwidget.h \  	statusframecontent.h \ -	tabbutton.h \ -	tabwidget.h \ -	textedit.h \ -	texture.h \ -	texturedbox.h \  	timingframecontent.h \ -	toggle.h \ -	tooltip.h \ -	uitranslation.h \ -	utf8.h \ -	verticalline.h \  	visualizerframecontent.h \ -	voicelimitframecontent.h \ -	widget.h \ -	window.h +	voicelimitframecontent.h -libdggui_la_SOURCES = \ -	$(GUI_SRC) \ -	lodepng/lodepng.cpp +libplugingui_la_SOURCES = \ +	$(GUI_SRC) -nodist_libdggui_la_SOURCES = \ +nodist_libplugingui_la_SOURCES = \  	$(top_builddir)/plugingui/resource_data.cc -if ENABLE_X11 -nodist_libdggui_la_SOURCES += \ -	nativewindow_x11.cc -endif - -if ENABLE_WIN32 -nodist_libdggui_la_SOURCES += \ -	nativewindow_win32.cc -endif - -if ENABLE_COCOA -nodist_libdggui_la_SOURCES += \ -	nativewindow_cocoa.mm - -libdggui_la_OBJCXXFLAGS = \ -	-fblocks -endif - -if ENABLE_PUGL_X11 -nodist_libdggui_la_SOURCES += \ -	nativewindow_pugl.cc \ -	$(top_srcdir)/pugl/pugl/pugl_x11.c - -libdggui_la_CPPFLAGS += \ -	-I$(top_srcdir)/pugl - -libdggui_la_CFLAGS += \ -	-std=c99 -endif - -if ENABLE_PUGL_WIN32 -nodist_libdggui_la_SOURCES += \ -	nativewindow_pugl.cc \ -	$(top_srcdir)/pugl/pugl/pugl_win.cpp - -libdggui_la_CPPFLAGS += \ -	-I$(top_srcdir)/pugl -endif - -if ENABLE_PUGL_COCOA -nodist_libdggui_la_SOURCES += \ -	nativewindow_pugl.cc \ -	$(top_srcdir)/pugl/pugl/pugl_osx.m - -libdggui_la_CPPFLAGS += \ -	-I$(top_srcdir)/pugl -endif -  plugingui_LDADD = \ -	libdggui.la \ +	libplugingui.la \  	$(top_builddir)/src/libdg.la \  	$(top_builddir)/src/libnls.la @@ -297,6 +156,7 @@ plugingui_CXXFLAGS = \  	$(GUI_CPPFLAGS) \  	$(SNDFILE_CXXFLAGS) \  	$(PTHREAD_CFLAGS) \ +	-I$(top_srcdir) \  	-I$(top_srcdir)/src \  	-I$(top_srcdir)/hugin @@ -306,11 +166,6 @@ plugingui_SOURCES = \  	testmain.cc \  	$(top_srcdir)/hugin/hugin.c -rcgen_LDFLAGS = -static -rcgen_CXXFLAGS = -I$(top_srcdir)/getoptpp -rcgen_SOURCES = \ -	rcgen.cc -  EXTRA_DIST = \  	$(RES) \  	$(GUI_HDR) diff --git a/plugingui/abouttab.cc b/plugingui/abouttab.cc index 384c815..094ed5d 100644 --- a/plugingui/abouttab.cc +++ b/plugingui/abouttab.cc @@ -29,7 +29,7 @@  #include <version.h>  #include <translation.h> -#include "utf8.h" +#include <dggui/utf8.h>  namespace  { diff --git a/plugingui/abouttab.h b/plugingui/abouttab.h index ed06b1d..99653d1 100644 --- a/plugingui/abouttab.h +++ b/plugingui/abouttab.h @@ -26,9 +26,9 @@   */  #pragma once -#include "widget.h" -#include "resource.h" -#include "textedit.h" +#include <dggui/widget.h> +#include <dggui/resource.h> +#include <dggui/textedit.h>  #include <string> diff --git a/plugingui/bleedcontrolframecontent.h b/plugingui/bleedcontrolframecontent.h index 78733c0..d4f6c2e 100644 --- a/plugingui/bleedcontrolframecontent.h +++ b/plugingui/bleedcontrolframecontent.h @@ -25,9 +25,9 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.   */ -#include "label.h" -#include "slider.h" -#include "widget.h" +#include <dggui/label.h> +#include <dggui/slider.h> +#include <dggui/widget.h>  struct Settings;  class SettingsNotifier; diff --git a/plugingui/button.cc b/plugingui/button.cc deleted file mode 100644 index 30bda82..0000000 --- a/plugingui/button.cc +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            button.cc - * - *  Sun Oct  9 13:01:56 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "button.h" - -#include "painter.h" - -#include <hugin.hpp> -#include <stdio.h> - -namespace GUI -{ - -Button::Button(Widget* parent) -	: ButtonBase(parent) -{ -} - -Button::~Button() -{ -} - -void Button::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); -	p.clear(); - -	int padTop = 3; -	int padLeft = 0; -	int padTextTop = 3; - -	int w = width(); -	int h = height(); -	if(w == 0 || h == 0) -	{ -		return; -	} - -	if (enabled) { -		switch(draw_state) -		{ -		case State::Up: -			box_up.setSize(w - padLeft, h - padTop); -			p.drawImage(padLeft, padTop, box_up); -			break; - -		case State::Down: -			box_down.setSize(w - padLeft, h - padTop); -			p.drawImage(padLeft, padTop, box_down); -			break; -		} -	} -	else { -		box_grey.setSize(w - padLeft, h - padTop); -		p.drawImage(padLeft, padTop, box_grey); - -		p.setColour(Colour(0.55)); -	} - -	auto x = padLeft + (width() - font.textWidth(text)) / 2; -	auto y = padTop + padTextTop + font.textHeight(text); -	p.drawText(x, y, font, text, enabled); -} - -} // GUI:: diff --git a/plugingui/button.h b/plugingui/button.h deleted file mode 100644 index 52f22e2..0000000 --- a/plugingui/button.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            button.h - * - *  Sun Oct  9 13:01:56 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "button_base.h" -#include "font.h" -#include "texturedbox.h" - -namespace GUI { - -class Button -	: public ButtonBase { -public: -	Button(Widget* parent); -	virtual ~Button(); - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* e) override; - -private: -	TexturedBox box_up{getImageCache(), ":resources/pushbutton.png", -			0, 0, // atlas offset (x, y) -			7, 1, 7, // dx1, dx2, dx3 -			6, 12, 9}; // dy1, dy2, dy3 - -	TexturedBox box_down{getImageCache(), ":resources/pushbutton.png", -			15, 0, // atlas offset (x, y) -			7, 1, 7, // dx1, dx2, dx3 -			6, 12, 9}; // dy1, dy2, dy3 - -	TexturedBox box_grey{getImageCache(), ":resources/pushbutton.png", -			30, 0, // atlas offset (x, y) -			7, 1, 7, // dx1, dx2, dx3 -			6, 12, 9}; // dy1, dy2, dy3 - -	Font font{":resources/fontemboss.png"}; -}; - -} // GUI:: diff --git a/plugingui/button_base.cc b/plugingui/button_base.cc deleted file mode 100644 index bf441f5..0000000 --- a/plugingui/button_base.cc +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            button_base.cc - * - *  Sat Apr 15 21:45:30 CEST 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "button_base.h" - -namespace GUI { - -ButtonBase::ButtonBase(Widget *parent) -	: Widget(parent) -	, draw_state(State::Up) -	, button_state(State::Up) -{ -} - -ButtonBase::~ButtonBase() -{ -} - -void ButtonBase::buttonEvent(ButtonEvent* buttonEvent) -{ -	// Ignore everything except left clicks. -	if(!enabled || buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if(buttonEvent->direction == Direction::down) -	{ -		draw_state = State::Down; -		button_state = State::Down; -		in_button = true; -		redraw(); -	} - -	if(buttonEvent->direction == Direction::up) -	{ -		draw_state = State::Up; -		button_state = State::Up; -		redraw(); -		if(in_button) -		{ -			clicked(); -			clickNotifier(); -		} -	} -} - -void ButtonBase::setText(const std::string& text) -{ -	this->text = text; -	redraw(); -} - -void ButtonBase::setEnabled(bool enabled) -{ -	this->enabled = enabled; -	redraw(); -} - -bool ButtonBase::isEnabled() const -{ -	return enabled; -} - -void ButtonBase::mouseLeaveEvent() -{ -	if (!enabled) { -		return; -	} - -	in_button = false; -	if(button_state == State::Down) -	{ -		draw_state = State::Up; -		redraw(); -	} -} - -void ButtonBase::mouseEnterEvent() -{ -	if (!enabled) { -		return; -	} - -	in_button = true; -	if(button_state == State::Down) -	{ -		draw_state = State::Down; -		redraw(); -	} -} - -} // GUI:: diff --git a/plugingui/button_base.h b/plugingui/button_base.h deleted file mode 100644 index c872d9b..0000000 --- a/plugingui/button_base.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            button_base.h - * - *  Sat Apr 15 21:45:30 CEST 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> - -#include <notifier.h> - -#include "widget.h" - -namespace GUI { - -class ButtonBase -	: public Widget -{ -public: -	ButtonBase(Widget* parent); -	virtual ~ButtonBase(); - -	// From Widget: -	bool isFocusable() override { return true; } -	bool catchMouse() override { return true; } - -	void setText(const std::string& text); - -	void setEnabled(bool enabled); -	bool isEnabled() const; - -	Notifier<> clickNotifier; - -protected: -	virtual void clicked() {} - -	// From Widget: -	virtual void repaintEvent(RepaintEvent* e) override {}; -	virtual void buttonEvent(ButtonEvent* e) override; -	virtual void mouseLeaveEvent() override; -	virtual void mouseEnterEvent() override; - -	bool enabled{true}; -	bool in_button{false}; - -	enum class State { -		Up, -		Down -	}; - -	std::string text; - -	State draw_state{State::Up}; -	State button_state{State::Up}; -}; - -} // GUI:: diff --git a/plugingui/canvas.h b/plugingui/canvas.h deleted file mode 100644 index d6e8f99..0000000 --- a/plugingui/canvas.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            canvas.h - * - *  Sun Sep  4 13:03:51 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "pixelbuffer.h" - -namespace GUI -{ - -//! Abstract class that can be used by the Painter to draw on. -class Canvas -{ -public: -	virtual ~Canvas() = default; - -	//! @returns a reference to the pixel buffer. -	virtual PixelBufferAlpha& getPixelBuffer() = 0; -}; - -} // GUI:: diff --git a/plugingui/checkbox.cc b/plugingui/checkbox.cc deleted file mode 100644 index f3601bd..0000000 --- a/plugingui/checkbox.cc +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            checkbox.cc - * - *  Sat Nov 26 15:07:44 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "checkbox.h" - -#include "painter.h" - -namespace GUI -{ - -CheckBox::CheckBox(Widget* parent) -	: Toggle(parent) -	, bg_on(getImageCache(), ":resources/switch_back_on.png") -	, bg_off(getImageCache(), ":resources/switch_back_off.png") -	, knob(getImageCache(), ":resources/switch_front.png") -{ -} - -void CheckBox::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); -	p.clear(); -	p.drawImage(0, (knob.height() - bg_on.height()) / 2, state ? bg_on : bg_off); - -	if(clicked) -	{ -		p.drawImage((bg_on.width() - knob.width()) / 2 + 1, 0, knob); -		return; -	} - -	if(state) -	{ -		p.drawImage(bg_on.width() - 40 + 2, 0, knob); -	} -	else -	{ -		p.drawImage(0, 0, knob); -	} -} - -} // GUI:: diff --git a/plugingui/checkbox.h b/plugingui/checkbox.h deleted file mode 100644 index 6627304..0000000 --- a/plugingui/checkbox.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            checkbox.h - * - *  Sat Nov 26 15:07:44 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "toggle.h" -#include "texture.h" - -namespace GUI { - -class CheckBox : public Toggle { -public: -	CheckBox(Widget *parent); -	virtual ~CheckBox() = default; - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; - -private: -	Texture bg_on; -	Texture bg_off; -	Texture knob; -}; - -} // GUI:: diff --git a/plugingui/colour.cc b/plugingui/colour.cc deleted file mode 100644 index 7fd649c..0000000 --- a/plugingui/colour.cc +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            colour.cc - * - *  Fri Oct 14 09:38:28 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "colour.h" - -#include <cstring> - -namespace GUI -{ - -Colour::Colour() -{ -} - -Colour::Colour(float grey, float a) -	: pixel({{(std::uint8_t)(grey * 255), -	          (std::uint8_t)(grey * 255), -	          (std::uint8_t)(grey * 255), -	          (std::uint8_t)(a * 255)}}) -{ -} - -Colour::Colour(float r, float g, float b, float a) -	: pixel({{(std::uint8_t)(r * 255), -	          (std::uint8_t)(g * 255), -	          (std::uint8_t)(b * 255), -	          (std::uint8_t)(a * 255)}}) -{ -} - -Colour::Colour(std::uint8_t r, std::uint8_t g, std::uint8_t b, std::uint8_t a) -	: pixel({{r, g, b, a}}) -{ -} - -Colour::Colour(const Colour& other) -	: pixel(other.pixel) -{ -} - -Colour& Colour::operator=(const Colour& other) -{ -	pixel = other.pixel; -	return *this; -} - -bool Colour::operator==(const Colour& other) const -{ -	return pixel[0] == other.pixel[0] && -	       pixel[1] == other.pixel[1] && -	       pixel[2] == other.pixel[2]; -} - -bool Colour::operator!=(const Colour& other) const -{ -	return !(*this == other); -} - -} // GUI:: diff --git a/plugingui/colour.h b/plugingui/colour.h deleted file mode 100644 index 0bc8659..0000000 --- a/plugingui/colour.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            colour.h - * - *  Fri Oct 14 09:38:28 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <array> -#include <cstdint> - -namespace GUI -{ - -class Colour -{ -public: -	Colour(); -	Colour(float grey, float alpha = 1.0f); -	Colour(float red, float green, float blue, float alpha = 1.0f); -	Colour(std::uint8_t r, std::uint8_t g, std::uint8_t b, std::uint8_t a); -	Colour(const Colour& other); - -	Colour& operator=(const Colour& other); - -	bool operator==(const Colour& other) const; -	bool operator!=(const Colour& other) const; - -	inline std::uint8_t red() const { return pixel[0]; } -	inline std::uint8_t green() const { return pixel[1]; } -	inline std::uint8_t blue() const { return pixel[2]; } -	inline std::uint8_t alpha() const { return pixel[3]; } - -	std::uint8_t* data() { return pixel.data(); } -	const std::uint8_t* data() const { return pixel.data(); } - -private: -	std::array<std::uint8_t, 4> pixel{{255, 255, 255, 255}}; -}; - -} // GUI:: diff --git a/plugingui/combobox.cc b/plugingui/combobox.cc deleted file mode 100644 index aa2058e..0000000 --- a/plugingui/combobox.cc +++ /dev/null @@ -1,234 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            combobox.cc - * - *  Sun Mar 10 19:04:50 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "combobox.h" - -#include "painter.h" -#include "font.h" - -#include <stdio.h> - -#define BORDER 10 - -namespace GUI -{ - -void ComboBox::listboxSelectHandler() -{ -	ButtonEvent buttonEvent; -	buttonEvent.direction = Direction::down; -	this->buttonEvent(&buttonEvent); -} - -ComboBox::ComboBox(Widget* parent) -	: Widget(parent) -	, listbox(parent) -{ -	CONNECT(&listbox, selectionNotifier, this, &ComboBox::listboxSelectHandler); -	CONNECT(&listbox, clickNotifier, this, &ComboBox::listboxSelectHandler); - -	listbox.hide(); -} - -ComboBox::~ComboBox() -{ -} - -void ComboBox::addItem(std::string name, std::string value) -{ -	listbox.addItem(name, value); -} - -void ComboBox::clear() -{ -	listbox.clear(); -	redraw(); -} - -bool ComboBox::selectItem(int index) -{ -	listbox.selectItem(index); -	redraw(); -	return true; -} - -std::string ComboBox::selectedName() -{ -	return listbox.selectedName(); -} - -std::string ComboBox::selectedValue() -{ -	return listbox.selectedValue(); -} - -static void drawArrow(Painter &p, int x, int y, int w, int h) -{ -	p.drawLine(x, y, x+(w/2), y+h); -	p.drawLine(x+(w/2), y+h, x+w, y); - -	y++; -	p.drawLine(x, y, x+(w/2), y+h); -	p.drawLine(x+(w/2), y+h, x+w, y); -} - -void ComboBox::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	std::string _text = selectedName(); - -	int w = width(); -	int h = height(); -	if(w == 0 || h == 0) -	{ -		return; -	} - -	box.setSize(w, h); -	p.drawImage(0, 0, box); - -	p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0/255.0f, 1.0f)); -	p.drawText(BORDER - 4 + 3, height()/2+5 + 1 + 1, font, _text); - -	//  p.setColour(Colour(1, 1, 1)); -	//  p.drawText(BORDER - 4, (height()+font.textHeight()) / 2 + 1, font, _text); - -	//int n = height() / 2; - -	//  p.drawLine(width() - n - 6, 1 + 6, width() - 1 - 6, 1 + 6); -	{ -		int w = 10; -		int h = 6; -		drawArrow(p, width() - 6 - 4 - w, (height() - h) / 2, w, h); -		p.drawLine(width() - 6 - 4 - w - 4, 7, -		           width() - 6 - 4 - w - 4, height() - 8); -	} -} - -void ComboBox::scrollEvent(ScrollEvent* scrollEvent) -{ -	/* -	scroll_offset += e->delta; -	if(scroll_offset < 0) -	{ -		scroll_offset = 0; -	} -	if(scroll_offset > (items.size() - 1)) -	{ -		scroll_offset = (items.size() - 1); -	} -	redraw(); -	*/ -} - -void ComboBox::keyEvent(KeyEvent* keyEvent) -{ -	if(keyEvent->direction != Direction::up) -	{ -		return; -	} - -	/* -	switch(keyEvent->keycode) { -	case Key::up: -		{ -			selected--; -			if(selected < 0) -			{ -				selected = 0; -			} -			if(selected < scroll_offset) -			{ -				scroll_offset = selected; -				if(scroll_offset < 0) -				{ -					scroll_offset = 0; -				} -			} -		} -		break; -	case Key::down: -		{ -			// Number of items that can be displayed at a time. -			int numitems = height() / (font.textHeight() + padding); - -			selected++; -			if(selected > (items.size() - 1)) -			{ -				selected = (items.size() - 1); -			} -			if(selected > (scroll_offset + numitems - 1)) -			{ -				scroll_offset = selected - numitems + 1; -				if(scroll_offset > (items.size() - 1)) -				{ -					scroll_offset = (items.size() - 1); -				} -			} -		} -		break; -	case Key::home: -		selected = 0; -		break; -	case Key::end: -		selected = items.size() - 1; -		break; -	default: -		break; -	} - -	redraw(); -	*/ -} - -void ComboBox::buttonEvent(ButtonEvent* buttonEvent) -{ -	// Ignore everything except left clicks. -	if(buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if(buttonEvent->direction != Direction::down) -	{ -		return; -	} - -	if(!listbox.visible()) -	{ -		listbox.resize(width() - 10, 100); -		listbox.move(x() + 5, y() + height() - 7); -	} -	else -	{ -		valueChangedNotifier(listbox.selectedName(), listbox.selectedValue()); -	} - -	listbox.setVisible(!listbox.visible()); -} - -} // GUI:: diff --git a/plugingui/combobox.h b/plugingui/combobox.h deleted file mode 100644 index 778d54c..0000000 --- a/plugingui/combobox.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            combobox.h - * - *  Sun Mar 10 19:04:50 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string.h> -#include <vector> - -#include "widget.h" -#include "font.h" -#include "listboxthin.h" -#include "painter.h" -#include "texturedbox.h" - -namespace GUI -{ - -class ComboBox -	: public Widget -{ -public: -	ComboBox(Widget* parent); -	virtual ~ComboBox(); - -	void addItem(std::string name, std::string value); - -	void clear(); -	bool selectItem(int index); -	std::string selectedName(); -	std::string selectedValue(); - -	// From Widget: -	bool isFocusable() override { return true; } -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; -	virtual void buttonEvent(ButtonEvent* buttonEvent) override; -	virtual void scrollEvent(ScrollEvent* scrollEvent) override; -	virtual void keyEvent(KeyEvent* keyEvent) override; - -	Notifier<std::string, std::string> valueChangedNotifier; - -private: -	TexturedBox box{getImageCache(), ":resources/widget.png", -			0, 0, // atlas offset (x, y) -			7, 1, 7, // dx1, dx2, dx3 -			7, 63, 7}; // dy1, dy2, dy3 - -	void listboxSelectHandler(); - -	Font font; -	ListBoxThin listbox; -}; - -} // GUI:: diff --git a/plugingui/dialog.cc b/plugingui/dialog.cc deleted file mode 100644 index 9ba579d..0000000 --- a/plugingui/dialog.cc +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            dialog.cc - * - *  Sun Apr 16 10:31:04 CEST 2017 - *  Copyright 2017 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "dialog.h" - -namespace GUI -{ - -Dialog::Dialog(Widget* parent, bool modal) -	: parent(parent) -{ -	parent->window()->eventHandler()->registerDialog(this); -	setModal(modal); -} - -Dialog::~Dialog() -{ -	parent->window()->eventHandler()->unregisterDialog(this); -} - -void Dialog::setModal(bool modal) -{ -	is_modal = modal; -} - -bool Dialog::isModal() const -{ -	return is_modal; -} - -} // GUI:: diff --git a/plugingui/dialog.h b/plugingui/dialog.h deleted file mode 100644 index 1b0c6da..0000000 --- a/plugingui/dialog.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            dialog.h - * - *  Sun Apr 16 10:31:04 CEST 2017 - *  Copyright 2017 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "window.h" - -namespace GUI -{ - -//! This class is used the base window for pop-up dialogs, such as a file -//! browser. -class Dialog -	: public Window -{ -public: -	//! - The dialog is placed near the parent window. -	//! - The parent window event handler will call the dialog event handler -	//! - While the dialog is visible, all mouse click and keyboard events -	//!   are ignored by the parent event handler. -	//! - The Dialog registers itself in the parent event handler when contructed -	//!   and removes itself when destructed. -	//! - The parent event handler will delete all registered Dialogs when itself -	//!   deleted. -	Dialog(Widget* parent, bool modal = false); - -	~Dialog(); - -	//! Change modality. -	void setModal(bool modal); - -	//! Get current modality state. -	bool isModal() const; - -private: -	bool is_modal{false}; -	Widget* parent{nullptr}; -}; - -} // GUI:: diff --git a/plugingui/diskstreamingframecontent.h b/plugingui/diskstreamingframecontent.h index eabc6e2..1f7ab39 100644 --- a/plugingui/diskstreamingframecontent.h +++ b/plugingui/diskstreamingframecontent.h @@ -26,10 +26,10 @@   */  #pragma once -#include "button.h" -#include "label.h" -#include "slider.h" -#include "widget.h" +#include <dggui/button.h> +#include <dggui/label.h> +#include <dggui/slider.h> +#include <dggui/widget.h>  struct Settings;  class SettingsNotifier; diff --git a/plugingui/drawable.h b/plugingui/drawable.h deleted file mode 100644 index 95492d6..0000000 --- a/plugingui/drawable.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            drawable.h - * - *  Sat Jun  4 21:39:38 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <cstdlib> -#include <cstdint> - -namespace GUI -{ - -class Colour; - -class Drawable -{ -public: -	virtual ~Drawable() = default; - -	virtual std::size_t width() const = 0; -	virtual std::size_t height() const = 0; - -	virtual const Colour& getPixel(std::size_t x, std::size_t y) const = 0; -	virtual const std::uint8_t* line(std::size_t y, -	                                 std::size_t x_offset = 0) const = 0; - -	virtual bool hasAlpha() const = 0; -}; - -} // GUI:: diff --git a/plugingui/drumkitframecontent.cc b/plugingui/drumkitframecontent.cc index 7dd2234..2bdff7a 100644 --- a/plugingui/drumkitframecontent.cc +++ b/plugingui/drumkitframecontent.cc @@ -28,7 +28,6 @@  #include <settings.h> -#include "label.h"  #include "pluginconfig.h"  #include <translation.h> diff --git a/plugingui/drumkitframecontent.h b/plugingui/drumkitframecontent.h index 921927d..3661d8e 100644 --- a/plugingui/drumkitframecontent.h +++ b/plugingui/drumkitframecontent.h @@ -28,11 +28,12 @@  #include <settings.h> -#include "button.h" -#include "label.h" -#include "lineedit.h" -#include "progressbar.h" -#include "widget.h" +#include <dggui/button.h> +#include <dggui/label.h> +#include <dggui/lineedit.h> +#include <dggui/progressbar.h> +#include <dggui/widget.h> +  #include "filebrowser.h"  namespace GUI diff --git a/plugingui/drumkittab.cc b/plugingui/drumkittab.cc index 8d85f1e..46c448e 100644 --- a/plugingui/drumkittab.cc +++ b/plugingui/drumkittab.cc @@ -31,7 +31,9 @@  #include <sstream>  #include "cpp11fix.h" // required for c++11 -#include "painter.h" + +#include <dggui/painter.h> +  #include "settings.h"  #include <dgxmlparser.h> diff --git a/plugingui/drumkittab.h b/plugingui/drumkittab.h index a14a9c5..3243fba 100644 --- a/plugingui/drumkittab.h +++ b/plugingui/drumkittab.h @@ -32,9 +32,9 @@  #include <grid.h> -#include "image.h" -#include "label.h" -#include "widget.h" +#include <dggui/image.h> +#include <dggui/label.h> +#include <dggui/widget.h>  struct Settings;  class SettingsNotifier; diff --git a/plugingui/eventhandler.cc b/plugingui/eventhandler.cc deleted file mode 100644 index fd333b8..0000000 --- a/plugingui/eventhandler.cc +++ /dev/null @@ -1,297 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            eventhandler.cc - * - *  Sun Oct  9 18:58:29 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "eventhandler.h" - -#include "window.h" -#include "painter.h" -#include "dialog.h" - -namespace GUI -{ - -EventHandler::EventHandler(NativeWindow& nativeWindow, Window& window) -	: window(window) -	, nativeWindow(nativeWindow) -	, lastWasDoubleClick(false) -{} - -bool EventHandler::hasEvent() -{ -	return !events.empty(); -} - -bool EventHandler::queryNextEventType(EventType type) -{ -	return !events.empty() && -		(events.front()->type() == type); -} - -std::shared_ptr<Event> EventHandler::getNextEvent() -{ -	if(events.empty()) -	{ -		return nullptr; -	} - -	auto event = events.front(); -	events.pop_front(); -	return event; -} - -void EventHandler::processEvents() -{ -	bool block_interaction{false}; -	for(auto dialog : dialogs) -	{ -		// Check if the dialog nativewindow (not the contained widget) is visible -		if(dialog->native->visible()) -		{ -			block_interaction |= dialog->isModal(); -			dialog->eventHandler()->processEvents(); -		} -	} - -	events = nativeWindow.getEvents(); - -	while(hasEvent()) -	{ -		auto event = getNextEvent(); - -		if(event == nullptr) -		{ -			continue; -		} - -		switch(event->type()) { -		case EventType::repaint: -			break; - -		case EventType::move: -			{ -				auto moveEvent = static_cast<MoveEvent*>(event.get()); -				window.moved(moveEvent->x, moveEvent->y); -			} -			break; - -		case EventType::resize: -			{ -				auto resizeEvent = static_cast<ResizeEvent*>(event.get()); -				if((resizeEvent->width != window.width()) || -				   (resizeEvent->height != window.height())) -				{ -					window.resized(resizeEvent->width, resizeEvent->height); -				} -			} -			break; - -		case EventType::mouseMove: -			{ -				// Skip all consecutive mouse move events and handle only the last one. -				while(queryNextEventType(EventType::mouseMove)) -				{ -					event = getNextEvent(); -				} - -				auto moveEvent = static_cast<MouseMoveEvent*>(event.get()); - -				auto widget = window.find(moveEvent->x, moveEvent->y); -				auto oldwidget = window.mouseFocus(); -				if(widget != oldwidget) -				{ -					// Send focus leave to oldwidget -					if(oldwidget) -					{ -						oldwidget->mouseLeaveEvent(); -					} - -					// Send focus enter to widget -					if(widget) -					{ -						widget->mouseEnterEvent(); -					} - -					window.setMouseFocus(widget); -				} - -				if(window.buttonDownFocus()) -				{ -					auto widget = window.buttonDownFocus(); -					moveEvent->x -= widget->translateToWindowX(); -					moveEvent->y -= widget->translateToWindowY(); - -					window.buttonDownFocus()->mouseMoveEvent(moveEvent); -					break; -				} - -				if(widget) -				{ -					moveEvent->x -= widget->translateToWindowX(); -					moveEvent->y -= widget->translateToWindowY(); -					widget->mouseMoveEvent(moveEvent); -				} -			} -			break; - -		case EventType::button: -			{ -				if(block_interaction) -				{ -					continue; -				} - -				auto buttonEvent = static_cast<ButtonEvent*>(event.get()); -				if(lastWasDoubleClick && (buttonEvent->direction == Direction::down)) -				{ -					lastWasDoubleClick = false; -					continue; -				} - -				lastWasDoubleClick = buttonEvent->doubleClick; - -				auto widget = window.find(buttonEvent->x, buttonEvent->y); - -				if(window.buttonDownFocus()) -				{ -					if(buttonEvent->direction == Direction::up) -					{ -						auto widget = window.buttonDownFocus(); -						buttonEvent->x -= widget->translateToWindowX(); -						buttonEvent->y -= widget->translateToWindowY(); - -						widget->buttonEvent(buttonEvent); -						window.setButtonDownFocus(nullptr); -						break; -					} -				} - -				if(widget) -				{ -					buttonEvent->x -= widget->translateToWindowX(); -					buttonEvent->y -= widget->translateToWindowY(); - -					widget->buttonEvent(buttonEvent); - -					if((buttonEvent->direction == Direction::down) && -					   widget->catchMouse()) -					{ -						window.setButtonDownFocus(widget); -					} - -					if(widget->isFocusable()) -					{ -						window.setKeyboardFocus(widget); -					} -				} -			} -			break; - -		case EventType::scroll: -			{ -				if(block_interaction) -				{ -					continue; -				} - -				auto scrollEvent = static_cast<ScrollEvent*>(event.get()); - -				auto widget = window.find(scrollEvent->x, scrollEvent->y); -				if(widget) -				{ -					scrollEvent->x -= widget->translateToWindowX(); -					scrollEvent->y -= widget->translateToWindowY(); - -					widget->scrollEvent(scrollEvent); -				} -			} -			break; - -		case EventType::key: -			{ -				if(block_interaction) -				{ -					continue; -				} - -				// TODO: Filter out multiple arrow events. - -				auto keyEvent = static_cast<KeyEvent*>(event.get()); -				if(window.keyboardFocus()) -				{ -					window.keyboardFocus()->keyEvent(keyEvent); -				} -			} -			break; - -		case EventType::close: -			if(block_interaction) -			{ -				continue; -			} - -			closeNotifier(); -			break; - -		case EventType::mouseEnter: -			{ -				auto enterEvent = static_cast<MouseEnterEvent*>(event.get()); -				auto widget = window.find(enterEvent->x, enterEvent->y); -				if(widget) -				{ -					widget->mouseEnterEvent(); -				} -			} -			break; - -		case EventType::mouseLeave: -			{ -				auto widget = window.mouseFocus(); -				if(widget) -				{ -					widget->mouseLeaveEvent(); -				} -			} -			break; -		} -	} - -	// Probe window and children to redraw as needed. -	// NOTE: This method will invoke native->redraw() if a redraw is needed. -	window.updateBuffer(); -} - -void EventHandler::registerDialog(Dialog* dialog) -{ -	dialogs.push_back(dialog); -} - -void EventHandler::unregisterDialog(Dialog* dialog) -{ -	dialogs.remove(dialog); -} - - -} // GUI:: diff --git a/plugingui/eventhandler.h b/plugingui/eventhandler.h deleted file mode 100644 index 8d6f492..0000000 --- a/plugingui/eventhandler.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            eventhandler.h - * - *  Sun Oct  9 18:58:29 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <notifier.h> -#include <memory> -#include <queue> -#include <list> - -#include "guievent.h" -#include "nativewindow.h" - -namespace GUI -{ - -class Window; -class Dialog; - -class EventHandler -{ -public: -	EventHandler(NativeWindow& nativeWindow, Window& window); - -	//! Process all events currently in the event queue. -	void processEvents(); - -	//! Query if any events are currently in the event queue. -	bool hasEvent(); - -	//! Query if the topmost event in the event queue is of type. -	bool queryNextEventType(EventType type); - -	//! Get a single event from the event queue. -	//! \return A pointer to the event or nullptr if there are none. -	std::shared_ptr<Event> getNextEvent(); - -	void registerDialog(Dialog* dialog); -	void unregisterDialog(Dialog* dialog); - -	Notifier<> closeNotifier; - -private: -	Window& window; -	NativeWindow& nativeWindow; - -	// Used to ignore mouse button release after a double click. -	bool lastWasDoubleClick; - -	EventQueue events; - -	std::list<Dialog*> dialogs; -}; - -} // GUI:: diff --git a/plugingui/filebrowser.cc b/plugingui/filebrowser.cc index 59daab4..9f322c8 100644 --- a/plugingui/filebrowser.cc +++ b/plugingui/filebrowser.cc @@ -26,8 +26,8 @@   */  #include "filebrowser.h" -#include "painter.h" -#include "button.h" +#include <dggui/painter.h> +#include <dggui/button.h>  #include <sys/types.h>  #include <dirent.h> diff --git a/plugingui/filebrowser.h b/plugingui/filebrowser.h index bc7adb3..53a058d 100644 --- a/plugingui/filebrowser.h +++ b/plugingui/filebrowser.h @@ -30,12 +30,12 @@  #include <platform.h>  #include <directory.h> -#include "dialog.h" -#include "button.h" -#include "listbox.h" -#include "lineedit.h" -#include "label.h" -#include "image.h" +#include <dggui/dialog.h> +#include <dggui/button.h> +#include <dggui/listbox.h> +#include <dggui/lineedit.h> +#include <dggui/label.h> +#include <dggui/image.h>  namespace GUI  { diff --git a/plugingui/font.cc b/plugingui/font.cc deleted file mode 100644 index 0500e81..0000000 --- a/plugingui/font.cc +++ /dev/null @@ -1,136 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            font.cc - * - *  Sat Nov 12 11:13:41 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "font.h" - -#include <cassert> - -namespace GUI -{ - -Font::Font(const std::string& fontfile) -	: img_font(fontfile) -{ -	std::size_t px = 0; -	std::size_t c; - -	for(c = 0; c < characters.size() && px < img_font.width(); ++c) -	{ -		auto& character = characters[c]; -		character.offset = px + 1; - -		if(c > 0) -		{ -			assert(character.offset >= characters[c - 1].offset); -			characters[c - 1].width = character.offset - characters[c - 1].offset; -			if(characters[c].offset != characters[c - 1].offset) -			{ -				--characters[c - 1].width; -			} -		} - -		++px; - -		while(px < img_font.width()) -		{ -			auto& pixel = img_font.getPixel(px, 0); - -			// Find next purple pixel in top row: -			if((pixel.red() == 255) && (pixel.green() == 0) && -			   (pixel.blue() == 255) && (pixel.alpha() == 255)) -			{ -				break; -			} - -			++px; -		} - -		characters[c] = character; -	} - -	--c; - -	assert(characters[c].offset >= characters[c - 1].offset); -	characters[c - 1].width = characters[c].offset - characters[c - 1].offset; -	if(characters[c].offset != characters[c - 1].offset) -	{ -		--characters[c - 1].width; -	} -} - -size_t Font::textWidth(const std::string& text) const -{ -	size_t len = 0; - -	for(unsigned char cha : text) -	{ -		auto& character = characters[cha]; -		len += character.width + spacing + character.post_bias; -	} - -	return len; -} - -size_t Font::textHeight(const std::string& text) const -{ -	return img_font.height(); -} - -void Font::setLetterSpacing(int letterSpacing) -{ -	spacing = letterSpacing; -} - -int Font::letterSpacing() const -{ -	return spacing; -} - -PixelBufferAlpha *Font::render(const std::string& text) const -{ -	PixelBufferAlpha *pb = -		new PixelBufferAlpha(textWidth(text), textHeight(text)); - -	int x_offset = 0; -	for(std::size_t i = 0; i < text.length(); ++i) -	{ -		unsigned char cha = text[i]; -		auto& character = characters.at(cha); -		for(size_t x = 0; x < character.width; ++x) -		{ -			for(size_t y = 0; y < img_font.height(); ++y) -			{ -				auto& c = img_font.getPixel(x + character.offset, y); -				pb->setPixel(x + x_offset + character.pre_bias, y, c); -			} -		} -		x_offset += character.width + spacing + character.post_bias; -	} - -	return pb; -} - -} // GUI:: diff --git a/plugingui/font.h b/plugingui/font.h deleted file mode 100644 index 2e3f87a..0000000 --- a/plugingui/font.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            font.h - * - *  Sat Nov 12 11:13:41 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <array> - -#include "pixelbuffer.h" -#include "image.h" - -namespace GUI { - -class Font { -public: -	Font(const std::string& fontfile = ":resources/font.png"); - -	size_t textWidth(const std::string& text) const; -	size_t textHeight(const std::string& text = "") const; - -	void setLetterSpacing(int letterSpacing); -	int letterSpacing() const; - -	PixelBufferAlpha *render(const std::string& text) const; - -private: -	Image img_font; - -	class Character { -	public: -		std::size_t offset{0}; -		std::size_t width{0}; -		int pre_bias{0}; -		int post_bias{0}; -	}; - -	std::array<Character, 256> characters; -	int spacing{1}; -}; - -} // GUI:: diff --git a/plugingui/frame.cc b/plugingui/frame.cc deleted file mode 100644 index d375b6d..0000000 --- a/plugingui/frame.cc +++ /dev/null @@ -1,146 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            frame.cc - * - *  Tue Feb  7 21:07:56 CET 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "frame.h" - -#include "painter.h" - -namespace GUI -{ - -FrameWidget::FrameWidget(Widget* parent, bool has_switch, bool has_help_text) -	: Widget(parent) -	, is_switched_on(!has_switch) -	, bar_height(24) -{ -	if(has_switch) -	{ -		// We only have to set this once as nothing happens on a resize -		power_button.move(4, 4); -		power_button.resize(16, 16); - -		power_button.setChecked(is_switched_on); -		CONNECT(&power_button, stateChangedNotifier, this, -		        &FrameWidget::powerButtonStateChanged); -	} -	power_button.setVisible(has_switch); - -	if(has_help_text) -	{ -		// We only have to set this once as nothing happens on a resize -		help_button.resize(16, 16); -		help_button.move(width() - 4 - 16, 4); -		help_button.setText("?"); -	} -	help_button.setVisible(has_help_text); - -	CONNECT(this, sizeChangeNotifier, this, &FrameWidget::sizeChanged); -} - -void FrameWidget::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	int center_x = width() / 2; -	auto title_buf = title.c_str(); - -	// draw the dark grey box -	p.setColour(enabled ? grey_box_colour : grey_box_colour_disabled); -	p.drawFilledRectangle(1, 1, width() - 2, bar_height); - -	// frame -	p.setColour(frame_colour_top); -	p.drawLine(0, 0, width() - 1, 0); -	p.setColour(frame_colour_bottom); -	p.drawLine(0, height() - 1, width() - 1, height() - 1); -	p.setColour(frame_colour_side); -	p.drawLine(0, 0, 0, height() - 1); -	p.drawLine(width() - 1, 0, width() - 1, height() - 1); - -	// background -	p.setColour(background_colour); -	p.drawFilledRectangle(1, bar_height, width() - 2, height() - 2); - -	// draw the label -	p.setColour(enabled ? label_colour : label_colour_disabled); -	p.drawText(center_x - label_width, bar_height - 4, font, title_buf); -	power_button.setEnabled(enabled); -} - -void FrameWidget::powerButtonStateChanged(bool new_state) -{ -	is_switched_on = new_state; -	onSwitchChangeNotifier(is_switched_on); -} - -void FrameWidget::setTitle(std::string const& title) -{ -	this->title = title; -	label_width = font.textWidth(title.c_str()) / 2 + 1; -} - -void FrameWidget::setHelpText(const std::string& help_text) -{ -	help_button.setHelpText(help_text); -} - -void FrameWidget::setContent(Widget* content) -{ -	this->content = content; -	content->reparent(this); -} - -void FrameWidget::setOnSwitch(bool on) -{ -	is_switched_on = on; -	power_button.setChecked(is_switched_on); -} - -void FrameWidget::setEnabled(bool enabled) -{ -	this->enabled = enabled; -	onEnabledChanged(enabled); - -	redraw(); -} - -void FrameWidget::sizeChanged(int width, int height) -{ -	if(content) -	{ -		content_start_x = content_margin; -		content_start_y = bar_height + content_margin; -		content_width = std::max((int)width - 2 * content_margin, 0); -		content_height = std::max((int)height - (bar_height + 2 * content_margin), 0); - -		content->move(content_start_x, content_start_y); -		content->resize(content_width, content_height); -	} - -	help_button.move(width - 4 - 16, help_button.y()); -} - -} // GUI:: diff --git a/plugingui/frame.h b/plugingui/frame.h deleted file mode 100644 index db26ea9..0000000 --- a/plugingui/frame.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            frame.h - * - *  Tue Feb  7 21:07:56 CET 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <notifier.h> - -#include "font.h" -#include "powerbutton.h" -#include "helpbutton.h" -#include "widget.h" - -namespace GUI -{ - -class FrameWidget -	: public Widget -{ -public: -	FrameWidget(Widget* parent, bool has_switch = false, bool has_help_text = false); -	virtual ~FrameWidget() = default; - -	// From Widget: -	virtual bool isFocusable() override { return false; } -	virtual bool catchMouse() override { return false; } - -	bool isSwitchedOn() { return is_switched_on; } - -	void setTitle(const std::string& title); -	void setHelpText(const std::string& help_text); -	void setContent(Widget* content); - -	void setOnSwitch(bool on); -	void setEnabled(bool enabled); - -	Notifier<bool> onSwitchChangeNotifier; // (bool on) -	Notifier<bool> onEnabledChanged; // (bool enabled) - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; - -	//! Callback for Widget::sizeChangeNotifier -	void sizeChanged(int width, int height); - -	bool enabled = true; - -private: -	// -	// upper bar -	// - -	// label -	Font font; -	std::string title; -	GUI::Colour label_colour{0.1}; -	GUI::Colour label_colour_disabled{0.5}; -	std::size_t label_width; - -	// switch -	bool is_switched_on; -	PowerButton power_button{this}; -	HelpButton help_button{this}; - -	void powerButtonStateChanged(bool clicked); - -	// grey box -	int bar_height; -	GUI::Colour grey_box_colour{0.7}; -	GUI::Colour grey_box_colour_disabled{0.7}; -	GUI::Colour background_colour{0.85, 0.8}; - -	// -	// content -	// - -	// content frame -	GUI::Colour frame_colour_top{0.95}; -	GUI::Colour frame_colour_bottom{0.4}; -	GUI::Colour frame_colour_side{0.6}; - -	// content box -	Widget* content{nullptr}; -	int content_margin{12}; - -	int content_start_x; -	int content_start_y; -	int content_width; -	int content_height; -}; - -} // GUI:: diff --git a/plugingui/guievent.h b/plugingui/guievent.h deleted file mode 100644 index 4ad0798..0000000 --- a/plugingui/guievent.h +++ /dev/null @@ -1,212 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            event.h - * - *  Sun Oct  9 16:11:47 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <list> -#include <memory> - -namespace GUI -{ - -enum class EventType -{ -	mouseMove, -	repaint, -	button, -	scroll, -	key, -	close, -	resize, -	move, -	mouseEnter, -	mouseLeave, -}; - -class Event -{ -public: -	virtual ~Event() {} - -	virtual EventType type() = 0; -}; - -class MouseMoveEvent -	: public Event -{ -public: -	EventType type() { return EventType::mouseMove; } - -	int x; -	int y; -}; - - -enum class Direction -{ -	up, -	down, -}; - -enum class MouseButton -{ -	right, -	middle, -	left, -}; - -class ButtonEvent -	: public Event -{ -public: -	EventType type() { return EventType::button; } - -	int x; -	int y; - -	Direction direction; -	MouseButton button; - -	bool doubleClick; -}; - -class ScrollEvent -	: public Event -{ -public: -	EventType type() { return EventType::scroll; } - -	int x; -	int y; - -	float delta; -}; - -class RepaintEvent -	: public Event -{ -public: -	EventType type() { return EventType::repaint; } - -	int x; -	int y; -	size_t width; -	size_t height; -}; - -enum class Key -{ -	unknown, -	left, -	right, -	up, -	down, -	deleteKey, -	backspace, -	home, -	end, -	pageDown, -	pageUp, -	enter, -	character, //!< The actual character is stored in KeyEvent::text -}; - -class KeyEvent -	: public Event -{ -public: -	EventType type() { return EventType::key; } - -	Direction direction; - -	Key keycode; -	std::string text; -}; - -class CloseEvent -	: public Event -{ -public: -	EventType type() { return EventType::close; } -}; - -class ResizeEvent -	: public Event -{ -public: -	EventType type() { return EventType::resize; } - -	size_t width; -	size_t height; -}; - -class MoveEvent -	: public Event -{ -public: -	EventType type() { return EventType::move; } - -	int x; -	int y; -}; - -class MouseEnterEvent -	: public Event -{ -public: -	EventType type() { return EventType::mouseEnter; } - -	int x; -	int y; -}; - -class MouseLeaveEvent -	: public Event -{ -public: -	EventType type() { return EventType::mouseLeave; } - -	int x; -	int y; -}; - -using EventQueue = std::list<std::shared_ptr<Event>>; - -struct Rect -{ -	std::size_t x1; -	std::size_t y1; -	std::size_t x2; -	std::size_t y2; - -	bool empty() const -	{ -		return x1 == x2 && y1 == y2; -	} -}; - -} // GUI:: diff --git a/plugingui/helpbutton.cc b/plugingui/helpbutton.cc deleted file mode 100644 index fa061a6..0000000 --- a/plugingui/helpbutton.cc +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            helpbutton.cc - * - *  Wed May  8 17:10:08 CEST 2019 - *  Copyright 2019 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "helpbutton.h" - -#include "painter.h" - -#include <iostream> - -namespace GUI -{ - -HelpButton::HelpButton(Widget* parent) -	: ButtonBase(parent) -	, tip(this) -{ -	CONNECT(this, clickNotifier, this, &HelpButton::showHelpText); -	tip.hide(); -} - -void HelpButton::setHelpText(const std::string& help_text) -{ -	tip.setText(help_text); -} - -void HelpButton::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	bool state = true; - -	// enabled and on -	if(state) -	{ -		if(button_state == ButtonBase::State::Down) -		{ -			p.drawImage(0, 0, pushed); -		} -		else -		{ -			p.drawImage(0, 0, normal); -		} -		return; -	} -} - -void HelpButton::showHelpText() -{ -	tip.show(); -} - -} // GUI:: diff --git a/plugingui/helpbutton.h b/plugingui/helpbutton.h deleted file mode 100644 index 6e97eca..0000000 --- a/plugingui/helpbutton.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            helpbutton.h - * - *  Wed May  8 17:10:08 CEST 2019 - *  Copyright 2019 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "texture.h" -#include "button_base.h" -#include "tooltip.h" - -namespace GUI -{ - -class HelpButton -	: public ButtonBase -{ -public: -	HelpButton(Widget* parent); -	virtual ~HelpButton() = default; - -	void setHelpText(const std::string& help_text); - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; - -private: -	void showHelpText(); - -	Texture normal{getImageCache(), ":resources/help_button.png", 0, 0, 16, 16}; -	Texture pushed{getImageCache(), ":resources/help_button.png", 16, 0, 16, 16}; - -	Tooltip tip; -}; - -} // GUI:: diff --git a/plugingui/humaniservisualiser.cc b/plugingui/humaniservisualiser.cc index 92da164..2a17197 100644 --- a/plugingui/humaniservisualiser.cc +++ b/plugingui/humaniservisualiser.cc @@ -26,7 +26,7 @@   */  #include "humaniservisualiser.h" -#include "painter.h" +#include <dggui/painter.h>  #include <notifier.h>  #include <settings.h> diff --git a/plugingui/humaniservisualiser.h b/plugingui/humaniservisualiser.h index 55e37d2..41179fa 100644 --- a/plugingui/humaniservisualiser.h +++ b/plugingui/humaniservisualiser.h @@ -26,9 +26,9 @@   */  #pragma once -#include "widget.h" -#include "texturedbox.h" -#include "texture.h" +#include <dggui/widget.h> +#include <dggui/texturedbox.h> +#include <dggui/texture.h>  struct Settings;  class SettingsNotifier; diff --git a/plugingui/humanizerframecontent.cc b/plugingui/humanizerframecontent.cc index 475f16d..a4f71e5 100644 --- a/plugingui/humanizerframecontent.cc +++ b/plugingui/humanizerframecontent.cc @@ -28,7 +28,7 @@  #include <settings.h> -#include "painter.h" +#include <dggui/painter.h>  namespace GUI  { diff --git a/plugingui/humanizerframecontent.h b/plugingui/humanizerframecontent.h index 10ae0f3..ef60b8e 100644 --- a/plugingui/humanizerframecontent.h +++ b/plugingui/humanizerframecontent.h @@ -26,10 +26,11 @@   */  #pragma once -#include "knob.h" +#include <dggui/knob.h> +#include <dggui/layout.h> +#include <dggui/widget.h> +  #include "labeledcontrol.h" -#include "layout.h" -#include "widget.h"  #include <translation.h> diff --git a/plugingui/image.cc b/plugingui/image.cc deleted file mode 100644 index 118203e..0000000 --- a/plugingui/image.cc +++ /dev/null @@ -1,216 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            image.cc - * - *  Sat Mar 16 15:05:09 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "image.h" - -#include <cstring> -#include <cstdint> -#include <cstdlib> -#include <cassert> - -#include <hugin.hpp> - -#include "resource.h" -#include "lodepng/lodepng.h" - -namespace GUI -{ - -Image::Image(const char* data, size_t size) -{ -	load(data, size); -} - -Image::Image(const std::string& filename) -	: filename(filename) -{ -	Resource rc(filename); -	if(!rc.valid()) -	{ -		setError(); -		return; -	} -	load(rc.data(), rc.size()); -} - -Image::Image(Image&& other) -	: _width(other._width) -	, _height(other._height) -	, image_data(std::move(other.image_data)) -	, image_data_raw(std::move(other.image_data_raw)) -	, filename(other.filename) -{ -	other._width = 0; -	other._height = 0; -} - -Image::~Image() -{ -} - -Image& Image::operator=(Image&& other) -{ -	image_data.clear(); -	image_data = std::move(other.image_data); -	image_data_raw.clear(); -	image_data_raw = std::move(other.image_data_raw); -	_width = other._width; -	_height = other._height; -	valid = other.valid; - -	other._width = 0; -	other._height = 0; -	other.valid = false; -	return *this; -} - -void Image::setError() -{ -	valid = false; -	Resource rc(":resources/png_error"); -	if(!rc.valid()) -	{ -		_width = _height = 0u; -		return; -	} - -	const unsigned char* ptr = (const unsigned char*)rc.data(); - -	std::uint32_t iw, ih; - -	iw = (uint32_t) ptr[0] | -	     (uint32_t) ptr[1] << 8 | -	     (uint32_t) ptr[2] << 16 | -	     (uint32_t) ptr[3] << 24; -	ptr += sizeof(uint32_t); - -	ih = (uint32_t) ptr[0] | -	     (uint32_t) ptr[1] << 8 | -	     (uint32_t) ptr[2] << 16 | -	     (uint32_t) ptr[3] << 24; -	ptr += sizeof(uint32_t); - -	_width = iw; -	_height = ih; - -	image_data.clear(); -	image_data.reserve(_width * _height); - -	image_data_raw.clear(); -	image_data_raw.reserve(_width * _height * 4); -	memcpy(image_data_raw.data(), ptr, _height * _width); - -	for(std::size_t y = 0; y < _height; ++y) -	{ -		for(std::size_t x = 0; x < _width; ++x) -		{ -			image_data.emplace_back(Colour{ptr[0] / 255.0f, ptr[1] / 255.0f, -						ptr[2] / 255.0f, ptr[3] / 255.0f}); -		} -	} - -	assert(image_data.size() == (_width * _height)); -} - -void Image::load(const char* data, size_t size) -{ -	has_alpha = false; -	unsigned int iw{0}, ih{0}; -	std::uint8_t* char_image_data{nullptr}; -	unsigned int res = lodepng_decode32((std::uint8_t**)&char_image_data, -	                                    &iw, &ih, -	                                    (const std::uint8_t*)data, size); - -	if(res != 0) -	{ -		ERR(image, "Error in lodepng_decode32: %d while loading '%s'", -		    res, filename.c_str()); -		setError(); -		return; -	} - -	_width = iw; -	_height = ih; - -	image_data.clear(); -	image_data.reserve(_width * _height); - -	image_data_raw.clear(); -	image_data_raw.reserve(_width * _height * 4); -	memcpy(image_data_raw.data(), char_image_data, _height * _width * 4); - -	for(std::size_t y = 0; y < _height; ++y) -	{ -		for(std::size_t x = 0; x < _width; ++x) -		{ -			std::uint8_t* ptr = &char_image_data[(x + y * _width) * 4]; -			image_data.emplace_back(Colour{ptr[0], ptr[1], ptr[2], ptr[3]}); -			has_alpha |= ptr[3] != 0xff; -		} -	} - -	assert(image_data.size() == (_width * _height)); - -	std::free(char_image_data); -	valid = true; -} - -size_t Image::width() const -{ -	return _width; -} - -size_t Image::height() const -{ -	return _height; -} - -const Colour& Image::getPixel(size_t x, size_t y) const -{ -	if(x > _width || y > _height) -	{ -		return out_of_range; -	} - -	return image_data[x + y * _width]; -} - -const std::uint8_t* Image::line(std::size_t y, std::size_t x_offset) const -{ -	return image_data_raw.data() + y * _width * 4 + x_offset * 4; -} - -bool Image::hasAlpha() const -{ -	return has_alpha; -} - -bool Image::isValid() const -{ -	return valid; -} - -} // GUI:: diff --git a/plugingui/image.h b/plugingui/image.h deleted file mode 100644 index d162a75..0000000 --- a/plugingui/image.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            image.h - * - *  Sat Mar 16 15:05:08 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <vector> - -#include "drawable.h" -#include "colour.h" -#include "resource.h" - -namespace GUI { - -class Image -	: public Drawable -{ -public: -	Image(const char* data, size_t size); -	Image(const std::string& filename); -	Image(Image&& other); -	virtual ~Image(); - -	Image& operator=(Image&& other); - -	size_t width() const override; -	size_t height() const override; - -	const Colour& getPixel(size_t x, size_t y) const override; -	const std::uint8_t* line(std::size_t y, -	                         std::size_t x_offset = 0) const override; - -	bool hasAlpha() const override; - -	bool isValid() const; - -protected: -	void setError(); -	bool valid{false}; - -	void load(const char* data, size_t size); - -	std::size_t _width{0}; -	std::size_t _height{0}; -	std::vector<Colour> image_data; -	std::vector<std::uint8_t> image_data_raw; -	Colour out_of_range{0.0f, 0.0f, 0.0f, 0.0f}; -	std::string filename; -	bool has_alpha{false}; -}; - -} // GUI:: diff --git a/plugingui/imagecache.cc b/plugingui/imagecache.cc deleted file mode 100644 index d3130fe..0000000 --- a/plugingui/imagecache.cc +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            imagecache.cc - * - *  Thu Jun  2 17:12:05 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "imagecache.h" - -#include <cassert> - -#include "image.h" - -namespace GUI -{ - -ScopedImageBorrower::ScopedImageBorrower(ImageCache& imageCache, -                                         const std::string& filename) -	: imageCache(imageCache) -	, filename(filename) -	, image(imageCache.borrow(filename)) -{ -} - -ScopedImageBorrower::ScopedImageBorrower(ScopedImageBorrower&& other) -	: imageCache(other.imageCache) -	, filename(other.filename) -	, image(other.image) -{ -	other.filename.clear(); -} - -ScopedImageBorrower::~ScopedImageBorrower() -{ -	if(!filename.empty()) -	{ -		imageCache.giveBack(filename); -	} -} - -Image& ScopedImageBorrower::operator*() -{ -	return image; -} - -Image& ScopedImageBorrower::operator()() -{ -	return image; -} - -ScopedImageBorrower ImageCache::getImage(const std::string& filename) -{ -	return ScopedImageBorrower(*this, filename); -} - -Image& ImageCache::borrow(const std::string& filename) -{ -	auto cacheIterator = imageCache.find(filename); -	if(cacheIterator == imageCache.end()) -	{ -		Image image(filename); -		auto insertValue = -			imageCache.emplace(filename, std::make_pair(0, std::move(image))); -		cacheIterator = insertValue.first; -	} - -	auto& cacheEntry = cacheIterator->second; -	++cacheEntry.first; -	return cacheEntry.second; -} - -void ImageCache::giveBack(const std::string& filename) -{ -	auto cacheIterator = imageCache.find(filename); -	assert(cacheIterator != imageCache.end()); -	auto& cacheEntry = cacheIterator->second; -	--cacheEntry.first; -	if(cacheEntry.first == 0) -	{ -		imageCache.erase(cacheIterator); -	} -} - -} // GUI:: diff --git a/plugingui/imagecache.h b/plugingui/imagecache.h deleted file mode 100644 index d31a844..0000000 --- a/plugingui/imagecache.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            imagecache.h - * - *  Thu Jun  2 17:12:05 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <map> -#include <utility> - -namespace GUI -{ - -class Image; -class ImageCache; - -class ScopedImageBorrower -{ -public: -	ScopedImageBorrower(ImageCache& imageCache, const std::string& filename); -	ScopedImageBorrower(ScopedImageBorrower&& other); -	virtual ~ScopedImageBorrower(); - -	ScopedImageBorrower& operator=(ScopedImageBorrower&& other); - -	Image& operator*(); -	Image& operator()(); - -protected: -	ImageCache& imageCache; -	std::string filename; -	Image& image; -}; - -class ImageCache -{ -public: -	ScopedImageBorrower getImage(const std::string& filename); - -private: -	friend class ScopedImageBorrower; - -	Image& borrow(const std::string& filename); -	void giveBack(const std::string& filename); - -protected: -	std::map<std::string, std::pair<std::size_t, Image>> imageCache; -}; - -} // GUI:: diff --git a/plugingui/knob.cc b/plugingui/knob.cc deleted file mode 100644 index 25200a7..0000000 --- a/plugingui/knob.cc +++ /dev/null @@ -1,255 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            knob.cc - * - *  Thu Feb 28 07:37:27 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "knob.h" - -#include "painter.h" - -#include <hugin.hpp> -#include <cmath> - -namespace -{ -const double pi = std::atan(1.0) * 4.0; -} - -namespace GUI -{ - -Knob::Knob(Widget *parent) -	: Widget(parent) -	, img_knob(getImageCache(), ":resources/knob.png") -{ -	state = up; - -	maximum = 1.0; -	minimum = 0.0; - -	current_value = 0.0; - -	mouse_offset_x = 0; -} - -void Knob::setValue(float value) -{ -	value -= minimum; -	value /= (maximum - minimum); -	internalSetValue(value); -} - -void Knob::setDefaultValue(float value) -{ -	default_value = value; -} - -void Knob::setRange(float minimum, float maximum) -{ -	this->minimum = minimum; -	this->maximum = maximum; -	internalSetValue(current_value); -} - -float Knob::value() -{ -	return current_value * (maximum - minimum) + minimum; -} - -void Knob::showValue(bool show_value) -{ -	this->show_value = show_value; -} - -void Knob::scrollEvent(ScrollEvent* scrollEvent) -{ -	float value = (current_value - (scrollEvent->delta / 200.0)); -	internalSetValue(value); -} - -void Knob::mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) -{ -	if(state == down) -	{ -		if(mouse_offset_x == (mouseMoveEvent->x + (-1 * mouseMoveEvent->y))) -		{ -			return; -		} - -		float dval = -			mouse_offset_x - (mouseMoveEvent->x + (-1 * mouseMoveEvent->y)); -		float value = current_value - (dval / 300.0); - -		internalSetValue(value); - -		mouse_offset_x = mouseMoveEvent->x + (-1 * mouseMoveEvent->y); -	} -} - -void Knob::keyEvent(KeyEvent* keyEvent) -{ -	if(keyEvent->direction != Direction::up) -	{ -		return; -	} - -	float value = current_value; -	switch(keyEvent->keycode) { -	case Key::up: -		value += 0.01; -		break; -	case Key::down: -		value -= 0.01; -		break; -	case Key::right: -		value += 0.01; -		break; -	case Key::left: -		value -= 0.01; -		break; -	case Key::home: -		value = 0; -		break; -	case Key::end: -		value = 1; -		break; -	default: -		break; -	} - -	internalSetValue(value); -} - -void Knob::buttonEvent(ButtonEvent* buttonEvent) -{ -	// Ignore everything except left clicks. -	if(buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if(buttonEvent->doubleClick) -	{ -		float value = default_value; -		value -= minimum; -		value /= (maximum - minimum); -		internalSetValue(value); -		return; -	} - -	if(buttonEvent->direction == Direction::down) -	{ -		state = down; -		mouse_offset_x = buttonEvent->x + (-1 * buttonEvent->y); -		return; -	} - -	if(buttonEvent->direction == Direction::up) -	{ -		state = up; -		mouse_offset_x = buttonEvent->x + (-1 * buttonEvent->y); -		clicked(); -		return; -	} -} - -void Knob::repaintEvent(RepaintEvent* repaintEvent) -{ -	int diameter = (width()>height()?height():width()); -	int radius = diameter / 2; -	int center_x = width() / 2; -	int center_y = height() / 2; - -	Painter p(*this); -	p.clear(); - -	p.drawImageStretched(0, 0, img_knob, diameter, diameter); - -	float range = maximum - minimum; - -	if (show_value) { -		// Show 0, 1 or 2 decimal point depending on the size of the range -		char buf[64]; -		if(range> 100.0f) -		{ -			sprintf(buf, "%.0f", current_value * range + minimum); -		} -		else if(range > 10.0f) -		{ -			sprintf(buf, "%.1f", current_value * range + minimum); -		} -		else -		{ -			sprintf(buf, "%.2f", current_value * range + minimum); -		} -		p.drawText(center_x - font.textWidth(buf) / 2 + 1, -				   center_y + font.textHeight(buf) / 2 + 1, font, buf); -	} - -	// Make it start from 20% and stop at 80% -	double padval = current_value * 0.8 + 0.1; - -	double from_x = sin((-1 * padval + 1) * 2 * pi) * radius * 0.6; -	double from_y = cos((-1 * padval + 1) * 2 * pi) * radius * 0.6; - -	double to_x = sin((-1 * padval + 1) * 2 * pi) * radius * 0.8; -	double to_y = cos((-1 * padval + 1) * 2 * pi) * radius * 0.8; - -	// Draw "fat" line by drawing 9 lines with moved start/ending points. -	p.setColour(Colour(1.0f, 0.0f, 0.0f, 1.0f)); -	for(int _x = -1; _x < 2; _x++) -	{ -		for(int _y = -1; _y < 2; _y++) -		{ -			p.drawLine(from_x + center_x + _x, -			           from_y + center_y + _y, -			           to_x + center_x + _x, -			           to_y + center_y + _y); -		} -	} -} - -void Knob::internalSetValue(float new_value) -{ -	if(new_value < 0.0) -	{ -	  new_value = 0.0; -	} - -	if(new_value > 1.0) -	{ -		new_value = 1.0; -	} - -	if(new_value == current_value) -	{ -		return; -	} - -	current_value = new_value; -	valueChangedNotifier(value()); -	redraw(); -} - -} // GUI:: diff --git a/plugingui/knob.h b/plugingui/knob.h deleted file mode 100644 index fc71511..0000000 --- a/plugingui/knob.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            knob.h - * - *  Thu Feb 28 07:37:27 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <notifier.h> - -#include "widget.h" -#include "texture.h" -#include "font.h" - -namespace GUI { - -class Knob : public Widget { -public: -	Knob(Widget *parent); -	virtual ~Knob() = default; - -	// From Widget: -	bool catchMouse() override { return true; } -	bool isFocusable() override { return true; } - -	void setValue(float value); -	void setDefaultValue(float value); -	void setRange(float minimum, float maximum); -	float value(); -	void showValue(bool show_value); - -	Notifier<float> valueChangedNotifier; // (float newValue) - -protected: -	virtual void clicked() {} - -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; -	virtual void buttonEvent(ButtonEvent* buttonEvent) override; -	virtual void mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) override; -	virtual void scrollEvent(ScrollEvent* scrollEvent) override; -	virtual void keyEvent(KeyEvent* keyEvent) override; - -private: -	//! Sets the internal value and sends out the changed notification. -	void internalSetValue(float value); - -	typedef enum { -		up, -		down -	} state_t; - -	state_t state; - -	float current_value; -	float default_value = 0.0; -	float maximum; -	float minimum; - -	bool show_value{true}; - -	Texture img_knob; - -	int mouse_offset_x; -	Font font; -}; - -} // GUI:: diff --git a/plugingui/label.cc b/plugingui/label.cc deleted file mode 100644 index b5239ec..0000000 --- a/plugingui/label.cc +++ /dev/null @@ -1,96 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            label.cc - * - *  Sun Oct  9 13:02:18 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "label.h" - -#include "painter.h" -#include "guievent.h" - -#include <cpp11fix.h> - -namespace GUI { - -Label::Label(Widget *parent) -	: Widget(parent) -{ -} - -void Label::setText(const std::string& text) -{ -	_text = text; -	redraw(); -} - -void Label::setAlignment(TextAlignment alignment) -{ -	this->alignment = alignment; -} - -void Label::setColour(Colour colour) -{ -	this->colour = std::make_unique<Colour>(colour); -	redraw(); -} - -void Label::resetColour() -{ -	colour.release(); -	redraw(); -} - -void Label::resizeToText() -{ -	resize(font.textWidth(_text) + border, font.textHeight()); -} - -void Label::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); -	p.clear(); - -	int offset = 0; -	switch(alignment) { -	case TextAlignment::left: -		offset = border; -		break; -	case TextAlignment::center: -		offset = (width() - font.textWidth(_text)) / 2; -		break; -	case TextAlignment::right: -		offset = width() - font.textWidth(_text) - border; -		break; -	} - -	if (colour) { -		p.setColour(*colour); -		p.drawText(offset, (height() + font.textHeight()) / 2, font, _text); -	} -	else { -		p.drawText(offset, (height() + font.textHeight()) / 2, font, _text, true); -	} -} - -} // GUI:: diff --git a/plugingui/label.h b/plugingui/label.h deleted file mode 100644 index 45b4176..0000000 --- a/plugingui/label.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            label.h - * - *  Sun Oct  9 13:02:17 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "widget.h" - -#include "font.h" - -#include <string> -#include <memory> - -namespace GUI { - -enum class TextAlignment { -	left, -	center, -	right, -}; - -class Label : public Widget { -public: -	Label(Widget *parent); -	virtual ~Label() = default; - -	void setText(const std::string& text); -	void setAlignment(TextAlignment alignment); -	void setColour(Colour colour); -	void resetColour(); -	void resizeToText(); - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; - -private: -	std::string _text; -	Font font{":resources/fontemboss.png"}; -	TextAlignment alignment{TextAlignment::left}; -	int border{0}; - -	// optional colour -	std::unique_ptr<Colour> colour; -}; - -} // GUI:: diff --git a/plugingui/labeledcontrol.h b/plugingui/labeledcontrol.h index 3cbae39..1972072 100644 --- a/plugingui/labeledcontrol.h +++ b/plugingui/labeledcontrol.h @@ -26,8 +26,8 @@   */  #pragma once -#include "label.h" -#include "widget.h" +#include <dggui/label.h> +#include <dggui/widget.h>  #include <iomanip>  #include <sstream> diff --git a/plugingui/layout.cc b/plugingui/layout.cc deleted file mode 100644 index 61e4f77..0000000 --- a/plugingui/layout.cc +++ /dev/null @@ -1,386 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            layout.cc - * - *  Sat Mar 21 15:12:36 CET 2015 - *  Copyright 2015 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "layout.h" - -#include "widget.h" - -#include <algorithm> - -namespace GUI -{ - -LayoutItem::LayoutItem() -	: parent(nullptr) -{ -} - -LayoutItem::~LayoutItem() -{ -	setLayoutParent(nullptr); // Will disconnect from layout if any. -} - -void LayoutItem::setLayoutParent(Layout* p) -{ -	if(this->parent) -	{ -		this->parent->removeItem(this); -	} - -	this->parent = p; -} - -Layout::Layout(LayoutItem* parent) : parent(parent) -{ -	auto widget = dynamic_cast<Widget*>(parent); -	if(widget) -	{ -		CONNECT(widget, sizeChangeNotifier, this, &Layout::sizeChanged); -	} -} - -void Layout::addItem(LayoutItem* item) -{ -	items.push_back(item); -	item->setLayoutParent(this); -	layout(); -} - -void Layout::removeItem(LayoutItem* item) -{ -	auto new_end = std::remove(items.begin(), items.end(), item); -	items.erase(new_end, items.end()); - -	layout(); -} - -void Layout::sizeChanged(int width, int height) -{ -	layout(); -} - -// -// BoxLayout -// - -BoxLayout::BoxLayout(LayoutItem* parent) : Layout(parent) -{ -} - -void BoxLayout::setResizeChildren(bool resizeChildren) -{ -	this->resizeChildren = resizeChildren; -	layout(); -} - -void BoxLayout::setSpacing(size_t spacing) -{ -	this->spacing = spacing; -	layout(); -} - -// -// VBoxLayout -// - -VBoxLayout::VBoxLayout(LayoutItem* parent) -	: BoxLayout(parent) -	, align(HAlignment::center) -{ -} - -void VBoxLayout::layout() -{ -	size_t y = 0; -	size_t w = parent->width(); -	// size_t h = parent->height() / items.size(); - -	LayoutItemList::iterator i = items.begin(); -	while(i != items.end()) -	{ -		LayoutItem* item = *i; - -		if(resizeChildren) -		{ -			auto num_items = items.size(); -			auto empty_space = (num_items - 1) * spacing; -			auto available_space = parent->height(); - -			if(available_space >= empty_space) -			{ -				auto item_height = (available_space - empty_space) / num_items; -				item->resize(w, item_height); -			} -			else -			{ -				// TODO: Should this case be handled differently? -				item->resize(w, 0); -			} -		} - -		size_t x = 0; -		switch(align) -		{ -		case HAlignment::left: -			x = 0; -			break; -		case HAlignment::center: -			x = (w / 2) - (item->width() / 2); -			break; -		case HAlignment::right: -			x = w - item->width(); -			break; -		} - -		item->move(x, y); -		y += item->height() + spacing; -		++i; -	} -} - -void VBoxLayout::setHAlignment(HAlignment alignment) -{ -	align = alignment; -} - -// -// HBoxLayout -// - -HBoxLayout::HBoxLayout(LayoutItem* parent) -	: BoxLayout(parent) -	, align(VAlignment::center) -{ -} - -void HBoxLayout::layout() -{ -	if(items.empty()) -	{ -		return; -	} - -	//	size_t w = parent->width() / items.size(); -	size_t h = parent->height(); -	size_t x = 0; - -	LayoutItemList::iterator i = items.begin(); -	while(i != items.end()) -	{ -		LayoutItem* item = *i; -		if(resizeChildren) -		{ -			auto num_items = items.size(); -			auto empty_space = (num_items - 1) * spacing; -			auto available_space = parent->width(); - -			if(available_space >= empty_space) -			{ -				auto item_width = (available_space - empty_space) / num_items; -				item->resize(item_width, h); -			} -			else -			{ -				// TODO: Should this case be handled differently? -				item->resize(0, h); -			} - -			item->move(x, 0); -		} -		else -		{ -			size_t y = 0; -			switch(align) -			{ -			case VAlignment::top: -				y = 0; -				break; -			case VAlignment::center: -				y = (h / 2) - (item->height() / 2); -				break; -			case VAlignment::bottom: -				y = h - item->height(); -				break; -			} - -			int diff = 0; // w - item->width(); -			item->move(x + diff / 2, y); -		} -		x += item->width() + spacing; -		++i; -	} -} - -void HBoxLayout::setVAlignment(VAlignment alignment) -{ -	align = alignment; -} - -// -// GridLayout -// - -GridLayout::GridLayout(LayoutItem* parent, std::size_t number_of_columns, -                       std::size_t number_of_rows) -	: BoxLayout(parent) -	, number_of_columns(number_of_columns) -	, number_of_rows(number_of_rows) -{ -} - -void GridLayout::removeItem(LayoutItem* item) -{ -	// manually remove from grid_ranges as remove_if doesn't work on an -	// unordered_map. -	auto it = grid_ranges.begin(); -	while(it != grid_ranges.end()) -	{ -		if(it->first == item) -		{ -			it = grid_ranges.erase(it); -		} -		else -		{ -			++it; -		} -	} - -	Layout::removeItem(item); -} - -void GridLayout::layout() -{ -	if(grid_ranges.empty()) -	{ -		return; -	} - -	// Calculate cell sizes -	auto cell_size = calculateCellSize(); - -	for(auto const& pair : grid_ranges) -	{ -		auto& item = *pair.first; -		auto const& range = pair.second; - -		moveAndResize(item, range, cell_size); -	} -} - -void GridLayout::setPosition(LayoutItem* item, GridRange const& range) -{ -	grid_ranges[item] = range; -} - -int GridLayout::lastUsedRow(int column) const -{ -	int last_row = -1; - -	for (auto const& grid_range : grid_ranges) -	{ -		auto const& range = grid_range.second; -		if (column >= range.column_begin && column < range.column_end) -		{ -			last_row = std::max(last_row, range.row_end - 1); -		} -	} - -	return last_row; -} - -int GridLayout::lastUsedColumn(int row) const -{ -	int last_column = -1; - -	for (auto const& grid_range : grid_ranges) -	{ -		auto const& range = grid_range.second; -		if (row >= range.row_begin && row < range.row_end) -		{ -			last_column = std::max(last_column, range.column_end - 1); -		} -	} - -	return last_column; - -} - -auto GridLayout::calculateCellSize() const -> CellSize -{ -	auto empty_width = (number_of_columns - 1) * spacing; -	auto available_width = parent->width(); -	auto empty_height = (number_of_rows - 1) * spacing; -	auto available_height = parent->height(); - -	CellSize cell_size; -	if(available_width > empty_width && available_height > empty_height) -	{ -		cell_size.width = (available_width - empty_width) / number_of_columns; -		cell_size.height = (available_height - empty_height) / number_of_rows; -	} -	else -	{ -		cell_size.width = 0; -		cell_size.height = 0; -	} - -	return cell_size; -} - -void GridLayout::moveAndResize( -	LayoutItem& item, GridRange const& range, CellSize cell_size) const -{ -	std::size_t x = range.column_begin * (cell_size.width + spacing); -	std::size_t y = range.row_begin * (cell_size.height + spacing); - -	std::size_t column_count = (range.column_end - range.column_begin); -	std::size_t row_count = (range.row_end - range.row_begin); -	std::size_t width = column_count * (cell_size.width + spacing) - spacing; -	std::size_t height = row_count * (cell_size.height + spacing) - spacing; - -	if(resizeChildren) -	{ -		item.move(x, y); - -		if(cell_size.width * cell_size.height != 0) -		{ -			item.resize(width, height); -		} -		else -		{ -			item.resize(0, 0); -		} -	} -	else -	{ -		auto x_new = (item.width() > width) ? x : x + (width - item.width()) / 2; -		auto y_new = (item.height() > height) ? y : y + (height - item.height()) / 2; - -		item.move(x_new, y_new); -	} -} - -} // GUI:: diff --git a/plugingui/layout.h b/plugingui/layout.h deleted file mode 100644 index 210c86e..0000000 --- a/plugingui/layout.h +++ /dev/null @@ -1,195 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            layout.h - * - *  Sat Mar 21 15:12:36 CET 2015 - *  Copyright 2015 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <cstdlib> -#include <list> -#include <unordered_map> - -#include <notifier.h> - -namespace GUI -{ - -class Layout; - -class LayoutItem -{ -public: -	LayoutItem(); -	virtual ~LayoutItem(); - -	void setLayoutParent(Layout* parent); - -	virtual void resize(std::size_t width, std::size_t height) = 0; -	virtual void move(int x, int y) = 0; -	virtual int x() const = 0; -	virtual int y() const = 0; -	virtual std::size_t width() const = 0; -	virtual std::size_t height() const = 0; - -private: -	Layout* parent; -}; - -//! \brief Abtract Layout class. -class Layout : public Listener -{ -public: -	Layout(LayoutItem* parent); -	virtual ~Layout() -	{ -	} - -	virtual void addItem(LayoutItem* item); -	virtual void removeItem(LayoutItem* item); - -	//! \brief Reimplement this method to create a new Layout rule. -	virtual void layout() = 0; - -protected: -	void sizeChanged(int width, int height); - -	LayoutItem* parent; -	typedef std::list<LayoutItem*> LayoutItemList; -	LayoutItemList items; -}; - -//! \brief Abstract box layout -class BoxLayout : public Layout -{ -public: -	BoxLayout(LayoutItem* parent); - -	//! \brief Set to false to only move the items, not scale them. -	void setResizeChildren(bool resize_children); - -	void setSpacing(size_t spacing); - -	// From Layout: -	virtual void layout() override = 0; - -protected: -	bool resizeChildren{false}; -	size_t spacing{0}; -}; - -enum class HAlignment -{ -	left, -	center, -	right, -}; - -//! \brief A Layout that lays out its elements vertically. -class VBoxLayout : public BoxLayout -{ -public: -	VBoxLayout(LayoutItem* parent); - -	void setHAlignment(HAlignment alignment); - -	// From BoxLayout: -	virtual void layout() override; - -protected: -	HAlignment align; -}; - -enum class VAlignment -{ -	top, -	center, -	bottom, -}; - -//! \brief A Layout that lays out its elements vertically. -class HBoxLayout : public BoxLayout -{ -public: -	HBoxLayout(LayoutItem* parent); - -	void setVAlignment(VAlignment alignment); - -	// From BoxLayout: -	virtual void layout() override; - -protected: -	VAlignment align; -}; - -//! \brief A Layout class which places the items in a regular grid. An item can -//! span multiple rows/columns. -class GridLayout : public BoxLayout -{ -public: -	// The range is open, i.e. end is one past the last one. -	struct GridRange -	{ -		int column_begin; -		int column_end; -		int row_begin; -		int row_end; -	}; - -	GridLayout(LayoutItem* parent, std::size_t number_of_columns, -	    std::size_t number_of_rows); - -	virtual ~GridLayout() -	{ -	} - -	// From Layout: -	virtual void removeItem(LayoutItem* item); -	virtual void layout(); - -	void setPosition(LayoutItem* item, GridRange const& range); - -	int lastUsedRow(int column) const; -	int lastUsedColumn(int row) const; - -protected: -	std::size_t number_of_columns; -	std::size_t number_of_rows; - -	// Note: Yes, this is somewhat redundant to the LayoutItemList of the Layout -	// class. However, this was the best idea I had such that I could still -	// derive from Layout. If you find this ugly, feel free to fix it. -	std::unordered_map<LayoutItem*, GridRange> grid_ranges; - -private: -	struct CellSize { -		std::size_t width; -		std::size_t height; -	}; - -	CellSize calculateCellSize() const; -	void moveAndResize( -	    LayoutItem& item, GridRange const& range, CellSize cell_size) const; -}; - -} // GUI:: diff --git a/plugingui/led.cc b/plugingui/led.cc deleted file mode 100644 index f77e31a..0000000 --- a/plugingui/led.cc +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            led.cc - * - *  Sat Oct 15 19:12:33 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "led.h" - -#include "painter.h" - -namespace GUI { - -LED::LED(Widget *parent) -	: Widget(parent) -	, state(Off) -{ -} - -void LED::setState(state_t state) -{ -	if(this->state != state) -	{ -		this->state = state; -		redraw(); -	} -} - -void LED::repaintEvent(RepaintEvent* repaintEvent) -{ -	size_t h = height() - 1; -	size_t w = width() - 1; - -	Painter p(*this); -	float alpha = 0.9; -	switch(state) { -	case Red: -		p.setColour(Colour(1, 0, 0,alpha)); -		break; -	case Green: -		p.setColour(Colour(0, 1, 0, alpha)); -		break; -	case Blue: -		p.setColour(Colour(0, 0, 1, alpha)); -		break; -	case Off: -		p.setColour(Colour(0.2, 0.2, 0.2, alpha)); -		break; -	} - -	size_t size = w / 2; -	if((h / 2) < size) -	{ -		size = h / 2; -	} -	p.drawFilledCircle(w / 2, h / 2, size); - -	switch(state) { -	case Red: -		p.setColour(Colour(0.4, 0, 0, alpha)); -		break; -	case Green: -		p.setColour(Colour(0, 0.4, 0, alpha)); -		break; -	case Blue: -		p.setColour(Colour(0, 0, 0.4, alpha)); -		break; -	case Off: -		p.setColour(Colour(0.1, 0.1, 0.1, alpha)); -		break; -	} -	p.drawCircle(w / 2, h / 2, size); - -	p.setColour(Colour(1, alpha)); -	p.drawFilledCircle(w / 3, h / 3, size / 6); -} - -} // GUI:: diff --git a/plugingui/led.h b/plugingui/led.h deleted file mode 100644 index 14ab6ef..0000000 --- a/plugingui/led.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            led.h - * - *  Sat Oct 15 19:12:33 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "widget.h" - -namespace GUI { - -class LED : public Widget { -public: -	typedef enum { -		Red, -		Green, -		Blue, -		Off -	} state_t; - -	LED(Widget *parent); - -	void setState(state_t state); - -protected: -	// From Widget: -	void repaintEvent(RepaintEvent* repaintEvent) override; - -private: -	state_t state; -}; - -} // GUI:: diff --git a/plugingui/lineedit.cc b/plugingui/lineedit.cc deleted file mode 100644 index 14cc234..0000000 --- a/plugingui/lineedit.cc +++ /dev/null @@ -1,285 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            lineedit.cc - * - *  Sun Oct  9 13:01:52 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "lineedit.h" - -#include <stdio.h> -#include <hugin.hpp> - -#define BORDER 10 - -namespace GUI { - -LineEdit::LineEdit(Widget *parent) -	: Widget(parent) -{ -	setReadOnly(false); -} - -LineEdit::~LineEdit() -{ -} - -void LineEdit::setReadOnly(bool ro) -{ -	readonly = ro; -} - -bool LineEdit::readOnly() -{ -	return readonly; -} - -void LineEdit::setText(const std::string& text) -{ -	_text = text; -	pos = text.size(); - -	visibleText = _text; -	offsetPos = 0; - -	redraw(); -	textChanged(); -} - -std::string LineEdit::getText() -{ -	return _text; -} - -void LineEdit::buttonEvent(ButtonEvent *buttonEvent) -{ -	if(readOnly()) -	{ -		return; -	} - -	// Ignore everything except left clicks. -	if(buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if(buttonEvent->direction == Direction::down) -	{ -		for(int i = 0; i < (int)visibleText.length(); ++i) -		{ -			int textWidth = font.textWidth(visibleText.substr(0, i)); -			if(buttonEvent->x < (textWidth + BORDER)) -			{ -				pos = i + offsetPos; -				break; -			} -		} -		redraw(); -	} -} - -void LineEdit::keyEvent(KeyEvent *keyEvent) -{ -	if(readOnly()) -	{ -		return; -	} - -	bool change = false; - -	if(keyEvent->direction == Direction::down) -	{ -		switch(keyEvent->keycode) { -		case Key::left: -			if(pos == 0) -			{ -				return; -			} - -			pos--; - -			if(offsetPos >= pos) -			{ -				walkstate = WalkLeft; -			} -			break; - -		case Key::right: -			if(pos == _text.length()) -			{ -				return; -			} - -			pos++; - -			if((pos < _text.length()) && ((offsetPos + visibleText.length()) <= pos)) -			{ -				walkstate = WalkRight; -			} -			break; - -		case Key::home: -			pos = 0; -			visibleText = _text; -			offsetPos = 0; -			break; - -		case Key::end: -			pos = _text.length(); -			visibleText = _text; -			offsetPos = 0; -			break; - -		case Key::deleteKey: -			if(pos < _text.length()) -			{ -				std::string t = _text.substr(0, pos); -				t += _text.substr(pos + 1, std::string::npos); -				_text = t; -				change = true; -			} -			break; - -		case Key::backspace: -			if(pos > 0) -			{ -				std::string t = _text.substr(0, pos - 1); -				t += _text.substr(pos, std::string::npos); -				_text = t; -				pos--; -				change = true; -			} -			break; - -		case Key::character: -			{ -				std::string pre = _text.substr(0, pos); -				std::string post = _text.substr(pos, std::string::npos); -				_text = pre + keyEvent->text + post; -				change = true; -				pos++; -			} -			break; - -		case Key::enter: -			enterPressedNotifier(); -	    break; - -		default: -			break; -		} - -		redraw(); -	} - -	if(change) -	{ -		textChanged(); -	} -} - -void LineEdit::repaintEvent(RepaintEvent *repaintEvent) -{ -	Painter p(*this); - -	int w = width(); -	int h = height(); -	if((w == 0) || (h == 0)) -	{ -		return; -	} - -	box.setSize(w, h); -	p.drawImage(0, 0, box); - -	p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0f/255.0f, 1.0f)); - -	switch(walkstate) { -	case WalkLeft: -		visibleText = _text.substr(pos, std::string::npos); -		offsetPos = pos; -		break; - -	case WalkRight: -		{ -			int delta = (offsetPos < _text.length()) ? 1 : 0; -			visibleText = _text.substr(offsetPos + delta); -			offsetPos = offsetPos + delta; -		} -		break; - -	case Noop: -		visibleText = _text; -		offsetPos = 0; -		break; -	} - -	while(true) -	{ -		int textWidth = font.textWidth(visibleText); -		if(textWidth <= std::max(w - BORDER - 4 + 3, 0)) -		{ -			break; -		} - -		switch(walkstate) { -		case WalkLeft: -			visibleText = visibleText.substr(0, visibleText.length() - 1); -			break; - -		case WalkRight: -			visibleText = visibleText.substr(0, visibleText.length() - 1); -			break; - -		case Noop: -			if(offsetPos < pos) -			{ -				visibleText = visibleText.substr(1); -				offsetPos++; -			} -			else -			{ -				visibleText = visibleText.substr(0, visibleText.length() - 1); -			} -			break; -		} -	} - -	walkstate = Noop; - -	p.drawText(BORDER - 4 + 3, height() / 2 + 5 + 1 + 1 + 1, font, visibleText); - -	if(readOnly()) -	{ -		return; -	} - -	if(hasKeyboardFocus()) -	{ -		size_t px = font.textWidth(visibleText.substr(0, pos - offsetPos)); -		p.drawLine(px + BORDER - 1 - 4 + 3, 6, -		           px + BORDER - 1 - 4 + 3, height() - 7); -	} -} - -} // GUI:: diff --git a/plugingui/lineedit.h b/plugingui/lineedit.h deleted file mode 100644 index 86ad986..0000000 --- a/plugingui/lineedit.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            lineedit.h - * - *  Sun Oct  9 13:01:52 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> - -#include "widget.h" -#include "font.h" -#include "painter.h" -#include "texturedbox.h" - -namespace GUI -{ - -class LineEdit -	: public Widget -{ -public: -	LineEdit(Widget *parent); -	virtual ~LineEdit(); - -	bool isFocusable() override { return true; } - -	std::string getText(); -	void setText(const std::string& text); - -	void setReadOnly(bool readonly); -	bool readOnly(); - -	Notifier<> enterPressedNotifier; - -	//protected: -	virtual void keyEvent(KeyEvent *keyEvent) override; -	virtual void repaintEvent(RepaintEvent *repaintEvent) override; -	virtual void buttonEvent(ButtonEvent *buttonEvent) override; - -protected: -	virtual void textChanged() {} - -private: -	TexturedBox box{getImageCache(), ":resources/widget.png", -			0, 0, // atlas offset (x, y) -			7, 1, 7, // dx1, dx2, dx3 -			7, 63, 7}; // dy1, dy2, dy3 - -	Font font; - -	std::string _text; -	size_t pos{0}; -	std::string visibleText; -	size_t offsetPos{0}; - -	enum state_t { -		Noop, -		WalkLeft, -		WalkRight, -	}; -	state_t walkstate{Noop}; - -	bool readonly; -}; - -} // GUI:: diff --git a/plugingui/listbox.cc b/plugingui/listbox.cc deleted file mode 100644 index 28c074e..0000000 --- a/plugingui/listbox.cc +++ /dev/null @@ -1,105 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            listbox.cc - * - *  Mon Feb 25 21:21:41 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "listbox.h" - -#include "painter.h" -#include "font.h" - -namespace GUI { - -ListBox::ListBox(Widget *parent) -	: Widget(parent) -	, selectionNotifier(basic.selectionNotifier) -	, clickNotifier(basic.clickNotifier) -	, valueChangedNotifier(basic.valueChangedNotifier) -	, basic(this) -{ -	basic.move(7, 7); -} - -ListBox::~ListBox() -{ -} - -void ListBox::addItem(std::string name, std::string value) -{ -	basic.addItem(name, value); -} - -void ListBox::addItems(std::vector<ListBoxBasic::Item> &items) -{ -	basic.addItems(items); -} - -void ListBox::clear() -{ -	basic.clear(); -} - -bool ListBox::selectItem(int index) -{ -	return basic.selectItem(index); -} - -std::string ListBox::selectedName() -{ -	return basic.selectedName(); -} - -std::string ListBox::selectedValue() -{ -	return basic.selectedValue(); -} - -void ListBox::clearSelectedValue() -{ -	basic.clearSelectedValue(); -} - -void ListBox::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	int w = width(); -	int h = height(); -	if(w == 0 || h == 0) -	{ -		return; -	} - -	box.setSize(w, h); -	p.drawImage(0, 0, box); -} - -void ListBox::resize(std::size_t width, std::size_t height) -{ -	Widget::resize(width, height); -	basic.resize(width - (7 + 7), -	             height - (7 + 7)); -} - -} // GUI:: diff --git a/plugingui/listbox.h b/plugingui/listbox.h deleted file mode 100644 index 0d9ad4d..0000000 --- a/plugingui/listbox.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            listbox.h - * - *  Mon Feb 25 21:21:40 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string.h> -#include <vector> - -#include "widget.h" -#include "painter.h" -#include "listboxbasic.h" -#include "texturedbox.h" - -namespace GUI -{ - -class ListBox -	: public Widget -{ -public: -	ListBox(Widget *parent); -	virtual ~ListBox(); - -	void addItem(std::string name, std::string value); -	void addItems(std::vector<ListBoxBasic::Item> &items); - -	void clear(); -	bool selectItem(int index); -	std::string selectedName(); -	std::string selectedValue(); -	void clearSelectedValue(); - -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; -	virtual void resize(std::size_t width, std::size_t height) override; - -	// Forwarded notifiers from ListBoxBasic::basic -	Notifier<>& selectionNotifier; -	Notifier<>& clickNotifier; -	Notifier<>& valueChangedNotifier; - -private: -	ListBoxBasic basic; - -	TexturedBox box{getImageCache(), ":resources/widget.png", -			0, 0, // atlas offset (x, y) -			7, 1, 7, // dx1, dx2, dx3 -			7, 63, 7}; // dy1, dy2, dy3 -}; - -} // GUI:: diff --git a/plugingui/listboxbasic.cc b/plugingui/listboxbasic.cc deleted file mode 100644 index b2637eb..0000000 --- a/plugingui/listboxbasic.cc +++ /dev/null @@ -1,362 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            listboxbasic.cc - * - *  Thu Apr  4 20:28:10 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "listboxbasic.h" - -#include "painter.h" -#include "font.h" - -namespace GUI { - -ListBoxBasic::ListBoxBasic(Widget *parent) -	: Widget(parent) -	, scroll(this) -{ -	scroll.move(0,0); -	scroll.resize(16, 100); - -	CONNECT(&scroll, valueChangeNotifier, -	        this, &ListBoxBasic::onScrollBarValueChange); - -	padding = 4; -	btn_size = 18; - -	selected = -1; -	marked = -1; -} - -ListBoxBasic::~ListBoxBasic() -{ -} - -void ListBoxBasic::setSelection(int index) -{ -	selected = index; -	if(marked == -1) -	{ -		marked = index; -	} -	valueChangedNotifier(); -} - -void ListBoxBasic::addItem(const std::string& name, const std::string& value) -{ -	std::vector<ListBoxBasic::Item> items; -	ListBoxBasic::Item item; -	item.name = name; -	item.value = value; -	items.push_back(item); -	addItems(items); -} - -void ListBoxBasic::addItems(const std::vector<ListBoxBasic::Item>& newItems) -{ -	for(auto& item : newItems) -	{ -		items.push_back(item); -	} - -	if(selected == -1) -	{ -		//setSelection((int)items.size() - 1); -		setSelection(0); -	} -	redraw(); -} - -void ListBoxBasic::clear() -{ -	items.clear(); -	setSelection(-1); -	marked = -1; -	scroll.setValue(0); -	redraw(); -} - -bool ListBoxBasic::selectItem(int index) -{ -	if(index < 0 || (index > (int)items.size() - 1)) -	{ -		return false; -	} - -	setSelection(index); -	redraw(); - -	return true; -} - -std::string ListBoxBasic::selectedName() -{ -	if(selected < 0 || (selected > (int)items.size() - 1)) -	{ -		return ""; -	} - -	return items[selected].name; -} - -std::string ListBoxBasic::selectedValue() -{ -	if(selected < 0 || (selected > (int)items.size() - 1)) -	{ -		return ""; -	} - -	return items[selected].value; -} - -void ListBoxBasic::clearSelectedValue() -{ -	setSelection(-1); -} - -void ListBoxBasic::onScrollBarValueChange(int value) -{ -	redraw(); -} - -void ListBoxBasic::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	int w = width(); -	int h = height(); - -	if((w == 0) || (h == 0)) -	{ -		return; -	} - -	p.drawImageStretched(0, 0, bg_img, w, h); - -	p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0f/255.0f, 1.0f)); - -	int yoffset = padding / 2; -	int skip = scroll.value(); -	int numitems = height() / (font.textHeight() + padding) + 1; -	for(int idx = skip; (idx < (int)items.size()) && (idx < (skip + numitems)); -	    idx++) -	{ -		auto& item = items[idx]; -		if(idx == selected) -		{ -			p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0f/255.0f, 0.5f)); -			p.drawFilledRectangle(0, -			                      yoffset - (padding / 2), -			                      width() - 1, -			                      yoffset + (font.textHeight() + 1)); -		} - -		if(idx == marked) -		{ -			p.drawRectangle(0, -			                yoffset - (padding / 2), -			                width() - 1, -			                yoffset + (font.textHeight() + 1)); -		} - -		p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0f/255.0f, 1.0f)); - -		p.drawText(2, yoffset + font.textHeight(), font, item.name); -		yoffset += font.textHeight() + padding; -	} - -	scroll.setRange(numitems); -	scroll.setMaximum(items.size()); -} - -void ListBoxBasic::scrollEvent(ScrollEvent* scrollEvent) -{ -	// forward scroll event to scroll bar. -	scroll.scrollEvent(scrollEvent); -} - -void ListBoxBasic::keyEvent(KeyEvent* keyEvent) -{ -	if(keyEvent->direction != Direction::down) -	{ -		return; -	} - -	switch(keyEvent->keycode) { -	case Key::up: -		if(marked == 0) -		{ -			return; -		} - -		marked--; - -		if(marked < scroll.value()) -		{ -			scroll.setValue(marked); -		} -		break; - -	case Key::down: -		{ -			// Number of items that can be displayed at a time. -			int numitems = height() / (font.textHeight() + padding); - -			if(marked == ((int)items.size() - 1)) -			{ -				return; -			} - -			marked++; - -			if(marked > (scroll.value() + numitems - 1)) -			{ -				scroll.setValue(marked - numitems + 1); -			} -		} -		break; - -	case Key::home: -		marked = 0; -		if(marked < scroll.value()) -		{ -			scroll.setValue(marked); -		} -		break; - -	case Key::end: -		{ -			// Number of items that can be displayed at a time. -			int numitems = height() / (font.textHeight() + padding); - -			marked = (int)items.size() - 1; -			if(marked > (scroll.value() + numitems - 1)) -			{ -				scroll.setValue(marked - numitems + 1); -			} -		} -		break; - -	case Key::character: -		if(keyEvent->text == " ") -		{ -			setSelection(marked); -			//selectionNotifier(); -		} -		break; - -	case Key::enter: -		setSelection(marked); -		selectionNotifier(); -		break; - -	default: -		break; -	} - -	redraw(); -} - -void ListBoxBasic::buttonEvent(ButtonEvent* buttonEvent) -{ -	// Ignore everything except left clicks. -	if(buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if((buttonEvent->x > ((int)width() - btn_size)) && -	   (buttonEvent->y < ((int)width() - 1))) -	{ -		if(buttonEvent->y > 0 && buttonEvent->y < btn_size) -		{ -			if(buttonEvent->direction == Direction::up) -			{ -				return; -			} -			scroll.setValue(scroll.value() - 1); -			return; -		} - -		if(buttonEvent->y > ((int)height() - btn_size) && -		   buttonEvent->y < ((int)height() - 1)) -		{ -			if(buttonEvent->direction == Direction::up) -			{ -				return; -			} -			scroll.setValue(scroll.value() + 1); -			return; -		} -	} - -	if(buttonEvent->direction == Direction::up) -	{ -		int skip = scroll.value(); -		size_t yoffset = padding / 2; -		for(int idx = skip; idx < (int)items.size(); idx++) -		{ -			yoffset += font.textHeight() + padding; -			if(buttonEvent->y < (int)yoffset - (padding / 2)) -			{ -				setSelection(idx); -				marked = selected; -				clickNotifier(); -				break; -			} -		} - -		redraw(); -	} - -	if(buttonEvent->direction != Direction::up) -	{ -		int skip = scroll.value(); -		size_t yoffset = padding / 2; -		for(int idx = skip; idx < (int)items.size(); idx++) -		{ -			yoffset += font.textHeight() + padding; -			if(buttonEvent->y < ((int)yoffset - (padding / 2))) -			{ -				marked = idx; -				break; -			} -		} - -		redraw(); -	} - -	if(buttonEvent->doubleClick) -	{ -		selectionNotifier(); -	} -} - -void ListBoxBasic::resize(std::size_t width, std::size_t height) -{ -	Widget::resize(width, height); -	scroll.move(width - scroll.width(), 0); -	scroll.resize(scroll.width(), height); -} - -} // GUI:: diff --git a/plugingui/listboxbasic.h b/plugingui/listboxbasic.h deleted file mode 100644 index 27822e6..0000000 --- a/plugingui/listboxbasic.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            listboxbasic.h - * - *  Thu Apr  4 20:28:10 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string.h> -#include <vector> - -#include <notifier.h> - -#include "widget.h" -#include "font.h" -#include "painter.h" -#include "scrollbar.h" - -namespace GUI { - -class ListBoxBasic : public Widget { -public: -	class Item { -	public: -		std::string name; -		std::string value; -	}; - -	ListBoxBasic(Widget *parent); -	virtual ~ListBoxBasic(); - -	void addItem(const std::string& name, const std::string& value); -	void addItems(const std::vector<Item>& items); - -	void clear(); -	bool selectItem(int index); -	std::string selectedName(); -	std::string selectedValue(); - -	void clearSelectedValue(); - -	Notifier<> selectionNotifier; -	Notifier<> clickNotifier; -	Notifier<> valueChangedNotifier; - -	// From Widget: -	virtual void resize(std::size_t width, std::size_t height) override; - -protected: -	void onScrollBarValueChange(int value); - -	// From Widget: -	bool isFocusable() override { return true; } -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; -	virtual void buttonEvent(ButtonEvent* buttonEvent) override; -	virtual void keyEvent(KeyEvent* keyEvent) override; -	virtual void scrollEvent(ScrollEvent* scrollEvent) override; - -	ScrollBar scroll; - -	Texture bg_img{getImageCache(), ":resources/widget.png", 7, 7, 1, 63}; - -	void setSelection(int index); - -	std::vector<Item> items; - -	int selected; -	int marked; -	Font font; -	int padding; -	int btn_size; -}; - -} // GUI:: diff --git a/plugingui/listboxthin.cc b/plugingui/listboxthin.cc deleted file mode 100644 index d224f11..0000000 --- a/plugingui/listboxthin.cc +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            listboxthin.cc - * - *  Sun Apr  7 19:39:36 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "listboxthin.h" - -#include "painter.h" -#include "font.h" - -namespace GUI -{ - -ListBoxThin::ListBoxThin(Widget *parent) -	: Widget(parent) -	, selectionNotifier(basic.selectionNotifier) -	, clickNotifier(basic.clickNotifier) -	, valueChangedNotifier(basic.valueChangedNotifier) -	, basic(this) -{ -	basic.move(1, 1); -} - -ListBoxThin::~ListBoxThin() -{ -} - -void ListBoxThin::addItem(std::string name, std::string value) -{ -	basic.addItem(name, value); -} - -void ListBoxThin::addItems(std::vector<ListBoxBasic::Item> &items) -{ -	basic.addItems(items); -} - -void ListBoxThin::clear() -{ -	basic.clear(); -} - -bool ListBoxThin::selectItem(int index) -{ -	return basic.selectItem(index); -} - -std::string ListBoxThin::selectedName() -{ -	return basic.selectedName(); -} - -std::string ListBoxThin::selectedValue() -{ -	return basic.selectedValue(); -} - -void ListBoxThin::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	int w = width(); -	int h = height(); -	if(w == 0 || h == 0) -	{ -		return; -	} - -	box.setSize(w,h); -	p.drawImage(0, 0, box); -} - -void ListBoxThin::resize(std::size_t height, std::size_t width) -{ -	Widget::resize(width, height); -	basic.resize(width - (1 + 1), -	             height - (1 + 1)); -} - -} // GUI:: diff --git a/plugingui/listboxthin.h b/plugingui/listboxthin.h deleted file mode 100644 index e861745..0000000 --- a/plugingui/listboxthin.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            listboxthin.h - * - *  Sun Apr  7 19:39:35 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string.h> -#include <vector> - -#include <notifier.h> - -#include "widget.h" -#include "painter.h" -#include "listboxbasic.h" -#include "texturedbox.h" - -namespace GUI -{ - -class ListBoxThin -	: public Widget -{ -public: -	ListBoxThin(Widget *parent); -	virtual ~ListBoxThin(); - -	void addItem(std::string name, std::string value); -	void addItems(std::vector<ListBoxBasic::Item> &items); - -	void clear(); -	bool selectItem(int index); -	std::string selectedName(); -	std::string selectedValue(); - -	// From Widget: -	virtual void repaintEvent(GUI::RepaintEvent* repaintEvent) override; -	virtual void resize(std::size_t height, std::size_t width) override; - -	// Forwarded notifier from ListBoxBasic::basic -	Notifier<>& selectionNotifier; -	Notifier<>& clickNotifier; -	Notifier<>& valueChangedNotifier; - -private: -	ListBoxBasic basic; - -	TexturedBox box{getImageCache(), ":resources/thinlistbox.png", -			0, 0, // atlas offset (x, y) -			1, 1, 1, // dx1, dx2, dx3 -			1, 1, 1}; // dy1, dy2, dy3 -}; - -} // GUI:: diff --git a/plugingui/lodepng b/plugingui/lodepng deleted file mode 160000 -Subproject a71964ed5fe4f82a32ac7f8201338900f66e855 diff --git a/plugingui/maintab.h b/plugingui/maintab.h index 57aec72..74b970a 100644 --- a/plugingui/maintab.h +++ b/plugingui/maintab.h @@ -26,9 +26,10 @@   */  #pragma once -#include "widget.h" -#include "layout.h" -#include "frame.h" +#include <dggui/widget.h> +#include <dggui/layout.h> +#include <dggui/frame.h> +  #include "drumkitframecontent.h"  #include "statusframecontent.h"  #include "humanizerframecontent.h" diff --git a/plugingui/mainwindow.cc b/plugingui/mainwindow.cc index 932e8f3..ea79cb5 100644 --- a/plugingui/mainwindow.cc +++ b/plugingui/mainwindow.cc @@ -32,7 +32,7 @@  #include <translation.h> -#include "painter.h" +#include <dggui/painter.h>  namespace GUI  { diff --git a/plugingui/mainwindow.h b/plugingui/mainwindow.h index 219f851..efacf07 100644 --- a/plugingui/mainwindow.h +++ b/plugingui/mainwindow.h @@ -28,12 +28,13 @@  #include <settings.h> +#include <dggui/image.h> +#include <dggui/tabwidget.h> +#include <dggui/texturedbox.h> +#include <dggui/window.h> +  #include "abouttab.h"  #include "drumkittab.h" -#include "image.h" -#include "tabwidget.h" -#include "texturedbox.h" -#include "window.h"  #include "maintab.h"  #include "pluginconfig.h" diff --git a/plugingui/nativewindow.h b/plugingui/nativewindow.h deleted file mode 100644 index 400ff57..0000000 --- a/plugingui/nativewindow.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow.h - * - *  Fri Dec 28 18:46:01 CET 2012 - *  Copyright 2012 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <memory> -#include <queue> -#include <tuple> -#include <vector> - -#include "guievent.h" - -namespace GUI -{ - -struct Point; - -//! Interface class for native window implementations. -class NativeWindow -{ -public: -	NativeWindow() {} -	virtual ~NativeWindow() {} - -	//! Set a fixed size to the window. -	//! It resizes the window and disallows user resizing. -	virtual void setFixedSize(std::size_t width, std::size_t height) = 0; - -	//! Force window to stay on top of other windows -	virtual void setAlwaysOnTop(bool always_on_top) = 0; - -	//! Set a new size of the window. -	virtual void resize(std::size_t width, std::size_t height) = 0; - -	//! Query size of the native window. -	virtual std::pair<std::size_t, std::size_t> getSize() const = 0; - -	//! Move the window to a new position. -	//! Note: negative value are allowed. -	virtual void move(int x, int y) = 0; - -	//! Query the screen position of the native window. -	//! Note: returned values can be negative. -	virtual std::pair<int, int> getPosition() const = 0; - -	//! Show the window if it is hidden. -	virtual void show() = 0; - -	//! Hides the window. -	virtual void hide() = 0; - -	//! Return visibility state of the native window. -	virtual bool visible() const = 0; - -	//! Sets the window caption in the title bar (if it has one). -	virtual void setCaption(const std::string &caption) = 0; - -	//! Draw the internal rendering buffer to the window buffer. -	virtual void redraw(const Rect& dirty_rect) = 0; - -	//! Toggle capture mouse mode. -	virtual void grabMouse(bool grab) = 0; - -	//! Reads all currently enqueued events from the native window system. -	//! \return A queue of shared pointers to events. -	virtual EventQueue getEvents() = 0; - -	//! \returns the native window handle, it HWND on Win32 or Window id on X11 -	virtual void* getNativeWindowHandle() const = 0; - -	//! Translate a the local native window coordinate to a global screen -	//! coordinate. -	virtual Point translateToScreen(const Point& point) = 0; -}; - -} // GUI:: diff --git a/plugingui/nativewindow_cocoa.h b/plugingui/nativewindow_cocoa.h deleted file mode 100644 index 8dc73e6..0000000 --- a/plugingui/nativewindow_cocoa.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_cocoa.h - * - *  Sun Dec  4 15:55:14 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <memory> - -#include "nativewindow.h" - -namespace GUI -{ - -class Window; -class NativeWindowCocoa -	: public NativeWindow -{ -public: -	NativeWindowCocoa(void* native_window, Window& window); -	~NativeWindowCocoa(); - -	// From NativeWindow: -	virtual void setFixedSize(std::size_t width, std::size_t height) override; -	virtual void setAlwaysOnTop(bool always_on_top) override; -	virtual void resize(std::size_t width, std::size_t height) override; -	virtual std::pair<std::size_t, std::size_t> getSize() const override; -	virtual void move(int x, int y) override; -	virtual std::pair<int, int> getPosition() const override; -	virtual void show() override; -	virtual void hide() override; -	virtual bool visible() const override; -	virtual void setCaption(const std::string &caption) override; -	virtual void redraw(const Rect& dirty_rect) override; -	virtual void grabMouse(bool grab) override; -	virtual EventQueue getEvents() override; -	virtual void* getNativeWindowHandle() const override; -	virtual Point translateToScreen(const Point& point) override; - -	// Expose friend members of Window to ObjC++ implementation. -	class Window& getWindow(); -	class PixelBuffer& getWindowPixbuf(); -	void resized(); -	void pushBackEvent(std::shared_ptr<Event> event); - -private: -	void updateLayerOffset(); - -	Window& window; -	std::unique_ptr<struct priv> priv; -	EventQueue event_queue; -	void* native_window{nullptr}; -	bool first{true}; -	float scale{1.0}; -}; - -} // GUI:: diff --git a/plugingui/nativewindow_cocoa.mm b/plugingui/nativewindow_cocoa.mm deleted file mode 100644 index 7b6ecc8..0000000 --- a/plugingui/nativewindow_cocoa.mm +++ /dev/null @@ -1,832 +0,0 @@ -/* -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_cocoa.mm - * - *  Fri Dec  2 20:31:03 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "nativewindow_cocoa.h" - -#include "guievent.h" - -#include <stdio.h> -#include <unistd.h> - -#import <Cocoa/Cocoa.h> - -#include "window.h" - -#include <Availability.h> - -#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED -#if __MAC_OS_X_VERSION_MAX_ALLOWED < 101300 // Before MacOSX 10.13 (High-Sierra) -#define STYLE_MASK                              \ -	(NSClosableWindowMask |                       \ -	 NSTitledWindowMask |                         \ -	 NSResizableWindowMask) -#define IMAGE_FLAGS                             \ -	(kCGBitmapByteOrder32Big |                    \ -	 kCGImageAlphaPremultipliedLast) -#define EVENT_MASK                              \ -	NSAnyEventMask -#else -#define STYLE_MASK                              \ -	(NSWindowStyleMaskClosable |                  \ -	 NSWindowStyleMaskTitled |                    \ -	 NSWindowStyleMaskResizable) -#define IMAGE_FLAGS                             \ -	(kCGImageByteOrder32Big |                     \ -	 kCGImageAlphaPremultipliedLast) -#define EVENT_MASK                              \ -	NSEventMaskAny -#endif - -#if __MAC_OS_X_VERSION_MAX_ALLOWED < 101400 // Before MacOSX 10.14 (Mojave) -// Nothing here yet... -#endif -#endif - -@interface DGListener : NSWindow -{ -@public -	NSWindow* window; -	GUI::NativeWindowCocoa* native; -} - -- (id) initWithWindow:(NSWindow*)ref -               native:(GUI::NativeWindowCocoa*)_native; -- (void) dealloc; -- (void) windowDidResize; -- (void) windowWillResize; -- (void) windowWillClose; -- (void) unbindNative; -@end - -@implementation DGListener -- (id) initWithWindow:(NSWindow*)ref -               native:(GUI::NativeWindowCocoa*)_native -{ -	[super init]; - -	native = _native; -	window = ref; - -	[[NSNotificationCenter defaultCenter] -	  addObserver:self -	     selector:@selector(windowDidResize) -	         name:NSWindowDidResizeNotification -	       object:ref]; - -	[[NSNotificationCenter defaultCenter] -	  addObserver:self -	     selector:@selector(windowWillResize) -	         name:NSWindowWillStartLiveResizeNotification -	       object:ref]; - -	[[NSNotificationCenter defaultCenter] -	  addObserver:self -	     selector:@selector(windowWillClose) -	         name:NSWindowWillCloseNotification -	       object:ref]; - -	[self windowWillResize]; // trigger to get the initial size as a size change - -	return self; -} - -- (void) dealloc -{ -	[[NSNotificationCenter defaultCenter] removeObserver:self]; -	[super dealloc]; -} - -- (void)windowDidResize -{ -	if(!native) -	{ -		return; -	} - -	native->resized(); -} - -- (void)windowWillResize -{ -	if(!native) -	{ -		return; -	} - -	native->resized(); -} - -- (void) windowWillClose -{ -	if(!native) -	{ -		return; -	} - -	auto closeEvent = std::make_shared<GUI::CloseEvent>(); -	native->pushBackEvent(closeEvent); -} - -- (void) unbindNative -{ -	native = nullptr; -} -@end - -@interface DGView : NSView -{ -	int colorBits; -	int depthBits; - -@private -	GUI::NativeWindowCocoa* native; -	NSTrackingArea* trackingArea; -} - -//- (id) initWithFrame:(NSRect)frame -//           colorBits:(int)numColorBits -//           depthBits:(int)numDepthBits; -- (void) updateTrackingAreas; - -- (void) mouseEntered:(NSEvent *)event; -- (void) mouseExited:(NSEvent *)event; -- (void) mouseMoved:(NSEvent*)event; -- (void) mouseDown:(NSEvent*)event; -- (void) mouseUp:(NSEvent*)event; -- (void) rightMouseDown:(NSEvent*)event; -- (void) rightMouseUp:(NSEvent*)event; -- (void) otherMouseDown:(NSEvent*)event; -- (void) otherMouseUp:(NSEvent*)event; -- (void) mouseDragged:(NSEvent*)event; -- (void) rightMouseDragged:(NSEvent*)event; -- (void) otherMouseDragged:(NSEvent*)event; -- (void) scrollWheel:(NSEvent*)event; -- (void) keyDown:(NSEvent*)event; -- (void) keyUp:(NSEvent*)event; - -- (void) dealloc; -- (void) bindNative:(GUI::NativeWindowCocoa*)native; -- (void) unbindNative; -@end - -@implementation DGView -//- (id) initWithFrame:(NSRect)frame -//           colorBits:(int)numColorBits -//           depthBits:(int)numDepthBits -//{ -//	[super init]; -//	[self updateTrackingAreas]; -//	return self; -//} - -- (void) updateTrackingAreas -{ -	if(trackingArea != nil) -	{ -		[self removeTrackingArea:trackingArea]; -		[trackingArea release]; -	} - -	int opts = -		NSTrackingMouseEnteredAndExited | -		NSTrackingMouseMoved | -		NSTrackingActiveAlways; - -	trackingArea = -	  [[NSTrackingArea alloc] initWithRect:[self bounds] -	                               options:opts -	                                 owner:self -	                              userInfo:nil]; -	[self addTrackingArea:trackingArea]; -} - -- (void) mouseEntered:(NSEvent *)event -{ -	[super mouseEntered:event]; -	auto frame = [self frame]; -	NSPoint loc = [event locationInWindow]; -	auto mouseEnterEvent = std::make_shared<GUI::MouseEnterEvent>(); -	mouseEnterEvent->x = loc.x - frame.origin.x; -	mouseEnterEvent->y = frame.size.height - loc.y - frame.origin.y; -	native->pushBackEvent(mouseEnterEvent); -	//[[NSCursor pointingHandCursor] set]; -} - -- (void) mouseExited:(NSEvent *)event -{ -	[super mouseExited:event]; -	auto frame = [self frame]; -	NSPoint loc = [event locationInWindow]; -	auto mouseLeaveEvent = std::make_shared<GUI::MouseLeaveEvent>(); -	mouseLeaveEvent->x = loc.x - frame.origin.x; -	mouseLeaveEvent->y = frame.size.height - loc.y - frame.origin.y; -	native->pushBackEvent(mouseLeaveEvent); -	//[[NSCursor arrowCursor] set]; -} - -- (void) mouseMoved:(NSEvent*)event -{ -	auto frame = [self frame]; -	NSPoint loc = [event locationInWindow]; -	auto mouseMoveEvent = std::make_shared<GUI::MouseMoveEvent>(); -	mouseMoveEvent->x = loc.x - frame.origin.x; -	mouseMoveEvent->y = frame.size.height - loc.y - frame.origin.y; -	native->pushBackEvent(mouseMoveEvent); -} - -- (void) mouseDown:(NSEvent*)event -{ -	auto frame = [self frame]; -	NSPoint loc = [event locationInWindow]; - -	auto buttonEvent = std::make_shared<GUI::ButtonEvent>(); -	buttonEvent->x = loc.x - frame.origin.x; -	buttonEvent->y = frame.size.height - loc.y - frame.origin.y; -	switch((int)[event buttonNumber]) -	{ -	case 0: -		buttonEvent->button = GUI::MouseButton::left; -		break; -	case 1: -		buttonEvent->button = GUI::MouseButton::right; -		break; -	case 2: -		buttonEvent->button = GUI::MouseButton::middle; -		break; -	default: -		return; -	} -	buttonEvent->direction = GUI::Direction::down; -	buttonEvent->doubleClick = [event clickCount] == 2; -	native->pushBackEvent(buttonEvent); - -	[super mouseDown: event]; -} - -- (void) mouseUp:(NSEvent*)event -{ -	auto frame = [self frame]; -	NSPoint loc = [event locationInWindow]; - -	auto buttonEvent = std::make_shared<GUI::ButtonEvent>(); -	buttonEvent->x = loc.x - frame.origin.x; -	buttonEvent->y = frame.size.height - loc.y - frame.origin.y; -	switch((int)[event buttonNumber]) -	{ -	case 0: -		buttonEvent->button = GUI::MouseButton::left; -		break; -	case 1: -		buttonEvent->button = GUI::MouseButton::right; -		break; -	case 2: -		buttonEvent->button = GUI::MouseButton::middle; -		break; -	default: -		return; -	} -	buttonEvent->direction = GUI::Direction::up; -	buttonEvent->doubleClick = false; -	native->pushBackEvent(buttonEvent); - -	[super mouseUp: event]; -} - -- (void) rightMouseDown:(NSEvent*)event -{ -	[self mouseDown: event]; -	[super rightMouseDown: event]; -} - -- (void) rightMouseUp:(NSEvent*)event -{ -	[self mouseUp: event]; -	[super rightMouseUp: event]; -} - -- (void) otherMouseDown:(NSEvent*)event -{ -	[self mouseDown: event]; -	[super otherMouseDown: event]; -} - -- (void) otherMouseUp:(NSEvent*)event -{ -	[self mouseUp: event]; -	[super otherMouseUp: event]; -} - -- (void) mouseDragged:(NSEvent*)event -{ -	[self mouseMoved: event]; -	[super mouseDragged: event]; -} - -- (void) rightMouseDragged:(NSEvent*)event -{ -	[self mouseMoved: event]; -	[super rightMouseDragged: event]; -} - -- (void) otherMouseDragged:(NSEvent*)event -{ -	[self mouseMoved: event]; -	[super otherMouseDragged: event]; -} - -- (void) scrollWheel:(NSEvent*)event -{ -	auto frame = [self frame]; -	NSPoint loc = [event locationInWindow]; - -	auto scrollEvent = std::make_shared<GUI::ScrollEvent>(); -	scrollEvent->x = loc.x - frame.origin.x; -	scrollEvent->y = frame.size.height - loc.y - frame.origin.y; -	scrollEvent->delta = [event deltaY] * -1.0f; -	native->pushBackEvent(scrollEvent); - -	[super scrollWheel: event]; -} - -- (void) keyDown:(NSEvent*)event -{ -	const NSString* chars = [event characters]; -	const char* str = [chars UTF8String]; - -	auto keyEvent = std::make_shared<GUI::KeyEvent>(); - -	switch([event keyCode]) -	{ -	case 123: keyEvent->keycode = GUI::Key::left; break; -	case 124: keyEvent->keycode = GUI::Key::right; break; -	case 126: keyEvent->keycode = GUI::Key::up; break; -	case 125: keyEvent->keycode = GUI::Key::down; break; -	case 117: keyEvent->keycode = GUI::Key::deleteKey; break; -	case 51:  keyEvent->keycode = GUI::Key::backspace; break; -	case 115: keyEvent->keycode = GUI::Key::home; break; -	case 119: keyEvent->keycode = GUI::Key::end; break; -	case 121: keyEvent->keycode = GUI::Key::pageDown; break; -	case 116: keyEvent->keycode = GUI::Key::pageUp; break; -	case 36:  keyEvent->keycode = GUI::Key::enter; break; -	default:  keyEvent->keycode = GUI::Key::unknown; break; -	} - -	if(strlen(str) && keyEvent->keycode == GUI::Key::unknown) -	{ -		keyEvent->keycode = GUI::Key::character; -	} - -	keyEvent->text = str; // TODO: UTF8 decode -	keyEvent->direction = GUI::Direction::down; - -	native->pushBackEvent(keyEvent); -	[super keyDown: event]; -} - -- (void) keyUp:(NSEvent*)event -{ -	const NSString* chars = [event characters]; -	const char* str = [chars UTF8String]; -	auto keyEvent = std::make_shared<GUI::KeyEvent>(); - -	switch([event keyCode]) -	{ -	case 123: keyEvent->keycode = GUI::Key::left; break; -	case 124: keyEvent->keycode = GUI::Key::right; break; -	case 126: keyEvent->keycode = GUI::Key::up; break; -	case 125: keyEvent->keycode = GUI::Key::down; break; -	case 117: keyEvent->keycode = GUI::Key::deleteKey; break; -	case 51:  keyEvent->keycode = GUI::Key::backspace; break; -	case 115: keyEvent->keycode = GUI::Key::home; break; -	case 119: keyEvent->keycode = GUI::Key::end; break; -	case 121: keyEvent->keycode = GUI::Key::pageDown; break; -	case 116: keyEvent->keycode = GUI::Key::pageUp; break; -	case 36:  keyEvent->keycode = GUI::Key::enter; break; -	default:  keyEvent->keycode = GUI::Key::unknown; break; -	} - -	if(strlen(str) && keyEvent->keycode == GUI::Key::unknown) -	{ -		keyEvent->keycode = GUI::Key::character; -	} - -	keyEvent->text = str; // TODO: UTF8 decode -	keyEvent->direction = GUI::Direction::up; - -	native->pushBackEvent(keyEvent); -	[super keyUp: event]; -} - -- (void) dealloc -{ -	[super dealloc]; -} - -- (void)bindNative:(GUI::NativeWindowCocoa*)_native -{ -	native = _native; -} - -- (void) unbindNative -{ -	native = nullptr; -} -@end - - -namespace GUI -{ - -struct priv -{ -	NSWindow* window; -	DGView* view; -	id listener; -	id parent_view; -	std::uint8_t* pixel_buffer{nullptr}; -	std::size_t pixel_buffer_width{0}; -	std::size_t pixel_buffer_height{0}; -}; - -NativeWindowCocoa::NativeWindowCocoa(void* native_window, Window& window) -	: window(window) -	, priv(new struct priv()) -	, native_window(native_window) -{ -	[NSAutoreleasePool new]; -	[NSApplication sharedApplication]; -	[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; - -	priv->view = [DGView new]; - -	[priv->view bindNative:this]; - -	if(native_window) -	{ -		if(sizeof(std::size_t) == sizeof(unsigned int)) // 32 bit machine -		{ -			WindowRef ptr = (WindowRef)native_window; -			priv->window = [[[NSWindow alloc] initWithWindowRef:ptr] retain]; -			priv->parent_view = [priv->window contentView]; -		} -		else  // 64 bit machine -		{ -			priv->parent_view = (NSView*)native_window; -			priv->window = [priv->parent_view window]; -		} - -		[priv->parent_view addSubview:priv->view]; -		[priv->view display]; -		[priv->parent_view setNeedsDisplay:YES]; -	} -	else -	{ -		priv->window = -			[[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 10, 10) -			                             styleMask:STYLE_MASK -			                               backing:NSBackingStoreBuffered -			                                 defer:NO] -			  retain]; -		[priv->window setLevel:NSStatusWindowLevel]; -	} - -	priv->listener = -		[[[DGListener alloc] initWithWindow:priv->window -		                             native:this] -		  retain]; - -	if(native_window) -	{ -		[[priv->window contentView] addSubview:priv->view]; -	} -	else -	{ -		[priv->window setReleasedWhenClosed:NO]; -		[priv->window setContentView:priv->view]; -	} - -	scale = [[NSScreen mainScreen] backingScaleFactor]; - -	[priv->view setWantsLayer:YES]; -	[priv->view setLayerContentsPlacement:NSViewLayerContentsPlacementTopLeft]; -	[priv->view updateTrackingAreas]; - -	if(!native_window) -	{ -	  hide(); -	} -} - -NativeWindowCocoa::~NativeWindowCocoa() -{ -	// Make the garbage collector able to collect the ObjC objects: -	if(visible()) -	{ -		hide(); -	} - -	[priv->listener unbindNative]; -	[priv->listener release]; - -	[priv->view unbindNative]; -	[priv->view release]; - -	if(native_window) -	{ -		if(sizeof(std::size_t) == sizeof(unsigned int)) // 32 bit machine -		{ -			[priv->window release]; -		} -		else -		{ -			// in 64-bit the window was not created by us -		} -	} -	else -	{ -		[priv->window release]; -	} -} - -void NativeWindowCocoa::setFixedSize(std::size_t width, std::size_t height) -{ -	resize(width, height); -	[priv->window setMinSize:NSMakeSize(width, height + 22)]; -	[priv->window setMaxSize:NSMakeSize(width, height + 22)]; -} - -void NativeWindowCocoa::setAlwaysOnTop(bool always_on_top) -{ -	if(always_on_top) -	{ -		[priv->window setLevel: NSStatusWindowLevel]; -	} -	else -	{ -		[priv->window setLevel: NSNormalWindowLevel]; -	} -} - -void NativeWindowCocoa::resize(std::size_t width, std::size_t height) -{ -	[priv->window setContentSize:NSMakeSize(width, height)]; -} - -std::pair<std::size_t, std::size_t> NativeWindowCocoa::getSize() const -{ -	if(native_window) -	{ -		auto frame = [priv->parent_view frame]; -		return {frame.size.width, frame.size.height - frame.origin.y}; -	} -	else -	{ -		NSSize size = [priv->view frame].size; -		return {size.width, size.height}; -	} -} - -void NativeWindowCocoa::move(int x, int y) -{ -	NSRect screen = [[NSScreen mainScreen] frame]; -	[priv->window setFrameTopLeftPoint:NSMakePoint(x, screen.size.height - y)]; -} - -std::pair<int, int> NativeWindowCocoa::getPosition() const -{ -	NSRect screen = [[NSScreen mainScreen] frame]; -	NSPoint pos = [[priv->window contentView] frame].origin; -	return {pos.x, screen.size.height - pos.y}; -} - -void NativeWindowCocoa::show() -{ -	if(!native_window) -	{ -		[priv->window makeKeyAndOrderFront:priv->window]; -		[NSApp activateIgnoringOtherApps:YES]; -	} -} - -void NativeWindowCocoa::hide() -{ -	if(!native_window) -	{ -		[priv->window orderOut:priv->window]; -	} -} - -bool NativeWindowCocoa::visible() const -{ -	return [priv->window isVisible]; -} - -void NativeWindowCocoa::redraw(const Rect& dirty_rect) -{ -	NSSize size; -	if(native_window) -	{ -		size = [priv->parent_view frame].size; -	} -	else -	{ -		size = [priv->view frame].size; -	} - -	std::size_t width = size.width; -	std::size_t height = size.height; - -	if(priv->pixel_buffer == nullptr || -	   priv->pixel_buffer_width != width || -	   priv->pixel_buffer_height != height) -	{ -		if(priv->pixel_buffer) delete[] priv->pixel_buffer; -		priv->pixel_buffer = new std::uint8_t[width * height * 4]; -		priv->pixel_buffer_width = width; -		priv->pixel_buffer_height = height; -	} - -	CGColorSpaceRef rgb = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); -	CGContextRef gc = -		CGBitmapContextCreate(priv->pixel_buffer, width, height, -		                      8, width * 4, rgb, -		                      IMAGE_FLAGS); -	CGColorSpaceRelease(rgb); - -	size_t pitch = CGBitmapContextGetBytesPerRow(gc); -	uint8_t *buffer = (uint8_t *)CGBitmapContextGetData(gc); - -	struct Pixel -	{ -		std::uint8_t red; -		std::uint8_t green; -		std::uint8_t blue; -		std::uint8_t alpha; -	}; -	std::uint8_t* pixels = window.wpixbuf.buf; -	for(std::size_t y = dirty_rect.y1; y < std::min(dirty_rect.y2, height); ++y) -	{ -		Pixel *row = (Pixel *)(buffer + y * pitch); -		for(std::size_t x = dirty_rect.x1; x < std::min(dirty_rect.x2, width); ++x) -		{ -			row[x] = *(Pixel*)&pixels[(y * width + x) * 3]; -			row[x].alpha = 0xff; -		} -	} -	CGImageRef image = CGBitmapContextCreateImage(gc); -	CGContextRelease(gc); - -	auto nsImage = [[NSImage alloc] initWithCGImage:image size:NSZeroSize]; - -	id layerContents = [nsImage layerContentsForContentsScale:scale]; -	[[priv->view layer] setContents:layerContents]; -	updateLayerOffset(); -	[[priv->view layer] setContentsScale:scale]; -} - -void NativeWindowCocoa::setCaption(const std::string &caption) -{ -	NSString* title = -		[NSString stringWithCString:caption.data() -		                   encoding:[NSString defaultCStringEncoding]]; -	[priv->window setTitle:title]; -} - -void NativeWindowCocoa::grabMouse(bool grab) -{ -} - -void NativeWindowCocoa::updateLayerOffset() -{ -	if(native_window) -	{ -		//auto r1 = [priv->parent_view frame]; -		auto r2 = [priv->view frame]; - -		CATransform3D t = [[priv->view layer] transform]; -		if(t.m42 != -r2.origin.y) -		{ -			t.m42 = -r2.origin.y; // y -			[[priv->view layer] setTransform:t]; -		} -	} -} - -EventQueue NativeWindowCocoa::getEvents() -{ -	if(first) -	{ -		resized(); -		first = false; -	} - -	// If this is the root window, process the events - event processing will -	// be handled by the hosting window if the window is embedded. -	if(!native_window) -	{ -		NSEvent* event = nil; -		do -		{ -			event = [NSApp nextEventMatchingMask:EVENT_MASK -			                           untilDate:[NSDate distantPast] -			                              inMode:NSDefaultRunLoopMode -			                             dequeue:YES]; -			[NSApp sendEvent:event]; -		} -		while(event != nil); -	} - -	EventQueue events; -	std::swap(events, event_queue); -	return events; -} - -void* NativeWindowCocoa::getNativeWindowHandle() const -{ -	if(sizeof(std::size_t) == sizeof(unsigned int)) // 32 bit machine -	{ -		return [priv->window windowRef]; -	} -	else // 64 bit machine -	{ -		return [priv->window contentView]; -	} -} - -Point NativeWindowCocoa::translateToScreen(const Point& point) -{ -	NSRect e = [[NSScreen mainScreen] frame]; -	NSRect frame; -	if(native_window) -	{ -		frame = [priv->parent_view frame]; -	} -	else -	{ -		frame = [priv->view frame]; -	} - -	NSRect rect { { point.x + frame.origin.x, -	                frame.size.height - point.y + frame.origin.y}, -	              {0.0, 0.0} }; -	rect = [priv->window convertRectToScreen:rect]; - -	return { (int)rect.origin.x, (int)(e.size.height - rect.origin.y) }; -} - -Window& NativeWindowCocoa::getWindow() -{ -	return window; -} - -PixelBuffer& NativeWindowCocoa::getWindowPixbuf() -{ -	window.updateBuffer(); -	return window.wpixbuf; -} - -void NativeWindowCocoa::resized() -{ -	if(native_window) -	{ -		NSRect frame = [priv->parent_view frame]; -		[priv->view setFrame:frame]; -		[priv->view updateTrackingAreas]; -		updateLayerOffset(); -	} - -	auto resizeEvent = std::make_shared<GUI::ResizeEvent>(); -	resizeEvent->width = 42; // size is not actually used -	resizeEvent->height = 42; // size is not actually used -	pushBackEvent(resizeEvent); -} - -void NativeWindowCocoa::pushBackEvent(std::shared_ptr<Event> event) -{ -	event_queue.push_back(event); -} - -} // GUI:: diff --git a/plugingui/nativewindow_pugl.cc b/plugingui/nativewindow_pugl.cc deleted file mode 100644 index f94b82b..0000000 --- a/plugingui/nativewindow_pugl.cc +++ /dev/null @@ -1,382 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_pugl.cc - * - *  Fri Dec 28 18:45:57 CET 2012 - *  Copyright 2012 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "nativewindow_pugl.h" - -#include <stdlib.h> -#include <list> - -#ifdef __APPLE__ -#include <OpenGL/glu.h> -#else -#include <GL/glu.h> -#include <GL/glext.h> -#include <GL/gl.h> -#endif - -#include "window.h" -#include "guievent.h" - -#include <hugin.hpp> - -namespace GUI -{ - -NativeWindowPugl::NativeWindowPugl(void* native_window, Window& window) -	: window(window) -{ -	INFO(nativewindow, "Running with PuGL native window\n"); -	view = puglInit(nullptr, nullptr); -	puglInitContextType(view, PUGL_GL); -	if(native_window) -	{ -		puglInitWindowParent(view, (PuglNativeWindow)native_window); -	} -	puglInitWindowClass(view, "DrumgGizmo"); -	puglInitWindowSize(view, 750, 466); -	puglInitResizable(view, true); -	puglCreateWindow(view, "DrumGizmo"); - -	puglSetHandle(view, (PuglHandle)this); -	puglSetEventFunc(view, onEvent); -} - -NativeWindowPugl::~NativeWindowPugl() -{ -	puglDestroy(view); -} - -void NativeWindowPugl::setFixedSize(std::size_t width, std::size_t height) -{ -//	redraw(); -} - -void NativeWindowPugl::resize(std::size_t width, std::size_t height) -{ -//	DEBUG(nativewindow_pugl, "Resizing to %dx%d\n", width, height); -//	init(); -//	redraw(); -} - -std::pair<std::size_t, std::size_t> NativeWindowPugl::getSize() const -{ -	int width, height; -	puglGetSize(view, &width, &height); -	return {width, height}; -} - -void NativeWindowPugl::move(int x, int y) -{ -//	redraw(); -} - -void NativeWindowPugl::show() -{ -	puglShowWindow(view); -} - -void NativeWindowPugl::hide() -{ -	puglHideWindow(view); -} - -bool NativeWindowPugl::visible() const -{ -	return puglGetVisible(view); -} - -void NativeWindowPugl::redraw(const Rect& dirty_rect) -{ -	//puglPostRedisplay(view);//	handleBuffer(); -	onDisplay(view); -} - -void NativeWindowPugl::setCaption(const std::string &caption) -{ -//	redraw(); -} - -void NativeWindowPugl::grabMouse(bool grab) -{ -	puglGrabFocus(view); -} - -EventQueue NativeWindowPugl::getEvents() -{ -	puglProcessEvents(view); -	EventQueue events; -	std::swap(events, event_queue); -	return events; -} - -void* NativeWindowPugl::getNativeWindowHandle() const -{ -	return (void*)puglGetNativeWindow(view); -} - -void NativeWindowPugl::onEvent(PuglView* view, const PuglEvent* event) -{ -	NativeWindowPugl* native = (NativeWindowPugl*)puglGetHandle(view); - -	switch(event->type) -	{ -	case PUGL_NOTHING: -		break; -	case PUGL_CONFIGURE: -		onReshape(view, event->configure.width, event->configure.height); -		{ -			auto resize_event = std::make_shared<ResizeEvent>(); -			resize_event->width = event->configure.width; -			resize_event->height = event->configure.height; -			native->event_queue.push_back(resize_event); -		} -		break; -	case PUGL_EXPOSE: -		onDisplay(view); -		break; -	case PUGL_CLOSE: -		//quit = 1; -		break; -	case PUGL_KEY_PRESS: -		fprintf(stderr, "Key %u (char %u) press (%s)%s\n", -		        event->key.keycode, event->key.character, event->key.utf8, -		        event->key.filter ? " (filtered)" : ""); -		if (event->key.character == 'q' || -		    event->key.character == 'Q' || -		    event->key.character == PUGL_CHAR_ESCAPE) { -			//quit = 1; -		} -		break; -	case PUGL_KEY_RELEASE: -		fprintf(stderr, "Key %u (char %u) release (%s)%s\n", -		        event->key.keycode, event->key.character, event->key.utf8, -		        event->key.filter ? " (filtered)" : ""); -		break; -	case PUGL_MOTION_NOTIFY: -		{ -			auto mouseMoveEvent = std::make_shared<MouseMoveEvent>(); -			mouseMoveEvent->x = event->motion.x; -			mouseMoveEvent->y = event->motion.y; -			native->event_queue.push_back(mouseMoveEvent); -		} -		break; -	case PUGL_BUTTON_PRESS: -	case PUGL_BUTTON_RELEASE: -		{ -			auto buttonEvent = std::make_shared<ButtonEvent>(); -			buttonEvent->x = event->button.x; -			buttonEvent->y = event->button.y; -			switch(event->button.button) { -			case 1: -				buttonEvent->button = MouseButton::left; -				break; -			case 2: -				buttonEvent->button = MouseButton::middle; -				break; -			case 3: -				buttonEvent->button = MouseButton::right; -				break; -			default: -				WARN(X11, "Unknown button %d, setting to MouseButton::left\n", -				     event->button.button); -				buttonEvent->button = MouseButton::left; -				break; -			} - -			buttonEvent->direction = -				(event->type == PUGL_BUTTON_PRESS) ? -				Direction::down : Direction::up; - -			buttonEvent->doubleClick = -				(event->type == PUGL_BUTTON_PRESS) && -				((event->button.time - native->last_click) < 200); - -			if(event->type == PUGL_BUTTON_PRESS) -			{ -				native->last_click = event->button.time; -			} -			native->event_queue.push_back(buttonEvent); -		} -		fprintf(stderr, "Mouse %d %s at %f,%f ", -		        event->button.button, -		        (event->type == PUGL_BUTTON_PRESS) ? "down" : "up", -		        event->button.x, -		        event->button.y); -		///printModifiers(view, event->scroll.state); -		break; -	case PUGL_SCROLL: -		{ -			auto scrollEvent = std::make_shared<ScrollEvent>(); -			scrollEvent->x = event->scroll.x; -			scrollEvent->y = event->scroll.y; -			scrollEvent->delta = event->scroll.dy * -1;//scroll * ((xevent.xbutton.button == 4) ? -1 : 1); -			native->event_queue.push_back(scrollEvent); -		} -		fprintf(stderr, "Scroll %f %f %f %f ", -		        event->scroll.x, event->scroll.y, event->scroll.dx, event->scroll.dy); -		//printModifiers(view, event->scroll.state); -		//dist += event->scroll.dy; -		//if (dist < 10.0f) { -		//	dist = 10.0f; -		//} -		puglPostRedisplay(view); -		break; -	case PUGL_ENTER_NOTIFY: -		fprintf(stderr, "Entered\n"); -		break; -	case PUGL_LEAVE_NOTIFY: -		fprintf(stderr, "Exited\n"); -		break; -	case PUGL_FOCUS_IN: -		fprintf(stderr, "Focus in\n"); -		break; -	case PUGL_FOCUS_OUT: -		fprintf(stderr, "Focus out\n"); -		break; -	} -} - -void NativeWindowPugl::onReshape(PuglView* view, int width, int height) -{ -	glMatrixMode(GL_PROJECTION); -	glLoadIdentity(); -	glViewport(0, 0, width, height); -} - -void NativeWindowPugl::onDisplay(PuglView* view) -{ -	NativeWindowPugl* native = (NativeWindowPugl*)puglGetHandle(view); -	Window& window = native->window; -	//window.redraw(); - -	if((window.wpixbuf.width < 16) || (window.wpixbuf.height < 16)) -	{ -		return; -	} - -	puglEnterContext(view); - -	glDisable(GL_DEPTH_TEST); -	glClear(GL_COLOR_BUFFER_BIT); - -	glMatrixMode(GL_MODELVIEW); -	glLoadIdentity(); -	glTranslatef(0.0f, 0.0f, 0.0f); - -	GLuint image; - -	glGenTextures(1, &image); - -	//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); -	//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - -	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -	glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_REPLACE); - -	glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -	glTexImage2D(GL_TEXTURE_2D, -	             0, GL_RGBA, -	             window.wpixbuf.width, -	             window.wpixbuf.height, -	             0, GL_RGB, GL_UNSIGNED_BYTE, -	             window.wpixbuf.buf); - -	glEnable(GL_TEXTURE_2D); - -	glBegin(GL_QUADS); -	glTexCoord2d(0.0f,  0.0f); glVertex2f(-1.0f, -1.0f); -	glTexCoord2d(0.0f, -1.0f); glVertex2f(-1.0f,  1.0f); -	glTexCoord2d(1.0f, -1.0f); glVertex2f( 1.0f,  1.0f); -	glTexCoord2d(1.0f,  0.0f); glVertex2f( 1.0f, -1.0f); -	glEnd(); - -	glDeleteTextures(1, &image); -	glDisable(GL_TEXTURE_2D); -	glFlush(); - -	puglLeaveContext(view, true); -} - -void NativeWindowPugl::onMouse(PuglView* view, int button, bool press, int x, int y) -{ -	NativeWindowPugl* native = (NativeWindowPugl*)puglGetHandle(view); - -	DEBUG(nativewindow_pugl, "Mouse %d %s at (%d,%d)\n", button, -	      press? "down":"up", x, y); - -	ButtonEvent* e = new ButtonEvent(); -	e->x = x; -	e->y = y; - -	switch(button) { -	case 1: -		e->button = MouseButton::left; -		break; -	case 2: -		e->button = MouseButton::middle; -		break; -	case 3: -	default: -		e->button = MouseButton::right; -		break; -	} - -	e->direction = press ? Direction::down : Direction::up; -	e->doubleClick = false; - -	native->eventq.push_back(e); -} - -void NativeWindowPugl::onKeyboard(PuglView* view, bool press, uint32_t key) -{ -	NativeWindowPugl* native = (NativeWindowPugl*)puglGetHandle(view); - -	KeyEvent* e = new KeyEvent(); -	e->direction = press ? Direction::down : Direction::up; - -	switch(key) -	{ -	case PUGL_KEY_LEFT: e->keycode = Key::left; break; -	case PUGL_KEY_RIGHT: e->keycode = Key::right; break; -	case PUGL_KEY_UP: e->keycode = Key::up; break; -	case PUGL_KEY_DOWN: e->keycode = Key::down; break; -	case PUGL_KEY_PAGE_UP: e->keycode = Key::pageDown; break; -	case PUGL_KEY_PAGE_DOWN: e->keycode = Key::pageUp; break; -	default: e->keycode = Key::unknown; break; -	} - -	// TODO: perform character type check -	if(e->keycode == Key::unknown) -	{ -		e->keycode = Key::character; -		e->text.assign(1, (char)key); -	} - -	native->eventq.push_back(e); -} - -} // GUI:: diff --git a/plugingui/nativewindow_pugl.h b/plugingui/nativewindow_pugl.h deleted file mode 100644 index 6a667f4..0000000 --- a/plugingui/nativewindow_pugl.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_pugl.h - * - *  Fri Dec 28 18:45:56 CET 2012 - *  Copyright 2012 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "nativewindow.h" -extern "C" -{ -#include <pugl/pugl.h> -} - -#include <list> - -namespace GUI -{ - -class Event; -class Window; - -class NativeWindowPugl : public NativeWindow { -public: -	NativeWindowPugl(void* native_window, Window& window); -	~NativeWindowPugl(); - -	void setFixedSize(std::size_t width, std::size_t height) override; -	void resize(std::size_t width, std::size_t height) override; -	std::pair<std::size_t, std::size_t> getSize() const override; - -	void move(int x, int y) override; -	std::pair<int, int> getPosition() const override{ return {}; } - -	void show() override; -	void setCaption(const std::string &caption) override; -	void hide() override; -	bool visible() const override; -	void redraw(const Rect& dirty_rect) override; -	void grabMouse(bool grab) override; - -	EventQueue getEvents() override; - -	void* getNativeWindowHandle() const override; - -private: -	Window& window; -	PuglView* view{nullptr}; - -	std::list<Event*> eventq; - -	// Internal pugl c-callbacks -	static void onEvent(PuglView* view, const PuglEvent* event); -	static void onReshape(PuglView* view, int width, int height); -	static void onDisplay(PuglView* view); -	static void onMouse(PuglView* view, int button, bool press, int x, int y); -	static void onKeyboard(PuglView* view, bool press, uint32_t key); - -	EventQueue event_queue; -	std::uint32_t last_click{0}; -}; - -} // GUI:: diff --git a/plugingui/nativewindow_win32.cc b/plugingui/nativewindow_win32.cc deleted file mode 100644 index 4b31130..0000000 --- a/plugingui/nativewindow_win32.cc +++ /dev/null @@ -1,584 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_win32.cc - * - *  Fri Dec 28 18:45:52 CET 2012 - *  Copyright 2012 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "nativewindow_win32.h" - -#include <cstring> -#include <algorithm> -#include <commctrl.h> - -#include "window.h" - -namespace GUI -{ - -static BOOL trackMouse(HWND hwnd) -{ -	TRACKMOUSEEVENT ev{}; -	ev.cbSize = sizeof(ev); -	ev.dwFlags = TME_HOVER | TME_LEAVE; -	ev.hwndTrack = hwnd; -	ev.dwHoverTime = 1; -	return TrackMouseEvent(&ev); -} - -LRESULT CALLBACK NativeWindowWin32::dialogProc(HWND hwnd, UINT msg, -                                               WPARAM wp, LPARAM lp) -{ -	NativeWindowWin32* native = -		(NativeWindowWin32*)GetWindowLongPtr(hwnd, GWLP_USERDATA); - -	// NOTE: 'native' is nullptr intil the WM_CREATE message has been handled. -	if(!native) -	{ -		return DefWindowProc(hwnd, msg, wp, lp); -	} - -	Window& window = native->window; - -	switch(msg) -	{ -	case WM_SIZE: -		if(wp > 4) -		{ -			// Bogus value - ignore -			break; -		} -		{ -			auto resizeEvent = std::make_shared<ResizeEvent>(); -			resizeEvent->width = LOWORD(lp); -			resizeEvent->height = HIWORD(lp); -			native->event_queue.push_back(resizeEvent); -		} -		break; - -	case WM_MOVE: -		{ -			auto moveEvent = std::make_shared<MoveEvent>(); -			moveEvent->x = (short)LOWORD(lp); -			moveEvent->y = (short)HIWORD(lp); -			native->event_queue.push_back(moveEvent); -		} -		break; - -	case WM_CLOSE: -		{ -			auto closeEvent = std::make_shared<CloseEvent>(); -			native->event_queue.push_back(closeEvent); -		} -		return 0; // Do not call DefWindowProc for this event. -//		HWND child, old; -//		old	= 0; - -//		numDialogs--; - -//		while(old != (child = GetNextDlgGroupItem(hwnd, hwnd, false))) { -//			old = child; -//			EndDialog(child, 0); -//		} - -//		if(numDialogs) EndDialog(hwnd, 0); -//		else PostQuitMessage(0); -//		return 0; -	case WM_MOUSEMOVE: -		{ -			trackMouse(native->m_hwnd); -			auto mouseMoveEvent = std::make_shared<MouseMoveEvent>(); -			mouseMoveEvent->x = (short)LOWORD(lp); -			mouseMoveEvent->y = (short)HIWORD(lp); -			native->last_mouse_position = { mouseMoveEvent->x, mouseMoveEvent->y }; - -			if(!native->mouse_in_window) -			{ -				auto enterEvent = std::make_shared<MouseEnterEvent>(); -				enterEvent->x = native->last_mouse_position.first; -				enterEvent->y = native->last_mouse_position.second; -				native->event_queue.push_back(enterEvent); -				native->mouse_in_window = true; -			} -			native->event_queue.push_back(mouseMoveEvent); -		} -		break; - -	case WM_MOUSEWHEEL: -		{ -			auto scrollEvent = std::make_shared<ScrollEvent>(); - -			// NOTE: lp is coordinates in screen space, not client space. -			POINT p; -			p.x = (short)LOWORD(lp); -			p.y = (short)HIWORD(lp); -			ScreenToClient(hwnd, &p); - -			scrollEvent->x = p.x; -			scrollEvent->y = p.y; -			scrollEvent->delta = -1 * (short)HIWORD(wp) / 60.0f; -			native->event_queue.push_back(scrollEvent); -		} -		break; - -	case WM_LBUTTONUP: -	case WM_LBUTTONDBLCLK: -	case WM_LBUTTONDOWN: -	case WM_RBUTTONUP: -	case WM_RBUTTONDBLCLK: -	case WM_RBUTTONDOWN: -	case WM_MBUTTONUP: -	case WM_MBUTTONDBLCLK: -	case WM_MBUTTONDOWN: -		{ -			auto buttonEvent = std::make_shared<ButtonEvent>(); - -			buttonEvent->x = (short)LOWORD(lp); -			buttonEvent->y = (short)HIWORD(lp); - -			if(msg == WM_LBUTTONUP || -			   msg == WM_LBUTTONDBLCLK || -			   msg == WM_LBUTTONDOWN) -			{ -				buttonEvent->button = MouseButton::left; -			} -			else if(msg == WM_MBUTTONUP || -			        msg == WM_MBUTTONDBLCLK || -			        msg == WM_MBUTTONDOWN) -			{ -				buttonEvent->button = MouseButton::middle; -			} -			else if(msg == WM_RBUTTONUP || -			        msg == WM_RBUTTONDBLCLK || -			        msg == WM_RBUTTONDOWN) -			{ -				buttonEvent->button = MouseButton::right; -			} -			else -			{ -				break; // unknown button -			} - -			// Double-clicking the a mouse button actually generates a sequence -			// of four messages: WM_xBUTTONDOWN, WM_xBUTTONUP, WM_xBUTTONDBLCLK, and -			// WM_xBUTTONUP. In other words the second WM_xBUTTONDOWN is replaced by a -			// WM_xBUTTONDBLCLK. We simply 'return it' as a WM_xBUTTONDOWN but set the -			// doubleClick boolean hint accordingly. -			if(msg == WM_LBUTTONUP || -			   msg == WM_RBUTTONUP || -			   msg == WM_MBUTTONUP) -			{ -				buttonEvent->direction = Direction::up; -			} -			else if(msg == WM_LBUTTONDOWN || -			        msg == WM_RBUTTONDOWN || -			        msg == WM_MBUTTONDOWN || -			        msg == WM_LBUTTONDBLCLK || -			        msg == WM_RBUTTONDBLCLK || -			        msg == WM_MBUTTONDBLCLK) -			{ -				buttonEvent->direction = Direction::down; -			} - -			buttonEvent->doubleClick = (msg == WM_LBUTTONDBLCLK || -			                            msg == WM_RBUTTONDBLCLK || -			                            msg == WM_MBUTTONDBLCLK); - -			native->event_queue.push_back(buttonEvent); -		} -		break; - -	case WM_KEYDOWN: -	case WM_KEYUP: -		{ -			auto keyEvent = std::make_shared<KeyEvent>(); - -			switch(wp) { -			case VK_LEFT:   keyEvent->keycode = Key::left;      break; -			case VK_RIGHT:  keyEvent->keycode = Key::right;     break; -			case VK_UP:     keyEvent->keycode = Key::up;        break; -			case VK_DOWN:   keyEvent->keycode = Key::down;      break; -			case VK_BACK:   keyEvent->keycode = Key::backspace; break; -			case VK_DELETE: keyEvent->keycode = Key::deleteKey; break; -			case VK_HOME:   keyEvent->keycode = Key::home;      break; -			case VK_END:    keyEvent->keycode = Key::end;       break; -			case VK_PRIOR:  keyEvent->keycode = Key::pageUp;    break; -			case VK_NEXT:   keyEvent->keycode = Key::pageDown;  break; -			case VK_RETURN: keyEvent->keycode = Key::enter;     break; -			default:        keyEvent->keycode = Key::unknown;   break; -			} - -			keyEvent->text = ""; -			keyEvent->direction = -				(msg == WM_KEYDOWN) ? Direction::down : Direction::up; - -			native->event_queue.push_back(keyEvent); -		} -		break; - -	case WM_CHAR: -		{ -			if(wp >= ' ') // Filter control chars. -			{ -				auto keyEvent = std::make_shared<KeyEvent>(); -				keyEvent->keycode = Key::character; -				keyEvent->text += (char)wp; -				keyEvent->direction = Direction::up; -				native->event_queue.push_back(keyEvent); -			} -		} -		break; - -	case WM_PAINT: -		{ -			RECT rect; -			GetUpdateRect(hwnd, &rect, FALSE); - -			// Bypass partial update, which is apparrently broken. -			rect.left = 0; -			rect.top = 0; -			rect.right = window.wpixbuf.width; -			rect.bottom = window.wpixbuf.height; - -			auto repaintEvent = std::make_shared<RepaintEvent>(); -			repaintEvent->x = rect.left; -			repaintEvent->y = rect.top; -			repaintEvent->width = rect.right - rect.left; -			repaintEvent->height = rect.bottom - rect.top; -			native->event_queue.push_back(repaintEvent); - -			// Move to window.h (in class) -			HDC pDC; -			HBITMAP old; -			HBITMAP ourbitmap; -			int* framebuf; -			PixelBuffer& px = window.wpixbuf; - -			{ // Create bitmap -				HDC hDC; -				BITMAPINFO bitmapinfo; -				hDC = CreateCompatibleDC(nullptr); -				bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); -				bitmapinfo.bmiHeader.biWidth = px.width; -				bitmapinfo.bmiHeader.biHeight = -px.height; // top-down -				bitmapinfo.bmiHeader.biPlanes = 1; -				bitmapinfo.bmiHeader.biBitCount = 32; -				bitmapinfo.bmiHeader.biCompression = BI_RGB; -				bitmapinfo.bmiHeader.biSizeImage = 0; -				bitmapinfo.bmiHeader.biClrUsed = 256; -				bitmapinfo.bmiHeader.biClrImportant = 256; -				ourbitmap = CreateDIBSection(hDC, &bitmapinfo, -				                             DIB_RGB_COLORS, (void**)&framebuf, 0, 0); -				pDC=CreateCompatibleDC(nullptr); -				old = (HBITMAP__*)SelectObject(pDC, ourbitmap); -				DeleteDC(hDC); -			} - -			int from_x = rect.left; -			int to_x = std::min(rect.right, (long)px.width); -			int from_y = rect.top; -			int to_y = std::min(rect.bottom, (long)px.height); -			{ // Copy PixelBuffer to framebuffer -				int idx = 0; -				for(int y = from_y; y < to_y; ++y) -				{ -					for(int x = from_x; x < to_x; ++x) -					{ -						*(framebuf + idx) = RGB(px.buf[(x + y * px.width) * 3 + 2], -						                        px.buf[(x + y * px.width) * 3 + 1], -						                        px.buf[(x + y * px.width) * 3 + 0]); -						++idx; -					} -				} -			} - -			PAINTSTRUCT ps; -			HDC hdc = BeginPaint(native->m_hwnd, &ps); -			BitBlt(hdc, from_x, from_y, to_x, to_y, pDC, from_x, from_y, SRCCOPY); -			EndPaint(native->m_hwnd, &ps); - -			{ // Destroy bitmap (move to window.cc) -				SelectObject(pDC,old); -				DeleteDC(pDC); -				DeleteObject(ourbitmap); -			} -		} -		break; - -	case WM_MOUSELEAVE: -		{ -			auto leaveEvent = std::make_shared<MouseLeaveEvent>(); -			leaveEvent->x = native->last_mouse_position.first; -			leaveEvent->y = native->last_mouse_position.second; -			native->event_queue.push_back(leaveEvent); -			native->mouse_in_window = false; -		} -		break; -	} - -	return DefWindowProc(hwnd, msg, wp, lp); -} - -LRESULT CALLBACK NativeWindowWin32::subClassProc(HWND hwnd, UINT msg, -                                                 WPARAM wp, LPARAM lp, -                                                 UINT_PTR id, DWORD_PTR data) -{ -	NativeWindowWin32* native = (NativeWindowWin32*)data; - -	// NOTE: 'native' is nullptr intil the WM_CREATE message has been handled. -	if(!native) -	{ -		return DefWindowProc(hwnd, msg, wp, lp); -	} - -	switch(msg) -	{ -	case WM_SIZE: -		if(wp > 4) -		{ -			// Bogus value - ignore -			break; -		} -		{ -			// Parent window size changed, replicate this size in inner window. -			int width = LOWORD(lp); -			int height = HIWORD(lp); -			SetWindowPos(native->m_hwnd, nullptr, -1, -1, width, height, SWP_NOMOVE); -		} -		break; -	} - -	return DefSubclassProc(hwnd, msg, wp, lp); -} - -NativeWindowWin32::NativeWindowWin32(void* native_window, Window& window) -	: window(window) -{ -	WNDCLASSEX wcex{}; - -	//Time to register a window class. -	//Generic flags and everything. cbWndExtra is the size of a pointer to an -	// object - we need this in the wndproc handler. - -	wcex.cbSize = sizeof(WNDCLASSEX); -	wcex.style = CS_DBLCLKS;//class_style; -	wcex.lpfnWndProc = (WNDPROC)dialogProc; -	wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); -	// Set data: -	wcex.cbWndExtra = sizeof(NativeWindowWin32*); // Size of data. -	wcex.hInstance = GetModuleHandle(nullptr); - -	//	if(ex_style && WS_EX_TRANSPARENT == WS_EX_TRANSPARENT) { -	//		wcex.hbrBackground = nullptr; -	//	} else { -	wcex.hbrBackground = nullptr;//(HBRUSH) COLOR_BACKGROUND + 1; -	//	} - -	const char* name = "DrumGizmoClass"; -	char* c_name = (char*)malloc(strlen(name) + 1); -	strcpy(c_name, name); -	wcex.lpszClassName = m_className = c_name; - -	RegisterClassEx(&wcex); - -	parent_window = (HWND)native_window; - -	int width = 1, height = 1; -	if(parent_window) -	{ -		// Listen in on parent size changes. -		SetWindowSubclass(parent_window, subClassProc, 42, (LONG_PTR)this); - -		// Resize newly created window to fit into parent. -		RECT rect; -		GetClientRect(parent_window, &rect); - -		auto resizeEvent = std::make_shared<ResizeEvent>(); -		width = resizeEvent->width = rect.right - rect.left; -		height = resizeEvent->height = rect.bottom - rect.top; -		event_queue.push_back(resizeEvent); -	} - -	m_hwnd = CreateWindowEx(0/*ex_style*/, m_className, -	                        "DGBasisWidget", -	                        (native_window?WS_CHILD:WS_OVERLAPPEDWINDOW) | -	                        (native_window?WS_VISIBLE:0), -	                        0, 0, -	                        width, height, -	                        parent_window, nullptr, -	                        GetModuleHandle(nullptr), nullptr); - -	SetWindowLongPtr(m_hwnd, GWLP_USERDATA, (LONG_PTR)this); - -	// Set up initial tracking of the mouse leave events -	trackMouse(m_hwnd); -} - -NativeWindowWin32::~NativeWindowWin32() -{ -	if(parent_window) -	{ -		RemoveWindowSubclass(parent_window, subClassProc, 42); -	} -	DestroyWindow(m_hwnd); -	UnregisterClass(m_className, GetModuleHandle(nullptr)); -	free(m_className); -} - -void NativeWindowWin32::setFixedSize(std::size_t width, std::size_t height) -{ -	resize(width, height); -	LONG style =  GetWindowLong(m_hwnd, GWL_STYLE); -	style &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX); -	SetWindowLong(m_hwnd, GWL_STYLE, style); -} - -void NativeWindowWin32::setAlwaysOnTop(bool always_on_top) -{ -	this->always_on_top = always_on_top; -	SetWindowPos(m_hwnd, always_on_top ? HWND_TOPMOST : nullptr, -	             0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); -} - -void NativeWindowWin32::resize(std::size_t width, std::size_t height) -{ -	auto hwnd = m_hwnd; -	//if(parent_window) -	//{ -	//	hwnd = parent_window; -	//} - -	// Set requested size on the window (or parent) -	SetWindowPos(hwnd, always_on_top ? HWND_TOPMOST : nullptr, -	             -1, -1, (int)width, (int)height, SWP_NOMOVE); - -	// Ask the client window what size it actually got -	RECT rect; -	GetClientRect(m_hwnd, &rect); -	int w = width - rect.right; -	int h = height - rect.bottom; - -	// Set the compensated size on the window (or parent) -	SetWindowPos(hwnd, always_on_top ? HWND_TOPMOST : nullptr, -	             -1, -1, width + w, height + h, SWP_NOMOVE); -} - -std::pair<std::size_t, std::size_t> NativeWindowWin32::getSize() const -{ -	RECT rect; -	GetClientRect(m_hwnd, &rect); -	return std::make_pair(rect.right - rect.left, rect.bottom - rect.top); -} - -void NativeWindowWin32::move(int x, int y) -{ -	SetWindowPos(m_hwnd, always_on_top ? HWND_TOPMOST : nullptr, -	             (int)x, (int)y, -1, -1, SWP_NOSIZE); -} - -std::pair<int, int> NativeWindowWin32::getPosition() const -{ -	RECT rect; -	GetClientRect(m_hwnd, &rect); -	return std::make_pair(rect.left, rect.top); -} - -void NativeWindowWin32::show() -{ -	ShowWindow(m_hwnd, SW_SHOW); -} - -void NativeWindowWin32::hide() -{ -	ShowWindow(m_hwnd, SW_HIDE); -} - -bool NativeWindowWin32::visible() const -{ -	return IsWindowVisible(m_hwnd); -} - -void NativeWindowWin32::redraw(const Rect& dirty_rect) -{ -	// Send WM_PAINT message. Buffer transfering is handled in MessageHandler. -	if(parent_window == nullptr) -	{ -		RECT rect = -			{ -				(long)dirty_rect.x1, -				(long)dirty_rect.y1, -				(long)dirty_rect.x2, -				(long)dirty_rect.y2 -			}; -		RedrawWindow(m_hwnd, &rect, nullptr, RDW_INVALIDATE); -		UpdateWindow(m_hwnd); -	} -	else -	{ -		InvalidateRect(m_hwnd, 0, TRUE); -	} -} - -void NativeWindowWin32::setCaption(const std::string &caption) -{ -	SetWindowText(m_hwnd, caption.c_str()); -} - -void NativeWindowWin32::grabMouse(bool grab) -{ -	if(grab) -	{ -		SetCapture(m_hwnd); -	} -	else -	{ -		ReleaseCapture(); -	} -} - -EventQueue NativeWindowWin32::getEvents() -{ -	MSG msg; -	while(PeekMessage(&msg, m_hwnd, 0, 0, PM_REMOVE) != 0) -	{ -		TranslateMessage(&msg); -		DispatchMessage(&msg); -	} - -	EventQueue events; -	std::swap(events, event_queue); -	return events; -} - -void* NativeWindowWin32::getNativeWindowHandle() const -{ -	return (void*)m_hwnd; -} - -Point NativeWindowWin32::translateToScreen(const Point& point) -{ -	POINT p{ point.x, point.y }; -	ClientToScreen(m_hwnd, &p); -	return { p.x, p.y }; -} - -} // GUI:: diff --git a/plugingui/nativewindow_win32.h b/plugingui/nativewindow_win32.h deleted file mode 100644 index 046b38a..0000000 --- a/plugingui/nativewindow_win32.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_win32.h - * - *  Fri Dec 28 18:45:51 CET 2012 - *  Copyright 2012 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <queue> - -#include "nativewindow.h" - -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -typedef HWND WNDID; - -namespace GUI { - -class Window; -class Event; - -class NativeWindowWin32 : public NativeWindow { -public: -	NativeWindowWin32(void* native_window, Window& window); -	~NativeWindowWin32(); - -	void setFixedSize(std::size_t width, std::size_t height) override; -	void setAlwaysOnTop(bool always_on_top) override; -	void resize(std::size_t width, std::size_t height) override; -	std::pair<std::size_t, std::size_t> getSize() const override; -	void move(int x, int y) override; -	std::pair<int, int> getPosition() const override; -	void show() override; -	bool visible() const override; -	void hide() override; -	void redraw(const Rect& dirty_rect) override; -	void setCaption(const std::string &caption) override; -	void grabMouse(bool grab) override; -	EventQueue getEvents() override; -	void* getNativeWindowHandle() const override; -	Point translateToScreen(const Point& point) override; - -private: -	static LRESULT CALLBACK dialogProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); -	static LRESULT CALLBACK subClassProc(HWND hwnd, UINT msg, WPARAM wp, -	                                     LPARAM lp, UINT_PTR id, DWORD_PTR data); - -	HWND parent_window; -	Window& window; -	WNDID m_hwnd = 0; -	bool mouse_in_window{false}; -	std::pair<int, int> last_mouse_position{0, 0}; -	char* m_className = nullptr; -	EventQueue event_queue; -	bool always_on_top{false}; -}; - -} // GUI:: diff --git a/plugingui/nativewindow_x11.cc b/plugingui/nativewindow_x11.cc deleted file mode 100644 index 33dde7b..0000000 --- a/plugingui/nativewindow_x11.cc +++ /dev/null @@ -1,715 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_x11.cc - * - *  Fri Dec 28 18:45:57 CET 2012 - *  Copyright 2012 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "nativewindow_x11.h" - -//http://www.mesa3d.org/brianp/xshm.c - -#include <X11/Xutil.h> -#include <sys/ipc.h> -#include <sys/shm.h> -#include <cerrno> -#include <cstring> -#include <cassert> - -#include <chrono> - -#include <hugin.hpp> - -#include "window.h" - -namespace GUI -{ - -#define _NET_WM_STATE_REMOVE        0    // remove/unset property -#define _NET_WM_STATE_ADD           1    // add/set property - -void setWindowFront(Display *disp, ::Window wind, bool enable) -{ -	Atom wm_state, wm_state_above; -	XEvent event; - -	if((wm_state = XInternAtom(disp, "_NET_WM_STATE", False)) == None) -	{ -		return; -	} - -	if((wm_state_above = XInternAtom(disp, "_NET_WM_STATE_ABOVE", False)) == None) -	{ -		return; -	} -	// -	//window  = the respective client window -	//message_type = _NET_WM_STATE -	//format = 32 -	//data.l[0] = the action, as listed below -	//data.l[1] = first property to alter -	//data.l[2] = second property to alter -	//data.l[3] = source indication (0-unk,1-normal app,2-pager) -	//other data.l[] elements = 0 -	// - -	// sending a ClientMessage -	event.xclient.type = ClientMessage; - -	// value unimportant in this case -	event.xclient.serial = 0; - -	// coming from a SendEvent request, so True -	event.xclient.send_event = True; - -	// the event originates from disp -	event.xclient.display = disp; - -	// the window whose state will be modified -	event.xclient.window = wind; - -	// the component Atom being modified in the window -	event.xclient.message_type = wm_state; - -	// specifies that data.l will be used -	event.xclient.format = 32; - -	// 0 is _NET_WM_STATE_REMOVE, 1 is _NET_WM_STATE_ADD -	event.xclient.data.l[0] = -		enable ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; - -	// the atom being added -	event.xclient.data.l[1] = wm_state_above; - -	// unused -	event.xclient.data.l[2] = 0; -	event.xclient.data.l[3] = 0; -	event.xclient.data.l[4] = 0; - -	// actually send the event -	XSendEvent(disp, DefaultRootWindow(disp), False, -	           SubstructureRedirectMask | SubstructureNotifyMask, &event); -} - -NativeWindowX11::NativeWindowX11(void* native_window, Window& window) -	: window(window) -{ -	display = XOpenDisplay(nullptr); -	if(display  == nullptr) -	{ -		ERR(X11, "XOpenDisplay failed"); -		return; -	} - -	screen = DefaultScreen(display); -	visual = DefaultVisual(display, screen); -	depth = DefaultDepth(display, screen); - -	if(native_window) -	{ -		parent_window = (::Window)native_window; - -		// Track size changes on the parent window -		XSelectInput(display, parent_window, StructureNotifyMask); -	} -	else -	{ -		parent_window = DefaultRootWindow(display); -	} - -	// Create the window -	XSetWindowAttributes swa; -	swa.backing_store = Always; -	xwindow = XCreateWindow(display, -	                        parent_window, -	                        0, 0, //window.x(), window.y(), -	                        1, 1, //window.width(), window.height(), -	                        0, // border -	                        CopyFromParent, // depth -	                        CopyFromParent, // class -	                        CopyFromParent, // visual -	                        0,//CWBackingStore, -	                        &swa); - -	long mask = (StructureNotifyMask | -	             PointerMotionMask | -	             ButtonPressMask | -	             ButtonReleaseMask | -	             KeyPressMask | -	             KeyReleaseMask| -	             ExposureMask | -	             StructureNotifyMask | -	             SubstructureNotifyMask | -	             EnterWindowMask | -	             LeaveWindowMask); -	XSelectInput(display, xwindow, mask); - -	// Register the delete window message: -	wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", false); - -	Atom protocols[] = { wmDeleteMessage }; -	XSetWMProtocols(display, xwindow, protocols, -	                sizeof(protocols) / sizeof(*protocols)); - -	// Create a "Graphics Context" -	gc = XCreateGC(display, xwindow, 0, nullptr); -} - -NativeWindowX11::~NativeWindowX11() -{ -	if(display == nullptr) -	{ -		return; -	} - -	deallocateShmImage(); - -	XFreeGC(display, gc); - -	XDestroyWindow(display, xwindow); -	XCloseDisplay(display); -} - -void NativeWindowX11::setFixedSize(std::size_t width, std::size_t height) -{ -	if(display == nullptr) -	{ -		return; -	} - -	resize(width, height); - -	XSizeHints size_hints; -	memset(&size_hints, 0, sizeof(size_hints)); - -	size_hints.flags = PMinSize|PMaxSize; -	size_hints.min_width = size_hints.max_width = (int)width; -	size_hints.min_height = size_hints.max_height = (int)height; - -	XSetNormalHints(display, xwindow, &size_hints); -} - -void NativeWindowX11::setAlwaysOnTop(bool always_on_top) -{ -	setWindowFront(display, xwindow, always_on_top); -} - -void NativeWindowX11::resize(std::size_t width, std::size_t height) -{ -	if(display == nullptr) -	{ -		return; -	} - -	XResizeWindow(display, xwindow, width, height); -} - -std::pair<std::size_t, std::size_t> NativeWindowX11::getSize() const -{ -//	XWindowAttributes attributes; -//	XGetWindowAttributes(display, xwindow, &attributes); -//	return std::make_pair(attributes.width, attributes.height); - -	::Window root_window; -	int x, y; -	unsigned int width, height, border, depth; - -	XGetGeometry(display, xwindow, &root_window, -	             &x, &y, -	             &width, &height, &border, &depth); - -	return {width, height}; -} - -void NativeWindowX11::move(int x, int y) -{ -	if(display == nullptr) -	{ -		return; -	} - -	XMoveWindow(display, xwindow, x, y); -} - -std::pair<int, int> NativeWindowX11::getPosition() const -{ -	::Window root_window; -	::Window child_window; -	int x, y; -	unsigned int width, height, border, depth; - -	XGetGeometry(display, xwindow, &root_window, -	             &x, &y, -	             &width, &height, &border, &depth); - -	XTranslateCoordinates(display, xwindow, root_window, -	                      0, 0, &x, &y, &child_window); - -	return std::make_pair(x, y); -} - -void NativeWindowX11::show() -{ -	if(display == nullptr) -	{ -		return; -	} - -	XMapWindow(display, xwindow); -} - -void NativeWindowX11::hide() -{ -	if(display == nullptr) -	{ -		return; -	} - -	XUnmapWindow(display, xwindow); -} - -bool NativeWindowX11::visible() const -{ -	if(display == nullptr) -	{ -		return false; -	} - -	XWindowAttributes xwa; -	XGetWindowAttributes(display, xwindow, &xwa); -	return (xwa.map_state == IsViewable); -} - -void NativeWindowX11::redraw(const Rect& dirty_rect) -{ -	if(display == nullptr) -	{ -		return; -	} - -	auto x1 = dirty_rect.x1; -	auto y1 = dirty_rect.y1; -	auto x2 = dirty_rect.x2; -	auto y2 = dirty_rect.y2; - -	// Assert that we don't try to paint a backwards rect. -	assert(x1 <= x2); -	assert(y1 <= y2); - -	updateImageFromBuffer(x1, y1, x2, y2); - -	XShmPutImage(display, xwindow, gc, image, x1, y1, x1, y1, -	             std::min((std::size_t)image->width, (x2 - x1)), -	             std::min((std::size_t)image->height, (y2 - y1)), false); -	XFlush(display); -} - -void NativeWindowX11::setCaption(const std::string &caption) -{ -	if(display == nullptr) -	{ -		return; -	} - -	XStoreName(display, xwindow, caption.c_str()); -} - -void NativeWindowX11::grabMouse(bool grab) -{ -	(void)grab; -	// Don't need to do anything on this platform... -} - -EventQueue NativeWindowX11::getEvents() -{ -	while(XPending(display)) -	{ -		XEvent xEvent; -		XNextEvent(display, &xEvent); -		translateXMessage(xEvent); -	} - -	EventQueue events; -	std::swap(events, event_queue); -	return events; -} - -void* NativeWindowX11::getNativeWindowHandle() const -{ -	return (void*)xwindow; -} - -Point NativeWindowX11::translateToScreen(const Point& point) -{ -	::Window child_window; -	Point p; -	XTranslateCoordinates(display, xwindow, DefaultRootWindow(display), -	                      point.x, point.y, &p.x, &p.y, &child_window); -	return p; -} - -void NativeWindowX11::translateXMessage(XEvent& xevent) -{ -	switch(xevent.type) -	{ -	case MotionNotify: -		//DEBUG(x11, "MotionNotify"); -		{ -			auto mouseMoveEvent = std::make_shared<MouseMoveEvent>(); -			mouseMoveEvent->x = xevent.xmotion.x; -			mouseMoveEvent->y = xevent.xmotion.y; -			event_queue.push_back(mouseMoveEvent); -		} -		break; - -	case Expose: -		//DEBUG(x11, "Expose"); -		if(xevent.xexpose.count == 0) -		{ -			auto repaintEvent = std::make_shared<RepaintEvent>(); -			repaintEvent->x = xevent.xexpose.x; -			repaintEvent->y = xevent.xexpose.y; -			repaintEvent->width = xevent.xexpose.width; -			repaintEvent->height = xevent.xexpose.height; -			event_queue.push_back(repaintEvent); - -			if(image) -			{ -				// Redraw the entire window. -				Rect rect{0, 0, window.wpixbuf.width, window.wpixbuf.height}; -				redraw(rect); -			} -		} -		break; - -	case ConfigureNotify: -		//DEBUG(x11, "ConfigureNotify"); - -		// The parent window size changed, reflect the new size in our own window. -		if(xevent.xconfigure.window == parent_window) -		{ -			resize(xevent.xconfigure.width, xevent.xconfigure.height); -			return; -		} - -		{ -			if((window.width() != (std::size_t)xevent.xconfigure.width) || -			   (window.height() != (std::size_t)xevent.xconfigure.height)) -			{ -				auto resizeEvent = std::make_shared<ResizeEvent>(); -				resizeEvent->width = xevent.xconfigure.width; -				resizeEvent->height = xevent.xconfigure.height; -				event_queue.push_back(resizeEvent); -			} - -			if((window.x() != xevent.xconfigure.x) || -			   (window.y() != xevent.xconfigure.y)) -			{ -				auto moveEvent = std::make_shared<MoveEvent>(); -				moveEvent->x = xevent.xconfigure.x; -				moveEvent->y = xevent.xconfigure.y; -				event_queue.push_back(moveEvent); -			} -		} -		break; - -	case ButtonPress: -	case ButtonRelease: -		//DEBUG(x11, "ButtonPress"); -		{ -			if((xevent.xbutton.button == 4) || (xevent.xbutton.button == 5)) -			{ -				if(xevent.type == ButtonPress) -				{ -					int scroll = 1; -					auto scrollEvent = std::make_shared<ScrollEvent>(); -					scrollEvent->x = xevent.xbutton.x; -					scrollEvent->y = xevent.xbutton.y; -					scrollEvent->delta = scroll * ((xevent.xbutton.button == 4) ? -1 : 1); -					event_queue.push_back(scrollEvent); -				} -			} -			else if ((xevent.xbutton.button == 6) || (xevent.xbutton.button == 7)) -			{ -				// Horizontal scrolling case -				// FIXME Introduce horizontal scrolling event to handle this. -			} -			else -			{ -				auto buttonEvent = std::make_shared<ButtonEvent>(); -				buttonEvent->x = xevent.xbutton.x; -				buttonEvent->y = xevent.xbutton.y; -				switch(xevent.xbutton.button) { -				case 1: -					buttonEvent->button = MouseButton::left; -					break; -				case 2: -					buttonEvent->button = MouseButton::middle; -					break; -				case 3: -					buttonEvent->button = MouseButton::right; -					break; -				default: -					WARN(X11, "Unknown button %d, setting to MouseButton::left\n", -					     xevent.xbutton.button); -					buttonEvent->button = MouseButton::left; -					break; -				} - -				buttonEvent->direction = -					(xevent.type == ButtonPress) ? -					Direction::down : Direction::up; - -				// This is a fix for hosts (e.g. those using JUCE) that set the -				// event time to '0'. -				if(xevent.xbutton.time == 0) -				{ -					auto now = std::chrono::system_clock::now().time_since_epoch(); -					xevent.xbutton.time = -						std::chrono::duration_cast<std::chrono::milliseconds>(now).count(); -				} - -				buttonEvent->doubleClick = -					(xevent.type == ButtonPress) && -					((xevent.xbutton.time - last_click) < 200); - -				if(xevent.type == ButtonPress) -				{ -					last_click = xevent.xbutton.time; -				} -				event_queue.push_back(buttonEvent); -			} -		} -		break; - -	case KeyPress: -	case KeyRelease: -		//DEBUG(x11, "KeyPress"); -		{ -			auto keyEvent = std::make_shared<KeyEvent>(); - -			switch(xevent.xkey.keycode) { -			case 113: keyEvent->keycode = Key::left; break; -			case 114: keyEvent->keycode = Key::right; break; -			case 111: keyEvent->keycode = Key::up; break; -			case 116: keyEvent->keycode = Key::down; break; -			case 119: keyEvent->keycode = Key::deleteKey; break; -			case 22:  keyEvent->keycode = Key::backspace; break; -			case 110: keyEvent->keycode = Key::home; break; -			case 115: keyEvent->keycode = Key::end; break; -			case 117: keyEvent->keycode = Key::pageDown; break; -			case 112: keyEvent->keycode = Key::pageUp; break; -			case 36:  keyEvent->keycode = Key::enter; break; -			default:  keyEvent->keycode = Key::unknown; break; -			} - -			char stringBuffer[1024]; -			int size = XLookupString(&xevent.xkey, stringBuffer, -		                         sizeof(stringBuffer), nullptr, nullptr); -			if(size && keyEvent->keycode == Key::unknown) -			{ -				keyEvent->keycode = Key::character; -			} - -			keyEvent->text.append(stringBuffer, size); - -			keyEvent->direction = -				(xevent.type == KeyPress) ? Direction::down : Direction::up; - -			event_queue.push_back(keyEvent); -		} -		break; - -	case ClientMessage: -		//DEBUG(x11, "ClientMessage"); -		if(((unsigned int)xevent.xclient.data.l[0] == wmDeleteMessage)) -		{ -			auto closeEvent = std::make_shared<CloseEvent>(); -			event_queue.push_back(closeEvent); -		} -		break; - -	case EnterNotify: -		//DEBUG(x11, "EnterNotify"); -		{ -			auto enterEvent = std::make_shared<MouseEnterEvent>(); -			enterEvent->x = xevent.xcrossing.x; -			enterEvent->y = xevent.xcrossing.y; -			event_queue.push_back(enterEvent); -		} -		break; - -	case LeaveNotify: -		//DEBUG(x11, "LeaveNotify"); -		{ -			auto leaveEvent = std::make_shared<MouseLeaveEvent>(); -			leaveEvent->x = xevent.xcrossing.x; -			leaveEvent->y = xevent.xcrossing.y; -			event_queue.push_back(leaveEvent); -		} -		break; - -	case MapNotify: -	case MappingNotify: -		//DEBUG(x11, "EnterNotify"); -		// There's nothing to do here atm. -		break; - -	default: -		WARN(X11, "Unhandled xevent.type: %d\n", xevent.type); -		break; -	} -} - -void NativeWindowX11::allocateShmImage(std::size_t width, std::size_t height) -{ -	DEBUG(x11, "(Re)alloc XShmImage (%d, %d)", (int)width, (int)height); - -	if(image) -	{ -		deallocateShmImage(); -	} - -	if(!XShmQueryExtension(display)) -	{ -		ERR(x11, "XShmExtension not available"); -		return; -	} - -	image = XShmCreateImage(display, visual, depth, -	                        ZPixmap, nullptr, &shm_info, -	                        width, height); -	if(image == nullptr) -	{ -		ERR(x11, "XShmCreateImage failed!\n"); -		return; -	} - -	std::size_t byte_size = image->bytes_per_line * image->height; - -	// Allocate shm buffer -	int shm_id = shmget(IPC_PRIVATE, byte_size, IPC_CREAT|0777); -	if(shm_id == -1) -	{ -		ERR(x11, "shmget failed: %s", strerror(errno)); -		return; -	} - -	shm_info.shmid = shm_id; - -	// Attach share memory bufer -	void* shm_addr = shmat(shm_id, nullptr, 0); -	if(reinterpret_cast<long int>(shm_addr) == -1) -	{ -		ERR(x11, "shmat failed: %s", strerror(errno)); -		return; -	} - -	shm_info.shmaddr = reinterpret_cast<char*>(shm_addr); -	image->data = shm_info.shmaddr; -	shm_info.readOnly = false; - -	// This may trigger the X protocol error we're ready to catch: -	XShmAttach(display, &shm_info); -	XSync(display, false); - -	// Make the shm id unavailable to others -	shmctl(shm_id, IPC_RMID, 0); -} - -void NativeWindowX11::deallocateShmImage() -{ -	if(image == nullptr) -	{ -		return; -	} - -	XFlush(display); -	XShmDetach(display, &shm_info); -	XDestroyImage(image); -	image = nullptr; -	shmdt(shm_info.shmaddr); -} - -void NativeWindowX11::updateImageFromBuffer(std::size_t x1, std::size_t y1, -                                            std::size_t x2, std::size_t y2) -{ -	//DEBUG(x11, "depth: %d", depth); - -	auto width = window.wpixbuf.width; -	auto height = window.wpixbuf.height; - -	// If image hasn't been allocated yet or if the image backbuffer is -	// too small, (re)allocate with a suitable size. -	if((image == nullptr) || -	   ((int)width > image->width) || -	   ((int)height > image->height)) -	{ -		constexpr std::size_t step_size = 128; // size increments -		std::size_t new_width = ((width / step_size) + 1) * step_size; -		std::size_t new_height = ((height / step_size) + 1) * step_size; -		allocateShmImage(new_width, new_height); -		x1 = 0; -		y1 = 0; -		x2 = width; -		y2 = height; -	} - -	auto stride = image->width; - -	std::uint8_t* pixel_buffer = (std::uint8_t*)window.wpixbuf.buf; -	if(depth >= 24) // RGB 888 format -	{ -		std::uint32_t* shm_addr = (std::uint32_t*)shm_info.shmaddr; -		for(std::size_t y = y1; y < y2; ++y) -		{ -			for(std::size_t x = x1; x < x2; ++x) -			{ -				const std::size_t pin = y * width + x; -				const std::size_t pout = y * stride + x; -				const std::uint8_t red = pixel_buffer[pin * 3]; -				const std::uint8_t green = pixel_buffer[pin * 3 + 1]; -				const std::uint8_t blue = pixel_buffer[pin * 3 + 2]; -				shm_addr[pout] = (red << 16) | (green << 8) | blue; -			} -		} -	} -	else if(depth >= 15) // RGB 565 format -	{ -		std::uint16_t* shm_addr = (std::uint16_t*)shm_info.shmaddr; - -		for(std::size_t y = y1; y < y2; ++y) -		{ -			for(std::size_t x = x1; x < x2; ++x) -			{ -				const std::size_t pin = y * width + x; -				const std::size_t pout = y * stride + x; -				const std::uint8_t red = pixel_buffer[pin * 3]; -				const std::uint8_t green = pixel_buffer[pin * 3 + 1]; -				const std::uint8_t blue = pixel_buffer[pin * 3 + 2]; -				shm_addr[pout] = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3); -			} -		} -	} -} - -} // GUI:: diff --git a/plugingui/nativewindow_x11.h b/plugingui/nativewindow_x11.h deleted file mode 100644 index cb56fbc..0000000 --- a/plugingui/nativewindow_x11.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            nativewindow_x11.h - * - *  Fri Dec 28 18:45:56 CET 2012 - *  Copyright 2012 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <queue> - -#include <X11/Xlib.h> -#include <X11/extensions/XShm.h> - -#include "nativewindow.h" - -namespace GUI -{ - -class Window; - -class NativeWindowX11 -	: public NativeWindow -{ -public: -	NativeWindowX11(void* native_window, Window& window); -	~NativeWindowX11(); - -	// From NativeWindow: -	void setFixedSize(std::size_t width, std::size_t height) override; -	void setAlwaysOnTop(bool always_on_top) override; -	void resize(std::size_t width, std::size_t height) override; -	std::pair<std::size_t, std::size_t> getSize() const override; -	void move(int x, int y) override; -	std::pair<int, int> getPosition() const override; -	void show() override; -	void hide() override; -	bool visible() const override; -	void setCaption(const std::string &caption) override; -	void redraw(const Rect& dirty_rect) override; -	void grabMouse(bool grab) override; -	EventQueue getEvents() override; -	void* getNativeWindowHandle() const override; -	Point translateToScreen(const Point& point) override; - -private: -	void translateXMessage(XEvent& xevent); - -	//! Allocate new shared memory buffer for the pixel buffer. -	//! Frees the existing buffer if there is one. -	void allocateShmImage(std::size_t width, std::size_t height); - -	//! Deallocate image and shm resources. -	void deallocateShmImage(); - -	//! Copy data from the pixel buffer into the shared memory -	void updateImageFromBuffer(std::size_t x1, std::size_t y1, -	                           std::size_t x2, std::size_t y2); - -	XShmSegmentInfo shm_info; -	XImage* image{nullptr}; - -	::Window xwindow{0}; -	GC gc{0}; - -	Window& window; - -	Time last_click{0}; - -	Display* display{nullptr}; -	int screen{0}; -	int depth{0}; -	Visual* visual{nullptr}; -	Atom wmDeleteMessage{0}; -	::Window parent_window; - -	EventQueue event_queue; -}; - -} // GUI:: diff --git a/plugingui/painter.cc b/plugingui/painter.cc deleted file mode 100644 index f746f83..0000000 --- a/plugingui/painter.cc +++ /dev/null @@ -1,644 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            painter.cc - * - *  Wed Oct 12 19:48:45 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "painter.h" - -#include <cmath> -#include <cassert> - -#include "pixelbuffer.h" -#include "font.h" -#include "drawable.h" -#include "image.h" -#include "canvas.h" - -namespace GUI -{ - -Painter::Painter(Canvas& canvas) -	: pixbuf(canvas.getPixelBuffer()) -{ -	colour = Colour(0.0f, 0.0f, 0.0f, 0.5f); -} - -Painter::~Painter() -{ -} - -void Painter::setColour(const Colour& colour) -{ -	this->colour = colour; -} - -static void plot(PixelBufferAlpha& pixbuf, const Colour& colour, -                 int x, int y, double c) -{ -	if((x >= (int)pixbuf.width) || -	   (y >= (int)pixbuf.height) || -	   (x < 0) || -	   (y < 0)) -	{ -		return; -	} - -	// plot the pixel at (x, y) with brightness c (where 0 ≤ c ≤ 1) -	Colour col(colour); -	if(c != 1) -	{ -		col.data()[3] *= c; -	} -	pixbuf.addPixel(x, y, col); -} - -static inline double fpart(double x) -{ -	return x - std::floor(x);// fractional part of x -} - -static inline double rfpart(double x) -{ -	return 1 - fpart(x); // reverse fractional part of x -} - -void Painter::drawLine(int x0, int y0, int x1, int y1) -{ -	bool steep = abs(y1 - y0) > abs(x1 - x0); - -	if(steep) -	{ -		std::swap(x0, y0); -		std::swap(x1, y1); -	} -	if(x0 > x1) -	{ -		std::swap(x0, x1); -		std::swap(y0, y1); -	} - -	double dx = x1 - x0; -	double dy = y1 - y0; -	double gradient = dy / dx; - -	// Handle first endpoint: -	double xend = std::round(x0); -	double yend = y0 + gradient * (xend - x0); - -	double xpxl1 = xend;   // this will be used in the main loop -	double ypxl1 = std::floor(yend); - -	if(steep) -	{ -		pixbuf.addPixel(ypxl1, xpxl1, colour); -	} -	else -	{ -		pixbuf.addPixel(xpxl1, ypxl1, colour); -	} - -	double intery = yend + gradient; // first y-intersection for the main loop - -	// Handle second endpoint: -	xend = std::round(x1); -	yend = y1 + gradient * (xend - x1); - -	double xpxl2 = xend; // this will be used in the main loop -	double ypxl2 = std::floor(yend); - -	if(steep) -	{ -		pixbuf.addPixel(ypxl2, xpxl2, colour); -	} -	else -	{ -		pixbuf.addPixel(xpxl2, ypxl2, colour); -	} - -	// main loop -	for(int x = xpxl1 + 1; x <= xpxl2 - 1; ++x) -	{ -		if(steep) -		{ -			plot(pixbuf, colour, std::floor(intery)  , x, rfpart(intery)); -			plot(pixbuf, colour, std::floor(intery)+1, x,  fpart(intery)); -		} -		else -		{ -			plot(pixbuf, colour, x, std::floor(intery),  rfpart(intery)); -			plot(pixbuf, colour, x, std::floor(intery)+1, fpart(intery)); -		} -		intery += gradient; -	} -} - -void Painter::drawRectangle(int x1, int y1, int x2, int y2) -{ -	drawLine(x1, y1, x2 - 1, y1); -	drawLine(x2, y1, x2, y2 - 1); -	drawLine(x1 + 1, y2, x2, y2); -	drawLine(x1, y1 + 1, x1, y2); -} - -void Painter::drawFilledRectangle(int x1, int y1, int x2, int y2) -{ -	for(int y = y1; y <= y2; ++y) -	{ -		drawLine(x1, y, x2, y); -	} -} - -void Painter::clear() -{ -	pixbuf.clear(); -} - -void Painter::drawText(int x0, int y0, const Font& font, -                       const std::string& text, bool nocolour, bool rotate) -{ -	PixelBufferAlpha* textbuf = font.render(text); - -	if(!rotate) -	{ -		y0 -= textbuf->height; // The y0 offset (baseline) is the bottom of the text. -	} - -	// If the text offset is outside the buffer; skip it. -	if((x0 > (int)pixbuf.width) || (y0 > (int)pixbuf.height)) -	{ -		delete textbuf; -		return; -	} - -	// Make sure we don't try to draw outside the pixbuf. -	int renderWidth = textbuf->width; -	if(renderWidth > (int)(pixbuf.width - x0)) -	{ -		renderWidth = pixbuf.width - x0; -	} - -	int renderHeight = textbuf->height; -	if(renderHeight > ((int)pixbuf.height - y0)) -	{ -		renderHeight = ((int)pixbuf.height - y0); -	} - -	if(nocolour) -	{ -		for(int y = -1 * std::min(0, y0); y < renderHeight; ++y) -		{ -			int x = -1 * std::min(0, x0); - -			assert(x >= 0); -			assert(y >= 0); -			assert(x < (int)textbuf->width); -			assert(y < (int)textbuf->height); - -			auto c = textbuf->getLine(x, y); - -			assert(x + x0 >= 0); -			assert(y + y0 >= 0); -			assert(x + x0 < (int)pixbuf.width); -			assert(y + y0 < (int)pixbuf.height); - -			pixbuf.blendLine(x + x0, y + y0, c, renderWidth - x); -		} -	} -	else if(rotate) -	{ -		int renderWidth = textbuf->height; -		if(renderWidth > (int)(pixbuf.width - x0)) -		{ -			renderWidth = pixbuf.width - x0; -		} - -		int renderHeight = textbuf->width; -		if(renderHeight > ((int)pixbuf.height - y0)) -		{ -			renderHeight = ((int)pixbuf.height - y0); -		} - -		for(int y = -1 * std::min(0, y0); y < renderHeight; ++y) -		{ -			for(int x = -1 * std::min(0, x0); x < renderWidth; ++x) -			{ -				assert(x >= 0); -				assert(y >= 0); -				assert(x < (int)textbuf->height); -				assert(y < (int)textbuf->width); - -				auto c = textbuf->pixel(textbuf->width - y - 1, x); - -				assert(x + x0 >= 0); -				assert(y + y0 >= 0); -				assert(x + x0 < (int)pixbuf.width); -				assert(y + y0 < (int)pixbuf.height); - -				Colour col(colour.red(), colour.green(), -				           colour.blue(), (int)(colour.alpha() * c.alpha()) / 255); -				pixbuf.addPixel(x + x0, y + y0, col); -			} -		} -	} -	else -	{ -		for(int y = -1 * std::min(0, y0); y < renderHeight; ++y) -		{ -			for(int x = -1 * std::min(0, x0); x < renderWidth; ++x) -			{ -				assert(x >= 0); -				assert(y >= 0); -				assert(x < (int)textbuf->width); -				assert(y < (int)textbuf->height); - -				auto c = textbuf->pixel(x, y); - -				assert(x + x0 >= 0); -				assert(y + y0 >= 0); -				assert(x + x0 < (int)pixbuf.width); -				assert(y + y0 < (int)pixbuf.height); - -				Colour col(colour.red(), colour.green(), -				           colour.blue(), (int)(colour.alpha() * c.alpha()) / 255); -				pixbuf.addPixel(x + x0, y + y0, col); -			} -		} -	} - -	delete textbuf; -} - -void Painter::drawPoint(int x, int y) -{ -	if(x >= 0 && y >= 0 && (std::size_t)x < pixbuf.width && (std::size_t)y < pixbuf.height) -	{ -		pixbuf.setPixel(x, y, colour); -	} -} - -static void plot4points(Painter *p, int cx, int cy, int x, int y) -{ -	p->drawPoint(cx + x, cy + y); -	if(x != 0) -	{ -		p->drawPoint(cx - x, cy + y); -	} - -	if(y != 0) -	{ -		p->drawPoint(cx + x, cy - y); -	} - -	if(x != 0 && y != 0) -	{ -		p->drawPoint(cx - x, cy - y); -	} -} - -void Painter::drawCircle(int cx, int cy, double radius) -{ -	int error = -radius; -	int x = radius; -	int y = 0; - -	while(x >= y) -	{ -		plot4points(this, cx, cy, x, y); - -		if(x != y) -		{ -			plot4points(this, cx, cy, y, x); -		} - -		error += y; -		++y; -		error += y; - -		if(error >= 0) -		{ -			--x; -			error -= x; -			error -= x; -		} -	} -} - -static void plot4lines(Painter *p, int cx, int cy, int x, int y) -{ -	p->drawLine(cx + x, cy + y, cx - x, cy + y); -	if(x != 0) -	{ -		p->drawLine(cx - x, cy + y, cx + x, cy + y); -	} - -	if(y != 0) -	{ -		p->drawLine(cx + x, cy - y, cx - x, cy - y); -	} - -	if(x != 0 && y != 0) -	{ -		p->drawLine(cx - x, cy - y, cx + x, cy - y); -	} -} - -void Painter::drawFilledCircle(int cx, int cy, int radius) -{ -	int error = -radius; -	int x = radius; -	int y = 0; - -	while(x >= y) -	{ -		plot4lines(this, cx, cy, x, y); - -		if(x != y) -		{ -			plot4lines(this, cx, cy, y, x); -		} - -		error += y; -		++y; -		error += y; - -		if(error >= 0) -		{ -			--x; -			error -= x; -			error -= x; -		} -	} -} - -void Painter::drawImage(int x0, int y0, const Drawable& image) -{ -	int fw = image.width(); -	int fh = image.height(); - -	// Make sure we don't try to draw outside the pixbuf. -	if(fw > (int)(pixbuf.width - x0)) -	{ -		fw = (int)(pixbuf.width - x0); -	} - -	if(fh > (int)(pixbuf.height - y0)) -	{ -		fh = (int)(pixbuf.height - y0); -	} - -	if((fw < 1) || (fh < 1)) -	{ -		return; -	} - -	if(image.hasAlpha()) -	{ -		if(!image.line(0)) -		{ -			for(std::size_t y = -1 * std::min(0, y0); y < (std::size_t)fh; ++y) -			{ -				for(std::size_t x = -1 * std::min(0, x0); x < (std::size_t)fw; ++x) -				{ -					assert(x >= 0); -					assert(y >= 0); -					assert(x < image.width()); -					assert(y < image.height()); -					auto& c = image.getPixel(x, y); - -					assert(x0 + x >= 0); -					assert(y0 + y >= 0); -					assert(x0 + x < pixbuf.width); -					assert(y0 + y < pixbuf.height); - -					pixbuf.addPixel(x0 + x, y0 + y, c); -				} -			} -		} -		else -		{ -			std::size_t x_offset = -1 * std::min(0, x0); -			for(std::size_t y = -1 * std::min(0, y0); y < (std::size_t)fh; ++y) -			{ -				pixbuf.blendLine(x_offset + x0, y + y0, image.line(y, x_offset), -				                 std::min((int)image.width(), fw - (int)x_offset)); -			} -		} -	} -	else -	{ -		std::size_t x_offset = -1 * std::min(0, x0); -		for(std::size_t y = -1 * std::min(0, y0); y < (std::size_t)fh; ++y) -		{ -			pixbuf.writeLine(x_offset + x0, y + y0, image.line(y, x_offset), -			                 std::min((int)image.width(), fw - (int)x_offset)); -		} -	} -} - -void Painter::drawRestrictedImage(int x0, int y0, -                                  const Colour& restriction_colour, -                                  const Drawable& image) -{ -	int fw = image.width(); -	int fh = image.height(); - -	// Make sure we don't try to draw outside the pixbuf. -	if(fw > (int)(pixbuf.width - x0)) -	{ -		fw = (int)(pixbuf.width - x0); -	} - -	if(fh > (int)(pixbuf.height - y0)) -	{ -		fh = (int)(pixbuf.height - y0); -	} - -	if((fw < 1) || (fh < 1)) -	{ -		return; -	} - -	for(std::size_t y = -1 * std::min(0, y0); y < (std::size_t)fh; ++y) -	{ -		for(std::size_t x = -1 * std::min(0, x0); x < (std::size_t)fw; ++x) -		{ -			assert(x >= 0); -			assert(y >= 0); -			assert(x < image.width()); -			assert(y < image.height()); -			auto& c = image.getPixel(x, y); - -			assert(x0 + x >= 0); -			assert(y0 + y >= 0); -			assert(x0 + x < pixbuf.width); -			assert(y0 + y < pixbuf.height); - -			if(c == restriction_colour) -			{ -				pixbuf.setPixel(x0 + x, y0 + y, c); -			} -		} -	} -} - -void Painter::drawImageStretched(int x0, int y0, const Drawable& image, -                                 int width, int height) -{ -	float fw = image.width(); -	float fh = image.height(); - -	// Make sure we don't try to draw outside the pixbuf. -	if(width > (int)(pixbuf.width - x0)) -	{ -		width = pixbuf.width - x0; -	} - -	if(height > (int)(pixbuf.height - y0)) -	{ -		height = pixbuf.height - y0; -	} - -	if((width < 1) || (height < 1)) -	{ -		return; -	} - -	for(int y = -1 * std::min(0, y0); y < height; ++y) -	{ -		for(int x = -1 * std::min(0, x0); x < width; ++x) -		{ -			int lx = ((float)x / (float)width) * fw; -			int ly = ((float)y / (float)height) * fh; -			auto& c = image.getPixel(lx, ly); -			pixbuf.addPixel(x0 + x, y0 + y, c); -		} -	} -} - -void Painter::drawBox(int x, int y, const Box& box, int width, int height) -{ -	int dx = x; -	int dy = y; - -	// Top: -	drawImage(dx, dy, *box.topLeft); - -	dx += box.topLeft->width(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImageStretched(dx, dy, *box.top, -	                   width - box.topRight->width() - box.topLeft->width(), -	                   box.top->height()); - -	dx = x + width - box.topRight->width(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImage(dx, dy, *box.topRight); - -	// Center: -	dy = y + box.topLeft->height(); -	dx = x + box.left->width(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImageStretched(dx, dy, *box.center, -	                   width - box.left->width() - box.right->width(), -	                   height - box.topLeft->height() - box.bottomLeft->height()); - -	// Mid: -	dx = x; -	dy = y + box.topLeft->height(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImageStretched(dx, dy, *box.left, box.left->width(), -	                   height - box.topLeft->height() - box.bottomLeft->height()); - -	dx = x + width - box.right->width(); -	dy = y + box.topRight->height(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImageStretched(dx, dy, *box.right, -	                   box.right->width(), -	                   height - box.topRight->height() - box.bottomRight->height()); - -	// Bottom: -	dx = x; -	dy = y + height - box.bottomLeft->height(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImage(dx, dy, *box.bottomLeft); - -	dx += box.bottomLeft->width(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImageStretched(dx, dy, *box.bottom, -	                   width - box.bottomRight->width() - box.bottomLeft->width(), -	                   box.bottom->height()); - -	dx = x + width - box.bottomRight->width(); -	if((dx < 0) || (dy < 0)) -	{ -		return; -	} - -	drawImage(dx, dy, *box.bottomRight); -} - -void Painter::drawBar(int x, int y, const Bar& bar, int width, int height) -{ -	if(width < ((int)bar.left->width() + (int)bar.right->width() + 1)) -	{ -		width = bar.left->width() + bar.right->width() + 1; -	} - -	drawImageStretched(x, y, *bar.left, bar.left->width(), height); - -	drawImageStretched(x + bar.left->width(), y, *bar.center, -	                   width - bar.left->width() - bar.right->width(), height); - -	drawImageStretched(x + width - bar.left->width(), y, *bar.right, -	                   bar.right->width(), height); -} - -} // GUI:: diff --git a/plugingui/painter.h b/plugingui/painter.h deleted file mode 100644 index 9bf7fbf..0000000 --- a/plugingui/painter.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            painter.h - * - *  Wed Oct 12 19:48:45 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> - -#include "colour.h" -#include "pixelbuffer.h" - -namespace GUI -{ - -class Font; -class Drawable; -class Image; -class Canvas; - -class Painter -{ -public: -	Painter(Canvas& canvas); -	~Painter(); - -	void setColour(const Colour& colour); - -	void drawLine(int x1, int y1, int x2, int y2); -	void drawText(int x, int y, const Font& font, const std::string& text, -	              bool nocolour = false, bool rotate = false); -	void drawRectangle(int x1, int y1, int x2, int y2); -	void drawFilledRectangle(int x1, int y1, int x2, int y2); -	void drawPoint(int x, int y); -	void drawCircle(int x, int y, double r); -	void drawFilledCircle(int x, int y, int r); -	void drawImage(int x, int y, const Drawable& image); -	void drawRestrictedImage(int x0, int y0, const Colour& restriction_colour, -	                         const Drawable& image); -	void drawImageStretched(int x, int y, const Drawable& image, -	                        int width, int height); - -	template<typename Iterator> -	void draw(Iterator begin, Iterator end, int x_offset, int y_offset, Colour const& colour); - -	typedef struct { -		Image* topLeft; -		Image* top; -		Image* topRight; -		Image* left; -		Image* right; -		Image* bottomLeft; -		Image* bottom; -		Image* bottomRight; -		Image* center; -	} Box; -	void drawBox(int x, int y, const Box& box, int width, int height); - -	typedef struct { -		Image* left; -		Image* right; -		Image* center; -	} Bar; -	void drawBar(int x, int y, const Bar& bar, int width, int height); - -	void clear(); - -private: -	PixelBufferAlpha& pixbuf; -	Colour colour; -}; - -template<typename Iterator> -void Painter::draw(Iterator begin, Iterator end, int x_offset, int y_offset, Colour const& colour) -{ -	for (auto it = begin; it != end; ++it) -	{ -		pixbuf.addPixel(x_offset + it->x, y_offset + it->y, colour); -	} -} - -} // GUI:: diff --git a/plugingui/pixelbuffer.cc b/plugingui/pixelbuffer.cc deleted file mode 100644 index 3c666cd..0000000 --- a/plugingui/pixelbuffer.cc +++ /dev/null @@ -1,369 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            pixelbuffer.cc - * - *  Thu Nov 10 09:00:38 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "pixelbuffer.h" - -#include <cassert> - -#include <cstdlib> -#include <cstring> -#include <algorithm> - -namespace GUI -{ - -PixelBuffer::PixelBuffer(std::size_t width, std::size_t height) -{ -	realloc(width, height); -} - -PixelBuffer::~PixelBuffer() -{ -} - -void PixelBuffer::realloc(std::size_t width, std::size_t height) -{ -	buf_data.resize(width * height * 3); -	buf = buf_data.data(); -	this->width = width; -	this->height = height; -} - -void PixelBuffer::blendLine(std::size_t x, std::size_t y, -                            const std::uint8_t* line, std::size_t len) -{ -	std::uint8_t* target = buf + (x + y * width) * 3; -	while(len) -	{ -		if(line[3] == 0xff) -		{ -			std::memcpy(target, line, 3); -		} -		else -		{ -			unsigned int a = line[3]; -			unsigned int b = 255 - a; - -			target[0] = (std::uint8_t)((line[0] * a + target[0] * b) / 255); -			target[1] = (std::uint8_t)((line[1] * a + target[1] * b) / 255); -			target[2] = (std::uint8_t)((line[2] * a + target[2] * b) / 255); -		} -		target += 3; -		line += 4; -		--len; -	} -} - -Rect PixelBuffer::updateBuffer(std::vector<PixelBufferAlpha*>& pixel_buffers) -{ -	bool has_dirty_rect{false}; -	Rect dirty_rect; - -	for(const auto& pixel_buffer : pixel_buffers) -	{ -		if(pixel_buffer->dirty) -		{ -			auto x1 = (std::size_t)std::max(pixel_buffer->x, 0); -			auto x2 = (std::size_t)std::max((pixel_buffer->x + (int)pixel_buffer->width), 0); -			auto y1 = (std::size_t)std::max(pixel_buffer->y, 0); -			auto y2 = (std::size_t)std::max((pixel_buffer->y + (int)pixel_buffer->height), 0); - -			pixel_buffer->dirty = false; -			if(!has_dirty_rect) -			{ -				// Insert this area: -				dirty_rect = {x1, y1, x2, y2}; -				has_dirty_rect = true; -			} -			else -			{ -				// Expand existing area: -				auto x1_0 = dirty_rect.x1; -				auto y1_0 = dirty_rect.y1; -				auto x2_0 = dirty_rect.x2; -				auto y2_0 = dirty_rect.y2; -				dirty_rect = { -					(x1_0 < x1) ? x1_0 : x1, -					(y1_0 < y1) ? y1_0 : y1, -					(x2_0 > x2) ? x2_0 : x2, -					(y2_0 > y2) ? y2_0 : y2 -				}; -			} -		} - -		if(pixel_buffer->has_last) -		{ -			auto x1 = (std::size_t)pixel_buffer->last_x; -			auto x2 = (std::size_t)(pixel_buffer->last_x + pixel_buffer->last_width); -			auto y1 = (std::size_t)pixel_buffer->last_y; -			auto y2 = (std::size_t)(pixel_buffer->last_y + pixel_buffer->last_height); - -			pixel_buffer->has_last = false; -			if(!has_dirty_rect) -			{ -				// Insert this area: -				dirty_rect = {x1, y1, x2, y2}; -				has_dirty_rect = true; -			} -			else -			{ -				// Expand existing area: -				auto x1_0 = dirty_rect.x1; -				auto y1_0 = dirty_rect.y1; -				auto x2_0 = dirty_rect.x2; -				auto y2_0 = dirty_rect.y2; -				dirty_rect = { -					(x1_0 < x1) ? x1_0 : x1, -					(y1_0 < y1) ? y1_0 : y1, -					(x2_0 > x2) ? x2_0 : x2, -					(y2_0 > y2) ? y2_0 : y2 -				}; -			} -		} -	} - -	if(!has_dirty_rect) -	{ -		return {}; -	} - -	for(const auto& pixel_buffer : pixel_buffers) -	{ -		if(!pixel_buffer->visible) -		{ -			continue; -		} - -		int update_width = pixel_buffer->width; -		int update_height = pixel_buffer->height; - -		// Skip buffer if not inside window. -		if(((int)width < pixel_buffer->x) || -		   ((int)height < pixel_buffer->y)) -		{ -			continue; -		} - -		if(update_width > ((int)width - pixel_buffer->x)) -		{ -			update_width = ((int)width - pixel_buffer->x); -		} - -		if(update_height > ((int)height - pixel_buffer->y)) -		{ -			update_height = ((int)height - pixel_buffer->y); -		} - -		auto from_x  = (int)dirty_rect.x1 - pixel_buffer->x; -		from_x = std::max(0, from_x); -		auto from_y  = (int)dirty_rect.y1 - pixel_buffer->y; -		from_y = std::max(0, from_y); - -		auto to_x = (int)dirty_rect.x2 - pixel_buffer->x; -		to_x = std::min(to_x, (int)update_width); -		auto to_y = (int)dirty_rect.y2 - pixel_buffer->y; -		to_y = std::min(to_y, (int)update_height); - -		if(to_x < from_x) -		{ -			continue; -		} - -		for(int y = from_y; y < to_y; y++) -		{ -			blendLine(pixel_buffer->x + from_x, -			          pixel_buffer->y + y, -			          pixel_buffer->getLine(from_x, y), -			          to_x - from_x); -		} -	} - -	dirty_rect.x2 = std::min(width, dirty_rect.x2); -	dirty_rect.y2 = std::min(height, dirty_rect.y2); - -	// Make sure we don't try to paint a rect backwards. -	if(dirty_rect.x1 > dirty_rect.x2) -	{ -		std::swap(dirty_rect.x1, dirty_rect.x2); -	} - -	if(dirty_rect.y1 > dirty_rect.y2) -	{ -		std::swap(dirty_rect.y1, dirty_rect.y2); -	} - -	return dirty_rect; -} - -PixelBufferAlpha::PixelBufferAlpha(std::size_t width, std::size_t height) -{ -	realloc(width, height); -} - -PixelBufferAlpha::~PixelBufferAlpha() -{ -} - -void PixelBufferAlpha::realloc(std::size_t width, std::size_t height) -{ -	buf_data.resize(width * height * 4); -	buf = buf_data.data(); -	this->width = width; -	this->height = height; -	clear(); -} - -void PixelBufferAlpha::clear() -{ -	std::memset(buf, 0, width * height * 4); -} - -void PixelBufferAlpha::setPixel(std::size_t x, std::size_t y, const Colour& c) -{ -	std::uint8_t* pixel = buf + (x + y * width) * 4; -	std::memcpy(pixel, c.data(), 4); -} - -void PixelBufferAlpha::writeLine(std::size_t x, std::size_t y, -                                 const std::uint8_t* line, std::size_t len) -{ -	if(x >= width || y >= height) -	{ -		return; -	} - -	if(x + len > width) -	{ -		len = width - x; -	} - -	auto offset = buf + (x + y * width) * 4; - -	std::memcpy(offset, line, len * 4); -} - - -// SIMD: https://github.com/WojciechMula/toys/blob/master/blend_32bpp/blend_32bpp.c -// Alpha blending: http://en.wikipedia.org/wiki/Alpha_compositing - -void PixelBufferAlpha::blendLine(std::size_t x, std::size_t y, -                                 const std::uint8_t* line, std::size_t len) -{ -	if(x >= width || y >= height) -	{ -		return; -	} - -	if(x + len > width) -	{ -		len = width - x; -	} - -	int a, b; -	std::uint8_t* target = buf + (x + y * width) * 4; -	while(len) -	{ -		if(line[3] == 0xff) -		{ -			const std::uint8_t* end = line; -			while(end[3] == 0xff && end < line + len * 4) -			{ -				end += 4; -			} -			auto chunk_len = end - line; -			std::memcpy(target, line, chunk_len); -			line += chunk_len; -			target += chunk_len; -			len -= chunk_len / 4; -			continue; -		} -		else if(line[3] == 0) -		{ -			// Do nothing -		} -		else -		{ -			a = line[3]; -			b = target[3] * (255 - a) / 255; - -			target[0] = (line[0] * a + target[0] * b) / (a + b); -			target[1] = (line[1] * a + target[1] * b) / (a + b); -			target[2] = (line[2] * a + target[2] * b) / (a + b); -			target[3] = (int)target[3] + line[3] * (255 - target[3]) / 255; -		} - -		line += 4; -		target += 4; -		--len; -	} -} - -void PixelBufferAlpha::addPixel(std::size_t x, std::size_t y, const Colour& c) -{ -	if(x >= width || y >= height) -	{ -		return; // out of bounds -	} - -	const std::uint8_t* colour = c.data(); - -	if(colour[3] == 0) -	{ -		return; -	} - -	int a, b; -	std::uint8_t* target = buf + (x + y * width) * 4; - -	if(colour[3] == 0xff) -	{ -		std::memcpy(target, colour, 4); -	} -	else -	{ -		a = colour[3]; -		b = target[3] * (255 - a) / 255; - -		target[0] = (colour[0] * a + target[0] * b) / (a + b); -		target[1] = (colour[1] * a + target[1] * b) / (a + b); -		target[2] = (colour[2] * a + target[2] * b) / (a + b); -		target[3] = (int)target[3] + colour[3] * (255 - target[3]) / 255; -	} -} - -const Colour& PixelBufferAlpha::pixel(std::size_t x, std::size_t y) const -{ -	static Colour c; -	std::memcpy(c.data(), buf + (x + y * width) * 4, 4); -	return c; -} - -const std::uint8_t* PixelBufferAlpha::getLine(std::size_t x, std::size_t y) const -{ -	return buf + (x + y * width) * 4; -} - -} // GUI:: diff --git a/plugingui/pixelbuffer.h b/plugingui/pixelbuffer.h deleted file mode 100644 index 5c11d14..0000000 --- a/plugingui/pixelbuffer.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            pixelbuffer.h - * - *  Thu Nov 10 09:00:37 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "colour.h" - -#include <cstddef> -#include <cstdint> -#include <vector> - -#include "guievent.h" - -namespace GUI -{ - -class PixelBuffer -{ -public: -	PixelBuffer(std::size_t width, std::size_t height); -	~PixelBuffer(); - -	void realloc(std::size_t width, std::size_t height); - -	void blendLine(std::size_t x, std::size_t y, -	               const std::uint8_t* line, std::size_t len); - -	Rect updateBuffer(std::vector<class PixelBufferAlpha*>& pixel_buffers); - -	std::vector<std::uint8_t> buf_data; -	std::uint8_t* buf{nullptr}; -	std::size_t width{0}; -	std::size_t height{0}; -}; - -class PixelBufferAlpha -{ -public: -	PixelBufferAlpha() = default; -	PixelBufferAlpha(std::size_t width, std::size_t height); -	~PixelBufferAlpha(); - -	void realloc(std::size_t width, std::size_t height); - -	void clear(); - -	void setPixel(std::size_t x, std::size_t y, const Colour& c); - -	void writeLine(std::size_t x, std::size_t y, -	               const std::uint8_t* line, std::size_t len); -	void blendLine(std::size_t x, std::size_t y, -	               const std::uint8_t* line, std::size_t len); - -	void addPixel(std::size_t x, std::size_t y, const Colour& c); - -	const Colour& pixel(std::size_t x, std::size_t y) const; - -	const std::uint8_t* getLine(std::size_t x, std::size_t y) const; - -	std::vector<std::uint8_t> buf_data; -	std::uint8_t* buf{nullptr}; -	std::size_t width{0}; -	std::size_t height{0}; -	int x{0}; -	int y{0}; -	bool dirty{true}; -	bool visible{true}; - -	// Add optional dirty rect that this pixelbuffer took up since it was last -	// rendered. Make sure to update this list on resize and/or move. -	std::size_t last_width{0}; -	std::size_t last_height{0}; -	int last_x{0}; -	int last_y{0}; -	bool has_last{false}; -}; - -} // GUI:: diff --git a/plugingui/powerbutton.cc b/plugingui/powerbutton.cc deleted file mode 100644 index 5bf2a2c..0000000 --- a/plugingui/powerbutton.cc +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            powerbutton.cc - * - *  Thu Mar 23 12:30:50 CET 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "powerbutton.h" - -#include "painter.h" - -namespace GUI -{ - -PowerButton::PowerButton(Widget* parent) : Toggle(parent) -{ -} - -void PowerButton::setEnabled(bool enabled) -{ -	this->enabled = enabled; - -	redraw(); -} - -void PowerButton::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	// disabled -	if(!enabled) -	{ -		if(clicked) -		{ -			p.drawImage(0, 0, disabled_clicked); -		} -		else -		{ -			p.drawImage(0, 0, disabled); -		} -		return; -	} - -	// enabled and on -	if(state) -	{ -		if(clicked) -		{ -			p.drawImage(0, 0, on_clicked); -		} -		else -		{ -			p.drawImage(0, 0, on); -		} -		return; -	} - -	// enabled and off -	if(clicked) -	{ -		p.drawImage(0, 0, off_clicked); -	} -	else -	{ -		p.drawImage(0, 0, off); -	} -} - -} // GUI:: diff --git a/plugingui/powerbutton.h b/plugingui/powerbutton.h deleted file mode 100644 index 14dbeca..0000000 --- a/plugingui/powerbutton.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            powerbutton.h - * - *  Thu Mar 23 12:30:50 CET 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "texture.h" -#include "toggle.h" - -namespace GUI -{ - -class PowerButton : public Toggle -{ -public: -	PowerButton(Widget* parent); -	virtual ~PowerButton() = default; - -	void setEnabled(bool enabled); - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; - -	bool enabled = true; - -private: -	Texture on{getImageCache(), ":resources/bypass_button.png", 32, 0, 16, 16}; -	Texture on_clicked{getImageCache(), ":resources/bypass_button.png", 48, 0, 16, 16}; -	Texture off{getImageCache(), ":resources/bypass_button.png", 0, 0, 16, 16}; -	Texture off_clicked{getImageCache(), ":resources/bypass_button.png", 16, 0, 16, 16}; -	Texture disabled{getImageCache(), ":resources/bypass_button.png", 64, 0, 16, 16}; -	Texture disabled_clicked{getImageCache(), ":resources/bypass_button.png", 80, 0, 16, 16}; -}; - -} // GUI:: diff --git a/plugingui/powerwidget.cc b/plugingui/powerwidget.cc index 0a565e6..301f396 100644 --- a/plugingui/powerwidget.cc +++ b/plugingui/powerwidget.cc @@ -26,11 +26,11 @@   */  #include "powerwidget.h" -#include "painter.h" +#include <dggui/painter.h> +#include <dggui/colour.h>  #include <notifier.h>  #include <settings.h> -#include <colour.h>  #include <powermap.h>  #include <hugin.hpp> diff --git a/plugingui/powerwidget.h b/plugingui/powerwidget.h index c5c6665..8398f75 100644 --- a/plugingui/powerwidget.h +++ b/plugingui/powerwidget.h @@ -26,13 +26,14 @@   */  #pragma once -#include <widget.h> -#include <texturedbox.h> -#include <texture.h> -#include <knob.h> -#include <checkbox.h> -#include <label.h> -#include <font.h> +#include <dggui/widget.h> +#include <dggui/texturedbox.h> +#include <dggui/texture.h> +#include <dggui/knob.h> +#include <dggui/checkbox.h> +#include <dggui/label.h> +#include <dggui/font.h> +  #include <powermap.h>  struct Settings; diff --git a/plugingui/progressbar.cc b/plugingui/progressbar.cc deleted file mode 100644 index dd3e130..0000000 --- a/plugingui/progressbar.cc +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            progressbar.cc - * - *  Fri Mar 22 22:07:57 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "progressbar.h" - -namespace GUI -{ - -ProgressBar::ProgressBar(Widget *parent) -	: Widget(parent) -{ -} - -ProgressBar::~ProgressBar() -{ -} - -void ProgressBar::setState(ProgressBarState state) -{ -	if(this->state != state) -	{ -		this->state = state; -		redraw(); -	} -} - -void ProgressBar::setTotal(std::size_t total) -{ -	if(this->total != total) -	{ -		this->total = total; -		redraw(); -	} -} - -void ProgressBar::setValue(std::size_t value) -{ -	if(this->value != value) -	{ -		this->value = value; -		redraw(); -	} -} - -void ProgressBar::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	float progress = 0.0f; -	if(total != 0) -	{ -		progress = (float)value / (float)total; -	} - -	int brd = 4; -	int val = (width() - (2 * brd)) * progress; - -	bar_bg.setSize(width(), height()); -	p.drawImage(0, 0, bar_bg); - -	switch(state) -	{ -	case ProgressBarState::Red: -		bar_red.setSize(val, height()); -		p.drawImage(brd, 0, bar_red); -		break; -	case ProgressBarState::Green: -		bar_green.setSize(val, height()); -		p.drawImage(brd, 0, bar_green); -		break; -	case ProgressBarState::Blue: -		bar_blue.setSize(val, height()); -		p.drawImage(brd, 0, bar_blue); -		break; -	case ProgressBarState::Off: -		return; -	} - -} - -} // GUI:: diff --git a/plugingui/progressbar.h b/plugingui/progressbar.h deleted file mode 100644 index 76cc6fd..0000000 --- a/plugingui/progressbar.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            progressbar.h - * - *  Fri Mar 22 22:07:57 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "widget.h" - -#include "guievent.h" -#include "painter.h" -#include "texturedbox.h" - -namespace GUI -{ - -enum class ProgressBarState -{ -	Red, -	Green, -	Blue, -	Off -}; - -class ProgressBar -	: public Widget -{ -public: -	ProgressBar(Widget* parent); -	virtual ~ProgressBar(); - -	void setTotal(std::size_t total); -	void setValue(std::size_t value); - -	void setState(ProgressBarState state); - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; - -private: -	ProgressBarState state{ProgressBarState::Blue}; - -	TexturedBox bar_bg{getImageCache(), ":resources/progress.png", -			0, 0, // atlas offset (x, y) -			6, 1, 6, // dx1, dx2, dx3 -			11, 0, 0}; // dy1, dy2, dy3 - -	TexturedBox bar_red{getImageCache(), ":resources/progress.png", -			13, 0, // atlas offset (x, y) -			2, 1, 2, // dx1, dx2, dx3 -			11, 0, 0}; // dy1, dy2, dy3 - -	TexturedBox bar_green{getImageCache(), ":resources/progress.png", -			18, 0, // atlas offset (x, y) -			2, 1, 2, // dx1, dx2, dx3 -			11, 0, 0}; // dy1, dy2, dy3 - -	TexturedBox bar_blue{getImageCache(), ":resources/progress.png", -			23, 0, // atlas offset (x, y) -			2, 1, 2, // dx1, dx2, dx3 -			11, 0, 0}; // dy1, dy2, dy3 - -	std::size_t total{0}; -	std::size_t value{0}; -}; - -} // GUI:: diff --git a/plugingui/rcgen.cc b/plugingui/rcgen.cc deleted file mode 100644 index f7b5590..0000000 --- a/plugingui/rcgen.cc +++ /dev/null @@ -1,190 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            rcgen.cc - * - *  Sun Mar 17 20:27:17 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include <stdio.h> -#include <string> -#include <unistd.h> -#include <sstream> - -#include <getoptpp.hpp> - -std::string usage(const std::string& name, bool brief = false) -{ -	std::ostringstream output; -	output << -		"Usage: " << name << " [options]\n"; -	if(!brief) -	{ -		output << -			"\n" -			"Create resource file from list of input files.\n" -			"\n"; -	} -	return output.str(); -} - -int main(int argc, char *argv[]) -{ -	bool verbose{false}; -	std::vector<std::string> stripPrefixes; -	std::string dirRoot; -	std::string outfile; - -	dg::Options opt; - -	opt.add("strip-path", required_argument, 's', -	        "Strip supplied path prefix from resource names.", -	        [&]() -	        { -		        stripPrefixes.push_back(optarg); -		        return 0; -	        }); - -	opt.add("dir-root", required_argument, 'd', -	        "Change to supplied root dir before reading files.", -	        [&]() -	        { -		        dirRoot = optarg; -		        return 0; -	        }); - -	opt.add("output", required_argument, 'o', -	        "Write output to specificed file, defaults to stdout.", -	        [&]() -	        { -		        outfile = optarg; -		        return 0; -	        }); - -	opt.add("verbose", no_argument, 'v', -	        "Print verbose output during processing.", -	        [&]() -	        { -		        verbose = true; -		        return 0; -	        }); - -	opt.add("help", no_argument, 'h', -	        "Print this message and exit.", -	        [&]() -	        { -		        std::cout << usage(argv[0]); -		        std::cout << "Options:\n"; -		        opt.help(); -		        exit(0); -		        return 0; -	        }); - -	if(opt.process(argc, argv) != 0) -	{ -		return 1; -	} - -	FILE* out = stdout; -	if(!outfile.empty()) -	{ -		out = fopen(outfile.data(), "wb"); -		if(!out) -		{ -			fprintf(stderr, "Could not write to file '%s' - quitting\n", -			        outfile.data()); -			return 1; - -		} -	} - -	fprintf(out, "/* This file is autogenerated by rcgen. Do not modify! */\n"); -	fprintf(out, "#include \"resource_data.h\"\n"); -	fprintf(out, "\n"); -	fprintf(out, "const rc_data_t rc_data[] =\n"); -	fprintf(out, "{\n"); - -	if(!dirRoot.empty()) -	{ -		if(verbose) -		{ -			fprintf(stderr, "Change to dir: %s\n", dirRoot.data()); -		} - -		if(chdir(dirRoot.data())) -		{ -			return 1; -		} -	} - -	for(const auto& arg : opt.arguments()) -	{ -		std::string resourceName = arg; -		for(const auto& stripPrefix : stripPrefixes) -		{ -			if(stripPrefix == resourceName.substr(0, stripPrefix.length())) -			{ -				resourceName = resourceName.substr(stripPrefix.length()); -				break; -			} -		} - -		fprintf(out, "	{\n		\":%s\", ", resourceName.data()); - -		if(verbose) -		{ -			fprintf(stderr, "Process: %s\n", arg.data()); -		} - -		std::string data; -		FILE *fp = fopen(arg.data(), "rb"); -		if(!fp) -		{ -			fprintf(stderr, "Could not read file '%s' - quitting\n", arg.data()); -			return 1; -		} - -		char buf[32]; -		while(!feof(fp)) -		{ -			std::size_t sz = fread(buf, 1, sizeof(buf), fp); -			data.append(buf, sz); -		} -		fclose(fp); - -		fprintf(out, "%d,\n		\"", (int)data.length()); -		for(std::size_t j = 0; j < data.length(); ++j) -		{ -			if((j != 0) && (j % 16) == 0) -			{ -				fprintf(out, "\"\n		\""); -			} -			fprintf(out, "\\%o", (unsigned char)data[j]); -		} - -		fprintf(out, "\"\n	},\n"); -	} - -	fprintf(out, "	{ \"\", 0, 0 }\n"); -	fprintf(out, "};\n"); - -	return 0; -} diff --git a/plugingui/resamplingframecontent.h b/plugingui/resamplingframecontent.h index 3efc62e..e66bec5 100644 --- a/plugingui/resamplingframecontent.h +++ b/plugingui/resamplingframecontent.h @@ -26,10 +26,10 @@   */  #pragma once -#include "widget.h" -#include "textedit.h" -#include "knob.h" -#include "label.h" +#include <dggui/widget.h> +#include <dggui/textedit.h> +#include <dggui/knob.h> +#include <dggui/label.h>  class SettingsNotifier;  struct Settings; diff --git a/plugingui/resource.cc b/plugingui/resource.cc deleted file mode 100644 index 44f5540..0000000 --- a/plugingui/resource.cc +++ /dev/null @@ -1,192 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            resource.cc - * - *  Sun Mar 17 19:38:04 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "resource.h" - -#include <hugin.hpp> -#include <cstdio> -#include <climits> - -#include <platform.h> - -#if DG_PLATFORM != DG_PLATFORM_WINDOWS -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#endif - -// rcgen generated file containing rc_data declaration. -#include "resource_data.h" - -namespace GUI -{ - -// TODO: Replace with std::filesystem::is_regular_file once we update the -// compiler to require C++17 -static bool pathIsFile(const std::string& path) -{ -#if DG_PLATFORM == DG_PLATFORM_WINDOWS -	return (GetFileAttributesA(path.data()) & FILE_ATTRIBUTE_DIRECTORY) == 0; -#else -	struct stat s; -	if(stat(path.data(), &s) != 0) -	{ -		return false; // error -	} - -	return (s.st_mode & S_IFREG) != 0; // s.st_mode & S_IFDIR => dir -#endif -} - -// Internal resources start with a colon. -static bool nameIsInternal(const std::string& name) -{ -	return name.size() && (name[0] == ':'); -} - -Resource::Resource(const std::string& name) -{ -	isValid = false; - -	if(nameIsInternal(name)) -	{ -		// Use internal resource: - -		// Find internal resource in rc_data. -		const rc_data_t* p = rc_data; -		while(*p->name) // last entry in rc_data has the name := "" -		{ -			if(name == p->name) -			{ -				internalData = p->data; -				internalSize = p->size; -				break; -			} -			++p; -		} - -		// We did not find the named resource. -		if(internalData == nullptr) -		{ -			ERR(rc, "Could not find '%s'\n", name.c_str()); -			return; -		} - -		isInternal = true; -	} -	else -	{ -		if(!pathIsFile(name)) -		{ -			return; -		} - -		// Read from file: -		std::FILE *fp = std::fopen(name.data(), "rb"); -		if(!fp) -		{ -			return; -		} - -		// Get the file size -		if(std::fseek(fp, 0, SEEK_END) == -1) -		{ -			std::fclose(fp); -			return; -		} - -		long filesize = std::ftell(fp); - -		// Apparently fseek doesn't fail if fp points to a directory that has been -		// opened (which doesn't fail either!!) and ftell will then fail by either -		// returning -1 or LONG_MAX -		if(filesize == -1L || filesize == LONG_MAX) -		{ -			std::fclose(fp); -			return; -		} - -		// Reserve space in the string for the data. -		externalData.reserve(filesize); - -		// Rewind and read... -		std::rewind(fp); - -		char buffer[32]; -		while(!std::feof(fp)) -		{ -			size_t size = std::fread(buffer, 1, sizeof(buffer), fp); -			externalData.append(buffer, size); -		} - -		std::fclose(fp); - -		isInternal = false; -	} - -	isValid = true; -} - -const char *Resource::data() -{ -	if(isValid == false) -	{ -		return nullptr; -	} - -	if(isInternal) -	{ -		return internalData; -	} -	else -	{ -		return externalData.data(); -	} -} - -size_t Resource::size() -{ -	if(isValid == false) -	{ -	  return 0; -	} - -	if(isInternal) -	{ -		return internalSize; -	} -	else -	{ -		return externalData.length(); -	} -} - -bool Resource::valid() -{ -	return isValid; -} - -} // GUI:: diff --git a/plugingui/resource.h b/plugingui/resource.h deleted file mode 100644 index 5f7b3b4..0000000 --- a/plugingui/resource.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            resource.h - * - *  Sun Mar 17 19:38:03 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> - -namespace GUI { - -class Resource { -public: -	Resource(const std::string& name); - -	const char* data(); -	size_t size(); - -	bool valid(); - -protected: -	std::string externalData; -	bool isValid{false}; -	bool isInternal{false}; -	const char *internalData{nullptr}; -	size_t internalSize{0}; -}; - -} // GUI:: diff --git a/plugingui/resource_data.h b/plugingui/resource_data.h deleted file mode 100644 index 337caf6..0000000 --- a/plugingui/resource_data.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            resource_data.h - * - *  Sun Mar 17 20:25:24 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -typedef struct { -	const char *name; -	unsigned int size; -	const char *data; -} rc_data_t; - -extern const rc_data_t rc_data[]; diff --git a/plugingui/sampleselectionframecontent.cc b/plugingui/sampleselectionframecontent.cc index f0aa5e7..a647144 100644 --- a/plugingui/sampleselectionframecontent.cc +++ b/plugingui/sampleselectionframecontent.cc @@ -28,7 +28,7 @@  #include <settings.h> -#include "painter.h" +#include <dggui/painter.h>  namespace GUI  { diff --git a/plugingui/sampleselectionframecontent.h b/plugingui/sampleselectionframecontent.h index f3636da..d56f545 100644 --- a/plugingui/sampleselectionframecontent.h +++ b/plugingui/sampleselectionframecontent.h @@ -26,10 +26,11 @@   */  #pragma once -#include "knob.h" +#include <dggui/knob.h> +#include <dggui/layout.h> +#include <dggui/widget.h> +  #include "labeledcontrol.h" -#include "layout.h" -#include "widget.h"  #include <translation.h> diff --git a/plugingui/scrollbar.cc b/plugingui/scrollbar.cc deleted file mode 100644 index 9a17d1d..0000000 --- a/plugingui/scrollbar.cc +++ /dev/null @@ -1,214 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            scrollbar.cc - * - *  Sun Apr 14 12:54:58 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "scrollbar.h" - -#include <hugin.hpp> - -#include "painter.h" - -namespace GUI { - -ScrollBar::ScrollBar(Widget *parent) -	: Widget(parent) -{ -} - -void ScrollBar::setRange(int r) -{ -	rangeValue = r; -	setValue(value()); -	redraw(); -} - -int ScrollBar::range() -{ -	return rangeValue; -} - -void ScrollBar::setMaximum(int m) -{ -	maxValue = m; -	if(maxValue < rangeValue) -	{ -		rangeValue = maxValue; -	} -	setValue(value()); -	redraw(); -} - -int ScrollBar::maximum() -{ -	return maxValue; -} - -void ScrollBar::addValue(int delta) -{ -	setValue(value() + delta); -} - -void ScrollBar::setValue(int value) -{ -	if(value > (maxValue - rangeValue)) -	{ -		value = maxValue - rangeValue; -	} - -	if(value < 0) -	{ -		value = 0; -	} - -	if(currentValue == value) -	{ -		return; -	} - -	currentValue = value; - -	valueChangeNotifier(value); - -	redraw(); -} - -int ScrollBar::value() -{ -	return currentValue; -} - -//! Draw an up/down arrow at (x,y) with the bounding box size (w,h) -//! If h is negative the arrow will point down, if positive it will point up. -static void drawArrow(Painter &p, int x, int y, int w, int h) -{ -	if(h < 0) -	{ -		y -= h; -	} - -	p.drawLine(x, y, x + (w / 2), y + h); -	p.drawLine(x + (w / 2), y + h, x + w, y); - -	++y; -	p.drawLine(x, y, x + (w / 2), y + h); -	p.drawLine(x + (w / 2), y + h, x + w, y); -} - -void ScrollBar::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	p.clear(); - -	p.drawImageStretched(0, 0, bg_img, width(), height()); - -	p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0f/255.0f, 1.0f)); -	if(!maxValue) -	{ -		return; -	} - -	{ -		int h = height() - 2 * width() - 3; -		int offset = width() + 2; - -		int y_val1 = (currentValue * h) / maxValue; -		int y_val2 = ((currentValue + rangeValue) * h) / maxValue - 1; - -		p.drawFilledRectangle(2, y_val1 + offset, width() - 1, y_val2 + offset); -	} - -	p.drawLine(0, 0, 0, height()); - -	drawArrow(p, width()/4, width()/4, width()/2, -1 * (width()/3)); -	p.drawLine(0, width(), width(), width()); - -	drawArrow(p, width()/4, height() - width() + width()/4, width()/2, width()/3); -	p.drawLine(0, height() - width(), width(), height() - width()); -} - -void ScrollBar::scrollEvent(ScrollEvent* scrollEvent) -{ -	setValue(value() + scrollEvent->delta); -} - -void ScrollBar::mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) -{ -	if(!dragging) -	{ -		return; -	} - -	float delta = yOffset - mouseMoveEvent->y; - -	int h = height() - 2 * width() - 3; -	delta /= (float)h / (float)maxValue; - -	int newval = valueOffset - delta; -	if(newval != value()) -	{ -		setValue(newval); -	} -} - -void ScrollBar::buttonEvent(ButtonEvent* buttonEvent) -{ -	// Ignore everything except left clicks. -	if(buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if((buttonEvent->y < (int)width()) && buttonEvent->y > 0) -	{ -		if(buttonEvent->direction == Direction::down) -		{ -			addValue(-1); -		} - -		return; -	} - -	if((buttonEvent->y > ((int)height() - (int)width())) && -	   (buttonEvent->y < (int)height())) -	{ -		if(buttonEvent->direction == Direction::down) -		{ -			addValue(1); -		} - -		return; -	} - -	if(buttonEvent->direction == Direction::down) -	{ -		yOffset = buttonEvent->y; -		valueOffset = value(); -	} - -	dragging = (buttonEvent->direction == Direction::down); -} - -} // GUI:: diff --git a/plugingui/scrollbar.h b/plugingui/scrollbar.h deleted file mode 100644 index 5e60673..0000000 --- a/plugingui/scrollbar.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            scrollbar.h - * - *  Sun Apr 14 12:54:58 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <limits> - -#include "widget.h" -#include "texture.h" -#include "notifier.h" - -namespace GUI { - -class ScrollBar : public Widget { -	friend class ListBoxBasic; -public: -	ScrollBar(Widget *parent); - -	void setRange(int range); -	int range(); - -	void setMaximum(int max); -	int maximum(); - -	void addValue(int delta); -	void setValue(int value); -	int value(); - -	Notifier<int> valueChangeNotifier; // (int value) - -protected: -	// From Widget: -	bool catchMouse() override { return true; } -	void scrollEvent(ScrollEvent* scrollEvent) override; -	void repaintEvent(RepaintEvent* repaintEvent) override; -	void buttonEvent(ButtonEvent* buttonEvent) override; -	void mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) override; - -private: -	int maxValue{100}; -	int currentValue{0}; -	int rangeValue{10}; - -	int yOffset{0}; -	int valueOffset{0}; -	bool dragging{false}; - -	Texture bg_img{getImageCache(), ":resources/widget.png", 7, 7, 1, 63}; -}; - -} // GUI:: diff --git a/plugingui/slider.cc b/plugingui/slider.cc deleted file mode 100644 index 15a82b3..0000000 --- a/plugingui/slider.cc +++ /dev/null @@ -1,217 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            slider.cc - * - *  Sat Nov 26 18:10:22 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "slider.h" - -#include "painter.h" - -#include <hugin.hpp> -#include <stdio.h> - -namespace GUI -{ - -Slider::Slider(Widget* parent) : Widget(parent) -{ -	state = State::up; - -	current_value = 0.0; -	maximum = 1.0; -	minimum = 0.0; -} - -void Slider::setValue(float new_value) -{ -	current_value = new_value; -	if (current_value < 0.) -	{ -		current_value = 0.; -	} -	else if (current_value > 1.0) { -		current_value = 1.0; -	} - -	redraw(); -	clickNotifier(); -	valueChangedNotifier(current_value); -} - -float Slider::value() const -{ -	return current_value; -} - -void Slider::setColour(Colour colour) -{ -	switch (colour) { -	case Colour::Green: -		active_inner_bar = &inner_bar_green; -		break; -	case Colour::Red: -		active_inner_bar = &inner_bar_red; -		break; -	case Colour::Blue: -		active_inner_bar = &inner_bar_blue; -		break; -	case Colour::Yellow: -		active_inner_bar = &inner_bar_yellow; -		break; -	case Colour::Purple: -		active_inner_bar = &inner_bar_purple; -		break; -	case Colour::Grey: -		active_inner_bar = &inner_bar_grey; -		break; -	} - -	if (enabled) { inner_bar = active_inner_bar; } -} - -void Slider::setEnabled(bool enabled) -{ -	this->enabled = enabled; - -	if (enabled) { -		inner_bar = active_inner_bar; -	} -	else { -		active_inner_bar = inner_bar; -		inner_bar = &inner_bar_light_grey; -	} - -	redraw(); -} - -void Slider::repaintEvent(RepaintEvent* repaintEvent) -{ -	Painter p(*this); - -	auto inner_offset = (current_value / maximum) * getControlWidth(); -	auto button_x = button_offset + inner_offset - (button.width() / 2); -	auto button_y = (height() - button.height()) / 2; - -	// draw bar -	bar.setSize(width(), height()); -	p.drawImage(0, 0, bar); - -	// draw inner bar -	inner_bar->setSize(button_x - bar_boundary, height() - 2 * bar_boundary); -	p.drawImage(bar_boundary, bar_boundary, *inner_bar); - -	// draw button -	p.drawImage(button_x, button_y, button); -} - -void Slider::buttonEvent(ButtonEvent* buttonEvent) -{ -	// Ignore everything except left clicks. -	if(!enabled || buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if(buttonEvent->direction == Direction::down) -	{ -		state = State::down; -		recomputeCurrentValue(buttonEvent->x); - -		redraw(); -		clickNotifier(); -		valueChangedNotifier(current_value); -	} - -	if(buttonEvent->direction == Direction::up) -	{ -		state = State::up; -		recomputeCurrentValue(buttonEvent->x); - -		redraw(); -		clickNotifier(); -		valueChangedNotifier(current_value); -	} -} - -void Slider::mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) -{ -	if(state == State::down) -	{ -		recomputeCurrentValue(mouseMoveEvent->x); - -		redraw(); -		clickNotifier(); -		valueChangedNotifier(current_value); -	} -} - -void Slider::scrollEvent(ScrollEvent* scrollEvent) -{ -	if (!enabled) { return; } - -	current_value -= scrollEvent->delta/(float)getControlWidth(); -	if (current_value < 0.) -	{ -		current_value = 0.; -	} -	else if (current_value > 1.0) { -		current_value = 1.0; -	} - -	redraw(); -	clickNotifier(); -	valueChangedNotifier(current_value); -} - -std::size_t Slider::getControlWidth() const -{ -	if(width() < 2 * button_offset) -	{ -		return 0; -	} - -	return width() - 2 * button_offset; -} - -void Slider::recomputeCurrentValue(float x) -{ -	if(x < button_offset) -	{ -		current_value = 0; -	} -	else -	{ -		current_value = (x - button_offset) / getControlWidth(); -	} - -	if (current_value < 0.) -	{ -		current_value = 0.; -	} -	else if (current_value > 1.0) { -		current_value = 1.0; -	} -} - -} // GUI:: diff --git a/plugingui/slider.h b/plugingui/slider.h deleted file mode 100644 index 90905fd..0000000 --- a/plugingui/slider.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            slider.h - * - *  Sat Nov 26 18:10:22 CET 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "texture.h" -#include "texturedbox.h" -#include "widget.h" - -namespace GUI -{ - -class Slider -	: public Widget -{ -public: -	Slider(Widget* parent); -	virtual ~Slider() = default; - -	// From Widget: -	bool catchMouse() override -	{ -		return true; -	} -	bool isFocusable() override -	{ -		return true; -	} - -	void setValue(float new_value); -	float value() const; - -	enum class Colour { Green, Red, Blue, Yellow, Purple, Grey }; -	// Changes the colour of the inner bar -	void setColour(Colour colour); -	void setEnabled(bool enabled); - -	Notifier<> clickNotifier; -	Notifier<float> valueChangedNotifier; // (float value) - -protected: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; -	virtual void buttonEvent(ButtonEvent* buttonEvent) override; -	virtual void mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) override; -	virtual void scrollEvent(ScrollEvent* scrollEvent) override; - -	bool enabled = true;; - -private: -	enum class State -	{ -		up, -		down -	}; - -	float current_value; -	float maximum; -	float minimum; - -	State state; - -	TexturedBox bar{getImageCache(), ":resources/slider.png", -		0, 0, // atlas offset (x, y) -	    7, 1, 7, // dx1, dx2, dx3 -	    7, 1, 7 // dy1, dy2, dy3 -	}; -	Texture button{ -	    getImageCache(), ":resources/slider.png", 15, 0, // atlas offset (x, y) -	    15, 15                                 // width, height -	}; - -	TexturedBox inner_bar_green{getImageCache(), ":resources/slider.png", -		30, 0, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_red{getImageCache(), ":resources/slider.png", -		30, 5, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_blue{getImageCache(), ":resources/slider.png", -		30, 10, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_yellow{getImageCache(), ":resources/slider.png", -		35, 0, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_purple{getImageCache(), ":resources/slider.png", -		35, 5, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_grey{getImageCache(), ":resources/slider.png", -		35, 10, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_turquoise{getImageCache(), ":resources/slider.png", -		40, 0, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_orange{getImageCache(), ":resources/slider.png", -		40, 5, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; -	TexturedBox inner_bar_light_grey{getImageCache(), ":resources/slider.png", -		40, 10, // atlas offset (x, y) -		2, 1, 2, // dx1, dx2, dx3 -		2, 1, 2 // dy1, dy2, dy3 -	}; - -	// This points to the inner_bar_* of the current color. -	// It should never be a nullptr! -	TexturedBox* inner_bar{&inner_bar_blue}; -	TexturedBox* active_inner_bar = inner_bar; - -	std::size_t bar_boundary{5}; -	std::size_t button_offset{7}; - -	std::size_t getControlWidth() const; -	void recomputeCurrentValue(float x); -}; - -} // GUI:: diff --git a/plugingui/stackedwidget.cc b/plugingui/stackedwidget.cc deleted file mode 100644 index 05f8f3c..0000000 --- a/plugingui/stackedwidget.cc +++ /dev/null @@ -1,151 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            stackedwidget.cc - * - *  Mon Nov 21 19:36:49 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "stackedwidget.h" - -namespace GUI -{ - -StackedWidget::StackedWidget(Widget *parent) -	: Widget(parent) -{ -	CONNECT(this, sizeChangeNotifier, this, &StackedWidget::sizeChanged); -} - -StackedWidget::~StackedWidget() -{ -} - -void StackedWidget::addWidget(Widget *widget) -{ -	widgets.push_back(widget); -	widget->reparent(this); - -	if(currentWidget == nullptr) -	{ -		setCurrentWidget(widget); -	} -	else -	{ -		widget->setVisible(false); -	} -} - -void StackedWidget::removeWidget(Widget *widget) -{ -	if(widget == currentWidget) -	{ -		setCurrentWidget(nullptr); -	} - -	widgets.remove(widget); -} - -Widget *StackedWidget::getCurrentWidget() const -{ -	return currentWidget; -} - -void StackedWidget::setCurrentWidget(Widget *widget) -{ -	if(widget == currentWidget) -	{ -		return; -	} - -	if(currentWidget) -	{ -		currentWidget->setVisible(false); -	} - -	currentWidget = widget; - -	if(currentWidget) -	{ -		currentWidget->move(0, 0); -		currentWidget->resize(width(), height()); -		currentWidget->setVisible(true); -	} - -	currentChanged(currentWidget); -} - -Widget* StackedWidget::getWidgetAfter(Widget* widget) -{ -	bool found_it{false}; - -	for(auto w : widgets) -	{ -		if(found_it) -		{ -			return w; -		} - -		if(w == widget) -		{ -			found_it = true; -		} -	} - -	if(found_it) -	{ -		// widget was the last in the list. -		return nullptr; -	} - -	// The Widget pointed to by 'widget' was not in the list... -	return nullptr; -} - -Widget* StackedWidget::getWidgetBefore(Widget* widget) -{ -	Widget* last{nullptr}; - -	for(auto w : widgets) -	{ -		if(w == widget) -		{ -			return last; -		} - -		last = w; -	} - -	// The Widget pointed to by 'widget' was not in the list... -	return nullptr; -} - -void StackedWidget::sizeChanged(int width, int height) -{ -	// Propagate size change to child: -	if(currentWidget) -	{ -		currentWidget->move(0, 0); -		currentWidget->resize(width, height); -	} -} - -} // GUI:: diff --git a/plugingui/stackedwidget.h b/plugingui/stackedwidget.h deleted file mode 100644 index 24213f7..0000000 --- a/plugingui/stackedwidget.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            stackedwidget.h - * - *  Mon Nov 21 19:36:49 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <list> - -#include "widget.h" -#include "notifier.h" - -namespace GUI -{ - -//! A StackedWidget is a widget containing a list of widgets but only showing -//! one of them at a time. -//! It is be used to implement a TabWidget but can also be used for other -//! purposes. -class StackedWidget -	: public Widget -{ -public: -	StackedWidget(Widget* parent); -	~StackedWidget(); - -	//! Add a widget to the stack. -	void addWidget(Widget* widget); - -	//! Remove a widget from the stack. -	void removeWidget(Widget* widget); - -	//! Get currently visible widget. -	Widget* getCurrentWidget() const; - -	//! Show widget. Hide all the others. -	//! If widget is not in the stack nothing happens. -	void setCurrentWidget(Widget* widget); - -	//! Returns a pointer to the Widget after the one referenced by 'widget' or -	//! nullptr if 'widget' is the last in the list. -	Widget* getWidgetAfter(Widget* widget); - -	//! Returns a pointer to the Widget beforer the one referenced by 'widget' or -	//! nullptr if 'widget' is the first in the list. -	Widget* getWidgetBefore(Widget* widget); - -	//! Reports whn a new widget is shown. -	Notifier<Widget*> currentChanged; - -private: -	//! Callback for Widget::sizeChangeNotifier -	void sizeChanged(int width, int height); - -private: -	Widget* currentWidget{nullptr}; -	std::list<Widget*> widgets; -}; - -} // GUI:: diff --git a/plugingui/statusframecontent.h b/plugingui/statusframecontent.h index 998e87c..fdf6d05 100644 --- a/plugingui/statusframecontent.h +++ b/plugingui/statusframecontent.h @@ -27,8 +27,9 @@  #pragma once  #include "settings.h" -#include "textedit.h" -#include "widget.h" + +#include <dggui/textedit.h> +#include <dggui/widget.h>  class SettingsNotifier; diff --git a/plugingui/tabbutton.cc b/plugingui/tabbutton.cc deleted file mode 100644 index 6a27f61..0000000 --- a/plugingui/tabbutton.cc +++ /dev/null @@ -1,132 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            tabbutton.cc - * - *  Thu Nov 24 18:52:26 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "tabbutton.h" - -#include "painter.h" - -namespace GUI -{ - -static TabID getNextTabID() -{ -	static TabID next{0}; -	next++; -	return next; -} - -TabButton::TabButton(Widget* parent, Widget* tab_widget) -	: ButtonBase(parent) -	, tab_widget(tab_widget) -{ -	tab_id = getNextTabID(); -	CONNECT(this, clickNotifier, this, &TabButton::clickHandler); -} - -TabButton::~TabButton() -{ -} - -Widget* TabButton::getTabWidget() -{ -	return tab_widget; -} - -std::size_t TabButton::getMinimalWidth() const -{ -	std::size_t padding = 15; -	auto font_width = font.textWidth(text); - -	return font_width + padding; -} - -std::size_t TabButton::getMinimalHeight() const -{ -	std::size_t padding = 10; -	auto font_height= font.textHeight(text); - -	return font_height + padding; -} - -void TabButton::setActive(bool active) -{ -	this->active = active; - -	if (active) { -		draw_state = State::Down; -	} -	else { -		draw_state = State::Up; -	} - -	redraw(); -} - -TabID TabButton::getID() const -{ -	return tab_id; -} - -void TabButton::repaintEvent(RepaintEvent* e) -{ -	Painter p(*this); - -	int padTop = 3; -	int padLeft = 0; -	int padTextTop = 3; - -	int w = width(); -	int h = height(); -	if(w == 0 || h == 0) -	{ -		return; -	} - -	if (draw_state == State::Up && !active) { -		tab_passive.setSize(w - padLeft, h - padTop); -		p.drawImage(padLeft, padTop, tab_passive); -	} -	else { -		tab_active.setSize(w - padLeft, h - padTop); -		p.drawImage(padLeft, padTop, tab_active); -	} - -	auto x = padLeft + (width() - font.textWidth(text)) / 2; -	auto y = padTop + padTextTop + font.textHeight(text); -	p.drawText(x, y, font, text, true); -} - -void TabButton::scrollEvent(ScrollEvent* scroll_event) -{ -	scrollNotifier(scroll_event->delta); -} - -void TabButton::clickHandler() -{ -	switchTabNotifier(tab_widget); -} - -} // GUI:: diff --git a/plugingui/tabbutton.h b/plugingui/tabbutton.h deleted file mode 100644 index 1e9371a..0000000 --- a/plugingui/tabbutton.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            tabbutton.h - * - *  Thu Nov 24 18:52:26 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <notifier.h> - -#include "button_base.h" -#include "font.h" -#include "texturedbox.h" - -namespace GUI -{ - -class ScrollEvent; - -using TabID = int; - -class TabButton -	: public ButtonBase -{ -public: -	TabButton(Widget* parent, Widget* tab_widget); -	virtual ~TabButton(); - -	Widget* getTabWidget(); -	std::size_t getMinimalWidth() const; -	std::size_t getMinimalHeight() const; -	void setActive(bool active); - -	TabID getID() const; - -	Notifier<Widget*> switchTabNotifier; -	Notifier<float> scrollNotifier; // float delta - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* e) override; -	virtual void scrollEvent(ScrollEvent* scroll_event) override; - -private: -	TabID tab_id; - -	void clickHandler(); - -	Widget* tab_widget; -	bool active{false}; - -	TexturedBox tab_active{getImageCache(), ":resources/tab.png", -			0, 0, // atlas offset (x, y) -			5, 1, 5, // dx1, dx2, dx3 -			5, 13, 1}; // dy1, dy2, dy3 - -	TexturedBox tab_passive{getImageCache(), ":resources/tab.png", -			11, 0, // atlas offset (x, y) -			5, 1, 5, // dx1, dx2, dx3 -			5, 13, 1}; // dy1, dy2, dy3 - -	Font font{":resources/fontemboss.png"}; -}; - -} // GUI:: diff --git a/plugingui/tabwidget.cc b/plugingui/tabwidget.cc deleted file mode 100644 index 635f1bd..0000000 --- a/plugingui/tabwidget.cc +++ /dev/null @@ -1,214 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            tabwidget.cc - * - *  Thu Nov 24 17:46:22 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "tabwidget.h" - -#include "painter.h" - -namespace GUI -{ - -TabWidget::TabWidget(Widget *parent) -	: Widget(parent) -	, stack(this) -{ -	CONNECT(this, sizeChangeNotifier, this, &TabWidget::sizeChanged); -	CONNECT(&stack, currentChanged, this, &TabWidget::setActiveButtons); -} - -TabID TabWidget::addTab(const std::string& title, Widget* widget) -{ -	buttons.emplace_back(this, widget); -	auto& button = buttons.back(); -	button.setText(title); -	stack.addWidget(widget); -	CONNECT(&button, switchTabNotifier, this, &TabWidget::switchTab); -	CONNECT(&button, scrollNotifier, this, &TabWidget::rotateTab); -	sizeChanged(width(), height()); -	return button.getID(); -} - -void TabWidget::setTabWidth(std::size_t width) -{ -	tab_width = width; -	relayout(); -} - -std::size_t TabWidget::getTabWidth() const -{ -	return tab_width; -} - -void TabWidget::setVisible(TabID tab_id, bool visible) -{ -	for (auto& button : buttons) -	{ -		if(button.getID() == tab_id) -		{ -			button.setVisible(visible); -			relayout(); -			return; -		} -	} -} - -std::size_t TabWidget::getBarHeight() const -{ -	return topbar.height(); -} - -void TabWidget::rotateTab(float delta) -{ -	Widget* widget{nullptr}; -	Widget* current = stack.getCurrentWidget(); -	if(delta > 0.0f) -	{ -		while((widget = stack.getWidgetAfter(current)) != nullptr) -		{ -			auto button = getButtonFromWidget(widget); -			if(!button || !button->visible()) -			{ -				current = widget; -				continue; -			} -			break; -		} -	} -	else -	{ -		while((widget = stack.getWidgetBefore(current)) != nullptr) -		{ -			auto button = getButtonFromWidget(widget); -			if(!button || !button->visible()) -			{ -				current = widget; -				continue; -			} -			break; -		} -	} - -	if(widget) -	{ -		switchTab(widget); -	} -} - -void TabWidget::switchTab(Widget* tab_widget) -{ -	stack.setCurrentWidget(tab_widget); -} - -void TabWidget::setActiveButtons(Widget* current_widget) -{ -	for (auto& button : buttons) { -		if (button.getTabWidget() == current_widget) { -			button.setActive(true); -		} -		else -		{ -			button.setActive(false); -		} -	} -} - -void TabWidget::sizeChanged(int width, int height) -{ -	std::size_t pos = 0; - -	int button_width = tab_width; -	int bar_height = 25; -	int button_border_width = 10; - -	int button_padding_left = 25; -	int button_padding_inner = 3; -	int logo_padding_right = button_padding_left / 2; - -	Painter p(*this); - -	if(buttons.size() > 0) -	{ -		for(auto& button : buttons) -		{ -			if(!button.visible()) -			{ -				continue; -			} -			int min_width = button.getMinimalWidth(); -			button_width = std::max(button_width, min_width + button_border_width); -		} - -		button_width = std::min(button_width, width / (int)buttons.size()); -	} - -	// draw the upper bar -	topbar.setSize(width, bar_height); -	p.drawImage(0, 0, topbar); -	auto x_logo = width - toplogo.width() - logo_padding_right; -	auto y_logo = (bar_height - toplogo.height()) / 2; -	p.drawImage(x_logo, y_logo, toplogo); - -	// place the buttons -	pos = button_padding_left; -	for(auto& button : buttons) -	{ -		if(!button.visible()) -		{ -			continue; -		} -		button.resize(button_width, bar_height); -		button.move(pos, 0); -		pos += button_width + button_padding_inner; -	} - -	stack.move(0, bar_height); -	stack.resize(width, std::max((int)height - bar_height, 0)); -} - -void TabWidget::relayout() -{ -	sizeChanged(TabWidget::width(), TabWidget::height()); // Force re-layout -} - -const TabButton* TabWidget::getButtonFromWidget(const Widget* tab_widget) -{ -	if(tab_widget == nullptr) -	{ -		return nullptr; -	} - -	for(auto& button : buttons) -	{ -		if(button.getTabWidget() == tab_widget) -		{ -			return &button; -		} -	} - -	return nullptr; -} - -} // GUI:: diff --git a/plugingui/tabwidget.h b/plugingui/tabwidget.h deleted file mode 100644 index 129826a..0000000 --- a/plugingui/tabwidget.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            tabwidget.h - * - *  Thu Nov 24 17:46:22 CET 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "widget.h" -#include "tabbutton.h" -#include "stackedwidget.h" -#include "texture.h" - -namespace GUI -{ - -class TabWidget -	: public Widget -{ -public: -	TabWidget(Widget *parent); - -	//! Add new tab to the tab widget. -	//! \param title The title to display on the tab button. -	//! \param widget The widget to show in the tab. -	//! \returns The TabID of the newly added tab. -	TabID addTab(const std::string& title, Widget* widget); - -	std::size_t getBarHeight() const; - -	void setTabWidth(std::size_t width); -	std::size_t getTabWidth() const; - -	void setVisible(TabID tab_id, bool visible); - -private: -	//! Callback for Widget::sizeChangeNotifier -	void sizeChanged(int width, int height); - -private: -	void relayout(); -	//! Switch to the next tab if delta is > 0 or previous tab if delta is <= 0. -	void rotateTab(float delta); -	void switchTab(Widget* tabWidget); -	void setActiveButtons(Widget* current_widget); - -	const TabButton* getButtonFromWidget(const Widget* tab_widget); - -	std::list<TabButton> buttons; -	StackedWidget stack; - -	TexturedBox topbar{getImageCache(), ":resources/topbar.png", -			0, 0, // atlas offset (x, y) -			1, 1, 1, // dx1, dx2, dx3 -			17, 1, 1}; // dy1, dy2, dy3 - -	Texture toplogo{getImageCache(), ":resources/toplogo.png", -			0, 0, // atlas offset (x, y) -			95, 17}; // width, height - -	std::size_t tab_width{64}; -}; - -} // GUI:: diff --git a/plugingui/testmain.cc b/plugingui/testmain.cc index 3f73039..4b94083 100644 --- a/plugingui/testmain.cc +++ b/plugingui/testmain.cc @@ -31,10 +31,10 @@  #include <settings.h>  #include <config.h> -#include "mainwindow.h" -#include "window.h" -#include "resource.h" -#include "uitranslation.h" +#include <dggui/window.h> +#include <dggui/resource.h> +#include <dggui/uitranslation.h> +  #include "mainwindow.h"  int main() diff --git a/plugingui/textedit.cc b/plugingui/textedit.cc deleted file mode 100644 index 9688b82..0000000 --- a/plugingui/textedit.cc +++ /dev/null @@ -1,201 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            lineedit.cc - * - *  Tue Oct 21 11:25:26 CEST 2014 - *  Copyright 2014 Jonas Suhr Christensen - *  jsc@umbraculum.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "textedit.h" - -#include "painter.h" - -namespace GUI -{ - -TextEdit::TextEdit(Widget* parent) : Widget(parent), scroll(this) -{ -	setReadOnly(true); - -	scroll.move(width() - 2*x_border - 3, y_border - 1); -	scroll.resize(16, 100); -	CONNECT(&scroll, valueChangeNotifier, this, &TextEdit::scrolled); -} - -TextEdit::~TextEdit() -{ -} - -void TextEdit::resize(std::size_t width, std::size_t height) -{ -	Widget::resize(width, height); - -	needs_preprocessing = true; -	scroll.move(width - 2*x_border - 3, y_border - 1); -	scroll.resize(scroll.width(), std::max((int)height - 2*(y_border - 1), 0)); -} - -void TextEdit::setReadOnly(bool readonly) -{ -	this->readonly = readonly; -} - -bool TextEdit::readOnly() -{ -	return readonly; -} - -void TextEdit::setText(const std::string& text) -{ -	this->text = text; - -	needs_preprocessing = true; -	redraw(); -	textChangedNotifier(); -} - -std::string TextEdit::getText() -{ -	return text; -} - -void TextEdit::preprocessText() -{ -	std::vector<std::string> lines; - -	preprocessed_text.clear(); -	std::string text = this->text; - -	// Handle tab characters -	for(std::size_t i = 0; i < text.length(); ++i) -	{ -		char ch = text.at(i); -		if(ch == '\t') -		{ -			text.erase(i, 1); -			text.insert(i, 4, ' '); -		} -	} - -	// Handle "\r" -	for(std::size_t i = 0; i < text.length(); ++i) -	{ -		char ch = text.at(i); -		if(ch == '\r') -		{ -			text.erase(i, 1); -		} -	} - -	// Handle new line characters -	std::size_t pos = 0; -	do -	{ -		pos = text.find("\n"); -		lines.push_back(text.substr(0, pos)); -		text = text.substr(pos + 1); -	} while(pos != std::string::npos); - -	// Wrap long lines -	auto const max_width = width() - 2*x_border - 10 - scroll.width(); -	for(auto const& line: lines) -	{ -		std::string valid; -		std::string current; -		for(auto c: line) -		{ -			current += c; -			if(c == ' ') -			{ -				valid.append(current.substr(valid.size())); -			} - -			if(font.textWidth(current) >= max_width) -			{ -				if(valid.empty()) -				{ -					current.pop_back(); -					preprocessed_text.push_back(current); -					current = c; -				} -				else -				{ -					current = current.substr(valid.size()); -					valid.pop_back(); -					preprocessed_text.push_back(valid); -					valid.clear(); -				} -			} -		} -		preprocessed_text.push_back(current); -	} -} - -void TextEdit::repaintEvent(RepaintEvent* repaintEvent) -{ -	if(needs_preprocessing) -	{ -		preprocessText(); -	} - -	Painter p(*this); - -	// update values of scroll bar -	scroll.setRange(height() / font.textHeight()); -	scroll.setMaximum(preprocessed_text.size()); - -	if((width() == 0) || (height() == 0)) -	{ -		return; -	} - -	box.setSize(width(), height()); -	p.drawImage(0, 0, box); -	p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0f/255.0f, 1.0f)); - -	int ypos = font.textHeight() + y_border; - -	auto scroll_value = scroll.value(); -	for(std::size_t i = 0; i < preprocessed_text.size() - scroll_value; ++i) -	{ -		if(i * font.textHeight() >= (height() - y_border - font.textHeight())) -		{ -			break; -		} - -		auto const& line = preprocessed_text[scroll_value + i]; -		p.drawText(x_border, ypos, font, line); -		ypos += font.textHeight(); -	} -} - -void TextEdit::scrollEvent(ScrollEvent* scrollEvent) -{ -	scroll.setValue(scroll.value() + scrollEvent->delta); -} - -void TextEdit::scrolled(int value) -{ -	(void)value; -	redraw(); -} - -} // GUI:: diff --git a/plugingui/textedit.h b/plugingui/textedit.h deleted file mode 100644 index 17a04ff..0000000 --- a/plugingui/textedit.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            textedit.h - * - *  Tue Oct 21 11:23:58 CEST 2014 - *  Copyright 2014 Jonas Suhr Christensen - *  jsc@umbraculum.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <vector> - -#include "font.h" -#include "notifier.h" -#include "scrollbar.h" -#include "texturedbox.h" -#include "widget.h" - -namespace GUI -{ - -class TextEdit -	: public Widget -{ -public: -	TextEdit(Widget* parent); -	virtual ~TextEdit(); - -	// From Widget -	bool isFocusable() override -	{ -		return true; -	} -	void resize(std::size_t width, std::size_t height) override; - -	std::string getText(); -	void setText(const std::string& text); - -	void setReadOnly(bool readonly); -	bool readOnly(); - -	void preprocessText(); - -	Notifier<> textChangedNotifier; - -protected: -	// From Widget -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; -	void scrollEvent(ScrollEvent* scrollEvent) override; - -private: -	void scrolled(int value); - -	TexturedBox box{getImageCache(), ":resources/widget.png", 0, -	    0,         // atlas offset (x, y) -	    7, 1, 7,   // dx1, dx2, dx3 -	    7, 63, 7}; // dy1, dy2, dy3 - -	static constexpr int x_border{10}; -	static constexpr int y_border{8}; - -	ScrollBar scroll; -	Font font; - -	std::string text; - -	bool readonly{true}; -	bool needs_preprocessing{false}; - -	std::vector<std::string> preprocessed_text; -}; - -} // GUI:: diff --git a/plugingui/texture.cc b/plugingui/texture.cc deleted file mode 100644 index 8cd7040..0000000 --- a/plugingui/texture.cc +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            texture.cc - * - *  Sat Jun  4 21:18:11 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "texture.h" - -namespace GUI -{ - -Texture::Texture(ImageCache& image_cache, const std::string& filename, -                 std::size_t x, std::size_t y, -                 std::size_t width, std::size_t height) -	: ScopedImageBorrower(image_cache, filename) -	, _x(x) -	, _y(y) -	, _width(width>image.width()?image.width():width) -	, _height(height>image.height()?image.height():height) -{ -} - -size_t Texture::width() const -{ -	return _width; -} - -size_t Texture::height() const -{ -	return _height; -} - -const Colour& Texture::getPixel(size_t x, size_t y) const -{ -	if(x > _width || y > _height) -	{ -		return outOfRange; -	} -	return image.getPixel(x + _x, y + _y); -} - -const std::uint8_t* Texture::line(std::size_t y, std::size_t x_offset) const -{ -	return image.line(y + _y) + _x * 4 + x_offset * 4; -} - -bool Texture::hasAlpha() const -{ -	return true; -} - -} // GUI:: diff --git a/plugingui/texture.h b/plugingui/texture.h deleted file mode 100644 index c751ed4..0000000 --- a/plugingui/texture.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            texture.h - * - *  Sat Jun  4 21:18:11 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <limits> - -#include "imagecache.h" -#include "image.h" - -namespace GUI -{ - -class Texture -	: public ScopedImageBorrower -	, public Drawable -{ -public: -	Texture(ImageCache& image_cache, const std::string& filename, -	        std::size_t x = 0, std::size_t y = 0, -	        std::size_t width = std::numeric_limits<std::size_t>::max(), -	        std::size_t height = std::numeric_limits<std::size_t>::max()); - -	size_t width() const override; -	size_t height() const override; - -	const Colour& getPixel(size_t x, size_t y) const override; -	const std::uint8_t* line(std::size_t y, -	                         std::size_t x_offset = 0) const override; -	bool hasAlpha() const override; - -private: -	std::size_t _x; -	std::size_t _y; -	std::size_t _width; -	std::size_t _height; -	Colour outOfRange{0.0f, 0.0f, 0.0f, 0.0f}; -}; - -} // GUI:: diff --git a/plugingui/texturedbox.cc b/plugingui/texturedbox.cc deleted file mode 100644 index e48353a..0000000 --- a/plugingui/texturedbox.cc +++ /dev/null @@ -1,147 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            texturedbox.cc - * - *  Sun Jun  5 12:22:15 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "texturedbox.h" - -#include <cassert> - -namespace GUI -{ - -TexturedBox::TexturedBox(ImageCache& image_cache, const std::string& filename, -                         std::size_t x0, std::size_t y0, -                         std::size_t dx1, std::size_t dx2, std::size_t dx3, -                         std::size_t dy1, std::size_t dy2, std::size_t dy3) -	: seg_a(image_cache, filename, x0            , y0            , dx1, dy1) -	, seg_b(image_cache, filename, x0 + dx1      , y0            , dx2, dy1) -	, seg_c(image_cache, filename, x0 + dx1 + dx2, y0            , dx3, dy1) -	, seg_d(image_cache, filename, x0            , y0 + dy1      , dx1, dy2) -	, seg_e(image_cache, filename, x0 + dx1      , y0 + dy1      , dx2, dy2) -	, seg_f(image_cache, filename, x0 + dx1 + dx2, y0 + dy1      , dx3, dy2) -	, seg_g(image_cache, filename, x0            , y0 + dy1 + dy2, dx1, dy3) -	, seg_h(image_cache, filename, x0 + dx1      , y0 + dy1 + dy2, dx2, dy3) -	, seg_i(image_cache, filename, x0 + dx1 + dx2, y0 + dy1 + dy2, dx3, dy3) -	, dx1(dx1) -	, dx2(dx2) -	, dx3(dx3) -	, dy1(dy1) -	, dy2(dy2) -	, dy3(dy3) -	, _width(dx1 + dx2 + dx3) -	, _height(dy1 + dy2 + dy3) -{ -} - -std::size_t TexturedBox::width() const -{ -	return _width; -} - -std::size_t TexturedBox::height() const -{ -	return _height; -} - -void TexturedBox::setSize(std::size_t width, std::size_t height) -{ -	_width = width; -	_height = height; -} - -const Colour& TexturedBox::getPixel(std::size_t x, std::size_t y) const -{ -	assert(x < _width); -	assert(y < _height); - -	if(y < dy1) // row 1 -	{ -		if(x < dx1) // col 1 -		{ -			return seg_a.getPixel(x, y); -		} -		else if(x < (_width - dx3)) // col 2 -		{ -			float scale = (float)(x - dx1) / (float)(_width - dx1 - dx3); -			assert(seg_b.width() == dx2); -			return seg_b.getPixel(scale * dx2, y); -		} -		else // col 3 -		{ -			return seg_c.getPixel(x - (_width - dx3), y); -		} -	} -	else if(y < (_height - dy3)) // row 2 -	{ -		if(x < dx1) // col 1 -		{ -			// TODO: Apply vertical scale -			float scale = (float)(y - dy1) / (float)(_height - dy1 - dy3); -			return seg_d.getPixel(x, scale * dy2); -		} -		else if(x < (_width - dx3)) // col 2 -		{ -			float scale_x = (float)(x - dx1) / (float)(_width - dx1 - dx3); -			float scale_y = (float)(y - dy1) / (float)(_height - dy1 - dy3); -			return seg_e.getPixel(scale_x * dx2, scale_y * dy2); -		} -		else // col 3 -		{ -			float scale = (float)(y - dy1) / (float)(_height - dy1 - dy3); -			return seg_f.getPixel(x - (_width - dx3), scale * dy2); -		} -	} -	else // row 3 -	{ -		if(x < dx1) // col 1 -		{ -			return seg_g.getPixel(x, y - (_height - dy3)); -		} -		else if(x < (_width - dx3)) // col 2 -		{ -			float scale = (float)(x - dx1) / (float)(_width - dx1 - dx3); -			return seg_h.getPixel(scale * dx2, y - (_height - dy3)); -		} -		else // col 3 -		{ -			return seg_i.getPixel(x - (_width - dx3), y - (_height - dy3)); -		} -	} - -	return outOfRange; -} - -const std::uint8_t* TexturedBox::line(std::size_t y, std::size_t x_offset) const -{ -	// TODO: Gather line into temporary buffer? -	return nullptr; -} - -bool TexturedBox::hasAlpha() const -{ -	return true; -} - -} // GUI:: diff --git a/plugingui/texturedbox.h b/plugingui/texturedbox.h deleted file mode 100644 index 7aa3967..0000000 --- a/plugingui/texturedbox.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            texturedbox.h - * - *  Sun Jun  5 12:22:14 CEST 2016 - *  Copyright 2016 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "drawable.h" -#include "imagecache.h" -#include "texture.h" - -namespace GUI -{ - -class TexturedBox -	: public Drawable -{ -public: -	//! Draw a box from 9 image segments nested inside the same image. -	//! An image says more than a thousand words: -	//! .----------------------------------------. -	//! |  (x0, y0)                              | -	//! |      \  dx1      dx2      dx3          | -	//! |       .-----+-----------+-----.  \     | -	//! |  dy1  |  A  |  <--B-->  |  C  |   |    | -	//! |       +-----+-----------+-----+   |    | -	//! |       | /|\ |    /|\    | /|\ |   | h  | -	//! |       |  |  |     |     |  |  |   | e  | -	//! |  dy2  |  D  |  <--E-->  |  F  |   > i  | -	//! |       |  |  |     |     |  |  |   | g  | -	//! |       | \|/ |    \|/    | \|/ |   | h  | -	//! |       +-----+-----------+-----+   | t  | -	//! |  dy3  |  G  |  <--H-->  |  I  |   |    | -	//! |       `-----+-----------+-----`  /     | -	//! |                                        | -	//! |       \___________ ___________/        | -	//! |                   V                    | -	//! |                 width                  | -	//! `----------------------------------------` -	//! -	//! \param image_cache A reference to the image cache object. -	//! \param filename The filename of the texture image to use. -	//! \param (x0, y0) is coordinate of the upper left corner of the A segment. -	//! \param (width, height) is the total rendered size of the Box. -	//! \param dx1 is the width of the A, C and F segments. -	//! \param dx2 is the width of the B, E and H segments. -	//! \param dx3 is the width of the C, F and I segments. -	//! \param dy1 is the height of the A, B and C segments. -	//! \param dy2 is the height of the D, E and F segments. -	//! \param dy3 is the height of the G, G and I segments. -	//! -	//! Segments A, C, G and I are drawn with no stretch. -	//! Segments B and H are stretched horizontally to fill the -	//! gaps between A, C and G, I so that resulting width is 'width' -	//! Segments D and F are stretched vertically to fill the -	//! gaps between A, G and C, I so that resulting height is 'height' -	//! Segment E will be stretched both horizontally and vertically -	//! to fill the inner space between B, H and D, F. -	TexturedBox(ImageCache& image_cache, const std::string& filename, -	            std::size_t x0, std::size_t y0, -	            std::size_t dx1, std::size_t dx2, std::size_t dx3, -	            std::size_t dy1, std::size_t dy2, std::size_t dy3); - -	// From Drawable: -	std::size_t width() const override; -	std::size_t height() const override; - -	void setSize(std::size_t width, std::size_t height); - -	const Colour& getPixel(std::size_t x, std::size_t y) const override; -	const std::uint8_t* line(std::size_t y, -	                         std::size_t x_offset = 0) const override; -	bool hasAlpha() const override; - -private: -	Texture seg_a; -	Texture seg_b; -	Texture seg_c; -	Texture seg_d; -	Texture seg_e; -	Texture seg_f; -	Texture seg_g; -	Texture seg_h; -	Texture seg_i; - -	std::size_t dx1; -	std::size_t dx2; -	std::size_t dx3; -	std::size_t dy1; -	std::size_t dy2; -	std::size_t dy3; -	std::size_t _width{100}; -	std::size_t _height{100}; - -	Colour outOfRange{0.0f, 0.0f, 0.0f, 0.0f}; -}; - -} // GUI:: diff --git a/plugingui/timingframecontent.cc b/plugingui/timingframecontent.cc index ceaf5be..ffcd07e 100644 --- a/plugingui/timingframecontent.cc +++ b/plugingui/timingframecontent.cc @@ -29,7 +29,7 @@  #include <cmath>  #include <iostream> -#include "painter.h" +#include <dggui/painter.h>  namespace GUI  { diff --git a/plugingui/timingframecontent.h b/plugingui/timingframecontent.h index 3dde8c1..adecc01 100644 --- a/plugingui/timingframecontent.h +++ b/plugingui/timingframecontent.h @@ -26,11 +26,12 @@   */  #pragma once -#include "knob.h" -#include "label.h" +#include <dggui/knob.h> +#include <dggui/label.h> +#include <dggui/layout.h> +#include <dggui/widget.h> +  #include "labeledcontrol.h" -#include "layout.h" -#include "widget.h"  #include <settings.h> diff --git a/plugingui/toggle.cc b/plugingui/toggle.cc deleted file mode 100644 index 39587de..0000000 --- a/plugingui/toggle.cc +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            toggle.cc - * - *  Wed Mar 22 22:58:57 CET 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "toggle.h" - -namespace GUI -{ - -Toggle::Toggle(Widget* parent) : Widget(parent) -{ -} - -void Toggle::buttonEvent(ButtonEvent* buttonEvent) -{ -	// Ignore everything except left clicks. -	if(buttonEvent->button != MouseButton::left) -	{ -		return; -	} - -	if((buttonEvent->direction == Direction::up) || buttonEvent->doubleClick) -	{ -		buttonDown = false; -		clicked = false; -		if(inCheckbox) -		{ -			internalSetChecked(!state); -		} -	} -	else -	{ -		buttonDown = true; -		clicked = true; -	} - -	redraw(); -} - -void Toggle::setText(std::string text) -{ -	_text = text; -	redraw(); -} - -bool Toggle::checked() -{ -	return state; -} - -void Toggle::setChecked(bool c) -{ -	internalSetChecked(c); -} - -void Toggle::mouseLeaveEvent() -{ -	inCheckbox = false; -	if(buttonDown) -	{ -		clicked = false; -		redraw(); -	} -} - -void Toggle::mouseEnterEvent() -{ -	inCheckbox = true; -	if(buttonDown) -	{ -		clicked = true; -		redraw(); -	} -} - -void Toggle::internalSetChecked(bool checked) -{ -	if(state == checked) -	{ -		return; -	} - -	state = checked; -	stateChangedNotifier(state); -	redraw(); -} - -} // GUI:: diff --git a/plugingui/toggle.h b/plugingui/toggle.h deleted file mode 100644 index 3466459..0000000 --- a/plugingui/toggle.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            toggle.h - * - *  Wed Mar 22 22:58:57 CET 2017 - *  Copyright 2017 André Nusser - *  andre.nusser@googlemail.com - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "widget.h" - -#include <notifier.h> - -namespace GUI -{ - -class Toggle : public Widget -{ -public: -	Toggle(Widget* parent); -	virtual ~Toggle() = default; - -	void setText(std::string text); - -	// From Widget: -	bool isFocusable() override { return true; } -	bool catchMouse() override { return true; } - -	bool checked(); -	void setChecked(bool checked); - -	Notifier<bool> stateChangedNotifier; - -protected: -	// From Widget: -	virtual void buttonEvent(ButtonEvent* buttonEvent) override; -	virtual void mouseLeaveEvent() override; -	virtual void mouseEnterEvent() override; - -	bool state{false}; -	bool clicked{false}; -	bool buttonDown{false}; -	bool inCheckbox{false}; - -	std::string _text; - -private: -	void internalSetChecked(bool checked); -}; - -} // GUI:: diff --git a/plugingui/tooltip.cc b/plugingui/tooltip.cc deleted file mode 100644 index e251ed5..0000000 --- a/plugingui/tooltip.cc +++ /dev/null @@ -1,200 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            tooltip.cc - * - *  Wed May  8 17:31:42 CEST 2019 - *  Copyright 2019 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "tooltip.h" - -#include "painter.h" -#include "font.h" -#include "window.h" -#include <iostream> - -namespace GUI -{ - -Tooltip::Tooltip(Widget *parent) -	: Widget(parent->window()) -	, activating_widget(parent) -{ -	resize(32, 32); -} - -Tooltip::~Tooltip() -{ -} - -void Tooltip::setText(const std::string& text) -{ -	this->text = text; -	needs_preprocessing = true; -	redraw(); -} - -void Tooltip::resize(std::size_t width, std::size_t height) -{ -	Widget::resize(width, height); -} - -void Tooltip::repaintEvent(RepaintEvent* repaintEvent) -{ -	if(needs_preprocessing) -	{ -		preprocessText(); -	} - -	Painter p(*this); - -	if((width() == 0) || (height() == 0)) -	{ -		return; -	} - -	box.setSize(width(), height()); -	p.drawImage(0, 0, box); -	p.setColour(Colour(183.0f/255.0f, 219.0f/255.0f, 255.0f/255.0f, 1.0f)); - -	int ypos = font.textHeight() + y_border; - -	for(std::size_t i = 0; i < preprocessed_text.size(); ++i) -	{ -		if(i * font.textHeight() >= (height() - y_border - font.textHeight())) -		{ -			break; -		} - -		auto const& line = preprocessed_text[i]; -		p.drawText(x_border, ypos, font, line); -		ypos += font.textHeight(); -	} -} - -void Tooltip::preprocessText() -{ -	std::vector<std::string> lines; - -	preprocessed_text.clear(); -	std::string text = this->text; - -	// Handle tab characters -	for(std::size_t i = 0; i < text.length(); ++i) -	{ -		char ch = text.at(i); -		if(ch == '\t') -		{ -			text.erase(i, 1); -			text.insert(i, 4, ' '); -		} -	} - -	// Handle "\r" -	for(std::size_t i = 0; i < text.length(); ++i) -	{ -		char ch = text.at(i); -		if(ch == '\r') -		{ -			text.erase(i, 1); -		} -	} - -	// Handle new line characters -	std::size_t pos = 0; -	do -	{ -		pos = text.find("\n"); -		lines.push_back(text.substr(0, pos)); -		text = text.substr(pos + 1); -	} while(pos != std::string::npos); - -	max_text_width = 0; -	total_text_height = 0; -	for(auto const& line: lines) -	{ -		std::string valid; -		std::string current; -		for(auto c: line) -		{ -			current += c; -			if(c == ' ') -			{ -				valid.append(current.substr(valid.size())); -			} -		} -		preprocessed_text.push_back(current); - -		max_text_width = std::max(max_text_width, font.textWidth(line)); -		total_text_height += font.textHeight(line); -	} -} - -void Tooltip::mouseLeaveEvent() -{ -	hide(); -} - -void Tooltip::show() -{ -	if(needs_preprocessing) -	{ -		preprocessText(); -	} - -	resize(max_text_width + 2*x_border, total_text_height + 2*y_border); - -	int x = activating_widget->translateToWindowX(); -	int y = activating_widget->translateToWindowY(); - -	if(x + width() > window()->width()) -	{ -		x -= width(); -		x += activating_widget->width(); -	} - -	if(y + height() > window()->height()) -	{ -		y -= height(); -		y += activating_widget->height(); -	} - -	// Make sure the tip is displayed inside the window -	x = std::max(x, 0); -	y = std::max(y, 0); - -	move(x, y); -	Widget::show(); - -	// TODO: This should be handled differently -	// Hack to notify the window that the mouse is now inside the tooltip. -	window()->setMouseFocus(this); -} - -void Tooltip::buttonEvent(ButtonEvent* buttonEvent) -{ -	if(buttonEvent->direction == Direction::down) -	{ -		hide(); -	} -} - -} // GUI:: diff --git a/plugingui/tooltip.h b/plugingui/tooltip.h deleted file mode 100644 index 9d1619d..0000000 --- a/plugingui/tooltip.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            tooltip.h - * - *  Wed May  8 17:31:42 CEST 2019 - *  Copyright 2019 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string.h> -#include <vector> - -#include <notifier.h> - -#include "widget.h" -#include "painter.h" -#include "texturedbox.h" -#include "font.h" - -namespace GUI -{ - -class Tooltip -	: public Widget -{ -public: -	Tooltip(Widget *parent); -	virtual ~Tooltip(); - -	void setText(const std::string& text); - -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaint_event) override; -	virtual void resize(std::size_t height, std::size_t width) override; -	virtual void mouseLeaveEvent() override; -	virtual void show() override; -	virtual void buttonEvent(ButtonEvent* buttonEvent) override; - -private: -	void preprocessText(); - -	TexturedBox box{getImageCache(), ":resources/thinlistbox.png", -			0, 0, // atlas offset (x, y) -			1, 1, 1, // dx1, dx2, dx3 -			1, 1, 1}; // dy1, dy2, dy3 -	Font font; - -	static constexpr int x_border{10}; -	static constexpr int y_border{8}; - -	bool needs_preprocessing{false}; -	std::string text; -	std::vector<std::string> preprocessed_text; -	std::size_t max_text_width{0}; -	std::size_t total_text_height{0}; -	Widget* activating_widget; -}; - -} // GUI:: diff --git a/plugingui/uitranslation.cc b/plugingui/uitranslation.cc deleted file mode 100644 index 0546be8..0000000 --- a/plugingui/uitranslation.cc +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            uitranslation.cc - * - *  Thu May  7 18:04:40 CEST 2020 - *  Copyright 2020 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "uitranslation.h" - -#ifdef WITH_NLS - -#include "resource.h" - -UITranslation::UITranslation() -{ -	auto lang = Translation::getISO639LanguageName(); -	printf("LANG: %s\n", lang.data()); -	std::string res = ":locale/"; -	res += lang + ".mo"; - -	GUI::Resource mo(res); -	if(!mo.valid()) -	{ -		printf("Locale not in resources - use default\n"); -		// Locale not in resources - use default -		return; -	} -	printf("Using mo: %s\n", res.data()); -	load(mo.data(), mo.size()); -} - -#endif // WITH_NLS diff --git a/plugingui/uitranslation.h b/plugingui/uitranslation.h deleted file mode 100644 index 5341255..0000000 --- a/plugingui/uitranslation.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: c++ -*- */ -/*************************************************************************** - *            uitranslation.h - * - *  Thu May  7 18:04:40 CEST 2020 - *  Copyright 2020 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <config.h> - -#include <translation.h> - -#ifdef WITH_NLS -class UITranslation -	: public Translation -{ -public: -	UITranslation(); -	~UITranslation() = default; -}; -#endif diff --git a/plugingui/utf8.cc b/plugingui/utf8.cc deleted file mode 100644 index 747e726..0000000 --- a/plugingui/utf8.cc +++ /dev/null @@ -1,361 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            utf8.cc - * - *  Tue Feb 27 19:18:23 CET 2007 - *  Copyright  2006 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU General Public License for more details. - * - *  You should have received a copy of the GNU General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "utf8.h" - -UTF8::UTF8() -{ -	// Encode Map -	map_encode["\x80"] = "\xc2\x80"; -	map_encode["\x81"] = "\xc2\x81"; -	map_encode["\x82"] = "\xc2\x82"; -	map_encode["\x83"] = "\xc2\x83"; -	map_encode["\x84"] = "\xc2\x84"; -	map_encode["\x85"] = "\xc2\x85"; -	map_encode["\x86"] = "\xc2\x86"; -	map_encode["\x87"] = "\xc2\x87"; -	map_encode["\x88"] = "\xc2\x88"; -	map_encode["\x89"] = "\xc2\x89"; -	map_encode["\x8a"] = "\xc2\x8a"; -	map_encode["\x8b"] = "\xc2\x8b"; -	map_encode["\x8c"] = "\xc2\x8c"; -	map_encode["\x8d"] = "\xc2\x8d"; -	map_encode["\x8e"] = "\xc2\x8e"; -	map_encode["\x8f"] = "\xc2\x8f"; -	map_encode["\x90"] = "\xc2\x90"; -	map_encode["\x91"] = "\xc2\x91"; -	map_encode["\x92"] = "\xc2\x92"; -	map_encode["\x93"] = "\xc2\x93"; -	map_encode["\x94"] = "\xc2\x94"; -	map_encode["\x95"] = "\xc2\x95"; -	map_encode["\x96"] = "\xc2\x96"; -	map_encode["\x97"] = "\xc2\x97"; -	map_encode["\x98"] = "\xc2\x98"; -	map_encode["\x99"] = "\xc2\x99"; -	map_encode["\x9a"] = "\xc2\x9a"; -	map_encode["\x9b"] = "\xc2\x9b"; -	map_encode["\x9c"] = "\xc2\x9c"; -	map_encode["\x9d"] = "\xc2\x9d"; -	map_encode["\x9e"] = "\xc2\x9e"; -	map_encode["\x9f"] = "\xc2\x9f"; -	map_encode["\xa0"] = "\xc2\xa0"; -	map_encode["\xa1"] = "\xc2\xa1"; -	map_encode["\xa2"] = "\xc2\xa2"; -	map_encode["\xa3"] = "\xc2\xa3"; -	map_encode["\xa4"] = "\xc2\xa4"; -	map_encode["\xa5"] = "\xc2\xa5"; -	map_encode["\xa6"] = "\xc2\xa6"; -	map_encode["\xa7"] = "\xc2\xa7"; -	map_encode["\xa8"] = "\xc2\xa8"; -	map_encode["\xa9"] = "\xc2\xa9"; -	map_encode["\xaa"] = "\xc2\xaa"; -	map_encode["\xab"] = "\xc2\xab"; -	map_encode["\xac"] = "\xc2\xac"; -	map_encode["\xad"] = "\xc2\xad"; -	map_encode["\xae"] = "\xc2\xae"; -	map_encode["\xaf"] = "\xc2\xaf"; -	map_encode["\xb0"] = "\xc2\xb0"; -	map_encode["\xb1"] = "\xc2\xb1"; -	map_encode["\xb2"] = "\xc2\xb2"; -	map_encode["\xb3"] = "\xc2\xb3"; -	map_encode["\xb4"] = "\xc2\xb4"; -	map_encode["\xb5"] = "\xc2\xb5"; -	map_encode["\xb6"] = "\xc2\xb6"; -	map_encode["\xb7"] = "\xc2\xb7"; -	map_encode["\xb8"] = "\xc2\xb8"; -	map_encode["\xb9"] = "\xc2\xb9"; -	map_encode["\xba"] = "\xc2\xba"; -	map_encode["\xbb"] = "\xc2\xbb"; -	map_encode["\xbc"] = "\xc2\xbc"; -	map_encode["\xbd"] = "\xc2\xbd"; -	map_encode["\xbe"] = "\xc2\xbe"; -	map_encode["\xbf"] = "\xc2\xbf"; -	map_encode["\xc0"] = "\xc3\x80"; -	map_encode["\xc1"] = "\xc3\x81"; -	map_encode["\xc2"] = "\xc3\x82"; -	map_encode["\xc3"] = "\xc3\x83"; -	map_encode["\xc4"] = "\xc3\x84"; -	map_encode["\xc5"] = "\xc3\x85"; -	map_encode["\xc6"] = "\xc3\x86"; -	map_encode["\xc7"] = "\xc3\x87"; -	map_encode["\xc8"] = "\xc3\x88"; -	map_encode["\xc9"] = "\xc3\x89"; -	map_encode["\xca"] = "\xc3\x8a"; -	map_encode["\xcb"] = "\xc3\x8b"; -	map_encode["\xcc"] = "\xc3\x8c"; -	map_encode["\xcd"] = "\xc3\x8d"; -	map_encode["\xce"] = "\xc3\x8e"; -	map_encode["\xcf"] = "\xc3\x8f"; -	map_encode["\xd0"] = "\xc3\x90"; -	map_encode["\xd1"] = "\xc3\x91"; -	map_encode["\xd2"] = "\xc3\x92"; -	map_encode["\xd3"] = "\xc3\x93"; -	map_encode["\xd4"] = "\xc3\x94"; -	map_encode["\xd5"] = "\xc3\x95"; -	map_encode["\xd6"] = "\xc3\x96"; -	map_encode["\xd7"] = "\xc3\x97"; -	map_encode["\xd8"] = "\xc3\x98"; -	map_encode["\xd9"] = "\xc3\x99"; -	map_encode["\xda"] = "\xc3\x9a"; -	map_encode["\xdb"] = "\xc3\x9b"; -	map_encode["\xdc"] = "\xc3\x9c"; -	map_encode["\xdd"] = "\xc3\x9d"; -	map_encode["\xde"] = "\xc3\x9e"; -	map_encode["\xdf"] = "\xc3\x9f"; -	map_encode["\xe0"] = "\xc3\xa0"; -	map_encode["\xe1"] = "\xc3\xa1"; -	map_encode["\xe2"] = "\xc3\xa2"; -	map_encode["\xe3"] = "\xc3\xa3"; -	map_encode["\xe4"] = "\xc3\xa4"; -	map_encode["\xe5"] = "\xc3\xa5"; -	map_encode["\xe6"] = "\xc3\xa6"; -	map_encode["\xe7"] = "\xc3\xa7"; -	map_encode["\xe8"] = "\xc3\xa8"; -	map_encode["\xe9"] = "\xc3\xa9"; -	map_encode["\xea"] = "\xc3\xaa"; -	map_encode["\xeb"] = "\xc3\xab"; -	map_encode["\xec"] = "\xc3\xac"; -	map_encode["\xed"] = "\xc3\xad"; -	map_encode["\xee"] = "\xc3\xae"; -	map_encode["\xef"] = "\xc3\xaf"; -	map_encode["\xf0"] = "\xc3\xb0"; -	map_encode["\xf1"] = "\xc3\xb1"; -	map_encode["\xf2"] = "\xc3\xb2"; -	map_encode["\xf3"] = "\xc3\xb3"; -	map_encode["\xf4"] = "\xc3\xb4"; -	map_encode["\xf5"] = "\xc3\xb5"; -	map_encode["\xf6"] = "\xc3\xb6"; -	map_encode["\xf7"] = "\xc3\xb7"; -	map_encode["\xf8"] = "\xc3\xb8"; -	map_encode["\xf9"] = "\xc3\xb9"; -	map_encode["\xfa"] = "\xc3\xba"; -	map_encode["\xfb"] = "\xc3\xbb"; -	map_encode["\xfc"] = "\xc3\xbc"; -	map_encode["\xfd"] = "\xc3\xbd"; -	map_encode["\xfe"] = "\xc3\xbe"; -	map_encode["\xff"] = "\xc3\xbf"; - -	// Decode Map -	map_decode["\xc2\x80"] = "\x80"; -	map_decode["\xc2\x81"] = "\x81"; -	map_decode["\xc2\x82"] = "\x82"; -	map_decode["\xc2\x83"] = "\x83"; -	map_decode["\xc2\x84"] = "\x84"; -	map_decode["\xc2\x85"] = "\x85"; -	map_decode["\xc2\x86"] = "\x86"; -	map_decode["\xc2\x87"] = "\x87"; -	map_decode["\xc2\x88"] = "\x88"; -	map_decode["\xc2\x89"] = "\x89"; -	map_decode["\xc2\x8a"] = "\x8a"; -	map_decode["\xc2\x8b"] = "\x8b"; -	map_decode["\xc2\x8c"] = "\x8c"; -	map_decode["\xc2\x8d"] = "\x8d"; -	map_decode["\xc2\x8e"] = "\x8e"; -	map_decode["\xc2\x8f"] = "\x8f"; -	map_decode["\xc2\x90"] = "\x90"; -	map_decode["\xc2\x91"] = "\x91"; -	map_decode["\xc2\x92"] = "\x92"; -	map_decode["\xc2\x93"] = "\x93"; -	map_decode["\xc2\x94"] = "\x94"; -	map_decode["\xc2\x95"] = "\x95"; -	map_decode["\xc2\x96"] = "\x96"; -	map_decode["\xc2\x97"] = "\x97"; -	map_decode["\xc2\x98"] = "\x98"; -	map_decode["\xc2\x99"] = "\x99"; -	map_decode["\xc2\x9a"] = "\x9a"; -	map_decode["\xc2\x9b"] = "\x9b"; -	map_decode["\xc2\x9c"] = "\x9c"; -	map_decode["\xc2\x9d"] = "\x9d"; -	map_decode["\xc2\x9e"] = "\x9e"; -	map_decode["\xc2\x9f"] = "\x9f"; -	map_decode["\xc2\xa0"] = "\xa0"; -	map_decode["\xc2\xa1"] = "\xa1"; -	map_decode["\xc2\xa2"] = "\xa2"; -	map_decode["\xc2\xa3"] = "\xa3"; -	map_decode["\xc2\xa4"] = "\xa4"; -	map_decode["\xc2\xa5"] = "\xa5"; -	map_decode["\xc2\xa6"] = "\xa6"; -	map_decode["\xc2\xa7"] = "\xa7"; -	map_decode["\xc2\xa8"] = "\xa8"; -	map_decode["\xc2\xa9"] = "\xa9"; -	map_decode["\xc2\xaa"] = "\xaa"; -	map_decode["\xc2\xab"] = "\xab"; -	map_decode["\xc2\xac"] = "\xac"; -	map_decode["\xc2\xad"] = "\xad"; -	map_decode["\xc2\xae"] = "\xae"; -	map_decode["\xc2\xaf"] = "\xaf"; -	map_decode["\xc2\xb0"] = "\xb0"; -	map_decode["\xc2\xb1"] = "\xb1"; -	map_decode["\xc2\xb2"] = "\xb2"; -	map_decode["\xc2\xb3"] = "\xb3"; -	map_decode["\xc2\xb4"] = "\xb4"; -	map_decode["\xc2\xb5"] = "\xb5"; -	map_decode["\xc2\xb6"] = "\xb6"; -	map_decode["\xc2\xb7"] = "\xb7"; -	map_decode["\xc2\xb8"] = "\xb8"; -	map_decode["\xc2\xb9"] = "\xb9"; -	map_decode["\xc2\xba"] = "\xba"; -	map_decode["\xc2\xbb"] = "\xbb"; -	map_decode["\xc2\xbc"] = "\xbc"; -	map_decode["\xc2\xbd"] = "\xbd"; -	map_decode["\xc2\xbe"] = "\xbe"; -	map_decode["\xc2\xbf"] = "\xbf"; -	map_decode["\xc3\x80"] = "\xc0"; -	map_decode["\xc3\x81"] = "\xc1"; -	map_decode["\xc3\x82"] = "\xc2"; -	map_decode["\xc3\x83"] = "\xc3"; -	map_decode["\xc3\x84"] = "\xc4"; -	map_decode["\xc3\x85"] = "\xc5"; -	map_decode["\xc3\x86"] = "\xc6"; -	map_decode["\xc3\x87"] = "\xc7"; -	map_decode["\xc3\x88"] = "\xc8"; -	map_decode["\xc3\x89"] = "\xc9"; -	map_decode["\xc3\x8a"] = "\xca"; -	map_decode["\xc3\x8b"] = "\xcb"; -	map_decode["\xc3\x8c"] = "\xcc"; -	map_decode["\xc3\x8d"] = "\xcd"; -	map_decode["\xc3\x8e"] = "\xce"; -	map_decode["\xc3\x8f"] = "\xcf"; -	map_decode["\xc3\x90"] = "\xd0"; -	map_decode["\xc3\x91"] = "\xd1"; -	map_decode["\xc3\x92"] = "\xd2"; -	map_decode["\xc3\x93"] = "\xd3"; -	map_decode["\xc3\x94"] = "\xd4"; -	map_decode["\xc3\x95"] = "\xd5"; -	map_decode["\xc3\x96"] = "\xd6"; -	map_decode["\xc3\x97"] = "\xd7"; -	map_decode["\xc3\x98"] = "\xd8"; -	map_decode["\xc3\x99"] = "\xd9"; -	map_decode["\xc3\x9a"] = "\xda"; -	map_decode["\xc3\x9b"] = "\xdb"; -	map_decode["\xc3\x9c"] = "\xdc"; -	map_decode["\xc3\x9d"] = "\xdd"; -	map_decode["\xc3\x9e"] = "\xde"; -	map_decode["\xc3\x9f"] = "\xdf"; -	map_decode["\xc3\xa0"] = "\xe0"; -	map_decode["\xc3\xa1"] = "\xe1"; -	map_decode["\xc3\xa2"] = "\xe2"; -	map_decode["\xc3\xa3"] = "\xe3"; -	map_decode["\xc3\xa4"] = "\xe4"; -	map_decode["\xc3\xa5"] = "\xe5"; -	map_decode["\xc3\xa6"] = "\xe6"; -	map_decode["\xc3\xa7"] = "\xe7"; -	map_decode["\xc3\xa8"] = "\xe8"; -	map_decode["\xc3\xa9"] = "\xe9"; -	map_decode["\xc3\xaa"] = "\xea"; -	map_decode["\xc3\xab"] = "\xeb"; -	map_decode["\xc3\xac"] = "\xec"; -	map_decode["\xc3\xad"] = "\xed"; -	map_decode["\xc3\xae"] = "\xee"; -	map_decode["\xc3\xaf"] = "\xef"; -	map_decode["\xc3\xb0"] = "\xf0"; -	map_decode["\xc3\xb1"] = "\xf1"; -	map_decode["\xc3\xb2"] = "\xf2"; -	map_decode["\xc3\xb3"] = "\xf3"; -	map_decode["\xc3\xb4"] = "\xf4"; -	map_decode["\xc3\xb5"] = "\xf5"; -	map_decode["\xc3\xb6"] = "\xf6"; -	map_decode["\xc3\xb7"] = "\xf7"; -	map_decode["\xc3\xb8"] = "\xf8"; -	map_decode["\xc3\xb9"] = "\xf9"; -	map_decode["\xc3\xba"] = "\xfa"; -	map_decode["\xc3\xbb"] = "\xfb"; -	map_decode["\xc3\xbc"] = "\xfc"; -	map_decode["\xc3\xbd"] = "\xfd"; -	map_decode["\xc3\xbe"] = "\xfe"; -	map_decode["\xc3\xbf"] = "\xff"; -	// FIXME: This is just a hack to make Goran Mekic's name work. -	map_decode["\xc4\x87"] = "c"; -} - -std::string UTF8::fromLatin1(std::string const& s) -{ -	std::string ret; - -	for(int i = 0; i < (int)s.length(); i++) -	{ -		std::string c; - -		if((unsigned char)s[i] <= 0x7F) -		{ -			c = s.substr(i, 1); -		} -		else -		{ -			c = map_encode[s.substr(i, 1)]; -		} - -		// If c == "", the character wasn't found in the map. -		// Ignore this case for now and just push an empty string in this case. - -		ret.append(c); -	} - -	return ret; -} - -std::string UTF8::toLatin1(std::string const& s) -{ -	std::string ret; - -	int width = 1; -	for(int i = 0; i < (int)s.length(); i += width) -	{ -		if(/*(unsigned char)s[i]>=0x00&&*/ (unsigned char)s[i] <= 0x7F) -		{ -			width = 1; // 00-7F -> 1 byte -		} -		if((unsigned char)s[i] >= 0xC2 && (unsigned char)s[i] <= 0xDF) -		{ -			width = 2; // C2-DF -> 2 bytes -		} -		if((unsigned char)s[i] >= 0xE0 && (unsigned char)s[i] <= 0xEF) -		{ -			width = 3; // E0-EF -> 3 bytes -		} -		if((unsigned char)s[i] >= 0xF0 && (unsigned char)s[i] <= 0xF4) -		{ -			width = 4; // F0-F4 -> 4 bytes -		} - -		std::string c; -		if(width == 1) -		{ -			c = s.substr(i, 1); -		} -		else -		{ -			c = map_decode[s.substr(i, width)]; -		} - -		// If c == "", the character wasn't found in the map. -		// Ignore this case for now and just push an empty string in this case. - -		ret.append(c); -	} - -	return ret; -} diff --git a/plugingui/utf8.h b/plugingui/utf8.h deleted file mode 100644 index 04c26b1..0000000 --- a/plugingui/utf8.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            utf8.h - * - *  Tue Feb 27 19:18:23 CET 2007 - *  Copyright  2006 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include <string> -#include <unordered_map> - -// Class to convert utf8 to latin1 and the other way around. -class UTF8 -{ -public: -	UTF8(); - -	// Encode a string from latin1 to UTF-8. -	std::string fromLatin1(std::string const& s); - -	// Decode a string from UTF-8 to latin1. -	std::string toLatin1(std::string const& s); - -private: -	std::unordered_map<std::string, std::string> map_encode; -	std::unordered_map<std::string, std::string> map_decode; -}; diff --git a/plugingui/verticalline.cc b/plugingui/verticalline.cc deleted file mode 100644 index 6a3a98a..0000000 --- a/plugingui/verticalline.cc +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            verticalline.cc - * - *  Sat Apr  6 12:59:44 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "verticalline.h" - -#include "painter.h" - -namespace GUI { - -VerticalLine::VerticalLine(Widget *parent) -	: Widget(parent) -	, vline(":resources/vertline.png") -{ -} - -void VerticalLine::repaintEvent(RepaintEvent* repaintEvent) -{ -	if(height() < 2) -	{ -		return; -	} - -	Painter p(*this); -	p.drawImageStretched(0, (height() - vline.height()) / 2, -	                     vline, width(), vline.height()); -} - -} // GUI:: diff --git a/plugingui/verticalline.h b/plugingui/verticalline.h deleted file mode 100644 index 3403244..0000000 --- a/plugingui/verticalline.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            verticalline.h - * - *  Sat Apr  6 12:59:43 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "widget.h" -#include "image.h" - -namespace GUI { - -class VerticalLine : public Widget { -public: -	VerticalLine(Widget* parent); -	virtual ~VerticalLine() = default; - -protected: -	// From Widget: -	virtual void repaintEvent(RepaintEvent* repaintEvent) override; - -private: -	Image vline; -}; - -} // GUI:: diff --git a/plugingui/visualizerframecontent.cc b/plugingui/visualizerframecontent.cc index 7e5b298..d6ea2c2 100644 --- a/plugingui/visualizerframecontent.cc +++ b/plugingui/visualizerframecontent.cc @@ -29,7 +29,7 @@  #include <cmath>  #include <iostream> -#include "painter.h" +#include <dggui/painter.h>  namespace GUI  { diff --git a/plugingui/visualizerframecontent.h b/plugingui/visualizerframecontent.h index edf8f35..3012762 100644 --- a/plugingui/visualizerframecontent.h +++ b/plugingui/visualizerframecontent.h @@ -25,8 +25,10 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.   */  #pragma once -#include "layout.h" -#include "widget.h" + +#include <dggui/layout.h> +#include <dggui/widget.h> +  #include "humaniservisualiser.h"  #include <settings.h> diff --git a/plugingui/voicelimitframecontent.h b/plugingui/voicelimitframecontent.h index 8b08014..0fbc306 100644 --- a/plugingui/voicelimitframecontent.h +++ b/plugingui/voicelimitframecontent.h @@ -28,10 +28,11 @@  #include <translation.h> -#include "label.h" -#include "knob.h" +#include <dggui/label.h> +#include <dggui/knob.h> +#include <dggui/widget.h> +  #include "labeledcontrol.h" -#include "widget.h"  struct Settings;  class SettingsNotifier; diff --git a/plugingui/widget.cc b/plugingui/widget.cc deleted file mode 100644 index da6b1e2..0000000 --- a/plugingui/widget.cc +++ /dev/null @@ -1,297 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            widget.cc - * - *  Sun Oct  9 13:01:44 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "widget.h" - -#include <cassert> - -#include "painter.h" -#include "window.h" - -namespace GUI -{ - -Widget::Widget(Widget* parent) -	: parent(parent) -{ -	if(parent) -	{ -		parent->addChild(this); -		_window = parent->window(); -	} - -	pixbuf.x = translateToWindowX(); -	pixbuf.y = translateToWindowY(); -} - -Widget::~Widget() -{ -	if(parent) -	{ -		parent->removeChild(this); -	} -} - -void Widget::show() -{ -	setVisible(true); -} - -void Widget::hide() -{ -	setVisible(false); -} - -void Widget::setVisible(bool visible) -{ -	_visible = visible; -	pixbuf.visible = visible; -	redraw(); -} - -bool Widget::visible() const -{ -	return _visible; -} - -void Widget::redraw() -{ -	dirty = true; -	window()->needsRedraw(); -} - -void Widget::addChild(Widget* widget) -{ -	children.push_back(widget); -} - -void Widget::removeChild(Widget* widget) -{ -	for(auto i = children.begin(); i != children.end(); ++i) -	{ -		if(*i == widget) -		{ -			children.erase(i); -			return; -		} -	} -} - -void Widget::reparent(Widget* parent) -{ -	if(parent == this->parent) -	{ -		return; // Already at the right parent. -	} - -	if(this->parent) -	{ -		this->parent->removeChild(this); -	} - -	if(parent) -	{ -		parent->addChild(this); -	} - -	this->parent = parent; -} - -void Widget::resize(std::size_t width, std::size_t height) -{ -	assert(width < 32000 && height < 32000); // Catch negative values as size_t -	if((width < 1) || (height < 1) || -	   ((width == _width) && (height == _height))) -	{ -		return; -	} - -	_width = width; -	_height = height; - -	// Store old size/position in pixelbuffer for rendering invalidation. -	if(!pixbuf.has_last) -	{ -		pixbuf.last_width = pixbuf.width; -		pixbuf.last_height = pixbuf.height; -		pixbuf.last_x = pixbuf.x; -		pixbuf.last_y = pixbuf.y; -		pixbuf.has_last = true; -	} - -	pixbuf.realloc(width, height); -	pixbuf.x = translateToWindowX(); -	pixbuf.y = translateToWindowY(); -	redraw(); -	sizeChangeNotifier(width, height); -} - -void Widget::move(int x, int y) -{ -	if((_x == x) && -	   (_y == y)) -	{ -		return; -	} - -	_x = x; -	_y = y; - -	// Store old size/position in pixelbuffer for rendering invalidation. -	if(!pixbuf.has_last) -	{ -		pixbuf.last_width = pixbuf.width; -		pixbuf.last_height = pixbuf.height; -		pixbuf.last_x = pixbuf.x; -		pixbuf.last_y = pixbuf.y; -		pixbuf.has_last = true; -	} - -	//pixbuf.x = translateToWindowX(); -	//pixbuf.y = translateToWindowY(); - -	positionChangeNotifier(x, y); -} - -int Widget::x() const -{ -	return _x; -} - -int Widget::y() const -{ -	return _y; -} - -std::size_t Widget::width() const -{ -	return _width; -} - -std::size_t Widget::height() const -{ -	return _height; -} - -Point Widget::position() const -{ -	return { _x, _y }; -} - -PixelBufferAlpha& Widget::getPixelBuffer() -{ -	return pixbuf; -} - -ImageCache& Widget::getImageCache() -{ -	assert(parent); -	return parent->getImageCache(); -} - -Widget* Widget::find(int x, int y) -{ -	for(auto i = children.rbegin(); i != children.rend(); ++i) -	{ -		Widget* widget = *i; -		if(widget->visible()) -		{ -			if((x >= widget->x()) && (x < (widget->x() + (int)widget->width())) && -			   (y >= widget->y()) && (y < (widget->y() + (int)widget->height()))) -			{ -				return widget->find(x - widget->x(), y - widget->y()); -			} -		} -	} - -	return this; -} - -Window* Widget::window() -{ -	return _window; -} - -std::vector<PixelBufferAlpha*> Widget::getPixelBuffers() -{ -	std::vector<PixelBufferAlpha*> pixelBuffers; - -	pixbuf.x = translateToWindowX(); -	pixbuf.y = translateToWindowY(); - -	if(dirty) -	{ -		repaintEvent(nullptr); -		pixbuf.dirty = true; -		dirty = false; -	} - -	if(pixbuf.dirty || visible()) -	{ -		pixelBuffers.push_back(&pixbuf); -	} - -	if(visible()) -	{ -		for(auto child : children) -		{ -			auto childPixelBuffers = child->getPixelBuffers(); -			pixelBuffers.insert(pixelBuffers.end(), -			                    childPixelBuffers.begin(), childPixelBuffers.end()); -		} -	} - -	return pixelBuffers; -} - -bool Widget::hasKeyboardFocus() -{ -	return window()->keyboardFocus() == this; -} - -std::size_t Widget::translateToWindowX() -{ -	size_t window_x = x(); -	if(parent) -	{ -		window_x += parent->translateToWindowX(); -	} - -	return window_x; -} - -std::size_t Widget::translateToWindowY() -{ -	size_t window_y = y(); -	if(parent) -	{ -		window_y += parent->translateToWindowY(); -	} - -	return window_y; -} - -} // GUI:: diff --git a/plugingui/widget.h b/plugingui/widget.h deleted file mode 100644 index b9436b7..0000000 --- a/plugingui/widget.h +++ /dev/null @@ -1,139 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            widget.h - * - *  Sun Oct  9 13:01:44 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "guievent.h" -#include "pixelbuffer.h" -#include "notifier.h" -#include "layout.h" -#include "canvas.h" - -#include <vector> - -namespace GUI -{ - -struct Point -{ -	int x; -	int y; -}; - -struct Size -{ -	std::size_t width; -	std::size_t height; -}; - -class ImageCache; -class Window; - -class Widget -	: public Listener -	, public LayoutItem -	, public Canvas -{ -	friend class Painter; -public: -	Widget(Widget* parent); -	virtual ~Widget(); - -	virtual void show(); -	virtual void hide(); -	void setVisible(bool visible); -	virtual bool visible() const; - -	//! Mark widget dirty and shedule redraw on next window redraw. -	void redraw(); - -	// From LayoutItem -	virtual void resize(std::size_t width, std::size_t height) override; -	virtual void move(int x, int y) override; -	virtual int x() const override; -	virtual int y() const override; -	virtual std::size_t width() const override; -	virtual std::size_t height() const override; - -	Point position() const; - -	// From Canvas -	PixelBufferAlpha& getPixelBuffer() override; - -	virtual bool isFocusable() { return false; } -	virtual bool catchMouse() { return false; } - -	void addChild(Widget* widget); -	void removeChild(Widget* widget); -	void reparent(Widget* parent); - -	virtual void repaintEvent(RepaintEvent* repaintEvent) {} -	virtual void mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) {} -	virtual void buttonEvent(ButtonEvent* buttonEvent) {} -	virtual void scrollEvent(ScrollEvent* scrollEvent) {} -	virtual void keyEvent(KeyEvent* keyEvent) {} -	virtual void mouseLeaveEvent() {} -	virtual void mouseEnterEvent() {} - -	virtual ImageCache& getImageCache(); - -	Widget* find(int x, int y); - -	virtual Window* window(); - -	std::vector<PixelBufferAlpha*> getPixelBuffers(); - -	bool hasKeyboardFocus(); - -	Notifier<std::size_t, std::size_t> sizeChangeNotifier; // (width, height) -	Notifier<int, int> positionChangeNotifier; // (x, y) - -	//! Translate x-coordinate from parent-space to window-space. -	virtual std::size_t translateToWindowX(); - -	//! Translate y-coordinate from parent-space to window-space. -	virtual std::size_t translateToWindowY(); - -protected: -	friend class EventHandler; -	PixelBufferAlpha pixbuf{0,0}; - -	std::vector<Widget*> children; - -	Widget* parent = nullptr; -	Window* _window = nullptr; - -	int _x{0}; -	int _y{0}; -	std::size_t _width{0}; -	std::size_t _height{0}; - -	bool _visible{true}; - -	bool dirty{true}; -}; - -} // GUI:: diff --git a/plugingui/window.cc b/plugingui/window.cc deleted file mode 100644 index 5e0ad31..0000000 --- a/plugingui/window.cc +++ /dev/null @@ -1,266 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            window.cc - * - *  Sun Oct  9 13:11:53 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "window.h" - -#include <cstring> - -#include "painter.h" - -#ifndef UI_PUGL -#ifdef UI_X11 -#include "nativewindow_x11.h" -#endif // UI_X11 -#ifdef UI_WIN32 -#include "nativewindow_win32.h" -#endif // UI_WIN32 -#ifdef UI_COCOA -#include "nativewindow_cocoa.h" -#endif // UI_COCOA -#else -#include "nativewindow_pugl.h" -#endif // !UI_PUGL - -namespace GUI -{ - -Window::Window(void* native_window) -	: Widget(nullptr) -	, wpixbuf(1, 1) -{ -	// Make sure we have a valid size when initialising the NativeWindow -	_width = wpixbuf.width; -	_height = wpixbuf.height; - -#ifndef UI_PUGL -#ifdef UI_X11 -	native = new NativeWindowX11(native_window, *this); -#endif // UI_X11 -#ifdef UI_WIN32 -	native = new NativeWindowWin32(native_window, *this); -#endif // UI_WIN32 -#ifdef UI_COCOA -	native = new NativeWindowCocoa(native_window, *this); -#endif // UI_COCOA -#else -	// Use pugl -	native = new NativeWindowPugl(native_window, *this); -#endif // !UI_PUGL - -	eventhandler = new EventHandler(*native, *this); - -	setVisible(true); // The root widget is always visible. -} - -Window::~Window() -{ -	delete native; -	delete eventhandler; -} - -void Window::setFixedSize(int w, int h) -{ -	native->setFixedSize(w, h); -} - -void Window::setAlwaysOnTop(bool always_on_top) -{ -	native->setAlwaysOnTop(always_on_top); -} - -void Window::setCaption(const std::string& caption) -{ -	native->setCaption(caption); -} - -//! This overload the resize method on Widget and simply requests a window resize -//! on the windowmanager/OS. The resized() method is called by the event handler -//! once the window has been resized. -void Window::resize(std::size_t width, std::size_t height) -{ -	native->resize(width, height); -} - -//! This overload the move method on Widget and simply requests a window move -//! on the windowmanager/OS. The moved() method is called by the event handler -//! once the window has been moved. -void Window::move(int x, int y) -{ -	native->move(x, y); -} - -void Window::show() -{ -	Widget::show(); -	redraw(); -	native->show(); -} - -void Window::hide() -{ -	native->hide(); -	Widget::hide(); -} - -Window* Window::window() -{ -	return this; -} - -Size Window::getNativeSize() -{ -	auto sz = native->getSize(); -	return {sz.first, sz.second}; -} - -ImageCache& Window::getImageCache() -{ -	return image_cache; -} - -EventHandler* Window::eventHandler() -{ -	return eventhandler; -} - -Widget* Window::keyboardFocus() -{ -	return _keyboardFocus; -} - -void Window::setKeyboardFocus(Widget* widget) -{ -	auto oldFocusWidget = _keyboardFocus; -	_keyboardFocus = widget; - -	if(oldFocusWidget) -	{ -		oldFocusWidget->redraw(); -	} - -	if(_keyboardFocus) -	{ -		_keyboardFocus->redraw(); -	} -} - -Widget* Window::buttonDownFocus() -{ -	return _buttonDownFocus; -} - -void Window::setButtonDownFocus(Widget* widget) -{ -	_buttonDownFocus = widget; -	native->grabMouse(widget != nullptr); -} - -Widget* Window::mouseFocus() -{ -	return _mouseFocus; -} - -void Window::setMouseFocus(Widget* widget) -{ -	_mouseFocus = widget; - -} - -void Window::needsRedraw() -{ -	needs_redraw = true; -} - -void* Window::getNativeWindowHandle() const -{ -	return native->getNativeWindowHandle(); -} - -Point Window::translateToScreen(const Point& point) -{ -	return native->translateToScreen(point); -} - -std::size_t Window::translateToWindowX() -{ -	return 0; -} - -std::size_t Window::translateToWindowY() -{ -	return 0; -} - -//! Called by event handler when an windowmanager/OS window resize event has -//! been received. Do not call this directly. -void Window::resized(std::size_t width, std::size_t height) -{ -	auto size = native->getSize(); -	if((wpixbuf.width != size.first) || -	   (wpixbuf.height != size.second)) -	{ -		wpixbuf.realloc(size.first, size.second); -		Widget::resize(size.first, size.second); -	} - -	updateBuffer(); -} - -//! Called by event handler when an windowmanager/OS window move event has -//! been received. Do not call this directly. -void Window::moved(int x, int y) -{ -	// Make sure widget coordinates are updated. -	Widget::move(x, y); -} - -bool Window::updateBuffer() -{ -	if(!native) -	{ -		return false; -	} - -	if(!needs_redraw) -	{ -		// Nothing changed, don't update anything. -		return false; -	} - -	auto pixel_buffers = getPixelBuffers(); - -	auto dirty_rect = wpixbuf.updateBuffer(pixel_buffers); - -	if(!dirty_rect.empty()) -	{ -		native->redraw(dirty_rect); -	} -	needs_redraw = false; - -	return true; -} - -} // GUI:: diff --git a/plugingui/window.h b/plugingui/window.h deleted file mode 100644 index 6031500..0000000 --- a/plugingui/window.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            window.h - * - *  Sun Oct  9 13:11:52 CEST 2011 - *  Copyright 2011 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#pragma once - -#include "widget.h" - -#include "pixelbuffer.h" -#include "nativewindow.h" -#include "image.h" -#include "eventhandler.h" -#include "imagecache.h" - -namespace GUI -{ - -class Window -	: public Widget -{ -public: -	Window(void* native_window = nullptr); -	~Window(); - -	void setFixedSize(int width, int height); -	void setAlwaysOnTop(bool always_on_top); -	void setCaption(const std::string& caption); - -	// From Widget: -	void resize(std::size_t width, std::size_t height) override; -	void move(int x, int y) override; -	void show() override; -	void hide() override; -	Window* window() override; -	Size getNativeSize(); -	ImageCache& getImageCache() override; - -	EventHandler* eventHandler(); - -	Widget* keyboardFocus(); -	void setKeyboardFocus(Widget* widget); - -	Widget* buttonDownFocus(); -	void setButtonDownFocus(Widget* widget); - -	Widget* mouseFocus(); -	void setMouseFocus(Widget* widget); - -	//! Tag the window buffer dirty to be rendered. -	void needsRedraw(); - -	// \returns the native window handle, it HWND on Win32 or Window id on X11 -	void* getNativeWindowHandle() const; - -	//! Translate a local window coordinate to a global screen coordinate. -	Point translateToScreen(const Point& point); - -protected: -	// For the EventHandler -	friend class EventHandler; - -	// From Widget: -	std::size_t translateToWindowX() override; -	std::size_t translateToWindowY() override; -	void resized(std::size_t width, std::size_t height); -	void moved(int x, int y); - -	//! Returns true if window pixel buffer changed and needs to be copied to -	//! native window. -	bool updateBuffer(); - -	// For the Painter -	friend class Widget; - -	// For the NativeWindow implementations: -	friend class NativeWindowX11; -	friend class NativeWindowWin32; -	friend class NativeWindowPugl; -	friend class NativeWindowCocoa; -	PixelBuffer wpixbuf; - -	size_t refcount{0}; - -	Widget* _keyboardFocus{nullptr}; -	Widget* _buttonDownFocus{nullptr}; -	Widget* _mouseFocus{nullptr}; - -	NativeWindow* native{nullptr}; -	EventHandler* eventhandler{nullptr}; - -	size_t maxRefcount{0}; - -	bool needs_redraw{false}; -	ImageCache image_cache; -}; - -} // GUI::  | 
