diff --git a/po/POTFILES.in b/po/POTFILES.in index 2b8db289..90c83431 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -9,6 +9,7 @@ [type: gettext/glade]ui/pagesize.glade [type: gettext/glade]ui/pdfpages.glade [type: gettext/glade]ui/settings.glade +[type: gettext/glade]ui/toolbar.glade src/Xournalpp.cpp src/util/OutputStream.cpp src/util/Range.cpp @@ -48,6 +49,8 @@ src/gui/GladeSearchpath.cpp src/gui/MainWindow.cpp src/gui/sidebar/SidebarPreview.cpp src/gui/sidebar/Sidebar.cpp +src/gui/toolbarMenubar/model/ToolbarData.cpp +src/gui/toolbarMenubar/model/ToolbarModel.cpp src/gui/toolbarMenubar/AbstractItem.cpp src/gui/toolbarMenubar/ColorToolItem.cpp src/gui/toolbarMenubar/ToolButton.cpp @@ -74,6 +77,7 @@ src/gui/dialog/SettingsDialog.cpp src/gui/dialog/AboutDialog.cpp src/gui/dialog/ButtonConfigGui.cpp src/gui/dialog/ExportDialog.cpp +src/gui/dialog/ToolbarDialog.cpp src/gui/Shadow.cpp src/control/LoadHandler.cpp src/control/jobs/AutosaveJob.cpp diff --git a/src/Makefile.am b/src/Makefile.am index f68aff56..0402aa73 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -59,12 +59,15 @@ xournalpp_SOURCES = \ gui/dialog/ButtonConfigGui.cpp \ gui/dialog/ExportDialog.cpp \ gui/dialog/FormatDialog.cpp \ + gui/dialog/ToolbarDialog.cpp \ gui/dialog/ImagesDialog.cpp \ gui/dialog/PdfPagesDialog.cpp \ gui/dialog/SelectBackgroundColorDialog.cpp \ gui/dialog/SettingsDialog.cpp \ gui/sidebar/Sidebar.cpp \ gui/sidebar/SidebarPreview.cpp \ + gui/toolbarMenubar/model/ToolbarModel.cpp \ + gui/toolbarMenubar/model/ToolbarData.cpp \ gui/toolbarMenubar/AbstractItem.cpp \ gui/toolbarMenubar/AbstractToolItem.cpp \ gui/toolbarMenubar/ColorToolItem.cpp \ diff --git a/src/Makefile.in b/src/Makefile.in index c9d7571c..ef64cf9e 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -91,11 +91,14 @@ am_xournalpp_OBJECTS = xournalpp-AutosaveJob.$(OBJEXT) \ xournalpp-ButtonConfigGui.$(OBJEXT) \ xournalpp-ExportDialog.$(OBJEXT) \ xournalpp-FormatDialog.$(OBJEXT) \ + xournalpp-ToolbarDialog.$(OBJEXT) \ xournalpp-ImagesDialog.$(OBJEXT) \ xournalpp-PdfPagesDialog.$(OBJEXT) \ xournalpp-SelectBackgroundColorDialog.$(OBJEXT) \ xournalpp-SettingsDialog.$(OBJEXT) xournalpp-Sidebar.$(OBJEXT) \ xournalpp-SidebarPreview.$(OBJEXT) \ + xournalpp-ToolbarModel.$(OBJEXT) \ + xournalpp-ToolbarData.$(OBJEXT) \ xournalpp-AbstractItem.$(OBJEXT) \ xournalpp-AbstractToolItem.$(OBJEXT) \ xournalpp-ColorToolItem.$(OBJEXT) \ @@ -373,12 +376,15 @@ xournalpp_SOURCES = \ gui/dialog/ButtonConfigGui.cpp \ gui/dialog/ExportDialog.cpp \ gui/dialog/FormatDialog.cpp \ + gui/dialog/ToolbarDialog.cpp \ gui/dialog/ImagesDialog.cpp \ gui/dialog/PdfPagesDialog.cpp \ gui/dialog/SelectBackgroundColorDialog.cpp \ gui/dialog/SettingsDialog.cpp \ gui/sidebar/Sidebar.cpp \ gui/sidebar/SidebarPreview.cpp \ + gui/toolbarMenubar/model/ToolbarModel.cpp \ + gui/toolbarMenubar/model/ToolbarData.cpp \ gui/toolbarMenubar/AbstractItem.cpp \ gui/toolbarMenubar/AbstractToolItem.cpp \ gui/toolbarMenubar/ColorToolItem.cpp \ @@ -677,6 +683,9 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-ToolPageSpinner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-ToolSelectCombocontrol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-ToolZoomSlider.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-ToolbarData.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-ToolbarDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-ToolbarModel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-UndoAction.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-UndoRedoHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xournalpp-UpdateRef.Po@am__quote@ @@ -1474,6 +1483,20 @@ xournalpp-FormatDialog.obj: gui/dialog/FormatDialog.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-FormatDialog.obj `if test -f 'gui/dialog/FormatDialog.cpp'; then $(CYGPATH_W) 'gui/dialog/FormatDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialog/FormatDialog.cpp'; fi` +xournalpp-ToolbarDialog.o: gui/dialog/ToolbarDialog.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-ToolbarDialog.o -MD -MP -MF $(DEPDIR)/xournalpp-ToolbarDialog.Tpo -c -o xournalpp-ToolbarDialog.o `test -f 'gui/dialog/ToolbarDialog.cpp' || echo '$(srcdir)/'`gui/dialog/ToolbarDialog.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-ToolbarDialog.Tpo $(DEPDIR)/xournalpp-ToolbarDialog.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gui/dialog/ToolbarDialog.cpp' object='xournalpp-ToolbarDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-ToolbarDialog.o `test -f 'gui/dialog/ToolbarDialog.cpp' || echo '$(srcdir)/'`gui/dialog/ToolbarDialog.cpp + +xournalpp-ToolbarDialog.obj: gui/dialog/ToolbarDialog.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-ToolbarDialog.obj -MD -MP -MF $(DEPDIR)/xournalpp-ToolbarDialog.Tpo -c -o xournalpp-ToolbarDialog.obj `if test -f 'gui/dialog/ToolbarDialog.cpp'; then $(CYGPATH_W) 'gui/dialog/ToolbarDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialog/ToolbarDialog.cpp'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-ToolbarDialog.Tpo $(DEPDIR)/xournalpp-ToolbarDialog.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gui/dialog/ToolbarDialog.cpp' object='xournalpp-ToolbarDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-ToolbarDialog.obj `if test -f 'gui/dialog/ToolbarDialog.cpp'; then $(CYGPATH_W) 'gui/dialog/ToolbarDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialog/ToolbarDialog.cpp'; fi` + xournalpp-ImagesDialog.o: gui/dialog/ImagesDialog.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-ImagesDialog.o -MD -MP -MF $(DEPDIR)/xournalpp-ImagesDialog.Tpo -c -o xournalpp-ImagesDialog.o `test -f 'gui/dialog/ImagesDialog.cpp' || echo '$(srcdir)/'`gui/dialog/ImagesDialog.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-ImagesDialog.Tpo $(DEPDIR)/xournalpp-ImagesDialog.Po @@ -1558,6 +1581,34 @@ xournalpp-SidebarPreview.obj: gui/sidebar/SidebarPreview.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-SidebarPreview.obj `if test -f 'gui/sidebar/SidebarPreview.cpp'; then $(CYGPATH_W) 'gui/sidebar/SidebarPreview.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/sidebar/SidebarPreview.cpp'; fi` +xournalpp-ToolbarModel.o: gui/toolbarMenubar/model/ToolbarModel.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-ToolbarModel.o -MD -MP -MF $(DEPDIR)/xournalpp-ToolbarModel.Tpo -c -o xournalpp-ToolbarModel.o `test -f 'gui/toolbarMenubar/model/ToolbarModel.cpp' || echo '$(srcdir)/'`gui/toolbarMenubar/model/ToolbarModel.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-ToolbarModel.Tpo $(DEPDIR)/xournalpp-ToolbarModel.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gui/toolbarMenubar/model/ToolbarModel.cpp' object='xournalpp-ToolbarModel.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-ToolbarModel.o `test -f 'gui/toolbarMenubar/model/ToolbarModel.cpp' || echo '$(srcdir)/'`gui/toolbarMenubar/model/ToolbarModel.cpp + +xournalpp-ToolbarModel.obj: gui/toolbarMenubar/model/ToolbarModel.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-ToolbarModel.obj -MD -MP -MF $(DEPDIR)/xournalpp-ToolbarModel.Tpo -c -o xournalpp-ToolbarModel.obj `if test -f 'gui/toolbarMenubar/model/ToolbarModel.cpp'; then $(CYGPATH_W) 'gui/toolbarMenubar/model/ToolbarModel.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/toolbarMenubar/model/ToolbarModel.cpp'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-ToolbarModel.Tpo $(DEPDIR)/xournalpp-ToolbarModel.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gui/toolbarMenubar/model/ToolbarModel.cpp' object='xournalpp-ToolbarModel.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-ToolbarModel.obj `if test -f 'gui/toolbarMenubar/model/ToolbarModel.cpp'; then $(CYGPATH_W) 'gui/toolbarMenubar/model/ToolbarModel.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/toolbarMenubar/model/ToolbarModel.cpp'; fi` + +xournalpp-ToolbarData.o: gui/toolbarMenubar/model/ToolbarData.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-ToolbarData.o -MD -MP -MF $(DEPDIR)/xournalpp-ToolbarData.Tpo -c -o xournalpp-ToolbarData.o `test -f 'gui/toolbarMenubar/model/ToolbarData.cpp' || echo '$(srcdir)/'`gui/toolbarMenubar/model/ToolbarData.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-ToolbarData.Tpo $(DEPDIR)/xournalpp-ToolbarData.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gui/toolbarMenubar/model/ToolbarData.cpp' object='xournalpp-ToolbarData.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-ToolbarData.o `test -f 'gui/toolbarMenubar/model/ToolbarData.cpp' || echo '$(srcdir)/'`gui/toolbarMenubar/model/ToolbarData.cpp + +xournalpp-ToolbarData.obj: gui/toolbarMenubar/model/ToolbarData.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-ToolbarData.obj -MD -MP -MF $(DEPDIR)/xournalpp-ToolbarData.Tpo -c -o xournalpp-ToolbarData.obj `if test -f 'gui/toolbarMenubar/model/ToolbarData.cpp'; then $(CYGPATH_W) 'gui/toolbarMenubar/model/ToolbarData.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/toolbarMenubar/model/ToolbarData.cpp'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-ToolbarData.Tpo $(DEPDIR)/xournalpp-ToolbarData.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gui/toolbarMenubar/model/ToolbarData.cpp' object='xournalpp-ToolbarData.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -c -o xournalpp-ToolbarData.obj `if test -f 'gui/toolbarMenubar/model/ToolbarData.cpp'; then $(CYGPATH_W) 'gui/toolbarMenubar/model/ToolbarData.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/toolbarMenubar/model/ToolbarData.cpp'; fi` + xournalpp-AbstractItem.o: gui/toolbarMenubar/AbstractItem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xournalpp_CXXFLAGS) $(CXXFLAGS) -MT xournalpp-AbstractItem.o -MD -MP -MF $(DEPDIR)/xournalpp-AbstractItem.Tpo -c -o xournalpp-AbstractItem.o `test -f 'gui/toolbarMenubar/AbstractItem.cpp' || echo '$(srcdir)/'`gui/toolbarMenubar/AbstractItem.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xournalpp-AbstractItem.Tpo $(DEPDIR)/xournalpp-AbstractItem.Po diff --git a/src/control/Control.cpp b/src/control/Control.cpp index f133d59f..89a453e9 100644 --- a/src/control/Control.cpp +++ b/src/control/Control.cpp @@ -6,6 +6,7 @@ #include "../gui/dialog/ImagesDialog.h" #include "../gui/dialog/FormatDialog.h" #include "../gui/dialog/SelectBackgroundColorDialog.h" +#include "../gui/dialog/ToolbarDialog.h" #include "../cfg.h" #include "LoadHandler.h" #include "PrintHandler.h" @@ -764,7 +765,11 @@ void Control::firePageSelected(int page) { } void Control::customizeToolbars() { + ToolbarDialog dlg(this->gladeSearchPath, win->getToolbarModel()); + dlg.show(); + // TODO: Debug + //win->updateToolbarMenu(); } void Control::enableFullscreen(bool enabled, bool presentation) { diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index ca24df9e..8c42d6c0 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -3,6 +3,8 @@ #include "../cfg.h" #include "toolbarMenubar/ToolMenuHandler.h" #include "../gui/GladeSearchpath.h" +#include "toolbarMenubar/model/ToolbarData.h" +#include "toolbarMenubar/model/ToolbarModel.h" #include #include @@ -22,7 +24,8 @@ MainWindow::MainWindow(GladeSearchpath * gladeSearchPath, Control * control) : this->tbBottom1 = get("tbBottom1"); this->tbBottom2 = get("tbBottom2"); this->maximized = false; - this->toolbarMenuitem = NULL; + this->toolbarMenuData = NULL; + this->toolbarMenuitems = NULL; this->xournal = new XournalWidget(get("scrolledwindowMain"), control); @@ -37,7 +40,10 @@ MainWindow::MainWindow(GladeSearchpath * gladeSearchPath, Control * control) : this->toolbar = new ToolMenuHandler(this->control, this->control->getZoomControl(), this, this->control->getToolHandler()); char * file = gladeSearchPath->findFile(NULL, "toolbar.ini"); - if (!this->toolbar->parse(file, true)) { + + ToolbarModel * tbModel = this->toolbar->getModel(); + + if (!tbModel->parse(file, true)) { GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(this->window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Could not parse general toolbar.ini file: %s\nNo Toolbars will be available"), file); @@ -50,7 +56,7 @@ MainWindow::MainWindow(GladeSearchpath * gladeSearchPath, Control * control) : file = g_build_filename(g_get_home_dir(), G_DIR_SEPARATOR_S, CONFIG_DIR, G_DIR_SEPARATOR_S, TOOLBAR_CONFIG, NULL); if (g_file_test(file, G_FILE_TEST_EXISTS)) { - if (!this->toolbar->parse(file, false)) { + if (!tbModel->parse(file, false)) { GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(this->window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Could not parse custom toolbar.ini file: %s\nToolbars will not be available"), file); @@ -61,7 +67,7 @@ MainWindow::MainWindow(GladeSearchpath * gladeSearchPath, Control * control) : } g_free(file); - initToolbar(); + initToolbarAndMenu(); g_signal_connect(getSpinPageNo(), "value-changed", G_CALLBACK(pageNrSpinChangedCallback), this); @@ -87,18 +93,21 @@ public: this->d = d; } - MainWindow *win; + MainWindow * win; GtkWidget * item; ToolbarData * d; }; MainWindow::~MainWindow() { - for (GList * l = this->toolbarMenuitem; l != NULL; l = l->next) { + for (GList * l = this->toolbarMenuData; l != NULL; l = l->next) { MenuSelectToolbarData * data = (MenuSelectToolbarData *) l->data; delete data; } - g_list_free(this->toolbarMenuitem); + g_list_free(this->toolbarMenuData); + this->toolbarMenuData = NULL; + g_list_free(this->toolbarMenuitems); + this->toolbarMenuitems = NULL; } void MainWindow::viewShowSidebar(GtkCheckMenuItem * checkmenuitem, MainWindow * win) { @@ -250,7 +259,7 @@ void MainWindow::toolbarSelected(ToolbarData * d) { void MainWindow::setControlTmpDisabled(bool disabled) { toolbar->setTmpDisabled(disabled); - for (GList * l = this->toolbarMenuitem; l != NULL; l = l->next) { + for (GList * l = this->toolbarMenuData; l != NULL; l = l->next) { MenuSelectToolbarData * data = (MenuSelectToolbarData *) l->data; gtk_widget_set_sensitive(data->item, !disabled); } @@ -262,11 +271,28 @@ void MainWindow::setControlTmpDisabled(bool disabled) { gtk_widget_set_sensitive(w, !disabled); } -void MainWindow::initToolbar() { +void MainWindow::updateToolbarMenu() { + for (GList * l = this->toolbarMenuitems; l != NULL; l = l->next) { + GtkWidget * w = GTK_WIDGET(l->data); + gtk_widget_destroy(w); + } + + for (GList * l = this->toolbarMenuData; l != NULL; l = l->next) { + MenuSelectToolbarData * data = (MenuSelectToolbarData *) l->data; + delete data; + } + + g_slist_free(this->toolbarGroup); + this->toolbarGroup = NULL; + + initToolbarAndMenu(); +} + +void MainWindow::initToolbarAndMenu() { GtkMenuShell * menubar = GTK_MENU_SHELL(get("menuViewToolbar")); g_return_if_fail(menubar != NULL); - ListIterator it = this->toolbar->iterator(); + ListIterator it = this->toolbar->getModel()->iterator(); GtkWidget * item = NULL; GtkWidget * selectedItem = NULL; ToolbarData * selectedData = NULL; @@ -291,7 +317,7 @@ void MainWindow::initToolbar() { MenuSelectToolbarData * data = new MenuSelectToolbarData(this, item, d); - this->toolbarMenuitem = g_list_append(this->toolbarMenuitem, data); + this->toolbarMenuData = g_list_append(this->toolbarMenuData, data); if (selectedId == d->getId()) { selectedData = d; @@ -308,10 +334,12 @@ void MainWindow::initToolbar() { gtk_menu_shell_insert(menubar, separator, menuPos++); predefined = true; + this->toolbarMenuitems = g_list_append(this->toolbarMenuitems, separator); } gtk_menu_shell_insert(menubar, item, menuPos++); - gtk_widget_unrealize(item); + + this->toolbarMenuitems = g_list_append(this->toolbarMenuitems, item); } if (selectedData) { @@ -401,3 +429,7 @@ void MainWindow::setRedoDescription(String description) { GtkWidget * MainWindow::getSpinPageNo() { return toolbar->getPageSpinner(); } + +ToolbarModel * MainWindow::getToolbarModel() { + return this->toolbar->getModel(); +} diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index fcc6bda2..5a9d8e20 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -21,6 +21,7 @@ class Control; class MainWindow; class ToolMenuHandler; class ToolbarData; +class ToolbarModel; class MainWindow: public GladeGui { public: @@ -56,11 +57,14 @@ public: void updateLayerCombobox(); GtkWidget * getSpinPageNo(); + ToolbarModel * getToolbarModel(); void setControlTmpDisabled(bool disabled); + void updateToolbarMenu(); + private: - void initToolbar(); + void initToolbarAndMenu(); static void pageNrSpinChangedCallback(GtkSpinButton * spinbutton, MainWindow * win); static void buttonCloseSidebarClicked(GtkButton * button, MainWindow * win); @@ -87,10 +91,12 @@ private: // Toolbars ToolMenuHandler * toolbar; GSList * toolbarGroup; - GList * toolbarMenuitem; + GList * toolbarMenuData; ToolbarData * selectedToolbar; bool toolbarIntialized; + GList * toolbarMenuitems; + bool maximized; GtkWidget * tbTop1; diff --git a/src/gui/dialog/ImagesDialog.cpp b/src/gui/dialog/ImagesDialog.cpp index 2d688f18..2349b600 100644 --- a/src/gui/dialog/ImagesDialog.cpp +++ b/src/gui/dialog/ImagesDialog.cpp @@ -2,6 +2,8 @@ #include "../Shadow.h" #include #include "../../util/Util.h" +#include "../../model/Document.h" +#include "../../control/settings/Settings.h" #include #include @@ -266,11 +268,11 @@ void ImagesDialog::updateOkButton() { gtk_widget_set_sensitive(get("buttonOk"), p && gtk_widget_get_visible(p->getWidget())); } -void ImagesDialog::okButtonCallback(GtkButton *button, ImagesDialog * dlg) { +void ImagesDialog::okButtonCallback(GtkButton * button, ImagesDialog * dlg) { dlg->selectedPage = dlg->selected; } -void ImagesDialog::filechooserButtonCallback(GtkButton *button, ImagesDialog * dlg) { +void ImagesDialog::filechooserButtonCallback(GtkButton * button, ImagesDialog * dlg) { dlg->selectedPage = -2; gtk_widget_hide(dlg->window); } diff --git a/src/gui/dialog/ImagesDialog.h b/src/gui/dialog/ImagesDialog.h index c02d59a2..eddbbb35 100644 --- a/src/gui/dialog/ImagesDialog.h +++ b/src/gui/dialog/ImagesDialog.h @@ -8,12 +8,15 @@ * * @license GPL */ + #ifndef __IMAGESDIALOG_H__ #define __IMAGESDIALOG_H__ #include "../GladeGui.h" -#include "../../model/Document.h" -#include "../../control/settings/Settings.h" + +class Document; +class Settings; +class BackgroundImage; class ImagesDialog: public GladeGui { public: @@ -34,9 +37,9 @@ private: void layout(); void updateOkButton(); - static void sizeAllocate(GtkWidget *widget, GtkRequisition *requisition, ImagesDialog * dlg); - static void okButtonCallback(GtkButton *button, ImagesDialog * dlg); - static void filechooserButtonCallback(GtkButton *button, ImagesDialog * dlg); + static void sizeAllocate(GtkWidget * widget, GtkRequisition * requisition, ImagesDialog * dlg); + static void okButtonCallback(GtkButton * button, ImagesDialog * dlg); + static void filechooserButtonCallback(GtkButton * button, ImagesDialog * dlg); private: bool backgroundInitialized; diff --git a/src/gui/dialog/SettingsDialog.cpp b/src/gui/dialog/SettingsDialog.cpp index d3679c82..7aa6ba81 100644 --- a/src/gui/dialog/SettingsDialog.cpp +++ b/src/gui/dialog/SettingsDialog.cpp @@ -18,8 +18,6 @@ #include "../../util/Util.h" #include -// TODO: Zoom kallibrieren einheitsangabe - SettingsDialog::SettingsDialog(GladeSearchpath * gladeSearchPath, Settings * settings) : GladeGui(gladeSearchPath, "settings.glade", "settingsDialog") { this->settings = settings; diff --git a/src/gui/dialog/ToolbarDialog.cpp b/src/gui/dialog/ToolbarDialog.cpp new file mode 100644 index 00000000..6546ee61 --- /dev/null +++ b/src/gui/dialog/ToolbarDialog.cpp @@ -0,0 +1,165 @@ +#include "ToolbarDialog.h" +#include "../toolbarMenubar/model/ToolbarData.h" +#include "../toolbarMenubar/model/ToolbarModel.h" + +#include +#include + +enum { + COLUMN_STRING, COLUMN_BOLD, COLUMN_POINTER, COLUMN_EDITABLE, N_COLUMNS +}; + +ToolbarDialog::ToolbarDialog(GladeSearchpath * gladeSearchPath, ToolbarModel * model) : + GladeGui(gladeSearchPath, "toolbar.glade", "DialogEditToolbar") { + + this->tbModel = model; + this->selected = NULL; + + GtkTreeIter iter; + this->model = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_INT, G_TYPE_POINTER, G_TYPE_BOOLEAN); + gtk_list_store_append(this->model, &iter); + gtk_list_store_set(this->model, &iter, COLUMN_STRING, _("Predefined"), COLUMN_BOLD, PANGO_WEIGHT_BOLD, COLUMN_POINTER, NULL, COLUMN_EDITABLE, false, -1); + + ListIterator it = model->iterator(); + + while (it.hasNext()) { + ToolbarData * data = it.next(); + if (data->isPredefined()) { + gtk_list_store_append(this->model, &iter); + gtk_list_store_set(this->model, &iter, COLUMN_STRING, data->getName().c_str(), COLUMN_BOLD, PANGO_WEIGHT_NORMAL, COLUMN_POINTER, data, + COLUMN_EDITABLE, false, -1); + } + } + + gtk_list_store_append(this->model, &iter); + gtk_list_store_set(this->model, &iter, COLUMN_STRING, _("Customized"), COLUMN_BOLD, PANGO_WEIGHT_BOLD, COLUMN_POINTER, NULL, COLUMN_EDITABLE, false, -1); + + ListIterator it2 = model->iterator(); + + while (it2.hasNext()) { + ToolbarData * data = it2.next(); + if (!data->isPredefined()) { + gtk_list_store_append(this->model, &iter); + gtk_list_store_set(this->model, &iter, COLUMN_STRING, data->getName().c_str(), COLUMN_BOLD, PANGO_WEIGHT_NORMAL, COLUMN_POINTER, data, + COLUMN_EDITABLE, true, -1); + } + } + + GtkWidget * tree = get("toolbarList"); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(this->model)); + + GtkCellRenderer * renderer = gtk_cell_renderer_text_new(); + GtkTreeViewColumn * column = gtk_tree_view_column_new_with_attributes(_("Toolbars"), renderer, "text", COLUMN_STRING, "weight", COLUMN_BOLD, "editable", + COLUMN_EDITABLE, NULL); + + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + //gtk_tree_view_set_column_drag_function + + GtkTreeSelection * select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); + gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); + g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK (treeSelectionChangedCallback), this); + + g_signal_connect(renderer, "edited", (GCallback) treeCellEditedCallback, this); + + g_signal_connect(get("btNew"), "clicked", G_CALLBACK(buttonNewCallback), this); + g_signal_connect(get("btDelete"), "clicked", G_CALLBACK(buttonDeleteCallback), this); + g_signal_connect(get("btCopy"), "clicked", G_CALLBACK(buttonCopyCallback), this); + + entrySelected(NULL); +} + +ToolbarDialog::~ToolbarDialog() { + g_object_unref(this->model); + this->tbModel = NULL; +} + +void ToolbarDialog::buttonNewCallback(GtkButton * button, ToolbarDialog * dlg) { + ToolbarData * data = new ToolbarData(false); + data->setName(_("New")); + dlg->addToolbarData(data); +} + +void ToolbarDialog::buttonDeleteCallback(GtkButton * button, ToolbarDialog * dlg) { + if (dlg->selected) { + dlg->tbModel->remove(dlg->selected); + GtkTreeIter iter; + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(dlg->model), &iter)) { + do { + ToolbarData * data = NULL; + gtk_tree_model_get(GTK_TREE_MODEL(dlg->model), &iter, COLUMN_POINTER, &data, -1); + + if (data == dlg->selected) { + gtk_list_store_remove(dlg->model, &iter); + break; + } + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(dlg->model), &iter)); + } + + dlg->entrySelected(NULL); + } +} + +void ToolbarDialog::buttonCopyCallback(GtkButton * button, ToolbarDialog * dlg) { + if (dlg->selected) { + ToolbarData * data = new ToolbarData(*dlg->selected); + dlg->addToolbarData(data); + } +} + +void ToolbarDialog::addToolbarData(ToolbarData * data) { + this->tbModel->add(data); + GtkTreeIter iter; + gtk_list_store_append(this->model, &iter); + gtk_list_store_set(this->model, &iter, COLUMN_STRING, data->getName().c_str(), COLUMN_BOLD, PANGO_WEIGHT_NORMAL, COLUMN_POINTER, data, COLUMN_EDITABLE, + true, -1); + + GtkWidget * tree = get("toolbarList"); + + GtkTreePath * path = gtk_tree_model_get_path(GTK_TREE_MODEL(this->model), &iter); + GtkTreeViewColumn * column = gtk_tree_view_get_column(GTK_TREE_VIEW(tree), 0); + + gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree), path, column, true); +} + +void ToolbarDialog::treeCellEditedCallback(GtkCellRendererText * renderer, gchar * pathString, gchar * newText, ToolbarDialog * dlg) { + GtkTreeIter iter; + ToolbarData * data = NULL; + + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(dlg->model), &iter, pathString); + gtk_tree_model_get(GTK_TREE_MODEL(dlg->model), &iter, COLUMN_POINTER, &data, -1); + if (data) { + gtk_list_store_set(dlg->model, &iter, COLUMN_STRING, newText, -1); + data->setName(newText); + } +} + +void ToolbarDialog::entrySelected(ToolbarData * data) { + GtkWidget * btCopy = get("btCopy"); + GtkWidget * btDelete = get("btDelete"); + + if (data == NULL) { + gtk_widget_set_sensitive(btCopy, false); + gtk_widget_set_sensitive(btDelete, false); + } else { + gtk_widget_set_sensitive(btCopy, true); + gtk_widget_set_sensitive(btDelete, !data->isPredefined()); + } + + this->selected = data; +} + +void ToolbarDialog::treeSelectionChangedCallback(GtkTreeSelection * selection, ToolbarDialog * dlg) { + GtkTreeIter iter; + GtkTreeModel * model = NULL; + ToolbarData * data = NULL; + + if (gtk_tree_selection_get_selected(selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, COLUMN_POINTER, &data, -1); + dlg->entrySelected(data); + } +} + +void ToolbarDialog::show() { + gtk_dialog_run(GTK_DIALOG(this->window)); + gtk_widget_hide(this->window); +} diff --git a/src/gui/dialog/ToolbarDialog.h b/src/gui/dialog/ToolbarDialog.h new file mode 100644 index 00000000..69c5253e --- /dev/null +++ b/src/gui/dialog/ToolbarDialog.h @@ -0,0 +1,46 @@ +/* + * Xournal++ + * + * Toolbar edit dialog + * + * @author Xournal Team + * http://xournal.sf.net + * + * @license GPL + */ + +#ifndef __TOOLBARDIALOG_H__ +#define __TOOLBARDIALOG_H__ + +#include "../GladeGui.h" + +class ToolbarModel; +class ToolbarData; + +class ToolbarDialog: public GladeGui { +public: + ToolbarDialog(GladeSearchpath * gladeSearchPath, ToolbarModel * model); + virtual ~ToolbarDialog(); + +public: + void show(); + +private: + static void treeSelectionChangedCallback(GtkTreeSelection * selection, ToolbarDialog * dlg); + static void treeCellEditedCallback(GtkCellRendererText * renderer, gchar * pathString, gchar * newText, ToolbarDialog * dlg); + + static void buttonNewCallback(GtkButton * button, ToolbarDialog * dlg); + static void buttonDeleteCallback(GtkButton * button, ToolbarDialog * dlg); + static void buttonCopyCallback(GtkButton * button, ToolbarDialog * dlg); + + void addToolbarData(ToolbarData * data); + void entrySelected(ToolbarData * data); + +private: + ToolbarModel * tbModel; + GtkListStore * model; + + ToolbarData * selected; +}; + +#endif /* __TOOLBARDIALOG_H__ */ diff --git a/src/gui/toolbarMenubar/ToolMenuHandler.cpp b/src/gui/toolbarMenubar/ToolMenuHandler.cpp index 322945b1..6b7644c7 100644 --- a/src/gui/toolbarMenubar/ToolMenuHandler.cpp +++ b/src/gui/toolbarMenubar/ToolMenuHandler.cpp @@ -29,60 +29,10 @@ #include "ToolZoomSlider.h" #include "ToolPageLayer.h" -ToolbarData::ToolbarData(bool predefined) { - this->predefined = predefined; -} - -String ToolbarData::getName() { - return this->name; -} - -String ToolbarData::getId() { - return this->id; -} - -bool ToolbarData::isPredefined() { - return this->predefined; -} - -void ToolbarData::load(GKeyFile * config, const char * group) { - gsize length = 0; - gchar ** keys = g_key_file_get_keys(config, group, &length, NULL); - if (keys == NULL) { - return; - } - - gchar * name = g_key_file_get_locale_string(config, group, "name", NULL, NULL); - if (name != NULL) { - this->name = name; - g_free(name); - } - - for (gsize i = 0; i < length; i++) { - if (strcmp(keys[i], "name") == 0 || strncmp(keys[i], "name[", 5) == 0) { - continue; - } - - ToolbarEntry e; - gsize keyLen = 0; - e.name = keys[i]; - gchar ** list = g_key_file_get_string_list(config, group, keys[i], &keyLen, NULL); - - for (gsize x = 0; x < keyLen; x++) { - String s = list[x]; - e.entries.push_back(s.trim()); - } - - contents.push_back(e); - - g_strfreev(list); - } - - g_strfreev(keys); -} +#include "model/ToolbarModel.h" +#include "model/ToolbarData.h" ToolMenuHandler::ToolMenuHandler(ActionHandler * listener, ZoomControl * zoom, GladeGui * gui, ToolHandler * toolHandler) { - this->toolbars = NULL; this->toolItems = NULL; this->toolbarColorItems = NULL; this->menuItems = NULL; @@ -94,97 +44,14 @@ ToolMenuHandler::ToolMenuHandler(ActionHandler * listener, ZoomControl * zoom, G this->redoButton = NULL; this->toolPageSpinner = NULL; this->toolPageLayer = NULL; - - this->colorNameTable = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + this->tbModel = new ToolbarModel(); initToolItems(); } ToolMenuHandler::~ToolMenuHandler() { - for (GList * l = toolbars; l != NULL; l = l->next) { - delete (ToolbarData*) l->data; - } - - g_list_free(this->toolbars); - this->toolbars = NULL; - - g_hash_table_destroy(this->colorNameTable); - this->colorNameTable = NULL; -} - -void ToolMenuHandler::parseGroup(GKeyFile * config, const char * group, bool predefined) { - ToolbarData * data = new ToolbarData(predefined); - - String name; - if (predefined) { - name = "predef_"; - } else { - name = "custom_"; - } - - data->name = name; - data->id = group; - - data->load(config, group); - - this->toolbars = g_list_append(this->toolbars, data); -} - -bool ToolMenuHandler::parse(const char * file, bool predefined) { - GKeyFile * config = g_key_file_new(); - g_key_file_set_list_separator(config, ','); - if (!g_key_file_load_from_file(config, file, G_KEY_FILE_NONE, NULL)) { - g_key_file_free(config); - return false; - } - - gsize lenght = 0; - gchar ** groups = g_key_file_get_groups(config, &lenght); - - for (gsize i = 0; i < lenght; i++) { - if (groups[i][0] == '_') { - if (strcmp("_ColorNames", groups[i]) == 0) { - parseColors(config, groups[i]); - } - - continue; - } - - parseGroup(config, groups[i], predefined); - } - - g_strfreev(groups); - g_key_file_free(config); - return true; -} - -void ToolMenuHandler::parseColors(GKeyFile * config, const char * group) { - gsize length = 0; - gchar ** keys = g_key_file_get_keys(config, group, &length, NULL); - if (keys == NULL) { - return; - } - - for (gsize i = 0; i < length; i++) { - if (strstr(keys[i], "[")) { - // skip localized keys - continue; - } - - char * name = g_key_file_get_locale_string(config, group, keys[i], NULL, NULL); - g_hash_table_insert(this->colorNameTable, g_strdup(keys[i]), name); - } - - g_strfreev(keys); -} - -const char * ToolMenuHandler::getColorName(const char * color) { - const char * name = (char *) g_hash_table_lookup(this->colorNameTable, color); - return name; -} - -ListIterator ToolMenuHandler::iterator() { - return ListIterator (this->toolbars); + delete this->tbModel; + this->tbModel = NULL; } void ToolMenuHandler::freeToolbar() { @@ -259,7 +126,7 @@ void ToolMenuHandler::load(ToolbarData * d, GtkWidget * toolbar, const char * to color = color.substring(2); gint c = g_ascii_strtoll(color.c_str(), NULL, 16); - const char * colorName = getColorName(color.c_str()); + const char * colorName = this->tbModel->getColorName(color.c_str()); String name; if (colorName == NULL) { g_warning("No color name in toolbar.ini for %s defined!", color.c_str()); @@ -600,3 +467,7 @@ void ToolMenuHandler::setLayerCount(int count, int selected) { toolPageLayer->setLayerCount(count, selected); } +ToolbarModel * ToolMenuHandler::getModel() { + return this->tbModel; +} + diff --git a/src/gui/toolbarMenubar/ToolMenuHandler.h b/src/gui/toolbarMenubar/ToolMenuHandler.h index c82a1efc..263d557f 100644 --- a/src/gui/toolbarMenubar/ToolMenuHandler.h +++ b/src/gui/toolbarMenubar/ToolMenuHandler.h @@ -14,42 +14,21 @@ #include -#include "../../util/ListIterator.h" #include "../../control/Actions.h" -#include "../../control/ZoomControl.h" #include "../../util/String.h" -#include "../GladeGui.h" -#include -#include "ToolbarEntry.h" -#include "../../control/ToolHandler.h" -class ToolbarData { -public: - ToolbarData(bool predefined); - -public: - String getName(); - String getId(); - - void load(GKeyFile * config, const char * group); - - bool isPredefined(); -private: - String id; - String name; - std::vector contents; - - bool predefined; - - friend class ToolMenuHandler; -}; class AbstractToolItem; class ToolButton; class ToolPageSpinner; class ToolPageLayer; class FontButton; - +class ToolbarData; +class ZoomControl; +class ToolHandler; +class XojFont; +class GladeGui; +class ToolbarModel; class ToolMenuHandler { public: @@ -57,9 +36,6 @@ public: virtual ~ToolMenuHandler(); public: - bool parse(const char * file, bool predefined); - - ListIterator iterator(); void unloadToolbar(GtkWidget * tBunload); void freeToolbar(); @@ -86,18 +62,14 @@ public: void setTmpDisabled(bool disabled); - const char * getColorName(const char * color); - + ToolbarModel * getModel(); private: void addToolItem(AbstractToolItem * it); - void parseGroup(GKeyFile * config, const char * group, bool predefined); - void parseColors(GKeyFile * config, const char * group); void initEraserToolItem(); private: - GList * toolbars; GList * toolbarColorItems; GList * toolItems; @@ -115,7 +87,7 @@ private: GladeGui * gui; ToolHandler * toolHandler; - GHashTable * colorNameTable; + ToolbarModel * tbModel; }; #endif /* EDITABLETOOLBAR_H_ */ diff --git a/src/gui/toolbarMenubar/model/ToolbarData.cpp b/src/gui/toolbarMenubar/model/ToolbarData.cpp new file mode 100644 index 00000000..ab48c6ec --- /dev/null +++ b/src/gui/toolbarMenubar/model/ToolbarData.cpp @@ -0,0 +1,58 @@ +#include "ToolbarData.h" +#include + +ToolbarData::ToolbarData(bool predefined) { + this->predefined = predefined; +} + +String ToolbarData::getName() { + return this->name; +} + +void ToolbarData::setName(String name) { + this->name = name; +} + +String ToolbarData::getId() { + return this->id; +} + +bool ToolbarData::isPredefined() { + return this->predefined; +} + +void ToolbarData::load(GKeyFile * config, const char * group) { + gsize length = 0; + gchar ** keys = g_key_file_get_keys(config, group, &length, NULL); + if (keys == NULL) { + return; + } + + gchar * name = g_key_file_get_locale_string(config, group, "name", NULL, NULL); + if (name != NULL) { + this->name = name; + g_free(name); + } + + for (gsize i = 0; i < length; i++) { + if (strcmp(keys[i], "name") == 0 || strncmp(keys[i], "name[", 5) == 0) { + continue; + } + + ToolbarEntry e; + gsize keyLen = 0; + e.name = keys[i]; + gchar ** list = g_key_file_get_string_list(config, group, keys[i], &keyLen, NULL); + + for (gsize x = 0; x < keyLen; x++) { + String s = list[x]; + e.entries.push_back(s.trim()); + } + + contents.push_back(e); + + g_strfreev(list); + } + + g_strfreev(keys); +} diff --git a/src/gui/toolbarMenubar/model/ToolbarData.h b/src/gui/toolbarMenubar/model/ToolbarData.h new file mode 100644 index 00000000..5a9ec5b1 --- /dev/null +++ b/src/gui/toolbarMenubar/model/ToolbarData.h @@ -0,0 +1,44 @@ +/* + * Xournal++ + * + * Toolbar definitions model + * + * @author Xournal Team + * http://xournal.sf.net + * + * @license GPL + */ + +#ifndef __TOOLBARDATA_H__ +#define __TOOLBARDATA_H__ + +#include +#include "../../../util/String.h" +#include + +#include "ToolbarEntry.h" + +class ToolbarData { +public: + ToolbarData(bool predefined); + +public: + String getName(); + void setName(String name); + String getId(); + + void load(GKeyFile * config, const char * group); + + bool isPredefined(); +private: + String id; + String name; + std::vector contents; + + bool predefined; + + friend class ToolbarModel; + friend class ToolMenuHandler; +}; + +#endif /* __TOOLBARDATA_H__ */ diff --git a/src/gui/toolbarMenubar/ToolbarEntry.h b/src/gui/toolbarMenubar/model/ToolbarEntry.h similarity index 100% rename from src/gui/toolbarMenubar/ToolbarEntry.h rename to src/gui/toolbarMenubar/model/ToolbarEntry.h diff --git a/src/gui/toolbarMenubar/model/ToolbarModel.cpp b/src/gui/toolbarMenubar/model/ToolbarModel.cpp new file mode 100644 index 00000000..89370c54 --- /dev/null +++ b/src/gui/toolbarMenubar/model/ToolbarModel.cpp @@ -0,0 +1,103 @@ +#include "ToolbarModel.h" +#include "ToolbarData.h" + +#include + +ToolbarModel::ToolbarModel() { + this->toolbars = NULL; + this->colorNameTable = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); +} + +ToolbarModel::~ToolbarModel() { + for (GList * l = this->toolbars; l != NULL; l = l->next) { + delete (ToolbarData *) l->data; + } + g_list_free(this->toolbars); + this->toolbars = NULL; + + g_hash_table_destroy(this->colorNameTable); + this->colorNameTable = NULL; +} + +ListIterator ToolbarModel::iterator() { + return ListIterator (this->toolbars); +} + +void ToolbarModel::parseGroup(GKeyFile * config, const char * group, bool predefined) { + ToolbarData * data = new ToolbarData(predefined); + + String name; + if (predefined) { + name = "predef_"; + } else { + name = "custom_"; + } + + data->name = name; + data->id = group; + + data->load(config, group); + + add(data); +} + +void ToolbarModel::remove(ToolbarData * data) { + this->toolbars = g_list_remove(this->toolbars, data); +} + +void ToolbarModel::add(ToolbarData * data) { + this->toolbars = g_list_append(this->toolbars, data); +} + +const char * ToolbarModel::getColorName(const char * color) { + const char * name = (char *) g_hash_table_lookup(this->colorNameTable, color); + return name; +} + +bool ToolbarModel::parse(const char * file, bool predefined) { + GKeyFile * config = g_key_file_new(); + g_key_file_set_list_separator(config, ','); + if (!g_key_file_load_from_file(config, file, G_KEY_FILE_NONE, NULL)) { + g_key_file_free(config); + return false; + } + + gsize lenght = 0; + gchar ** groups = g_key_file_get_groups(config, &lenght); + + for (gsize i = 0; i < lenght; i++) { + if (groups[i][0] == '_') { + if (strcmp("_ColorNames", groups[i]) == 0) { + parseColors(config, groups[i]); + } + + continue; + } + + parseGroup(config, groups[i], predefined); + } + + g_strfreev(groups); + g_key_file_free(config); + return true; +} + +void ToolbarModel::parseColors(GKeyFile * config, const char * group) { + gsize length = 0; + gchar ** keys = g_key_file_get_keys(config, group, &length, NULL); + if (keys == NULL) { + return; + } + + for (gsize i = 0; i < length; i++) { + if (strstr(keys[i], "[")) { + // skip localized keys + continue; + } + + char * name = g_key_file_get_locale_string(config, group, keys[i], NULL, NULL); + g_hash_table_insert(this->colorNameTable, g_strdup(keys[i]), name); + } + + g_strfreev(keys); +} diff --git a/src/gui/toolbarMenubar/model/ToolbarModel.h b/src/gui/toolbarMenubar/model/ToolbarModel.h new file mode 100644 index 00000000..d63fe77b --- /dev/null +++ b/src/gui/toolbarMenubar/model/ToolbarModel.h @@ -0,0 +1,41 @@ +/* + * Xournal++ + * + * Toolbar definitions model + * + * @author Xournal Team + * http://xournal.sf.net + * + * @license GPL + */ + +#ifndef __TOOLBARMODEL_H__ +#define __TOOLBARMODEL_H__ + +#include +#include "../../../util/ListIterator.h" + +class ToolbarData; + +class ToolbarModel { +public: + ToolbarModel(); + virtual ~ToolbarModel(); + +public: + ListIterator iterator(); + bool parse(const char * file, bool predefined); + const char * getColorName(const char * color); + void add(ToolbarData * data); + void remove(ToolbarData * data); + +private: + void parseGroup(GKeyFile * config, const char * group, bool predefined); + void parseColors(GKeyFile * config, const char * group); + +private: + GList * toolbars; + GHashTable * colorNameTable; +}; + +#endif /* __TOOLBARMODEL_H__ */ diff --git a/ui/Makefile.am b/ui/Makefile.am index 24375b18..d1bd495b 100644 --- a/ui/Makefile.am +++ b/ui/Makefile.am @@ -10,6 +10,7 @@ ui_DATA = \ pagesize.glade \ pdfpages.glade \ settings.glade \ + toolbar.glade \ toolbar.ini EXTRA_DIST = ${ui_DATA} \ No newline at end of file diff --git a/ui/Makefile.in b/ui/Makefile.in index 61675eb2..c4674792 100644 --- a/ui/Makefile.in +++ b/ui/Makefile.in @@ -253,6 +253,7 @@ ui_DATA = \ pagesize.glade \ pdfpages.glade \ settings.glade \ + toolbar.glade \ toolbar.ini EXTRA_DIST = ${ui_DATA} diff --git a/ui/toolbar.glade b/ui/toolbar.glade new file mode 100644 index 00000000..767f1688 --- /dev/null +++ b/ui/toolbar.glade @@ -0,0 +1,129 @@ + + + + + + 5 + Edit Toolbar + pixmaps/xournalpp.svg + normal + False + + + True + vertical + 2 + + + True + vertical + + + True + + + True + True + + + 0 + + + + + True + vertical + + + gtk-new + True + True + True + True + + + False + 2 + 0 + + + + + gtk-delete + True + True + True + True + + + False + 3 + 1 + + + + + gtk-copy + True + True + True + True + + + False + 2 + 2 + + + + + False + 5 + 1 + + + + + 0 + + + + + + + + + + + 1 + + + + + True + end + + + gtk-close + True + True + True + True + + + False + False + 0 + + + + + False + end + 0 + + + + + +