notes-app-1.4+14.04.20140415/0000755000015301777760000000000012323261122015654 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/cmake/0000755000015301777760000000000012323261122016734 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/cmake/FindLcov.cmake0000644000015301777760000000172012323260622021446 0ustar pbusernogroup00000000000000# - Find lcov # Will define: # # LCOV_EXECUTABLE - the lcov binary # GENHTML_EXECUTABLE - the genhtml executable # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(LCOV_EXECUTABLE lcov) FIND_PROGRAM(GENHTML_EXECUTABLE genhtml) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lcov DEFAULT_MSG LCOV_EXECUTABLE GENHTML_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(LCOV_EXECUTABLE GENHTML_EXECUTABLE) notes-app-1.4+14.04.20140415/cmake/EnableCoverageReport.cmake0000644000015301777760000001531112323260622024001 0ustar pbusernogroup00000000000000# - Creates a special coverage build type and target on GCC. # # Defines a function ENABLE_COVERAGE_REPORT which generates the coverage target # for selected targets. Optional arguments to this function are used to filter # unwanted results using globbing expressions. Moreover targets with tests for # the source code can be specified to trigger regenerating the report if the # test has changed # # ENABLE_COVERAGE_REPORT(TARGETS target... [FILTER filter...] [TESTS test targets...]) # # To generate a coverage report first build the project with # CMAKE_BUILD_TYPE=coverage, then call make test and afterwards make coverage. # # The coverage report is based on gcov. Depending on the availability of lcov # a HTML report will be generated and/or an XML report of gcovr is found. # The generated coverage target executes all found solutions. Special targets # exist to create e.g. only the xml report: coverage-xml. # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(ParseArguments) FIND_PACKAGE(Lcov) FIND_PACKAGE(gcovr) FUNCTION(ENABLE_COVERAGE_REPORT) # argument parsing PARSE_ARGUMENTS(ARG "FILTER;TARGETS;TESTS" "" ${ARGN}) SET(COVERAGE_RAW_FILE "${CMAKE_BINARY_DIR}/coverage.raw.info") SET(COVERAGE_FILTERED_FILE "${CMAKE_BINARY_DIR}/coverage.info") SET(COVERAGE_REPORT_DIR "${CMAKE_BINARY_DIR}/coveragereport") SET(COVERAGE_XML_FILE "${CMAKE_BINARY_DIR}/coverage.xml") SET(COVERAGE_XML_COMMAND_FILE "${CMAKE_BINARY_DIR}/coverage-xml.cmake") # decide if there is any tool to create coverage data SET(TOOL_FOUND FALSE) IF(LCOV_FOUND OR GCOVR_FOUND) SET(TOOL_FOUND TRUE) ENDIF() IF(NOT TOOL_FOUND) MESSAGE(STATUS "Cannot enable coverage targets because neither lcov nor gcovr are found.") ENDIF() STRING(TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE) IF(CMAKE_COMPILER_IS_GNUCXX AND TOOL_FOUND AND "${COVERAGE_BUILD_TYPE}" MATCHES "coverage") MESSAGE(STATUS "Coverage support enabled for targets: ${ARG_TARGETS}") # create coverage build type SET(CMAKE_CXX_FLAGS_COVERAGE ${CMAKE_CXX_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_C_FLAGS_COVERAGE ${CMAKE_C_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} coverage PARENT_SCOPE) # instrument targets SET_TARGET_PROPERTIES(${ARG_TARGETS} PROPERTIES COMPILE_FLAGS --coverage LINK_FLAGS --coverage) # html report IF (LCOV_FOUND) MESSAGE(STATUS "Enabling HTML coverage report") # set up coverage target ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_RAW_FILE} COMMAND ${LCOV_EXECUTABLE} -c -d ${CMAKE_BINARY_DIR} -o ${COVERAGE_RAW_FILE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Collecting coverage data" DEPENDS ${ARG_TARGETS} ${ARG_TESTS} VERBATIM) # filter unwanted stuff LIST(LENGTH ARG_FILTER FILTER_LENGTH) IF(${FILTER_LENGTH} GREATER 0) SET(FILTER COMMAND ${LCOV_EXECUTABLE}) FOREACH(F ${ARG_FILTER}) SET(FILTER ${FILTER} -r ${COVERAGE_FILTERED_FILE} ${F}) ENDFOREACH() SET(FILTER ${FILTER} -o ${COVERAGE_FILTERED_FILE}) ELSE() SET(FILTER "") ENDIF() ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_FILTERED_FILE} COMMAND ${LCOV_EXECUTABLE} -e ${COVERAGE_RAW_FILE} "${CMAKE_SOURCE_DIR}*" -o ${COVERAGE_FILTERED_FILE} ${FILTER} DEPENDS ${COVERAGE_RAW_FILE} COMMENT "Filtering recorded coverage data for project-relevant entries" VERBATIM) ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_REPORT_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_REPORT_DIR} COMMAND ${GENHTML_EXECUTABLE} --legend --show-details -t "${PROJECT_NAME} test coverage" -o ${COVERAGE_REPORT_DIR} ${COVERAGE_FILTERED_FILE} DEPENDS ${COVERAGE_FILTERED_FILE} COMMENT "Generating HTML coverage report in ${COVERAGE_REPORT_DIR}" VERBATIM) ADD_CUSTOM_TARGET(coverage-html DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() # xml coverage report IF(GCOVR_FOUND) MESSAGE(STATUS "Enabling XML coverage report") # gcovr cannot write directly to a file so the execution needs to # be wrapped in a cmake file that generates the file output FILE(WRITE ${COVERAGE_XML_COMMAND_FILE} "SET(ENV{LANG} en)\n") FILE(APPEND ${COVERAGE_XML_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND \"${GCOVR_EXECUTABLE}\" -x -r \"${CMAKE_SOURCE_DIR}\" OUTPUT_FILE \"${COVERAGE_XML_FILE}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n") ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_XML_FILE} COMMAND ${CMAKE_COMMAND} ARGS -P ${COVERAGE_XML_COMMAND_FILE} COMMENT "Generating coverage XML report" VERBATIM) ADD_CUSTOM_TARGET(coverage-xml DEPENDS ${COVERAGE_XML_FILE}) ENDIF() # provide a global coverage target executing both steps if available SET(GLOBAL_DEPENDS "") IF(LCOV_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() IF(GCOVR_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_XML_FILE}) ENDIF() IF(LCOV_FOUND OR GCOVR_FOUND) ADD_CUSTOM_TARGET(coverage DEPENDS ${GLOBAL_DEPENDS}) ENDIF() ENDIF() ENDFUNCTION() notes-app-1.4+14.04.20140415/cmake/Findgcovr.cmake0000644000015301777760000000170212323260622021663 0ustar pbusernogroup00000000000000# - Find gcovr scrip # Will define: # # GCOVR_EXECUTABLE - the gcovr script # # Uses: # # GCOVR_ROOT - root to search for the script # # Copyright (C) 2011 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(GCOVR_EXECUTABLE gcovr HINTS ${GCOVR_ROOT} "${GCOVR_ROOT}/bin") FIND_PACKAGE_HANDLE_STANDARD_ARGS(gcovr DEFAULT_MSG GCOVR_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(GCOVR_EXECUTABLE) notes-app-1.4+14.04.20140415/cmake/ParseArguments.cmake0000644000015301777760000000340612323260622022705 0ustar pbusernogroup00000000000000# Parse arguments passed to a function into several lists separated by # upper-case identifiers and options that do not have an associated list e.g.: # # SET(arguments # hello OPTION3 world # LIST3 foo bar # OPTION2 # LIST1 fuz baz # ) # PARSE_ARGUMENTS(ARG "LIST1;LIST2;LIST3" "OPTION1;OPTION2;OPTION3" ${arguments}) # # results in 7 distinct variables: # * ARG_DEFAULT_ARGS: hello;world # * ARG_LIST1: fuz;baz # * ARG_LIST2: # * ARG_LIST3: foo;bar # * ARG_OPTION1: FALSE # * ARG_OPTION2: TRUE # * ARG_OPTION3: TRUE # # taken from http://www.cmake.org/Wiki/CMakeMacroParseArguments MACRO(PARSE_ARGUMENTS prefix arg_names option_names) SET(DEFAULT_ARGS) FOREACH(arg_name ${arg_names}) SET(${prefix}_${arg_name}) ENDFOREACH(arg_name) FOREACH(option ${option_names}) SET(${prefix}_${option} FALSE) ENDFOREACH(option) SET(current_arg_name DEFAULT_ARGS) SET(current_arg_list) FOREACH(arg ${ARGN}) SET(larg_names ${arg_names}) LIST(FIND larg_names "${arg}" is_arg_name) IF (is_arg_name GREATER -1) SET(${prefix}_${current_arg_name} ${current_arg_list}) SET(current_arg_name ${arg}) SET(current_arg_list) ELSE (is_arg_name GREATER -1) SET(loption_names ${option_names}) LIST(FIND loption_names "${arg}" is_option) IF (is_option GREATER -1) SET(${prefix}_${arg} TRUE) ELSE (is_option GREATER -1) SET(current_arg_list ${current_arg_list} ${arg}) ENDIF (is_option GREATER -1) ENDIF (is_arg_name GREATER -1) ENDFOREACH(arg) SET(${prefix}_${current_arg_name} ${current_arg_list}) ENDMACRO(PARSE_ARGUMENTS) notes-app-1.4+14.04.20140415/tests/0000755000015301777760000000000012323261122017016 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/tests/autopilot/0000755000015301777760000000000012323261122021036 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/tests/autopilot/install_autopilot.sh0000755000015301777760000000032712323260622025151 0ustar pbusernogroup00000000000000#!/bin/bash PYDIR=`python -c 'from distutils.sysconfig import get_python_lib; print get_python_lib()'` CURDIR=$1 mkdir -p ${CURDIR}/debian/tmp${PYDIR} cp -r tests/autopilot/notes_app ${CURDIR}/debian/tmp${PYDIR} notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/0000755000015301777760000000000012323261122023026 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/0000755000015301777760000000000012323261122024170 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/test_delete.py0000644000015301777760000000617112323260622027054 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """Tests for Notes app""" from __future__ import absolute_import from testtools.matchers import Equals from autopilot.matchers import Eventually from notes_app.tests import NotesAppTestCase import sqlite3 class TestDelete(NotesAppTestCase): """Tests deleting notes""" def setUp(self): # Setup the database before starting the app self.setup_db() super(TestDelete, self).setUp() def setup_db(self): note_data = """{ "elements" : [ {"content":"This is a note.","type":"text"} ]}""" path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("DELETE FROM notes") cursor.execute("INSERT INTO notes (date, note) " "VALUES ('2013-04-07', '" + note_data + "')") conn.commit() conn.close() def test_slide_to_delete_right(self): note = self.main_window.get_notes()[0] listitem = self.main_window.get_note_listitem(note) listitem.swipe_to_delete('right') listitem.confirm_removal() self.assertThat( lambda: len(self.main_window.get_notes()), Eventually(Equals(0))) def test_slide_to_delete_left(self): note = self.main_window.get_notes()[0] listitem = self.main_window.get_note_listitem(note) listitem.swipe_to_delete('left') listitem.confirm_removal() self.assertThat( lambda: len(self.main_window.get_notes()), Eventually(Equals(0))) def test_slide_incomplete(self): note = self.main_window.get_notes()[0] # Verify that sliding the note just a little bit won't remove the note note_x, note_y, note_w, note_h = note.globalRect self.pointing_device.move(note_x + note_w / 2, note_y + note_h / 2) self.pointing_device.press() self.pointing_device.move( note_x + note_w / 2 + 10, note_y + note_h / 2) self.pointing_device.release() self.main_window.get_note_listitem(note).swipingState.wait_for("") self.assertThat( lambda: len(self.main_window.get_notes()), Eventually(Equals(1))) def test_slide_and_put_back(self): note = self.main_window.get_notes()[0] # Verify that sliding the note all the way and then putting it back # where it was will not delete it note_x, note_y, note_w, note_h = note.globalRect self.pointing_device.move(note_x + note_w / 2, note_y + note_h / 2) self.pointing_device.press() self.pointing_device.move(note_x, note_y + note_h / 2) self.pointing_device.move(note_x + note_w / 2, note_y + note_h / 2) self.pointing_device.release() self.main_window.get_note_listitem(note).swipingState.wait_for("") self.assertThat( lambda: len(self.main_window.get_notes()), Eventually(Equals(1))) notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/test_images.py0000644000015301777760000000433212323260622027054 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """Tests for Notes app""" from __future__ import absolute_import from testtools.matchers import Equals from autopilot.matchers import Eventually from notes_app.tests import NotesTestCaseBaseWithHTTPServer import sqlite3 class BaseForTestImages(NotesTestCaseBaseWithHTTPServer): def setUp(self): self.start_server() self.setup_db(self.IMAGE) super(BaseForTestImages, self).setUp() def setup_db(self, image): note_data = '{"elements": [{"content":"%s/%s","type":"image"}]}' % \ (self.base_url, image) path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("DELETE FROM notes") cursor.execute("INSERT INTO notes (date, note) " "VALUES ('2013-04-07', '" + note_data + "')") conn.commit() conn.close() def verify_loader_item(self, loader, obj_type): self.assertThat(loader.progress, Eventually(Equals(1))) children = loader.get_children_by_type(obj_type) self.assertThat(len(children), Equals(1)) return children[0] class MixinForTestImage(object): def test_no_crash(self): note = self.main_window.get_notes()[0] # Expand the note self.pointing_device.click_object(note) note.height.wait_for(note.actualExpandedHeight) # Verify that the note we inserted has the right parts parts = self.main_window.get_note_parts(note) self.assertThat(len(parts), Equals(1)) self.verify_loader_item(parts[0], "ImageDelegate") class TestImageLargeWide(BaseForTestImages, MixinForTestImage): IMAGE = "large_wide.png" class TestImageSmallWide(BaseForTestImages, MixinForTestImage): IMAGE = "small_wide.png" class TestImageLargeHigh(BaseForTestImages, MixinForTestImage): IMAGE = "large_high.png" class TestImageSmallHigh(BaseForTestImages, MixinForTestImage): IMAGE = "small_high.png" notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/imagedata.py0000644000015301777760000001236512323260622026471 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. IMAGE_DATA = """ /9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAGRFS1hLP2RYUVhx amR3lvqjloqKlv/b57X6////////////////////////////////////////////////////wgAL CAD6ASkBAREA/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECA//aAAgBAQAAAAGgAABCAA0AAAJmgANA AAEw0AA0AAAmctgANAAAM5zbaADQAAJJmWrQA0AAEkkQttANAADKSIC6oDQACZSyW1MxdUDQAEzL Zcy6pjK6oNAAmSq5rqrnEuqDQASSrpxhu1c82rQ0LAkStXHOrN1XKW2jQAhDblktbVjC200WAlkX c54sq6tOJq00URLSKzzDV0s4mlrQZo1pBEkRbTitNNM5KrpjDXREJIts5yq00kkVcxWuiRJEtZZt S3YJi6zLh06JIkgQUOgHLrc5uJvqkyiEssA6gcum5M3LqkzECEBeoLx30SZzrpGUkIJbIOwLjHck TUjNZELq5zDsA5b6BGYk1kgOlxlOwDOOnQiZkkpBDephegQuc73SYkgCEu2K6BBZz31JysM0shFS 62IC8873qYSFiWAQ7CAXnlW4lIQAOpAJWJNaIIsgA6wBCs52skUSAE//xAAfEAABAwUBAQEAAAAA AAAAAAABABFAAhAgMFBgQYD/2gAIAQEAAQUC/JLcE5mcfEix1mWcShiZZxKExsW1GcyaWak9nlsm 1ieLnhi5Q4VOf2dTiyZCcZAgAyTsNhGG9rA8U2BkvsIs6fiHyIi//8QAFBABAAAAAAAAAAAAAAAA AAAAoP/aAAgBAQAGPwIYH//EACAQAAICAgMBAQEBAAAAAAAAAAABEBEgMSEwQEFRUGD/2gAIAQEA AT8h/uN/xWNi/iOF/Dcr/DX02WX6rh40Vgi/Q30UUMNelvKhKzSV5HKlIahu4rFjhedFWUNjdubE 8WhwvSebOGay28/zDeHC3DTFZXsrMa4wXhoqFS1aG03Kw0yWdll4LqqSsn1tll5I/AsW/wBF++9j hdFSVP2LcbOEcD81h96LLL5NlZXm0M5DR9gtStrD6fkvJvvcajKFOSKqFxWL33X1PUaSzXJaZwhc 4mvR8HsbFiwlYaLGuuiutCi2LGsNlxY10XJrsfI+meN9KdChOxIfJjfe8PXa7GnDeL33rgvvS8pj 3DPg+24sp2UQnQloT4Gz7PyX6tic+GvLsaKj4LUfnQ/S4+SY+lT9y//aAAgBAQAAABD/AP8A/wAg A/8A/wD3gA//AP8AbwA//wD7zwD/AP8A4twD/wD+3bAP/wDzXPA//wAv4OD/APtP44P/AOprXw// APsBJz//AEOpLPf13iTz/g7i4+76Qz+JuFotlGb0QUQ6EkRfYEFOA/h30b45KClg/HbK2R/7irYn 79QEAyP4K+oTN/GYYbCnwg913y91iIgT/eAw8GXuGH6qHzB64LEBgrAGYBwdg83h/8QAJhAAAwAC AgEEAgMBAQAAAAAAAAERECExQVEgQGFxMIFQkaHw8f/aAAgBAQABPxD27f8ACwE6/wCEaYm3/Btw ajZzL/AtjUbGchMTL76jY2PCRSiZfd0Yo2PDLilCKr3LY6OxhnY/g2yht6Ggvbm5hRujx2JbEleC KQbKdo1MJwT9sNvsZtRDUJRb7RRRMTExMeyEMIcvs28D5GJW2fLRN/ZNuiV+RjViQgs9CVCR40EL 2LeFyxbR5CpsWn0QVN10cGxMi5fQt7Ejw2E/ztm+R9HcOKxaXgQbNUwkltmvRoHXE6hCw1orlhPY mJi/K+CXDUZwqzsjlyaFxfAziFyNXhgmkMELPZ1lsK/lolSD4GcCmqJ6wvYtMa7wu6NdHAQhYU2u UMJi/DUUbEqRzQlR9iP0bL6PmJJLCpCDE2irwPwErtiwWavEEtiOBvVUhqbCFKJ/2IxKDxvLGNDS QaEJF/8AISaEJ5appcj5whMoufQxqKYwmVKFKJxjqWktbMbe2JfYe2kn7FGqmMmZrXBEODb5uhtk +RN/YnoTqHqiWxY8bZTgvQ0Y/EbjZCR0LcDUT8lNXQ1BVouCchtwxyph4uyE+Bj8nfgf9eRMVW6L yNXtaL3/APBvuNhaxrCcI9TVwNGLW8SQSOGtj26Jxj7MMZ5+UWMeUWr7OFGyTgpXRLyxlEmt47E8 onrTQ+REEHsVVQtUPgZ2bPhhlnQ+RtC7Hy0WiUOxnA1e5+xGilKhClL6+cYwY0IOvHBGQHh4wx7G izpzR55ess42Nl9H3+GVhYyIOYaGhoW9rRs2UI6LSp6emNtvKErcZ3IZRE5wi+TkjEm+huhslfR+ /wADdR4HqHiEHAlsZdjfb9MfRnyLp0+DwDPlHh9jxyVYQ+CDmNTk28X1piRsSMhpidxCEIM0v9Fa Kmh1DcYma+ZyLeuxQbheiX0UUaoYqXsv4kxLVS2cM8osQhBBCe/o7GpwdDonC1/I0UmH6NEfQy2x D4J+FM5iIyQ1GKvQ0RQ/9G9C2vg6naOaJYap16mqkuMvIoJUj/EmTVHDIaYnVcLBtiTBbVw/0jur sXgeOUPQ+cPP0V5wof5JMY16wgg1tyJdUq4hqsPgfJZD8j3PIkaRjOB1OobvGaa9imaQllXORWrY uNODe38j4o9oa0ocpMaqLh8elLjr2CcHoMT4HphrQcTa+h6TfIlvZufRxofBBYSbKTRCPoXskM4n Z3OCFy/2cF9o748DFyxc4Z2cDsQ8nn//2Q==""" IMAGE_LARGE_WIDE = """ iVBORw0KGgoAAAANSUhEUgAAAlgAAABkCAIAAADVI9l0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA B3RJTUUH3QUBFxUAPPQepQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAFT SURBVHja7dWhAQAgDANByv47pxNUVSC4GyEiX4edmAB4p0yw/PDkWgGAnwkhAEIIAEIIAEIIAEII AEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEII AEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEII AEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIAEIIgBACgBACgBACgBACgBACgBACgBACgBACgBACgBAC gBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBAC gBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACgBACwKwBzXUE xYI3t3YAAAAASUVORK5CYII=""" IMAGE_SMALL_WIDE = """ iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAIAAABnvaqVAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA B3RJTUUH3QUBFyA5wcBUGwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAx SURBVDjLY2DAC5IYGH4wMPynI/rKwOCF10mysrJMDEMQjDp61NGjjh519KijBzcAAPuuJt8P+yQh AAAAAElFTkSuQmCC""" IMAGE_LARGE_HIGH = """ iVBORw0KGgoAAAANSUhEUgAAAGQAAAJYCAIAAAAbp9T8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA B3RJTUUH3QUBFxUfsfwTUAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAJY SURBVHja7dAxEQAACAQgtX/nt4KzBxGoAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHip 4+BsFMiSJUuWLFkKZMmSJUuWLAWyZMmSJUuWAlmyZMmSJUuBLFmyZMmSpUCWLFmyZMlSIEuWLFmy ZCmQJUuWLFmyFMiSJUuWLFkKZMmSJUuWLAWyZMmSJUuWAlmyZMmSJUuBLFmyZMmSpUCWLFmyZMlS IEuWLFmyZCmQJUuWLFmyFMiSJUuWLFkKZMmSJUuWLAWyZMmSJUuWAlmyZMmSJUuBLFmyZMmSpUCW LFmyZMlSIEuWLFmyZCmQJUuWLFmyFMiSJUuWLFkKZMmSJUuWLAWyZMmSJUuWAlmyZMmSJUuBLFmy ZMmSpUCWLFmyZMlSIEuWLFmyZCmQJUuWLFmyFMiSJUuWLFkKZMmSJUuWLAWyZMmSJUuWAlmyZMmS JUuBLFmyZMmSpUCWLFmyZMlSIEuWLFmyZCmQJUuWLFmyFMiSJUuWLFkKZMmSJUuWLAWyZMmSJUuW AlmyZMmSJUuBLFmyZMmSpUCWLFmyZMlSIEuWLFmyZCmQJUuWLFmyFMiSJUuWLFkKZMmSJUuWLAWy ZMmSJUuWAlmyZMmSJUuBLFmyZMmSpUCWLFmyZMlSIEuWLFmyZCmQJUuWLFmyFMiSJUuWLFkKZMmS JUuWLAWyZMmSJUuWAlmyZMmSJUuBLFmyZMmSpUCWLFmyZMlSIEuWLFmyZCmQJUuWLFkAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/NRJLBwtQBcG/0CGxscAAAAASUVORK5CYII=""" IMAGE_SMALL_HIGH = """ iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAIAAADQc7xaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA B3RJTUUH3QUBFzYHHDn8ZwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAA1 SURBVDjLY2AYBaQDxiT80j/wS//HK83EMCo9Kj0qPSpNhjTLN/xFj9do4U1GcS8rK4tHGgDI8QRA YhsoowAAAABJRU5ErkJggg==""" notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/__init__.py0000644000015301777760000001705612323260622026316 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2012-2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """notes-app autopilot tests.""" import base64 import BaseHTTPServer import errno import glob import md5 import os import os.path import socket import threading from autopilot.input import Mouse, Touch, Pointer from autopilot.matchers import Eventually from autopilot.platform import model from autopilot.testcase import AutopilotTestCase from testtools.matchers import Equals from ubuntuuitoolkit.emulators import UbuntuUIToolkitEmulatorBase from notes_app.emulators.notesapp import NotesApp import imagedata class NotesAppTestCase(AutopilotTestCase): """A common test case class that provides several useful methods for notes app tests.""" TYPING_DELAY = 0.02 if model() == 'Desktop': scenarios = [('with mouse', dict(input_device_class=Mouse))] else: scenarios = [('with touch', dict(input_device_class=Touch))] local_location = "../../NotesApp.qml" def setUp(self): self.pointing_device = Pointer(self.input_device_class.create()) super(NotesAppTestCase, self).setUp() self.launch_app() self.main_window.visible.wait_for(True) self.main_window.close_toolbar() """Workaround to find the qmlscene binary via shell globbing. This is needed since we can't rely on qt5-default being installed on devices to make qmlscene available in the path""" def qmlscene(self): return glob.glob("/usr/lib/*/qt5/bin/qmlscene")[0] def launch_app(self): if os.path.exists(self.local_location): self.launch_app_local() elif os.path.exists('/usr/share/notes-app/NotesApp.qml'): self.launch_app_installed() else: self.launch_click_installed() def launch_app_local(self): self.app = self.launch_test_application( self.qmlscene(), "-I", "../../src", "../../NotesApp.qml", emulator_base=UbuntuUIToolkitEmulatorBase) def launch_app_installed(self): self.app = self.launch_test_application( self.qmlscene(), "/usr/share/notes-app/NotesApp.qml", "--desktop_file_hint=/usr/share/applications/notes-app.desktop", app_type='qt', emulator_base=UbuntuUIToolkitEmulatorBase) def launch_click_installed(self): self.app = self.launch_click_package( "com.ubuntu.notes", emulator_base=UbuntuUIToolkitEmulatorBase) def launch_and_quit_app(self): self.launch_app() self.main_window.visible.wait_for(True) # When calling launch_app an instance of the spawned process # control object will be stored in self.app.process, and a cleanup # handler will be registered that essentially kills the process. # Therefore, by triggering the cleanup handler here we're killing the # process and removing the handler, which allows a clean launch of # the process during regular test setup. self.doCleanups() def ensure_db(self): path = os.path.expanduser("~/.local/share/com.ubuntu.notes/Databases") db = os.path.join(path, md5.md5("notes").hexdigest() + ".sqlite") if not os.path.exists(db): self.launch_and_quit_app() self.assertTrue(os.path.exists(db)) return db def assert_osk_eventually_shown(self): if model() != 'Desktop': keyboardRectangle = self.main_window.get_keyboard_rectangle() self.assertThat(keyboardRectangle.state, Eventually(Equals("shown"))) def assert_osk_eventually_hidden(self): if model() != 'Desktop': keyboardRectangle = self.main_window.get_keyboard_rectangle() self.assertThat(keyboardRectangle.state, Eventually(Equals("hidden"))) @property def main_window(self): return self.app.select_single(NotesApp) def assert_note_eventually_expanded(self, note): # To properly ensure a note is expanded we have to wait for the # height to equal actualExpandedHeight because that is the point # when the expanding animation is finished and the note reaches # its final expanded geometry. # Just testing for isExpanded does not work as the property # changes immediately and then the animation is triggered. # This applies as well for collapsing the note. note.height.wait_for(note.actualExpandedHeight) self.assertThat(note.isExpanded, Eventually(Equals(True))) def assert_note_eventually_collapsed(self, note): note.height.wait_for(note.collapsedHeight) self.assertThat(note.isExpanded, Eventually(Equals(False))) class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): """ A custom HTTP request handler that serves GET resources. """ def send_image(self, data): self.send_header("Content-Type", "image/png") self.end_headers() self.wfile.write(data) def do_GET(self): if self.path == "/image.png": self.send_response(200) self.send_image(base64.b64decode(imagedata.IMAGE_DATA)) elif self.path == "/large_wide.png": self.send_response(200) self.send_image(base64.b64decode(imagedata.IMAGE_LARGE_WIDE)) elif self.path == "/small_wide.png": self.send_response(200) self.send_image(base64.b64decode(imagedata.IMAGE_SMALL_WIDE)) elif self.path == "/large_high.png": self.send_response(200) self.send_image(base64.b64decode(imagedata.IMAGE_LARGE_HIGH)) elif self.path == "/small_high.png": self.send_response(200) self.send_image(base64.b64decode(imagedata.IMAGE_SMALL_HIGH)) else: self.send_error(404) class HTTPServerInAThread(threading.Thread): """ A simple custom HTTP server run in a separate thread. """ def __init__(self): super(HTTPServerInAThread, self).__init__() port = 12345 self.server = None while (self.server is None) and (port < 12350): try: self.server = BaseHTTPServer.HTTPServer(("", port), HTTPRequestHandler) except socket.error as error: if (error.errno == errno.EADDRINUSE): print "Port %d is already in use" % port port += 1 else: print os.strerror(error.errno) raise if self.server is None: raise SystemError("Unable to start local HTTP server") self.server.allow_reuse_address = True @property def port(self): return self.server.server_port def run(self): print "now serving on port %d" % self.port self.server.serve_forever() def shutdown(self): self.server.shutdown() self.server.server_close() class NotesTestCaseBaseWithHTTPServer(NotesAppTestCase): """ A specialization of the common test case class that runs a simple custom HTTP server in a separate thread. """ def start_server(self): self.server = HTTPServerInAThread() self.server.start() self.addCleanup(self.server.shutdown) self.base_url = "http://localhost:%d" % self.server.port notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/test_quit.py0000644000015301777760000001011012323260622026560 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """Tests for Notes app""" from __future__ import absolute_import from autopilot.platform import model from notes_app.tests import NotesAppTestCase import sqlite3 import json import unittest class UtilsMixin(object): def focus_note_for_editing(self, index): notes = self.main_window.get_notes() note = notes[index] self.pointing_device.click_object(note) # wait for note to expand note.height.wait_for(note.actualExpandedHeight) # click outside of the text area note_x, note_y, note_w, note_h = note.globalRect self.pointing_device.move(note_x + note_w / 2, note_y + note_h - 1) self.pointing_device.click() return note def assert_app_has_quit(self): self.app.process.poll() self.assertIsNotNone(self.app.process.returncode) class TestQuit(NotesAppTestCase, UtilsMixin): """Tests save on quit""" """ This is needed to wait for the application to start. In the testfarm, the application may take some time to show up.""" def setUp(self): # Setup the database before starting the app self.setup_db() super(TestQuit, self).setUp() def setup_db(self): note_data = """{ "elements" : [ {"content":"foobar","type":"text"} ]}""" path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("DELETE FROM notes") cursor.execute("INSERT INTO notes (date, note) " "VALUES ('2013-04-07', '" + note_data + "')") conn.commit() conn.close() @unittest.skipUnless(model() == "Desktop", "Alt+F4 to close apps only works on desktop") def test_save_before_quit(self): # Verify that after typing something in the note and quitting will save # the note to db self.focus_note_for_editing(0) self.keyboard.type("xxx", delay=self.TYPING_DELAY) self.keyboard.press_and_release("Alt+F4") self.assert_app_has_quit() path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("SELECT note FROM NOTES") result = cursor.fetchone() self.assertEquals(len(result), 1) data = json.loads(result[0]) self.assertEquals(len(data["elements"]), 1) self.assertEquals(data["elements"][0]["content"], "foobarxxx") class TestQuitNoNote(NotesAppTestCase, UtilsMixin): """Tests save on quit with no notes""" """ This is needed to wait for the application to start. In the testfarm, the application may take some time to show up.""" def setUp(self): # Setup the database before starting the app self.setup_db() super(TestQuitNoNote, self).setUp() def setup_db(self): path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("DELETE FROM notes") conn.commit() conn.close() @unittest.skipUnless(model() == "Desktop", "Alt+F4 to close apps only works on desktop") def test_save_before_quit(self): # Verify that after typing something in the note and quitting will # save the note to db self.focus_note_for_editing(0) self.keyboard.type("xxx", delay=self.TYPING_DELAY) self.keyboard.press_and_release("Alt+F4") self.assert_app_has_quit() path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("SELECT note FROM NOTES") result = cursor.fetchone() self.assertEquals(len(result), 1) data = json.loads(result[0]) self.assertEquals(len(data["elements"]), 1) self.assertEquals(data["elements"][0]["content"], "xxx") notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/test_expand_collapse.py0000644000015301777760000000730312323260622030751 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """Tests for Notes app""" from __future__ import absolute_import from testtools.matchers import Equals from autopilot.matchers import Eventually from notes_app.tests import NotesAppTestCase import sqlite3 class TestExpandCollapse(NotesAppTestCase): """Tests deleting notes""" def setUp(self): # Setup the database before starting the app self.setup_db() super(TestExpandCollapse, self).setUp() def setup_db(self): notes = [ """{ "elements" : [ {"content":"This is a note.","type":"text"} ]}""", """{ "elements" : [ {"content":"This is another note.","type":"text"} ]}""" ] path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("DELETE FROM notes") for note in notes: cursor.execute("INSERT INTO notes (date, note) " "VALUES ('2013-04-07', '" + note + "')") conn.commit() conn.close() def test_expand_and_collapse_many(self): notes = self.main_window.get_notes() first = notes[0] second = notes[1] self.assert_note_eventually_collapsed(first) self.assert_note_eventually_collapsed(second) self.pointing_device.click_object(first) self.assert_note_eventually_expanded(first) self.pointing_device.click_object(second) self.assert_note_eventually_collapsed(first) self.assert_note_eventually_expanded(second) self.pointing_device.click_object(first) self.assert_note_eventually_expanded(first) self.assert_note_eventually_collapsed(second) def test_collapse_header(self): # Skipping the test for now because in order to release qt5.2 we want # to match the results as much as possible to what we get in the # current image. As the notes app is going to be deprecated, and this # bug has a low impact on the user experience, it's not critical and # won't be fixed before the qt5.2 release. -- elopio - 2014-03-14 self.skipTest('The test is failing because of bug #1288876') first = self.main_window.get_notes()[0] header = self.main_window.get_header() self.pointing_device.click_object(first) self.assert_note_eventually_expanded(first) self.pointing_device.click_object(header) self.assert_note_eventually_collapsed(first) def test_collapse_bottom(self): notes = self.main_window.get_notes() first = notes[0] second = notes[1] self.pointing_device.click_object(first) self.assert_note_eventually_expanded(first) # click in the empty space after all the notes note_x, note_y, note_w, note_h = second.globalRect self.pointing_device.move(note_x + note_w / 2, note_y + note_h + 20) self.pointing_device.click() self.assert_note_eventually_collapsed(first) def test_collapse_between(self): first = self.main_window.get_notes()[0] self.pointing_device.click_object(first) self.assert_note_eventually_expanded(first) # click in the empty space between notes note_x, note_y, note_w, note_h = first.globalRect self.pointing_device.move(note_x + note_w / 2, note_y + note_h + 2) self.pointing_device.click() self.assert_note_eventually_collapsed(first) notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/test_create.py0000644000015301777760000001203712323260622027053 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """Tests for Notes app""" from __future__ import absolute_import from testtools.matchers import Equals from autopilot.matchers import Eventually from autopilot.introspection import dbus from notes_app.tests import NotesAppTestCase import os class TestCreate(NotesAppTestCase): """Tests creating notes""" """ This is needed to wait for the application to start. In the testfarm, the application may take some time to show up.""" def setUp(self): # Clean up the database before starting up the app, or it will read # the old one self.clean_db() super(TestCreate, self).setUp() def clean_db(self): path = self.ensure_db() try: os.remove(path) except OSError: pass def focus_note_for_editing(self, index): notes = self.main_window.get_notes() note = notes[index] self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) self.pointing_device.click() return note def ensure_one_collapsed_note(self): note = self.focus_note_for_editing(0) self.keyboard.type("Hello", delay=self.TYPING_DELAY) self._collapse_note(note) def _collapse_note(self, note): """Collapse a note by clicking outside of it.""" x, y, width, height = note.globalRect self.pointing_device.move(x + width // 2, y + height + 20) self.pointing_device.click() try: self.assert_note_eventually_collapsed(note) except dbus.StateNotFoundError: # The note doesn't have text so it's deleted. pass def test_note_expand_and_unexpand(self): notes = self.main_window.get_notes() # When starting with no database there should be one empty note there self.assertThat(len(notes), Equals(1)) note = notes[0] # Clicking on a note should expand it self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) # Clicking outside of the note should unexpand it, and this should # cause it to be deleted self._collapse_note(note) self.assertThat( lambda: len(self.main_window.get_notes()), Eventually(Equals(0))) def test_note_focus_on_second_click_outside(self): notes = self.main_window.get_notes() self.ensure_one_collapsed_note() self.assertThat(len(notes), Equals(1)) note = notes[0] # Clicking on a note should expand it but it should not be focused self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) content = self.main_window.get_note_content(note) self.assertThat(content.activeFocus, Equals(False)) # Now click on it the note outside of the content area and verify # that the content area still gets focus content_x, content_y, content_w, content_h = content.globalRect note_x, note_y, note_w, note_h = note.globalRect self.pointing_device.move( note_x + note_w / 2, note_y + content_h + ((note_h - content_h) / 2)) self.pointing_device.click() self.assertThat(content.activeFocus, Eventually(Equals(True))) def test_note_focus_on_second_click_inside(self): notes = self.main_window.get_notes() self.ensure_one_collapsed_note() self.assertThat(len(notes), Equals(1)) note = notes[0] # Clicking on a note should expand it but it should not be focused self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) content = self.main_window.get_note_content(note) self.assertThat(content.activeFocus, Equals(False)) # Now click on it the note inside the content area and verify it # focuses content_x, content_y, content_w, content_h = content.globalRect self.pointing_device.move( content_x + content_w / 2, content_y + content_h / 2) self.pointing_device.click() self.assertThat(content.activeFocus, Eventually(Equals(True))) def test_note_unfocused_when_collapsed(self): note = self.focus_note_for_editing(0) # Type something so that the note doesn't get deleted then collapse it. self.keyboard.type("Hello", delay=self.TYPING_DELAY) self._collapse_note(note) content = self.main_window.get_note_content(note) self.assertThat(content.activeFocus, Equals(False)) def test_note_focused_when_empty(self): notes = self.main_window.get_notes() note = notes[0] self.pointing_device.click_object(note) content = self.main_window.get_note_content(note) self.assertThat(content.activeFocus, Eventually(Equals(True))) notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/tests/test_parts.py0000644000015301777760000001541112323260622026740 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """Tests for Notes app""" from __future__ import absolute_import from testtools.matchers import Equals from autopilot.matchers import Eventually from autopilot.platform import model from notes_app.tests import NotesTestCaseBaseWithHTTPServer import sqlite3 class TestFocus(NotesTestCaseBaseWithHTTPServer): """Tests focusing notes""" """ This is needed to wait for the application to start. In the testfarm, the application may take some time to show up.""" def setUp(self): self.start_server() # Setup the database before starting the app self.setup_db() super(TestFocus, self).setUp() def setup_db(self): note_data = """{ "elements" : [ {"content":"foobar","type":"text"}, {"content":"%s/image.png","type":"image"} ]}""" % self.base_url path = self.ensure_db() conn = sqlite3.connect(path) cursor = conn.cursor() cursor.execute("DELETE FROM notes") cursor.execute("INSERT INTO notes (date, note) " "VALUES ('2013-04-07', '" + note_data + "')") conn.commit() conn.close() def get_loader_item(self, loader, obj_type): self.assertThat(loader.progress, Eventually(Equals(1))) children = loader.get_children_by_type(obj_type) self.assertThat(len(children), Equals(1)) return children[0] def _collapse_note(self, note): """Collapse a note by clicking outside of it.""" x, y, width, height = note.globalRect self.pointing_device.move(x + width // 2, y + height + 20) self.pointing_device.click() self.assert_note_eventually_collapsed(note) def test_parts_focus(self): note = self.main_window.get_notes()[0] # Expand the note self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) # Verify that the note we inserted has the right parts parts = self.main_window.get_note_parts(note) self.assertThat(len(parts), Equals(2)) text = self.get_loader_item(parts[0], "TextDelegate") image = self.get_loader_item(parts[1], "ImageDelegate") # Clicking on the upper half of the image should focus the first # text area part_x, part_y, part_w, part_h = image.globalRect self.pointing_device.move(part_x + part_w / 2, part_y + 1) self.pointing_device.click() self.assert_osk_eventually_shown() self.assertThat(text.activeFocus, Eventually(Equals(True))) # Clicking on the lower half of the image should create a new text # area below the image and focus it self.pointing_device.move(part_x + part_w / 2, part_y + part_h - 1) self.pointing_device.click() self.assert_osk_eventually_hidden() # On the phone input focus is lost when the OSK appears so # we click the input box to gain focus again. LP: #1204084 if model() != 'Desktop': self.pointing_device.click() self.assertThat(text.activeFocus, Eventually(Equals(False))) parts = self.main_window.get_note_parts(note) self.assertThat(len(parts), Equals(3)) new_text = self.get_loader_item(parts[2], "TextDelegate") self.assertThat(new_text.activeFocus, Eventually(Equals(True))) def test_parts_delete_when_empty(self): note = self.main_window.get_notes()[0] # Expand the note self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) # Click on the lower half of the image to create the new text part parts = self.main_window.get_note_parts(note) image = self.get_loader_item(parts[1], "ImageDelegate") part_x, part_y, part_w, part_h = image.globalRect self.pointing_device.move(part_x + part_w / 2, part_y + part_h - 1) self.pointing_device.click() self.assertThat( lambda: len(self.main_window.get_note_parts(note)), Eventually(Equals(3))) self.assert_osk_eventually_shown() # Now verify that clicking on the upper part of the image will cause # the new text to be deleted because it was empty empty_part = self.main_window.get_note_parts(note)[-1] self.pointing_device.move(part_x + part_w / 2, part_y + 1) self.pointing_device.click() empty_part.wait_until_destroyed() def test_parts_delete_empty_header(self): note = self.main_window.get_notes()[0] # Expand the note self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) # Click on the lower half of the image to create the new text part parts = self.main_window.get_note_parts(note) image = self.get_loader_item(parts[1], "ImageDelegate") part_x, part_y, part_w, part_h = image.globalRect self.pointing_device.move(part_x + part_w / 2, part_y + part_h - 1) self.pointing_device.click() self.assertThat( lambda: len(self.main_window.get_note_parts(note)), Eventually(Equals(3))) self.assert_osk_eventually_shown() # Now verify that clicking outside of a note (thus collapsing the # expanded note) will still cause the new part to disappear empty_part = self.main_window.get_note_parts(note)[-1] self._collapse_note(note) self.assert_note_eventually_collapsed(note) empty_part.wait_until_destroyed() def test_parts_no_delete_with_text(self): note = self.main_window.get_notes()[0] # Expand the note self.pointing_device.click_object(note) self.assert_note_eventually_expanded(note) # Click on the lower half of the image to create the new text part parts = self.main_window.get_note_parts(note) image = self.get_loader_item(parts[1], "ImageDelegate") part_x, part_y, part_w, part_h = image.globalRect self.pointing_device.move(part_x + part_w / 2, part_y + part_h - 1) self.pointing_device.click() self.assertThat( lambda: len(self.main_window.get_note_parts(note)), Eventually(Equals(3))) # Verify that after typing something in the note will cause it to stay # when unfocusing self.keyboard.type("Some text", delay=self.TYPING_DELAY) self._collapse_note(note) self.assert_note_eventually_collapsed(note) self.assertThat( lambda: len(self.main_window.get_note_parts(note)), Eventually(Equals(3))) notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/__init__.py0000644000015301777760000000054512323260622025147 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2012 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """notes app autopilot tests and emulators - top level package.""" notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/emulators/0000755000015301777760000000000012323261122025041 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/emulators/__init__.py0000644000015301777760000000044112323260622027155 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2012 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. notes-app-1.4+14.04.20140415/tests/autopilot/notes_app/emulators/notesapp.py0000644000015301777760000000226312323260622027253 0ustar pbusernogroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2012-2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. from ubuntuuitoolkit import emulators as uitk class NotesApp(uitk.MainView): """An emulator class that makes it easy to interact with the notes app.""" def get_notes(self): notes = self.select_many("NoteItem") notes.sort(key=lambda note: note.y) return notes def get_header(self): return self.select_single("Header") def get_note_content(self, note_item): return note_item.select_single("MixedEdit") def get_note_parts(self, note_item): edit = self.get_note_content(note_item) parts = edit.select_single( "QQuickColumn").get_children_by_type("QQuickLoader") parts.sort(key=lambda part: part.y) return parts def get_note_listitem(self, note_item): return note_item.select_single(uitk.Empty) def get_keyboard_rectangle(self): return self.select_single("KeyboardRectangle") notes-app-1.4+14.04.20140415/tests/autopilot/CMakeLists.txt0000644000015301777760000000052512323260622023604 0ustar pbusernogroup00000000000000set(AUTOPILOT_DIR notes_app) execute_process(COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_PACKAGE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) if(INSTALL_TESTS) install(DIRECTORY ${AUTOPILOT_DIR} DESTINATION ${PYTHON_PACKAGE_DIR} ) endif(INSTALL_TESTS) notes-app-1.4+14.04.20140415/tests/CMakeLists.txt0000644000015301777760000000007012323260622021557 0ustar pbusernogroup00000000000000add_subdirectory(autopilot) add_subdirectory(unittests) notes-app-1.4+14.04.20140415/tests/unittests/0000755000015301777760000000000012323261122021060 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/tests/unittests/image.h0000644000015301777760000000332412323260622022321 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __IMAGE_H__ #define __IMAGE_H__ #include const unsigned char image_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xde, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xdd, 0x05, 0x0e, 0x0f, 0x2a, 0x23, 0x8c, 0x1b, 0xa7, 0x75, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81, 0x0e, 0x17, 0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8, 0xff, 0xff, 0x3f, 0x00, 0x05, 0xfe, 0x02, 0xfe, 0xdc, 0xcc, 0x59, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; const unsigned int image_png_len = 146; const QSize image_png_size(1, 1); #endif // __IMAGE_H__ notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/0000755000015301777760000000000012323261122023016 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkRequest0000644000015301777760000000171312323260622026072 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef QNETWORKREQUEST #define QNETWORKREQUEST #include /** * This class is a mock class for * http://qt-project.org/doc/qt-5.0/qtnetwork/qnetworkrequest.html */ class QNetworkRequest { public: enum Attribute { RedirectionTargetAttribute }; QNetworkRequest(const QUrl& url = QUrl()); QUrl m_url; }; #endif notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkReply0000644000015301777760000000121512323260622025532 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "QNetworkReply.h" notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkAccessManager.cpp0000644000015301777760000000310212323260622027711 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "QNetworkRequest" #include "QNetworkReply" #include "QNetworkAccessManager" #include "image.h" QNetworkAccessManager::QNetworkAccessManager(QObject* parent) { } QNetworkReply* QNetworkAccessManager::get(QNetworkRequest request) { QNetworkReply* reply = new QNetworkReply(this); QString path = request.m_url.path(); if (path == "/image.png") { reply->setData(reinterpret_cast(image_png), image_png_len); } else if (path == "/redirect_loop.png") { reply->setRedirectUrl(QUrl("/redirect_loop.png")); } else if (path == "/redirect/1.png") { reply->setRedirectUrl(QUrl("/redirect/2.png")); } else if (path == "/redirect/2.png") { reply->setRedirectUrl(QUrl("/redirect/3.png")); } else if (path == "/redirect/3.png") { reply->setRedirectUrl(QUrl("/image.png")); } QNetworkAccessManager::log().append(path); return reply; } notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkReply.cpp0000644000015301777760000000353412323260622026321 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "QNetworkReply" QNetworkReply::QNetworkReply(QObject* parent) : m_error(QNetworkReply::NoError) { } QVariant QNetworkReply::attribute(QNetworkRequest::Attribute code) const { if (code == QNetworkRequest::RedirectionTargetAttribute) { return QVariant(m_redirectUrl); } else { return QVariant(); } } QNetworkReply::NetworkError QNetworkReply::error() const { return m_error; } QString QNetworkReply::errorString() const { return QString(); } void QNetworkReply::setRedirectUrl(QUrl url) { m_redirectUrl = url; } /* The original QNetworkReply would retrieve the data from the network * asynchronously and fire the "finished" signal when done. Here in the * mock class we try to fire it as soon as we know that something is * interested in getting it. */ void QNetworkReply::connectNotify(const QMetaMethod &signal) { if (signal == QMetaMethod::fromSignal(&QNetworkReply::finished)) { /* Emit the finished signal at the next iteration of the main loop. * If we try to emit it immediately it will not be received as when * this method is called the signal is not fully connected yet */ QTimer::singleShot(0, this, SIGNAL(finished())); } } notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkRequest.cpp0000644000015301777760000000132512323260622026652 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "QNetworkRequest" QNetworkRequest::QNetworkRequest(const QUrl& url) : m_url(url) { } notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkAccessManager.h0000644000015301777760000000207512323260622027366 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "QNetworkReply" /** * This class is a mock class for * http://qt-project.org/doc/qt-5.0/qtnetwork/qnetworkaccessmanager.html */ class QNetworkAccessManager : public QObject { Q_OBJECT public: QNetworkAccessManager(QObject* parent = 0); QNetworkReply* get(QNetworkRequest request); static QStringList& log() { static QStringList requestLog; return requestLog; } }; notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkReply.h0000644000015301777760000000261112323260622025761 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef QNETWORKREPLY #define QNETWORKREPLY #include #include #include #include #include #include "QNetworkRequest" /** * This class is a mock class for * http://qt-project.org/doc/qt-5.0/qtnetwork/qnetworkreply.html */ class QNetworkReply : public QBuffer { Q_OBJECT public: enum NetworkError { NoError, ConnectionRefusedError }; QNetworkReply(QObject* parent = 0); QVariant attribute(QNetworkRequest::Attribute code) const; NetworkError error() const; QString errorString() const; void setRedirectUrl(QUrl url); Q_SIGNALS: void finished(); protected: void connectNotify(const QMetaMethod &signal); private: NetworkError m_error; QUrl m_redirectUrl; }; #endif notes-app-1.4+14.04.20140415/tests/unittests/QtNetwork/QNetworkAccessManager0000644000015301777760000000122512323260622027134 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "QNetworkAccessManager.h" notes-app-1.4+14.04.20140415/tests/unittests/CMakeLists.txt0000644000015301777760000000142612323260622023627 0ustar pbusernogroup00000000000000set(CACHEIMGPROVIDER_SRC ${notes-app_SOURCE_DIR}/src/NotesApp/Plugins/cachingprovider.cpp tst_CachingProviderTests.cpp QtNetwork/QNetworkRequest.cpp QtNetwork/QNetworkReply.cpp QtNetwork/QNetworkAccessManager.cpp ) add_executable(tst_CachingProviderTests ${CACHEIMGPROVIDER_SRC} ${CACHEIMGPROVIDER_MOC_SRCS}) include_directories(${notes-app_SOURCE_DIR}/src/NotesApp/Plugins ${notes-app_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/QtNetwork) qt5_use_modules(tst_CachingProviderTests Core Test Quick) add_test(tst_CachingProviderTests ${CMAKE_CURRENT_BINARY_DIR}/tst_CachingProviderTests -xunitxml -o tst_CachingProviderTest.xml) set_tests_properties(tst_CachingProviderTests PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal") notes-app-1.4+14.04.20140415/tests/unittests/tst_CachingProviderTests.cpp0000644000015301777760000001236512323260622026563 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include "cachingprovider.h" #include "image.h" #define BASEURL "http://localhost:8888" class CachingProviderTests : public QObject { Q_OBJECT public: CachingProviderTests(QObject* parent = 0) { } private: QDir cache; private Q_SLOTS: void initTestCase() { cache = QDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); } void init() { QNetworkAccessManager::log().clear(); cache.removeRecursively(); cache.setFilter(QDir::NoDotAndDotDot | QDir::Files); } void shouldDownloadAndCache() { QString path("/image.png"); CachingProvider provider; QSize size; QImage image = provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); /* Verify that the image we get back is good and that the file was cached with the * correct hash for the URL we requested. */ QVERIFY(!image.isNull()); QCOMPARE(size, image_png_size); QCOMPARE(cache.entryList().count(), 1); QCOMPARE(cache.entryList().first(), QString("2c9fc02d059d33853dff5622ee332ab4.png")); QCOMPARE(QNetworkAccessManager::log().count(), 1); QCOMPARE(QNetworkAccessManager::log().first(), path); } void shouldRetrieveFromCache() { QString path("/image.png"); CachingProvider provider; QSize size; /* Verify that the second time we request the same image we get something valid back */ provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); QImage image = provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); QVERIFY(!image.isNull()); QCOMPARE(size, image_png_size); /* Verify that the server only received the first request (as the second one came * from the cache) and not two of them */ QCOMPARE(QNetworkAccessManager::log().count(), 1); QCOMPARE(QNetworkAccessManager::log().first(), path); } void shouldFollowRedirectsAndCache() { QString path("/redirect/1.png"); CachingProvider provider; QSize size; // Verify that we get a valid image back QImage image = provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); QVERIFY(!image.isNull()); QCOMPARE(size, image_png_size); QCOMPARE(QNetworkAccessManager::log().count(), 4); QCOMPARE(QNetworkAccessManager::log().first(), path); QCOMPARE(QNetworkAccessManager::log().last(), QString("/image.png")); QCOMPARE(cache.entryList().count(), 1); // Verify that the second time we request the same image it is fullfilled directly from // the cache and thus the server log doesn't change at all image = provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); QVERIFY(!image.isNull()); QCOMPARE(size, image_png_size); QCOMPARE(QNetworkAccessManager::log().count(), 4); QCOMPARE(QNetworkAccessManager::log().first(), path); QCOMPARE(QNetworkAccessManager::log().last(), QString("/image.png")); } void shouldFailOnRedirectLoop() { QString path("/redirect_loop.png"); CachingProvider provider; QSize size; QImage image = provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); QVERIFY(image.isNull()); QVERIFY(size.isNull()); QCOMPARE(cache.entryList().count(), 0); } void shouldDownloadOnCorrupt() { QString path("/image.png"); CachingProvider provider; QSize size; QImage image = provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); /* Corrupt the image in the cache so that it will fail to load at next request */ QFile cachedFile; cachedFile.setFileName(cache.absolutePath() + "/" + cache.entryList().first()); cachedFile.open(QFile::WriteOnly); cachedFile.write(QByteArray("corrupt")); cachedFile.close(); QNetworkAccessManager::log().clear(); /* Verify that the corrupt image will be downloaded and re-cached */ image = provider.requestImage(QString(BASEURL "%1").arg(path), &size, size); QVERIFY(!image.isNull()); QCOMPARE(size, image_png_size); QCOMPARE(QNetworkAccessManager::log().count(), 1); QCOMPARE(QNetworkAccessManager::log().first(), path); QCOMPARE(cache.entryList().first(), QString("2c9fc02d059d33853dff5622ee332ab4.png")); } }; QTEST_MAIN(CachingProviderTests) #include "tst_CachingProviderTests.moc" notes-app-1.4+14.04.20140415/notes-app.desktop.in0000644000015301777760000000043012323260622021563 0ustar pbusernogroup00000000000000[Desktop Entry] Type=Application Exec=@DESKTOP_EXEC@ Name=tr("Notes") GenericName=tr("Notes application for Ubuntu") Icon=notepad Terminal=false @DESKTOP_PATH@ X-Ubuntu-Touch=true X-Ubuntu-StageHint=SideStage X-Ubuntu-Gettext-Domain=com.ubuntu.notes X-Ubuntu-Single-Instance=true notes-app-1.4+14.04.20140415/Components/0000755000015301777760000000000012323261122020001 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/Components/CollapsedNoteDecorations.qml0000644000015301777760000000243712323260622025455 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import "Constants.js" as Const Item { property alias date: noteDate.text Image { id: bottomFade anchors { bottom: parent.bottom left: parent.left right: parent.right } height: units.gu(5) source: "graphics/note_bottom_fade.png" } Label { id: noteDate anchors { bottom: parent.bottom right: parent.right margins: units.gu(1) } fontSize: "x-small" color: "#c7af87" } Behavior on opacity { NumberAnimation { duration: Const.animationDuration } } } notes-app-1.4+14.04.20140415/Components/MixedEdit.qml0000644000015301777760000003631012323260622022377 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.Popups 0.1 FocusScope { id: edit property real contentHeight: childrenRect.height property bool dirty: false property alias model: mixedModel signal activated signal modelUpdated property TextArea activeTextArea: null property int activeTextAreaIndex: -1 clip: true function setData(data) { mixedModel.clear(); dataToModel(data); dirty = false; } function readData() { return modelToData() } onFocusChanged: { /* When losing focus reset the properties tracking the current item in the list to no selection */ if (!focus) setCurrentTextItem(-1); } Column { id: list clip: true anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top anchors.margins: units.gu(1.5) Repeater { model: ListModel { id: mixedModel ListElement { type: "text"; content: "" } } delegate: Loader { id: loader width: list.width property int itemIndex: index source: (index != -1) ? (type == "image" ? "ImageDelegate.qml" : "TextDelegate.qml") : "" focus: index === edit.activeTextAreaIndex Binding { target: item; property: "source"; value: content; when: type == "image" } Binding { target: item; property: "text"; value: content; when: type == "text" } Binding { target: item; property: "popover"; value: textAreaPopup; when: type == "text" } Binding { target: item; property: "focus"; value: loader.focus; when: type == "text" } Connections { target: item ignoreUnknownSignals: true onClicked: { edit.editAtIndex(index, atTop); edit.activated(); } onDeletePrevious: { syncItemToModel(item, index); var location = edit.deletePreviousImage(index); item.cursorPosition = location; } onActivateClipboard: edit.activateClipboard(type, item, index) onTextChanged: { // Save the text while it's changing because the user is typing // but not when it's changing because it's being set from a binding if (activeFocus) { syncItemToModel(item, index); edit.dirty = true; } } onFocusChanged: { if (type != "text") return; // When leaving a text area check if it's empty and remove it from // the model if it's not the only text area left if (!item.focus) { if (mixedModel.count > 1 && mixedModel.get(index).content.trim().length == 0) { mixedModel.remove(index); dirty = true; } } else { /* Keep the current item in sync when focus is switched immediately to this item as a result of the user clicking inside of it */ edit.setCurrentTextItem(itemIndex) } } } } } } function itemAtIndex(index) { for (var i = 0; i < list.children.length; i++) { var child = list.children[i]; if (child.itemIndex === index) return child; } return null; } // Start editing at index, or as close as possible. -1 means at the last item. // If index is an image, and there is not a text edit before or after // (depending on the value of insertBefore), then create a temporary one. function editAtIndex(index, insertBefore) { if (index === -1) index = mixedModel.count - 1; if (mixedModel.get(index).type === "image") { if (insertBefore) { if (index === 0) { mixedModel.insert(index, { "type": "text", "content": "" }); setCurrentTextItem(index); } else { if (mixedModel.get(index - 1).type === "image") { mixedModel.insert(index - 1, { "type": "text", "content": "" }); } // If we're editing the text before an image, the editing should // start at the last character before the image. var item = setCurrentTextItem(index - 1); item.item.cursorPosition = item.item.text.length; } } else { if (index === mixedModel.count - 1) { mixedModel.insert(index + 1, { "type": "text", "content": "" }); setCurrentTextItem(index + 1); } else { if (mixedModel.get(index + 1).type === "image") { mixedModel.insert(index + 1, { "type": "text", "content": "" }); } setCurrentTextItem(index + 1); } } } else { var item = setCurrentTextItem(index); item.item.cursorPosition = item.item.text.length; } } /* Update the properties tracking the current item in the list to the new selection. This automatically updates focus due to the binding in the delegate that focuses the item in the list which index matches list.activeTextAreaIndex. */ function setCurrentTextItem(index) { if (index == -1) { edit.activeTextAreaIndex = -1; edit.activeTextArea = null; return } var item = itemAtIndex(index); if (item) { edit.activeTextAreaIndex = index; edit.activeTextArea = item.item; /* WORKAROUND for bug https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1163371 The following two lines won't be normally needed, but currently focus proxying inside TextArea seems to be broken, and just the binding on the delegate isn't enough to correctly focus the current item. */ item.item.focus = true; if (item.item.type === "text") item.item.forceActiveFocus(); } return item; } function activateClipboard(type, item, index) { var popupObject = PopupUtils.open(imagePopup, item); edit.preparePopover(type, item, index, popupObject) if (!popupObject.canCutOrCopy && !popupObject.canPaste) { PopupUtils.close(popupObject); } } function preparePopover(type, item, index, popupObject) { if (type == "text") syncItemToModel(item, index); popupObject.canCutOrCopy = type == "image" || item.selectionStart != item.selectionEnd; popupObject.canPaste = (type == "text" && Clipboard.data && Clipboard.data.formats.length > 0); popupObject.canSelectAll = (type == "text" && !(item.selectionStart == 0 && item.selectionEnd == item.text.length)) popupObject.targetIndex = index; popupObject.targetItem = item; popupObject.target = item; if (type == "text") { popupObject.selectionStart = item.selectionStart; popupObject.selectionEnd = item.selectionEnd; } } Component { id: textAreaPopup ClipboardPopover { id: popover Component.onCompleted: { if (edit.activeTextArea == null) { canCutOrCopy = false canPaste = false } else { edit.preparePopover("text", edit.activeTextArea, edit.activeTextAreaIndex, popover) } } onCut: edit.doCut(popover) onCopy: edit.doCopy(popover) onPaste: edit.doPaste(popover) onSelectAll: edit.doSelectAll(popover) } } Component { id: imagePopup ClipboardPopover { id: popover onCut: edit.doCut(popover) onCopy: edit.doCopy(popover) onPaste: edit.doPaste(popover) onSelectAll: edit.doSelectAll(popover) } } function doCut(popover) { Clipboard.clear(); var item = mixedModel.get(popover.targetIndex); if (item.type == "text") { popover.targetItem.cut(); syncItemToModel(popover.targetItem, popover.targetIndex); } else { var data = Clipboard.newData(); data.urls = [item.content]; Clipboard.push(data); /* If the removed image was between to text blocks then merge them */ if (popover.targetIndex > 0 && mixedModel.get(popover.targetIndex - 1).type == "text" && popover.targetIndex + 1 < mixedModel.count && mixedModel.get(popover.targetIndex + 1).type == "text") { mixedModel.setProperty(popover.targetIndex - 1, "content", mixedModel.get(popover.targetIndex - 1).content + "\n" + mixedModel.get(popover.targetIndex + 1).content) mixedModel.remove(popover.targetIndex + 1); mixedModel.remove(popover.targetIndex); } else { mixedModel.remove(popover.targetIndex); } } } function doCopy(popover) { Clipboard.clear(); var item = mixedModel.get(popover.targetIndex); if (item.type == "text") { popover.targetItem.copy(); } else { var data = Clipboard.newData(); data.urls = [item.content]; Clipboard.push(data); } } /* We can only paste inside text blocks, and the data that is pasted is either a text, an image, or both (in either order) */ function doPaste(popover) { var start, end; var targetIndex = popover.targetIndex; var currentText = mixedModel.get(targetIndex).content; var lastClipboardTextLength = 0; /* First split the target text block if needed */ if (popover.selectionStart != popover.selectionEnd) { start = currentText.substring(0, popover.selectionStart); end = currentText.substring(popover.selectionEnd); } else { start = currentText.substring(0, popover.targetItem.cursorPosition); end = currentText.substring(popover.targetItem.cursorPosition); } mixedModel.setProperty(popover.targetIndex, "content", start); popover.targetItem.cursorPosition = popover.selectionEnd; for (var i = 0; i < Clipboard.data.formats.length; i++) { var format = Clipboard.data.formats[i]; switch (format) { case "text/uri-list": /* TODO: support pasting more than one image */ var imageUrl = Clipboard.data.urls[0]; /* Always add a new text block after pasting the image, and update the target text block to be the new block. Since there can't be two text blocks one after the other in the model, and we can't paste over images, then we are guaranteed not to have two consecutive text blocks after this paste. */ mixedModel.insert(targetIndex + 1, { 'type': 'image', 'content': imageUrl }); mixedModel.insert(targetIndex + 2, { 'type': 'text', 'content': '' }); targetIndex += 2; break; case "text/plain": var clipboardText = Clipboard.data.text; lastClipboardTextLength = clipboardText.length; currentText = mixedModel.get(targetIndex).content; mixedModel.setProperty(targetIndex, "content", currentText + clipboardText); break; } } /* Paste the remaining text from splitting the initial target text block */ if (mixedModel.get(targetIndex).type == "text") { currentText = mixedModel.get(targetIndex).content; mixedModel.setProperty(targetIndex, "content", currentText + end); } } function doSelectAll(popover) { popover.targetItem.selectAll(); } function deletePreviousImage(i) { /* There shouldn't be two pieces of text one after the other, but better check just in case */ if (i > 0 && mixedModel.get(i - 1).type == "image") { if (i > 1 && mixedModel.get(i - 2).type == "text") { /* If there was text before the deleted image then merge it into the current element */ var text = mixedModel.get(i - 2).content var location = text.length; text += "\n" + mixedModel.get(i).content; mixedModel.setProperty(i, "content", text); mixedModel.remove(i - 1); mixedModel.remove(i - 2); return location; } else { mixedModel.remove(i - 1); } } return 0; } function syncItemToModel(item, index) { mixedModel.setProperty(index, "content", item.text); } function modelToData() { if (mixedModel.count == 0 || (mixedModel.count == 1 && mixedModel.get(0).type == "text" && mixedModel.get(0).content.trim().length == 0)) { return ""; } else { var json = '{ "elements" : ['; for (var i = 0; i < mixedModel.count; i++) { json += (i == 0 ? "" : ",") + JSON.stringify(mixedModel.get(i)); } json += "]}" return json; } } function dataToModel(noteData) { try { var data = JSON.parse(noteData); // TODO: make more robust by checking if it's an array and if the // TODO: elements have the right properties. if (data['elements']) { for (var i = 0; i < data['elements'].length; i++) { var element = data['elements'][i]; mixedModel.append(element); } } } catch (exception) { mixedModel.append({ type: 'text', content: noteData }); } modelUpdated() } } notes-app-1.4+14.04.20140415/Components/NoteList.qml0000644000015301777760000000764612323260622022276 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import "Constants.js" as Const ListView { id: noteList spacing: units.gu(2) currentIndex: -1 delegate: NoteItem { id: noteDelegate width: noteList.width expandedHeight: units.gu(24) collapsedHeight: units.gu(11) noteText: note dateText: date focus: isExpanded isExpanded: noteList.currentIndex === index onNoteDeleted: dataModel.deleteNote(index) // after deleting, the NoteItem should be removed onActivated: noteList.setActiveIndex(index); onDeactivated: noteList.setActiveIndex(-1); /* After editing an expanded note we used to collapse it and save it at the same time, and this was causing the note to be moved at the start of the list. The two animations (move and collapse) were happening at the same time. However with ListView the move animation shapshots the height of the items at the start, so it is not possible to do the animations at the same time or the items will end up in the wrong place. So for now we start saving the note and thus starting the move animation only when the collapsed animation has finished */ onCollapsed: noteList.commitNote(index, true); Connections { target: Qt.application onActiveChanged: { if (!Qt.application.active && noteList.currentIndex == index) noteList.commitNote(index, true); } } property int itemIndex: index } move: Transition { NumberAnimation { property: "y"; duration: Const.animationDuration } } displaced: Transition { NumberAnimation { property: "y"; duration: Const.animationDuration } } // Given an index makes the corresponding note the selected one. // Any negative index will deselect any current note and not select any other function setActiveIndex(newIndex) { if (newIndex < 0) { noteList.currentIndex = -1; } else { noteList.currentIndex = newIndex; } } // Find actual note item from its index, returns the note if // found, null otherwise. It might be that the delegate does not // exist at the moment since it's out of view and not created yet. function getNoteAtIndex(noteIndex) { for (var i = 0; i < noteList.contentItem.children.length; i++) { var current = noteList.contentItem.children[i]; if (current.itemIndex === noteIndex) { return current; } } return null; } // Save to the database the note if dirty or delete it completely if // it's totally empty (and the caller is ok to have it deleted). // Return the text of the note that was saved. function commitNote(index, deleteIfEmpty) { var note = noteList.getNoteAtIndex(index); if (note) { var theData = note.readNoteData(note); if (theData.length === 0) { if (deleteIfEmpty) { dataModel.deleteNote(note.itemIndex); } } else if (note.dirty) { note.dirty = false; dataModel.touchNote(note.itemIndex, theData); } return theData; } else return null; } } notes-app-1.4+14.04.20140415/Components/graphics/0000755000015301777760000000000012323261122021601 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/Components/graphics/note_bottom_fade@18.png0000644000015301777760000000255512323260622026103 0ustar pbusernogroup00000000000000‰PNG  IHDR¬V TÄftEXtSoftwareAdobe ImageReadyqÉe<$iTXtXML:com.adobe.xmp ÄØà©ßIDATxÚìÚ» ƒ@EA~î¿& ¢Gk£#˜‘¶]í<Ƙ j~ûâ Tmß'X¬ X¬pu°®Î@9X-¬¤ƒÕ @:X-¬¤ƒÕ €`Á €`Á §`Ýœ€r°ZXH«…€t°ZXH«…€t°ZXH«…Á ‚Á ‚+‚+‚+V+V¬/g ¬V+Vn¬þ°V +‚+· VXH«…Á ‚Á ‚+‚+‚+V+V¬«3PV +é`µ°V +é`µ°V +é`µ° X@° X@°À)Xg ¬VÒÁja ¬VÒÁja@°€`@°€`€± €`Á €`Á ‚Á ‚Á ‚þû0_â,˜9æIEND®B`‚notes-app-1.4+14.04.20140415/Components/graphics/PageHeaderBaseDivider@18.sci0000644000015301777760000000014312323260622026643 0ustar pbusernogroup00000000000000border.top: 4 border.bottom: 4 border.left: 0 border.right: 0 source: PageHeaderBaseDivider@18.png notes-app-1.4+14.04.20140415/Components/graphics/note_bg@18.sci0000644000015301777760000000020012323260622024163 0ustar pbusernogroup00000000000000border.left: 10 border.top: 10 border.bottom: 10 border.right: 10 source: note_bg@18.png horizontalTileMode: BorderImage.Repeat notes-app-1.4+14.04.20140415/Components/graphics/PageHeaderBaseDivider@18.png0000644000015301777760000000021412323260622026650 0ustar pbusernogroup00000000000000‰PNG  IHDR$´a{ÆtEXtSoftwareAdobe ImageReadyqÉe<.IDATxÚbI‰÷ bÀ˜–¨Pׇ™0ª`TÁ¨‚᪀ñóçç™`ô‘¢`߯IEND®B`‚notes-app-1.4+14.04.20140415/Components/graphics/note_bg@18.png0000644000015301777760000000555412323260622024212 0ustar pbusernogroup00000000000000‰PNG  IHDR²ªQc¬_tEXtSoftwareAdobe ImageReadyqÉe<$iTXtXML:com.adobe.xmp LQÞIDATxÚìÝÍŽU€áS==£Ð ‰‘Qã,&î`ÃÆ¹.êRÝx!\€/ÀµÆ˜˜hf1QF~ç¯Ëªžî¡©|Ÿyž¤Cÿ|ô$½zS9uΨ,Øß{t±üKý¬yóæÍ›7oÞ¼yóÏs~ñõxþdww÷Éöõõ½‡e¼râ›Ú—ìí<¸8Ù¾µ>{ÞÍŸ4oÞ¼yóæÍ›7oþçNç»f½¾¼¼|{1d›ÉdrºÙ½w©´mÙÙ¾_V^:õm÷~{ä;š'^hwn¯O¶¯}Ñ¿1jÛ+Ý{eååWÍ›7oÞ¼yóæÍ›ÿïç·ïwó·ÖÛ½­Kíxõ«î½;ýܨÿ°tuÛôÿoú…»wÖŸ<Þº0ûìðK¦ïíý6ÿ£Ëýcú¼{ϼyóæÍ›7oÞ¼ùc™ïÚô`¾-ÍzЯ£ùÐöööü?-·Ýà¨û²ÇîÍ¿¬éŸ÷ïµOÿh1oÞ¼yóæÍ›7oþyÎÏšuÚ­ó'K7nÜ8æ•_?)û÷/Ï—Í–•·¯ì7§¿î_,µ|Pv®ý£‹Ì›7oÞ¼yóæÍ›?¾ù¥SWï>zóÓÕÕÕŸºWû}ÄöWe—677ÏŸ}í÷Ëä0d§_Ö.¿õa¿¡Ùý¥öGÍ›7oÞ¼yóæÍ›?ÞùÑ©«7·^ÿlmmíï!»±±ñÞ;g¶>*“— D3:yõÚÝ×>?wîÜ}ÈÎ×È–ÉdâÇ ´Åf= Ù¶mÿ±×DÑΚõ™! ¡cv0dµ,a+¶zEVÉ·dCVÆ7c-- iÉZZ@Ê’µk9SÖYÒEl±F€¤%ûÌ=8îKÉ·dQ @ÂŒµ´€¤%kû-R–¬í·È™²¶ß ]Ä ÙñüÉô°¶ñ ´dû] ,- eËZZ@¶ˆ-Õí·¤,QK¶­ìq9Ù €t,- iÉZZ@RÃK \ ¨ƒƒûÈ*Y¦ìðÒ @ÜŒ­,-P²D.YK HY²–0c-- iÉVö‘U²Ä-YûÈ/c]‘ iÊV®Èúu›±µ+²J€À%;¼k’ pÉÚG€„[ÝGVʵd]‘ cÇ'{´dí# @Ê’u²ù2ÖY’¦¬“½È˜±Nö iÉ>󊬥D/Y7{/cÝì@Ò”u³3¶z³—” jɶÃ7{ÉXÂvl)ÃK ”,‘KÖÍ^¤,Ùá¥:€¨ÛÖ–¸" @Ü”^Z cˆ›±Õ›½¤,QKÖY2vl)Ã7{¹" @Ü’u ;¶8€¤%ë@R–¬È—±D iÊV¶ßÒ±DÍØ¶¶ý–+²ÄMÙá¥2€¸[ÛµÀÚ–¬ÈرÅ$-Y"²dˆ@¾ŒµýIS¶²ý–Ž jÆZ# @Ò”µý3¶ºý–” jɶÃK d,a;¶Ôv-pE€°%[ÛµÀÏ@ÔŽ-µ] ”,KÖ¤,YGÔ/cÛÚö[®È7em¿@ÆŒµý)KÖö[dìØRÝ~Kʵdk»øyˆÚ±¥¶k’ pÉ/-P².Ù᛽t,Q3ÖY’¦¬›½È˜±Õ›½¤,QKÖµdìØR=¢Ö@Ü’^Z d\²ÃK t,Q3ÖY’¦¬›½È˜±Õ›½¤,QK¶vD­Ÿ€¨[jGÔ*Y—¬›½HY²nö aÆÖ®ÈºÙ €°%ëŠ,;¶T¯Èúˆ[²Ã»(Y—¬}dH˜±Õ}d¥,QKÖY2vlq²IKÖÉ^¤,YûÈ0cì@Ê’¸"ÛŠX·ìÐÒ- @؈u³9SÖÍ^dÌØêÍ^~ â–låf/% @Ü’ Y @ÜŒuD-IKÖ®¤,YK H˜±–´d-- eÉZZ@ÂŒ­í#«d\²D eÉßì ÞìÕº @P­¥$MÙZÈ@à”µýé"¶Ø~ €¤%k,)KÖÒflq³Icvx¬˜ lź" @Ö–µF€l[l¿@Ò’µý)KÖYr¦¬à²Óü6DØ#¯Ýì@š’u³)KÖYr¦ìB³Žßìßþîû/ýD„‹Ø#!Û”ƒ«²KÝãÄÚ»gßï>uŸwï·Ÿ €¯i›¦‹Ó¦™lþ|ó‡î‡Ýc¿™Ål²Ë ¥Ùûð¢õ—a÷»ÇîÂc¼ðád6ÐÌž Y¢„ì¼U'³×e|¤rËBÄ Y¢„ìb̆l»°‹ÿ Y¢„lYˆÙiØŽ|¸/`H´O·ß:úDö—'š<ÂOÝDIEND®B`‚notes-app-1.4+14.04.20140415/Components/graphics/add@18.png0000644000015301777760000000027212323260622023315 0ustar pbusernogroup00000000000000‰PNG  IHDR$$ÛÎ ÛsBITÛáOà pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<PLTEÿÿÿˆˆˆªÝ€tRNS@æØfIDAT™c`À >P…äÿÿÿ?6’Zæã¤b"±¦— IEND®B`‚notes-app-1.4+14.04.20140415/Components/ClipboardPopover.qml0000644000015301777760000000326212323260622023775 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.Popups 0.1 import Ubuntu.Components.ListItems 0.1 as ListItem ActionSelectionPopover { id: popover property int insertPosition: 0 property int targetIndex: -1 property variant targetItem: null property int selectionStart: 0 property int selectionEnd: 0 property bool canCutOrCopy: true property bool canPaste: true property bool canSelectAll: true signal copy() signal paste() signal cut() signal selectAll() actions: ActionList { Action { text: i18n.tr("Select All") onTriggered: selectAll() enabled: canSelectAll } Action { text: i18n.tr("Cut") onTriggered: cut() enabled: canCutOrCopy } Action { text: i18n.tr("Copy") onTriggered: copy() enabled: canCutOrCopy } Action { text: i18n.tr("Paste") onTriggered: paste() enabled: canPaste } } } notes-app-1.4+14.04.20140415/Components/TextDelegate.qml0000644000015301777760000000202312323260622023074 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.Themes.Ambiance 0.1 TextArea { id: textArea readonly property string type: "text" style: TextAreaStyle { frameSpacing: 0 background: Item {} } signal deletePrevious() autoSize: true maximumLineCount: 0 function cursorToEnd() { textArea.cursorPosition = textArea.text.length } } notes-app-1.4+14.04.20140415/Components/Constants.js0000644000015301777760000000124012323260622022314 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ .pragma library var animationDuration = 300; notes-app-1.4+14.04.20140415/Components/NoteItem.qml0000644000015301777760000001223712323260622022251 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.ListItems 0.1 as ListItem import "Constants.js" as Const FocusScope { id: noteItem property string dateText property string noteText onNoteTextChanged: noteContent.setData(noteText); property alias dirty: noteContent.dirty property real collapsedHeight property real expandedHeight property real actualExpandedHeight: Math.max(noteContent.contentHeight + units.gu(2), expandedHeight) property bool isExpanded: false signal noteDeleted signal activated signal deactivated signal collapsed state: isExpanded ? "expanded" : "collapsed" onIsExpandedChanged: { // When collapsing, update the content of the collapsed text to match the expanded one. // When expanding, if the note is empty focus it immediately instead of requiring another click. // This is because there's nothing to read on an empty note, so the only action possible is edit. if (!isExpanded) collapsedContent.fill(noteContent.model); else if (readNoteData().length === 0) noteContent.startEditAtEnd() } Component.onCompleted: removableMenu.itemRemoved.connect(noteDeleted) function readNoteData() { return noteContent.readData() } ListItem.Empty { id: removableMenu showDivider: false removable: !noteItem.isExpanded confirmRemoval: true onClicked: { if (removableMenu.swipingState === "") noteItem.activated() } anchors { fill: parent leftMargin: units.gu(0.5) rightMargin: units.gu(0.5) } MouseArea { anchors.fill: parent enabled: !removableMenu.removable onPressAndHold: { if (noteContent.activeTextAreaIndex != -1) { noteContent.activateClipboard("text", noteContent.activeTextArea, noteContent.activeTextAreaIndex) } } onClicked: { noteContent.startEditAtEnd(); mouse.accepted = false; } propagateComposedEvents: true } BorderImage { anchors.fill: noteContent source: "graphics/note_bg.sci" } MixedEdit { id: noteContent width: parent.width height: noteItem.height opacity: noteItem.isExpanded ? 1.0 : 0.0 visible: opacity > 0.0 onModelUpdated: collapsedContent.fill(noteContent.model); onActivated: { focus = true; noteItem.activated(); } function startEditAtEnd() { noteContent.focus = true; noteContent.editAtIndex(-1, false) } } CollapsedNote { id: collapsedContent anchors.fill: parent anchors.margins: units.gu(0.5) height: noteItem.collapsedHeight opacity: noteItem.isExpanded ? 0.0 : 1.0 } CollapsedNoteDecorations { anchors.fill: parent anchors.margins: units.gu(0.5) date: noteItem.dateText opacity: collapsedContent.opacity } } InverseMouseArea { anchors.fill: parent onClicked: { /* We want the first click on the noteItem to expand the item but not focus anything, and the second click to focus. Therefore, when collapsing the item, we need to defocus is, otherwise it will retain focus and the next first click will refocus it again */ noteItem.deactivated() noteContent.focus = false; mouse.accepted = false; } enabled: noteItem.isExpanded propagateComposedEvents: true topmostItem: true } states: [ State { name: "collapsed" PropertyChanges { target: noteItem; height: collapsedHeight } }, State { name: "expanded" PropertyChanges { target: noteItem; height: actualExpandedHeight } } ] transitions: [ Transition { from: "collapsed" PropertyAnimation { target: noteItem; property: "height"; duration: Const.animationDuration } }, Transition { from: "expanded" SequentialAnimation { PropertyAnimation { target: noteItem; property: "height"; duration: Const.animationDuration } ScriptAction { script: noteItem.collapsed() } } } ] } notes-app-1.4+14.04.20140415/Components/ImageDelegate.qml0000644000015301777760000000340512323260622023177 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 Item { id: item readonly property string type: "image" property string source signal clicked(bool atTop) signal activateClipboard() height: image.height UbuntuShape { id: image anchors.top: parent.top anchors.left: parent.left width: (img.sourceSize.width > item.width) ? item.width : img.sourceSize.width height: (img.sourceSize.height / img.sourceSize.width) * width image: Image { id: img source: item.source ? "image://cache/" + item.source : "" fillMode: Image.PreserveAspectFit } } MouseArea { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right height: parent.height / 2 onClicked: item.clicked(true) onPressAndHold: item.activateClipboard() } MouseArea { anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right height: parent.height / 2 onClicked: item.clicked(false) onPressAndHold: item.activateClipboard() } } notes-app-1.4+14.04.20140415/Components/CollapsedNote.qml0000644000015301777760000000375512323260622023266 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 Item { clip: true UbuntuShape { id: shape anchors.top: parent.top anchors.left: parent.left height: units.gu(8) width: units.gu(8) anchors.margins: units.gu(1) image: Image { id: imageItem fillMode: Image.PreserveAspectCrop } visible: imageItem.status === Image.Ready } Label { id: label anchors.left: (shape.visible) ? shape.right : parent.left anchors.top: parent.top anchors.right: parent.right anchors.margins: units.gu(1) textFormat: Text.RichText wrapMode: TextEdit.Wrap } function fill(model) { var text = "" for (var i = 0; i < model.count; i++) { if (model.get(i).type == "image") { imageItem.source = model.get(i).content; break; } } for (i = 0; i < model.count; i++) { if (model.get(i).type == "text") { var richText = model.get(i).content.split("\n"); if (text.length === 0) { richText[0] = "" + richText[0] + ""; text = richText.join("
"); } else text += "
" + richText.join("
") } } label.text = text; } } notes-app-1.4+14.04.20140415/po/0000755000015301777760000000000012323261122016272 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/po/fa.po0000644000015301777760000000242212323260622017224 0ustar pbusernogroup00000000000000# Persian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-19 13:15+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/kn.po0000644000015301777760000000315012323260622017245 0ustar pbusernogroup00000000000000# Kannada translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-21 03:26+0000\n" "Last-Translator: Sai Ranjan \n" "Language-Team: Kannada \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "ಎಲà³à²²à²µà²¨à³à²¨à³ ಆಯà³à²•ೆಮಾಡà³" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "ಕತà³à²¤à²°à²¿à²¸à³" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "ಕಾಪೀ" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "ಪೇಸà³à²Ÿà³" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "ಸೇರಿಸà³" #: NotesApp.qml:35 msgid "Create New Note" msgstr "ಒಂದೠಹೊಸ ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ರಚಿಸಿ" #: NotesApp.qml:39 msgid "Delete" msgstr "ಅಳಿಸಿಹಾಕà³" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "ಟà³à²°à²¾à²¶à³; ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ಅಳಿಸಿ ಹಾಕà³" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "ಟಿಪà³à²ªà²£à²¿à²—ಳà³" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/lv.po0000644000015301777760000000264012323260622017261 0ustar pbusernogroup00000000000000# Latvian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-19 14:31+0000\n" "Last-Translator: Klavs Anson \n" "Language-Team: Latvian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "IzvÄ“lÄ“ties visu" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Griezt" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "KopÄ“t" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "IelÄ«mÄ“t" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Pievienot" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Izveidot jaunu piezÄ«mi" #: NotesApp.qml:39 msgid "Delete" msgstr "DzÄ“st" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Miskaste; IzdzÄ“st PiezÄ«mi" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "PiezÄ«mes" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Ubuntu PiezÄ«mjbloks" notes-app-1.4+14.04.20140415/po/eo.po0000644000015301777760000000242612323260622017245 0ustar pbusernogroup00000000000000# Esperanto translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-20 18:21+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/ko.po0000644000015301777760000000254112323260622017251 0ustar pbusernogroup00000000000000# Korean translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-16 07:40+0000\n" "Last-Translator: Jinkyu Yi \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "ëª¨ë‘ ê³ ë¥´ê¸°" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "ìžë¥´ê¸°" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "ë² ë¼ê¸°" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "ë¶™ì´ê¸°" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "만들기" #: NotesApp.qml:35 msgid "Create New Note" msgstr "새 노트 만들기" #: NotesApp.qml:39 msgid "Delete" msgstr "지우기" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "노트" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/zh_CN.po0000644000015301777760000000264712323260622017650 0ustar pbusernogroup00000000000000# Chinese (Simplified) translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-18 14:05+0000\n" "Last-Translator: Anthony Wong \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "全选" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "剪切" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "å¤åˆ¶" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "粘贴" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "添加" #: NotesApp.qml:35 msgid "Create New Note" msgstr "新建便笺" #: NotesApp.qml:39 msgid "Delete" msgstr "删除" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "垃圾;清除便签" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "便签" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Ubuntu 专用便签应用程åº" notes-app-1.4+14.04.20140415/po/it.po0000644000015301777760000000260512323260622017255 0ustar pbusernogroup00000000000000# Italian translations for notes-app package. # Copyright (C) 2013 THE notes-app'S COPYRIGHT HOLDER # This file is distributed under the same license as the notes-app package. # Ugo , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-09-28 10:11+0000\n" "Last-Translator: Claudio Arseni \n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" "Language: it\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Seleziona tutto" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Taglia" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copia" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Incolla" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Aggiungi" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Crea nuova nota" #: NotesApp.qml:39 msgid "Delete" msgstr "Elimina" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Rimuovi;Elimina nota" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Note" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Applicazione Ubuntu per le note" notes-app-1.4+14.04.20140415/po/es.po0000644000015301777760000000263112323260622017247 0ustar pbusernogroup00000000000000# Spanish translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-07-02 23:26+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Seleccionar todo" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Cortar" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copiar" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Pegar" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Añadir" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Crear una nota nueva" #: NotesApp.qml:39 msgid "Delete" msgstr "Eliminar" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Papelera;Borrar nota" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notas" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Aplicación de notas para Ubuntu" notes-app-1.4+14.04.20140415/po/ro.po0000644000015301777760000000242412323260622017260 0ustar pbusernogroup00000000000000# Romanian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-20 18:30+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/is.po0000644000015301777760000000262612323260622017257 0ustar pbusernogroup00000000000000# Icelandic translation for notes-app # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2014-01-24 12:14+0000\n" "Last-Translator: Sigurpáll Sigurðsson \n" "Language-Team: Icelandic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Velja Allt" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Klippa" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Afrita" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Líma" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Bæta Við" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Gera Nýja Glósu" #: NotesApp.qml:39 msgid "Delete" msgstr "Eyða" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Rusl;Eyða Glósu" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Glósur" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Glósuforrit fyrir Ubuntu" notes-app-1.4+14.04.20140415/po/com.ubuntu.notes.pot0000644000015301777760000000222612323260622022252 0ustar pbusernogroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.ubuntu.notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/sr.po0000644000015301777760000000270512323260622017266 0ustar pbusernogroup00000000000000# Serbian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-29 17:32+0000\n" "Last-Translator: Марко М. КоÑтић \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Изабери Ñве" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "ИÑеци" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Умножи" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Ðалепи" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Додај" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Ðаправи нову белешку" #: NotesApp.qml:39 msgid "Delete" msgstr "Обриши" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Смеће;Обриши белешку" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Белешке" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/uk.po0000644000015301777760000000310012323260622017247 0ustar pbusernogroup00000000000000# Ukrainian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-07-21 05:47+0000\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Позначити вÑе" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Вирізати" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Копіювати" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Ð’Ñтавити" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Додати" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Створити нову нотатку" #: NotesApp.qml:39 msgid "Delete" msgstr "Вилучити" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Trash;Erase Note;Смітник;Вилучити нотатку" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Ðотатки" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Програма Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з нотатками у Ubuntu" notes-app-1.4+14.04.20140415/po/br.po0000644000015301777760000000266712323260622017254 0ustar pbusernogroup00000000000000# Breton translation for notes-app # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2014-03-06 14:31+0000\n" "Last-Translator: Fohanno Thierry \n" "Language-Team: Breton \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Diuzañ pep tra" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Troc'hañ" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Eilañ" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Pegañ" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Ouzhpennañ" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Krouiñ un notenn nevez" #: NotesApp.qml:39 msgid "Delete" msgstr "Diverkañ" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Pod-lastez;Diverkañ an notenn" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notennoù" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Arload notennoù evit Ubuntu" notes-app-1.4+14.04.20140415/po/sv.po0000644000015301777760000000242212323260622017266 0ustar pbusernogroup00000000000000# Swedish translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-18 19:53+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/zh_HK.po0000644000015301777760000000265312323260622017647 0ustar pbusernogroup00000000000000# Chinese (Hong Kong) translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-20 04:59+0000\n" "Last-Translator: Walter Cheuk \n" "Language-Team: Chinese (Hong Kong) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "å…¨é¸" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "剪下" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "複製" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "貼上" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "加入" #: NotesApp.qml:35 msgid "Create New Note" msgstr "建立新筆記" #: NotesApp.qml:39 msgid "Delete" msgstr "刪除" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Trash;Erase Note;垃圾桶;清除記事" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "筆記" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Ubuntu 的筆記程å¼" notes-app-1.4+14.04.20140415/po/lo.po0000644000015301777760000000277112323260622017257 0ustar pbusernogroup00000000000000# Lao translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-03 07:46+0000\n" "Last-Translator: Anousak \n" "Language-Team: Lao \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "ເລີອàºàº—ັ້ງà»àº»àº”" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "ຕັດ" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "ສà»àº²à»€àº™àº»àº²" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "ວາງ" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "ເພີ້ມ" #: NotesApp.qml:35 msgid "Create New Note" msgstr "ສ້າງນົດໃà»à»ˆ" #: NotesApp.qml:39 msgid "Delete" msgstr "ລຶບ" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "ຂີ້ເຫàºàº·à»‰àº­" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "ນົດ" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "ໂປຣເເàºàº£àº¡àº™àº»àº”ສà»àº²àº¥àº±àºšàº­àº¸àºšàº±àº™àº•ູ" notes-app-1.4+14.04.20140415/po/id.po0000644000015301777760000000243012323260622017231 0ustar pbusernogroup00000000000000# Indonesian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-20 18:51+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/nl.po0000644000015301777760000000253712323260622017256 0ustar pbusernogroup00000000000000# Dutch translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-20 19:25+0000\n" "Last-Translator: Rachid \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Alles selecteren" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Knippen" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Kopiëren" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Plakken" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Toevoegen" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Nieuwe notitie aanmaken" #: NotesApp.qml:39 msgid "Delete" msgstr "Verwijderen" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notities" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/tr.po0000644000015301777760000000257212323260622017271 0ustar pbusernogroup00000000000000# Turkish translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-22 19:03+0000\n" "Last-Translator: Volkan Gezer \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Tümünü Seç" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Kes" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Kopyala" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Yapıştır" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Ekle" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Yeni Not OluÅŸtur" #: NotesApp.qml:39 msgid "Delete" msgstr "Sil" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Çöp;Notu Sil" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notlar" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Ubuntu için not uygulaması" notes-app-1.4+14.04.20140415/po/ug.po0000644000015301777760000000274412323260622017260 0ustar pbusernogroup00000000000000# Uyghur translation for notes-app # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2014-02-09 06:37+0000\n" "Last-Translator: omarjan \n" "Language-Team: Uyghur \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "ھەممىنى تاللا" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "كەس" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "كۆچۈر" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "چاپلا" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "قوش" #: NotesApp.qml:35 msgid "Create New Note" msgstr "ÙŠÛÚ­Ù‰ ئىزاھ قۇرۇش" #: NotesApp.qml:39 msgid "Delete" msgstr "ئۆچۈر" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "ئەخلەت؛ئىزاھاتن ئۆچۈرۈلدى" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "ئىزاھ" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Ubuntuنىڭ پروگرامما ئىزاھاتى" notes-app-1.4+14.04.20140415/po/pl.po0000644000015301777760000000261712323260622017257 0ustar pbusernogroup00000000000000# Polish translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-22 16:47+0000\n" "Last-Translator: GTriderXC \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Zaznacz wszystko" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Wytnij" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Kopiuj" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Wklej" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Dodaj" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Utwórz nowÄ… notatkÄ™" #: NotesApp.qml:39 msgid "Delete" msgstr "UsuÅ„" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Kosz;UsuÅ„ notatkÄ™" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notatki" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Aplikacja notatnika dla Ubuntu" notes-app-1.4+14.04.20140415/po/de.po0000644000015301777760000000262512323260622017233 0ustar pbusernogroup00000000000000# German translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-21 12:52+0000\n" "Last-Translator: Phillip Sz \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Alles auswählen" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Ausschneiden" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Kopieren" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Einfügen" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Hinzufügen" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Neue Notiz anlegen" #: NotesApp.qml:39 msgid "Delete" msgstr "Löschen" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Müll;Notiz löschen" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notizen" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Notizen-Anwendung für Ubuntu" notes-app-1.4+14.04.20140415/po/da.po0000644000015301777760000000242012323260622017220 0ustar pbusernogroup00000000000000# Danish translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-03 23:55+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/ca.po0000644000015301777760000000255612323260622017231 0ustar pbusernogroup00000000000000# Catalan translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-20 17:39+0000\n" "Last-Translator: David Planella \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Selecciona-ho tot" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Retalla" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copia" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Enganxa" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Afegeix" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Crea una nota nova" #: NotesApp.qml:39 msgid "Delete" msgstr "Suprimeix" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notes" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/en_AU.po0000644000015301777760000000263012323260622017626 0ustar pbusernogroup00000000000000# English (Australia) translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-18 21:11+0000\n" "Last-Translator: Jackson Doak \n" "Language-Team: English (Australia) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Select All" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Cut" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copy" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Paste" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Add" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Create New Note" #: NotesApp.qml:39 msgid "Delete" msgstr "Delete" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Trash;Erase Note" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notes" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Notes application for Ubuntu" notes-app-1.4+14.04.20140415/po/ml.po0000644000015301777760000000342212323260622017247 0ustar pbusernogroup00000000000000# Malayalam translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-11-22 04:25+0000\n" "Last-Translator: STyM Alfazz \n" "Language-Team: Malayalam \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "à´Žà´²àµà´²à´¾à´‚ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "à´®àµà´±à´¿à´•àµà´•àµà´•" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "പകരàµâ€à´¤àµà´¤àµà´•" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "à´’à´Ÿàµà´Ÿà´¿à´•àµà´•àµà´•" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "ചേരàµâ€à´•àµà´•àµà´•" #: NotesApp.qml:35 msgid "Create New Note" msgstr "à´ªàµà´¤à´¿à´¯ à´•àµà´±à´¿à´ªàµà´ªàµ ഉണàµà´Ÿà´¾à´•àµà´•àµà´•" #: NotesApp.qml:39 msgid "Delete" msgstr "നീകàµà´•à´‚ ചെയàµà´¯àµà´•" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "ചവറàµà´±àµà´•àµà´Ÿàµà´Ÿ;à´•àµà´±à´¿à´ªàµà´ªàµ മായàµà´•àµà´•àµà´•" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "à´•àµà´±à´¿à´ªàµà´ªàµà´•à´³àµâ€" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "ഉബàµà´£àµà´Ÿàµà´µà´¿à´¨àµà´³àµà´³ à´•àµà´±à´¿à´ªàµà´ªàµà´•à´³àµâ€ à´ªàµà´°à´¯àµ‹à´—à´‚" notes-app-1.4+14.04.20140415/po/gd.po0000644000015301777760000000273412323260622017236 0ustar pbusernogroup00000000000000# Gaelic; Scottish translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-09-29 21:44+0000\n" "Last-Translator: Akerbeltz \n" "Language-Team: Gaelic; Scottish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Tagh na h-uile" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Gearr às" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Dèan lethbhreac" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Cuir ann" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Cuir ris" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Cruthaich nòta ùr" #: NotesApp.qml:39 msgid "Delete" msgstr "Sguab às" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Trash;Erase Note;Cuir san sgudal;Suath às an nòta" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Nòtaichean" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Aplacaid nòtaichean airson Ubuntu" notes-app-1.4+14.04.20140415/po/sl.po0000644000015301777760000000262612323260622017262 0ustar pbusernogroup00000000000000# Slovenian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-09-28 09:54+0000\n" "Last-Translator: Damir JerovÅ¡ek \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Izberi vse" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Izreži" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Kopiraj" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Prilepi" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Dodaj" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Ustvari novo sporoÄilce" #: NotesApp.qml:39 msgid "Delete" msgstr "IzbriÅ¡i" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Smeti;IzbriÅ¡i sporoÄilce" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "SporoÄilca" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Program opomb za Ubuntu" notes-app-1.4+14.04.20140415/po/ta.po0000644000015301777760000000337112323260622017246 0ustar pbusernogroup00000000000000# Tamil translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-25 07:21+0000\n" "Last-Translator: Thangamani Arun - தஙà¯à®•மணி à®…à®°à¯à®£à¯ \n" "Language-Team: Tamil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "அனைதà¯à®¤à¯ˆà®¯à¯à®®à¯ தேரà¯à®µà¯ செயà¯" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "வெடà¯à®Ÿà¯" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "படியெடà¯" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "ஒடà¯à®Ÿà¯" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "சேரà¯" #: NotesApp.qml:35 msgid "Create New Note" msgstr "பà¯à®¤à®¿à®¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®©à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯" #: NotesApp.qml:39 msgid "Delete" msgstr "நீகà¯à®•à¯" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "கà¯à®ªà¯à®ªà¯ˆ;கà¯à®±à®¿à®ªà¯à®ªà¯ˆ அழி" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "கà¯à®±à®¿à®ªà¯à®ªà¯" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "உபà¯à®£à¯à®Ÿà¯à®µà®¿à®±à¯à®•à¯à®•ான கà¯à®±à®¿à®ªà¯à®ªà¯à®•ள௠எடà¯à®•à¯à®•à¯à®®à¯ பயனà¯à®ªà®¾à®Ÿà¯" notes-app-1.4+14.04.20140415/po/be.po0000644000015301777760000000305712323260622017231 0ustar pbusernogroup00000000000000# Belarusian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-22 15:13+0000\n" "Last-Translator: Maksim Tomkowicz \n" "Language-Team: Belarusian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Выбраць уÑÑ‘" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "ВынÑць" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "СкапіÑваць" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "УÑтавіць" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Дадаць" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Стварыць новую нататку" #: NotesApp.qml:39 msgid "Delete" msgstr "Выдаліць" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Выкінуць у Ñметніцу;Выдаліць нататку" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Ðататкі" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Праграма нататак Ð´Ð»Ñ Ubuntu" notes-app-1.4+14.04.20140415/po/ast.po0000644000015301777760000000262612323260622017433 0ustar pbusernogroup00000000000000# Asturian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-03 08:57+0000\n" "Last-Translator: ivarela \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Esbillar Too" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Cortar" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copiar" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Apegar" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Amestar" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Crear una nota nueva" #: NotesApp.qml:39 msgid "Delete" msgstr "Desaniciar" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Papelera;Desaniciar nota" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notes" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Aplicación de notes pa Ubuntu" notes-app-1.4+14.04.20140415/po/zh_TW.po0000644000015301777760000000270012323260622017670 0ustar pbusernogroup00000000000000# Chinese (Traditional) translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-07-13 15:48+0000\n" "Last-Translator: Cheng-Chia Tseng \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "全部é¸å–" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "剪下" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "複製" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "貼上" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "新增" #: NotesApp.qml:35 msgid "Create New Note" msgstr "建立新記事" #: NotesApp.qml:39 msgid "Delete" msgstr "刪除" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Trash;Erase Note;垃圾桶;清除記事" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "記事" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Ubuntu 的記事應用程å¼" notes-app-1.4+14.04.20140415/po/en_GB.po0000644000015301777760000000263212323260622017613 0ustar pbusernogroup00000000000000# English (United Kingdom) translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-24 16:35+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Select All" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Cut" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copy" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Paste" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Add" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Create New Note" #: NotesApp.qml:39 msgid "Delete" msgstr "Delete" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Rubbish Bin;Erase Note" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notes" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Notes application for Ubuntu" notes-app-1.4+14.04.20140415/po/cs.po0000644000015301777760000000262112323260622017244 0ustar pbusernogroup00000000000000# Czech translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2014-01-08 09:37+0000\n" "Last-Translator: Ondra Kadlec \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Vybrat vÅ¡e" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Vyjmout" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Kopírovat" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Vložit" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "PÅ™idat" #: NotesApp.qml:35 msgid "Create New Note" msgstr "VytvoÅ™it novou poznámku" #: NotesApp.qml:39 msgid "Delete" msgstr "Smazat" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "KoÅ¡;Smazat poznámku" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Poznámky" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Poznámky pro ubuntu" notes-app-1.4+14.04.20140415/po/ar.po0000644000015301777760000000270512323260622017244 0ustar pbusernogroup00000000000000# Arabic translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-11-15 13:59+0000\n" "Last-Translator: Ibrahim Saed \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "ظلل الكل" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "قص" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "انسخ" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "ألصق" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "أضÙ" #: NotesApp.qml:35 msgid "Create New Note" msgstr "أنشئ ملاحظة جديدة" #: NotesApp.qml:39 msgid "Delete" msgstr "احذÙ" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "حذÙ;مسح الملاحظة" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "ملاحظات" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "تطبيق الملاحظات لأبونتو" notes-app-1.4+14.04.20140415/po/CMakeLists.txt0000644000015301777760000000200512323260622021033 0ustar pbusernogroup00000000000000project(notes-translations) include(FindGettext) find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext) set(DOMAIN ${GETTEXT_PACKAGE}) set(POT_FILE ${DOMAIN}.pot) file(GLOB PO_FILES *.po) add_custom_target(${POT_FILE} COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} -o ${POT_FILE} -D ${CMAKE_SOURCE_DIR} --from-code=UTF-8 --c++ --qt --add-comments=TRANSLATORS --keyword=tr --keyword=tr:1,2 --package-name=com.ubuntu.notes --copyright-holder='Canonical Ltd.' ${I18N_SRC_FILES}) foreach(PO_FILE ${PO_FILES}) get_filename_component(LANG ${PO_FILE} NAME_WE) gettext_process_po_files(${LANG} ALL PO_FILES ${PO_FILE}) set(INSTALL_DIR ${CMAKE_INSTALL_LOCALEDIR}/${LANG}/LC_MESSAGES) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo DESTINATION ${INSTALL_DIR} RENAME ${DOMAIN}.mo) endforeach(PO_FILE) notes-app-1.4+14.04.20140415/po/fi.po0000644000015301777760000000265012323260622017237 0ustar pbusernogroup00000000000000# Finnish translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-07-26 09:07+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Valitse kaikki" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Leikkaa" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Kopioi" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Liitä" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Lisää" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Luo uusi muistiinpano" #: NotesApp.qml:39 msgid "Delete" msgstr "Poista" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Trash;Erase Note;Roskakori;Poista muistiinpano" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Muistiinpanot" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Muistiosovellus Ubuntulle" notes-app-1.4+14.04.20140415/po/az.po0000644000015301777760000000263312323260622017254 0ustar pbusernogroup00000000000000# Azerbaijani translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-21 07:48+0000\n" "Last-Translator: Emin Mastizada \n" "Language-Team: Azerbaijani \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Hamısını Seç" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "KÉ™s" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Köçür" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Yapışdır" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "ÆlavÉ™ et" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Yeni Qeyd Yarat" #: NotesApp.qml:39 msgid "Delete" msgstr "Sil" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Çöp;Qeydi Sil" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "QeydlÉ™r" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Ubuntu üçün QeydlÉ™r proqramı" notes-app-1.4+14.04.20140415/po/ms.po0000644000015301777760000000256112323260622017261 0ustar pbusernogroup00000000000000# Malay translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-12-14 05:43+0000\n" "Last-Translator: abuyop \n" "Language-Team: Malay \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Pilih Semua" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Potong" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Salin" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Tampal" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Tambah" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Cipta Nota Baharu" #: NotesApp.qml:39 msgid "Delete" msgstr "Padam" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Tong Sampah;Padam Nota" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Nota" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Aplikasi Nota untuk Ubuntu" notes-app-1.4+14.04.20140415/po/shn.po0000644000015301777760000000241512323260622017430 0ustar pbusernogroup00000000000000# Shan translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-07 11:32+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Shan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/gl.po0000644000015301777760000000261012323260622017237 0ustar pbusernogroup00000000000000# Galician translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-01 15:19+0000\n" "Last-Translator: Marcos Lans \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Seleccionar todo" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Cortar" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copiar" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Pegar" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Engadir" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Crear unha nota nova" #: NotesApp.qml:39 msgid "Delete" msgstr "Eliminar" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Lixo;Borrar nota" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notas" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Aplicativo de notas para Ubuntu" notes-app-1.4+14.04.20140415/po/pt_BR.po0000644000015301777760000000267612323260622017657 0ustar pbusernogroup00000000000000# Brazilian Portuguese translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-08-30 06:47+0000\n" "Last-Translator: Tiago Hillebrandt \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Selecionar tudo" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Recortar" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copiar" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Colar" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Adicionar" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Criar nova nota" #: NotesApp.qml:39 msgid "Delete" msgstr "Excluir" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Lixeira;Apagar nota" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notas" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Aplicativo de notas para o Ubuntu" notes-app-1.4+14.04.20140415/po/my.po0000644000015301777760000000322212323260622017262 0ustar pbusernogroup00000000000000# Burmese translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-09 11:11+0000\n" "Last-Translator: Pyae Sone \n" "Language-Team: Burmese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "အားလုံးကို ရွေးá€á€»á€šá€ºá€•ါ" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "ဖြá€á€º" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "မိá€á€¹á€á€°" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "ပွားယူ" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "ပေါင်းထည့်" #: NotesApp.qml:35 msgid "Create New Note" msgstr "မှá€á€ºá€…ုအသစ်ဖန်á€á€®á€¸á€›á€”်" #: NotesApp.qml:39 msgid "Delete" msgstr "ဖျက်ရန်" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "အမှိုက်ပုံးአမှá€á€ºá€…ုဖျက်မည်" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "မှá€á€ºá€…ုများ" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "ဦးဘန္á€á€¯á€¡á€á€½á€€á€º မှá€á€ºá€…ု application" notes-app-1.4+14.04.20140415/po/fr.po0000644000015301777760000000264712323260622017256 0ustar pbusernogroup00000000000000# French translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-08-28 10:21+0000\n" "Last-Translator: Anne \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Tout sélectionner" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Couper" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Copier" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Coller" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Ajouter" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Créer une nouvelle note" #: NotesApp.qml:39 msgid "Delete" msgstr "Supprimer" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Corbeille;Effacer la note" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Notes" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Application de prise de notes pour Ubuntu" notes-app-1.4+14.04.20140415/po/vi.po0000644000015301777760000000260312323260622017255 0ustar pbusernogroup00000000000000# Vietnamese translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-05-21 00:14+0000\n" "Last-Translator: Vu Do Quynh \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:06+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Chá»n tất cả" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Cắt" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Chép" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Dán" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Thêm" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Tạo ra tá» ghi chép má»›i" #: NotesApp.qml:39 msgid "Delete" msgstr "Xoá" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Xá»t rác;Xoá Tá» ghi" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Tá» ghi" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/km.po0000644000015301777760000000316112323260622017246 0ustar pbusernogroup00000000000000# Khmer translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-11 04:06+0000\n" "Last-Translator: Khoem Sokhem \n" "Language-Team: Khmer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "ជ្រើស​ទាំង​អស់" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "កាážáŸ‹" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "ចម្លង" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "បិទភ្ជាប់" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "បន្ážáŸ‚ម" #: NotesApp.qml:35 msgid "Create New Note" msgstr "បង្កើážâ€‹áž…ំណាំ​ážáŸ’មី" #: NotesApp.qml:39 msgid "Delete" msgstr "លុប" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "ធុង​សំរាម;លុប​ចំណាំ" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "ចំណាំ" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "កម្មវិធី​​បង្កើážâ€‹áž…ំណាំ​សម្រាប់ Ubuntu" notes-app-1.4+14.04.20140415/po/el.po0000644000015301777760000000241612323260622017241 0ustar pbusernogroup00000000000000# Greek translation for notes-app # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2014-03-01 12:51+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/hi.po0000644000015301777760000000241612323260622017241 0ustar pbusernogroup00000000000000# Hindi translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-06-12 13:25+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Hindi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "" #: NotesApp.qml:35 msgid "Create New Note" msgstr "" #: NotesApp.qml:39 msgid "Delete" msgstr "" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "" notes-app-1.4+14.04.20140415/po/hu.po0000644000015301777760000000265612323260622017263 0ustar pbusernogroup00000000000000# Hungarian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2014-01-05 00:45+0000\n" "Last-Translator: Mátó Péter \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Összes kijelölése" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Kivágás" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Másolás" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Beillesztés" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Hozzáadás" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Új jegyzet létrehozása" #: NotesApp.qml:39 msgid "Delete" msgstr "Törlés" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Kuka;Jegyzet törlése" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Jegyzetek" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Jegyzet alkalmazás Ubuntuhoz" notes-app-1.4+14.04.20140415/po/ru.po0000644000015301777760000000275212323260622017272 0ustar pbusernogroup00000000000000# Russian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-09-30 13:26+0000\n" "Last-Translator: Zonov Roman \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Выделить вÑÑ‘" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Вырезать" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "Копировать" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "Ð’Ñтавить" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Добавить" #: NotesApp.qml:35 msgid "Create New Note" msgstr "Создать заметку" #: NotesApp.qml:39 msgid "Delete" msgstr "Удалить" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Корзина;Стереть Заметку" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Заметки" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Заметки Ð´Ð»Ñ Ubuntu" notes-app-1.4+14.04.20140415/po/hy.po0000644000015301777760000000300012323260622017247 0ustar pbusernogroup00000000000000# Armenian translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-07-08 16:44+0000\n" "Last-Translator: iAbaS \n" "Language-Team: Armenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "Ô¿Õ¿Ö€Õ¥Õ¬" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "ÕŠÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬" #: NotesApp.qml:35 msgid "Create New Note" msgstr "ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö€ Õ¶Õ·Õ¸Ö‚Õ´" #: NotesApp.qml:39 msgid "Delete" msgstr "Õ‹Õ¶Õ»Õ¥Õ¬" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "Ô±Õ²Õ¢Õ¡Õ´Õ¡Õ¶;Õ‹Õ¶Õ»Õ¥Õ¬ Õ¶Õ·Õ¸Ö‚Õ´Õ¨" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "Õ†Õ·Õ¸Ö‚Õ´Õ¶Õ¥Ö€" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "Õ†Õ·Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ®Ö€Õ¡Õ£Õ«Ö€ Ubuntu-Õ« Õ°Õ¡Õ´Õ¡Ö€" notes-app-1.4+14.04.20140415/po/he.po0000644000015301777760000000270412323260622017235 0ustar pbusernogroup00000000000000# Hebrew translation for notes-app # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the notes-app package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: notes-app\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-10-10 11:34+0200\n" "PO-Revision-Date: 2013-10-01 09:22+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-03-22 07:05+0000\n" "X-Generator: Launchpad (build 16967)\n" #: Components/ClipboardPopover.qml:42 msgid "Select All" msgstr "בחירת הכול" #: Components/ClipboardPopover.qml:47 msgid "Cut" msgstr "גזירה" #: Components/ClipboardPopover.qml:52 msgid "Copy" msgstr "העתקה" #: Components/ClipboardPopover.qml:57 msgid "Paste" msgstr "הדבקה" #: NotesApp.qml:34 NotesApp.qml:69 msgid "Add" msgstr "הוספה" #: NotesApp.qml:35 msgid "Create New Note" msgstr "יצירת פתקית חדשה" #: NotesApp.qml:39 msgid "Delete" msgstr "מחיקה" #: NotesApp.qml:40 msgid "Trash;Erase Note" msgstr "ל×שפה;מחיקת פתקית" #: NotesApp.qml:64 notes-app.desktop.in:4 msgid "Notes" msgstr "פתקי×" #: notes-app.desktop.in:5 msgid "Notes application for Ubuntu" msgstr "×™×™×©×•× ×”×¢×¨×•×ª ל×ובונטו" notes-app-1.4+14.04.20140415/click/0000755000015301777760000000000012323261122016741 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/click/manifest.json.in0000644000015301777760000000115712323260622022057 0ustar pbusernogroup00000000000000{ "architecture": "armhf", "description": "Note taking application for the Ubuntu platform", "framework": "ubuntu-sdk-14.04-dev1", "hooks": { "notes": { "apparmor": "notes-apparmor.json", "desktop": "@CMAKE_INSTALL_DATADIR@/applications/@DESKTOP_FILE@" } }, "icon": "notepad", "maintainer": "Ubuntu Developers ", "name": "com.ubuntu.notes", "title": "Notes", "version": "1.4.@BZR_REVNO@", "x-source": { "vcs-bzr": "lp:notes-app", "vcs-bzr-revno": "@BZR_REVNO@" } } notes-app-1.4+14.04.20140415/click/CMakeLists.txt0000644000015301777760000000060212323260622021503 0ustar pbusernogroup00000000000000if(CLICK_MODE) if(NOT BZR_REVNO) set(BZR_REVNO "trunk") endif(NOT BZR_REVNO) configure_file(manifest.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest.json) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/manifest.json DESTINATION ${CMAKE_INSTALL_PREFIX}) install(FILES notes-apparmor.json DESTINATION ${CMAKE_INSTALL_PREFIX}) endif(CLICK_MODE) notes-app-1.4+14.04.20140415/click/notes-apparmor.json0000644000015301777760000000010412323260622022602 0ustar pbusernogroup00000000000000{ "policy_groups": ["networking"], "policy_version": 1.1 } notes-app-1.4+14.04.20140415/NotesApp.qml0000644000015301777760000000662312323260622020133 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.ListItems 0.1 as ListItem import Ubuntu.Unity.Action 1.0 as UnityActions import NotesApp.Plugins 0.1 import "Components" import "Models" MainView { id: notesMainWindow applicationName: "com.ubuntu.notes" width: units.gu(40) height: units.gu(71) automaticOrientation: true actions: [ UnityActions.Action { text: i18n.tr("Add") keywords: i18n.tr("Create New Note") onTriggered: notesMainWindow.createNewNote() }, UnityActions.Action { text: i18n.tr("Delete") keywords: i18n.tr("Trash;Erase Note") enabled: noteList.currentIndex !== -1 onTriggered: dataModel.deleteNote(noteList.currentIndex) } ] NotesApplication { id: application /* We need to set this because we are being run through qmlscene, but our custom CachingProvider image provider needs to reserve a directory to save its data, and Qt will reserve it based on application name */ applicationName: "notes-app" onAboutToQuit: { if (noteList.currentIndex !== -1) noteList.commitNote(noteList.currentIndex, true); } } Page { id: page anchors.fill: parent title: i18n.tr("Notes") tools: ToolbarItems { ToolbarButton { action: Action { text: i18n.tr("Add") iconSource: Qt.resolvedUrl("Components/graphics/add.png") onTriggered: { page.tools.opened = false notesMainWindow.createNewNote() } } } } // model to access the database of Notes DataModel { id: dataModel } // background Rectangle { anchors.fill: parent color: "#fff6e5" } NoteList { id: noteList anchors.fill: parent anchors.topMargin: units.gu(1.5) focus: true model: dataModel } Connections { target: Qt.inputMethod onVisibleChanged: { if (!Qt.inputMethod.visible) { noteList.focus = true; } } } } function createNewNote() { // Don't create a new note if there's only one and it's empty already, // but ensure it's activated so that the user can start typing if (dataModel.count === 1 && noteList.commitNote(0, false).length === 0) { } else { dataModel.newNote(); } noteList.setActiveIndex(0); } KeyboardRectangle { } } notes-app-1.4+14.04.20140415/Models/0000755000015301777760000000000012323261122017077 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/Models/dateTimeUtils.js0000644000015301777760000000143712323260622022223 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ .pragma library function formatDateTime(date) { var now = new Date() var dt = (date !== undefined) ? date : now return Qt.formatDateTime(dt, "dddd, h:mm AP") } notes-app-1.4+14.04.20140415/Models/DataModel.qml0000644000015301777760000001016412323260622021452 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtQuick.LocalStorage 2.0 import "dateTimeUtils.js" as DateTime /*! \brief Notes database model. The model loads the notes in memory and builds up a model that can be used in Notes app. The very first element is an empty one instructing Roles: - id: unique identifier, should be used to touch and delete note - date: creation or last modification date - data: note data When executing operations such as touch, new and delete note, the model is automatically refreshed. The model keeps all the data in the memory. This could be memory consuming and should be optimized by loading the notes only for those items requesting for it. */ ListModel { id: model /*! Refreshes the model by loading the notes from the database */ function refresh() { if (!__db) return; __db.readTransaction(function (tx) { model.clear(); var rs = tx.executeSql("SELECT * FROM notes ORDER BY date DESC"); if (rs.rows.length == 0) { // add fake element if we don't have any note in the database model.append({"id": -1, "date": DateTime.formatDateTime(new Date()), "note": ""}); } else { for(var i = 0; i < rs.rows.length; i++) { var item = rs.rows.item(i); model.append({"id": parseInt(item.id), "date": DateTime.formatDateTime(item.date), "note": item.note}); } } }); } /*! Updates (touches) a note. The date is automatically updated. */ function touchNote(index, note) { if (!__db) return; var id = model.get(index).id; __db.transaction(function (tx) { var dt = new Date(); if (id !== -1) { tx.executeSql("UPDATE notes SET date=?, note=? WHERE id=?", [dt, note, id]); } else { var result = tx.executeSql("INSERT INTO notes VALUES(NULL, ?, ?)", [dt, note]); model.setProperty(index, "id", parseInt(result.insertId)); } model.setProperty(index, "date", DateTime.formatDateTime(dt)); if (index > 0) model.move(index, 0, 1); }); } /*! Stores a new note into the database. */ function newNote(note) { if (!__db) return; __db.transaction(function (tx) { var dt = new Date(); var result = tx.executeSql("INSERT INTO notes VALUES(NULL, ?, ?)", [dt, ""]); model.insert(0, {"id": parseInt(result.insertId), "date": DateTime.formatDateTime(dt), "note": note}) }); } /*! Deletes a note identified by its database ID. */ function deleteNote(index) { if (!__db) return; if (model.get(index) === undefined) { console.debug("undefined item to be removed!") return; } var id = model.get(index).id; __db.transaction(function (tx) { tx.executeSql("DELETE FROM notes WHERE id=?", [id]); model.remove(index); }); } property var __db: null Component.onCompleted: { __db = LocalStorage.openDatabaseSync("notes", 1.0, "Notes database", 3 * 1024 * 1024); __db.transaction(function (tx){ // create table if not exist tx.executeSql("CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, date DATETIME, note TEXT)"); }); refresh(); } } notes-app-1.4+14.04.20140415/NotesApp.qmlproject0000644000015301777760000000101512323260622021510 0ustar pbusernogroup00000000000000/* File generated by Qt Creator, version 2.6.0 */ import QmlProject 1.1 Project { mainFile: "NotesApp.qml" /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } /* List of plugin directories passed to QML runtime */ // importPaths: [ "../exampleplugin" ] Files { directory: "tests" filter: "*.h;*.cpp;*.py" } } notes-app-1.4+14.04.20140415/README.click0000644000015301777760000000056512323260622017632 0ustar pbusernogroup00000000000000Building for click ================== To build for a click package configure cmake as: mkdir build cd build cmake [path_to_this_location] -DINSTALL_TESTS=off -DCLICK_MODE=on \ -DBZR_REVNO=$(cd [path_to_this_location]; bzr revno) make DESTDIR=package install click build package This package can be installed by running: pkcon install-local com.ubuntu.notes_*.click notes-app-1.4+14.04.20140415/CMakeLists.txt0000644000015301777760000000616712323260633020434 0ustar pbusernogroup00000000000000project(notes-app) cmake_minimum_required(VERSION 2.8.9) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower) include(EnableCoverageReport) ##################################################################### # Enable code coverage calculation with gcov/gcovr/lcov # Usage: # * Switch build type to coverage (use ccmake or cmake-gui) # * Invoke make, make test, make coverage (or ninja if you use that backend) # * Find html report in subdir coveragereport # * Find xml report feasible for jenkins in coverage.xml ##################################################################### if(cmake_build_type_lower MATCHES coverage) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage" ) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage" ) set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --coverage" ) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage" ) ENABLE_COVERAGE_REPORT(TARGETS ${SHELL_APP}) endif() option(INSTALL_TESTS "Install the tests on make install" on) option(CLICK_MODE "Installs to a contained location" off) if(CLICK_MODE) set(CMAKE_INSTALL_PREFIX "/") endif(CLICK_MODE) find_package(Qt5Qml) find_package(Qt5Quick) # Standard install paths include(GNUInstallDirs) set(NOTES_APP notes-app) if(NOT CLICK_MODE) set(NOTES_APP_DIR ${CMAKE_INSTALL_DATADIR}/${NOTES_APP}) set(DESKTOP_PATH "Path=${CMAKE_INSTALL_FULL_DATADIR}/${NOTES_APP}") set(DESKTOP_EXEC "qmlscene -qt5 ${CMAKE_INSTALL_FULL_DATADIR}/${NOTES_APP}/NotesApp.qml") else(NOT CLICK_MODE) set(NOTES_APP_DIR "/") set(DESKTOP_PATH "") set(DESKTOP_EXEC "qmlscene $@ -I ./usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/qt5/qml NotesApp.qml") endif(NOT CLICK_MODE) file(GLOB QML_JS_FILES *.qml) install(FILES ${QML_JS_FILES} DESTINATION ${NOTES_APP_DIR} ) install(DIRECTORY Components DESTINATION ${NOTES_APP_DIR} ) install(DIRECTORY Models DESTINATION ${NOTES_APP_DIR} ) set(DESKTOP_FILE notes-app.desktop) file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE}) file(STRINGS ${DESKTOP_FILE}.in DESKTOP_FILE_CONTENTS) foreach(LINE ${DESKTOP_FILE_CONTENTS}) string(REGEX REPLACE "tr\\\(\"(.*)\"\\\)" "\\1" LINE "${LINE}") string(REGEX REPLACE "\@DESKTOP_EXEC\@" "${DESKTOP_EXEC}" LINE "${LINE}") string(REGEX REPLACE "\@DESKTOP_PATH\@" "${DESKTOP_PATH}" LINE "${LINE}") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE} "${LINE}\n") endforeach(LINE) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/applications ) enable_testing() add_subdirectory(tests) add_subdirectory(src) file(GLOB_RECURSE I18N_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} **.qml **.desktop.in) list(SORT I18N_SRC_FILES) # for dh_translations to extract the domain # (regarding syntax consistency, see http://pad.lv/1181187) set (GETTEXT_PACKAGE "com.ubuntu.notes") add_subdirectory(po) add_subdirectory(click) notes-app-1.4+14.04.20140415/COPYING0000644000015301777760000010451312323260622016717 0ustar pbusernogroup00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . notes-app-1.4+14.04.20140415/src/0000755000015301777760000000000012323261122016443 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/src/CMakeLists.txt0000644000015301777760000000003312323260622021203 0ustar pbusernogroup00000000000000add_subdirectory(NotesApp) notes-app-1.4+14.04.20140415/src/NotesApp/0000755000015301777760000000000012323261122020174 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/0000755000015301777760000000000012323261122021615 5ustar pbusernogroup00000000000000notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/components.cpp0000644000015301777760000000204712323260622024515 0ustar pbusernogroup00000000000000/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "components.h" #include "notesapplication.h" #include "cachingprovider.h" void Components::registerTypes(const char *uri) { qmlRegisterType(uri, 0, 1, "NotesApplication"); } void Components::initializeEngine(QQmlEngine *engine, const char *uri) { QQmlExtensionPlugin::initializeEngine(engine, uri); engine->addImageProvider(QLatin1String("cache"), new CachingProvider); } notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/notesapplication.cpp0000644000015301777760000000240412323260622025701 0ustar pbusernogroup00000000000000/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "notesapplication.h" #include NotesApplication::NotesApplication(QObject *parent) : QObject(parent) { this->connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), SIGNAL(aboutToQuit())); } QString NotesApplication::applicationName() const { return QCoreApplication::instance()->applicationName(); } void NotesApplication::setApplicationName(QString &applicationName) { QCoreApplication* application = QCoreApplication::instance(); if (application->applicationName() != applicationName) { application->setApplicationName(applicationName); Q_EMIT applicationNameChanged(); } } notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/cachingprovider.h0000644000015301777760000000175212323260622025146 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef CACHINGPROVIDER_H #define CACHINGPROVIDER_H #include #include class CachingProvider : public QQuickImageProvider { public: CachingProvider(); QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize); private: QImage downloadImage(const QUrl& url); static const int REDIRECT_LIMIT = 5; }; #endif notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/config.h.in0000644000015301777760000000210712323260622023644 0ustar pbusernogroup00000000000000/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include inline bool isRunningInstalled() { static bool installed = (QCoreApplication::applicationDirPath() == QDir("@CMAKE_INSTALL_FULL_BINDIR@").canonicalPath()); return installed; } inline QString notesAppDirectory() { if (isRunningInstalled()) { return QString("@CMAKE_INSTALL_PREFIX@/@NOTES_APP_DIR@/"); } else { return QString("@CMAKE_SOURCE_DIR@/"); } } notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/qmldir0000644000015301777760000000006012323260622023030 0ustar pbusernogroup00000000000000module NotesApp.Plugins plugin notes-app-plugin notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/notesapplication.h0000644000015301777760000000216412323260622025351 0ustar pbusernogroup00000000000000/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef NOTESAPPLICATION_H #define NOTESAPPLICATION_H #include class NotesApplication : public QObject { Q_OBJECT Q_PROPERTY(QString applicationName READ applicationName WRITE setApplicationName NOTIFY applicationNameChanged) public: NotesApplication(QObject* parent = 0); QString applicationName() const; void setApplicationName(QString& applicationName); Q_SIGNALS: void aboutToQuit(); void applicationNameChanged(); }; #endif // NOTESAPPLICATION_H notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/CMakeLists.txt0000644000015301777760000000165512323260622024370 0ustar pbusernogroup00000000000000configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) # QML plugin set(plugin_SRCS components.cpp notesapplication.cpp cachingprovider.cpp ) add_library(notes-app-plugin SHARED ${plugin_SRCS} ${plugin_HDRS}) qt5_use_modules(notes-app-plugin Core Qml Quick Network) # Qt5's cmake does not export QT_IMPORTS_DIR, lets query qmake on our own for now get_target_property(QMAKE_EXECUTABLE Qt5::qmake LOCATION) function(QUERY_QMAKE VAR RESULT) exec_program(${QMAKE_EXECUTABLE} ARGS "-query ${VAR}" RETURN_VALUE return_code OUTPUT_VARIABLE output ) if(NOT return_code) file(TO_CMAKE_PATH "${output}" output) set(${RESULT} ${output} PARENT_SCOPE) endif(NOT return_code) endfunction(QUERY_QMAKE) query_qmake(QT_INSTALL_QML QT_IMPORTS_DIR) set(PLUGIN_DIR ${QT_IMPORTS_DIR}/NotesApp/Plugins) install(TARGETS notes-app-plugin DESTINATION ${PLUGIN_DIR}) install(FILES qmldir DESTINATION ${PLUGIN_DIR}) notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/cachingprovider.cpp0000644000015301777760000001125312323260622025476 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "cachingprovider.h" #include #include #include #include #include #include #include #include #include #include /* CachingProvider is a implementation of QQuickImageProvider that caches the images it provides so that if the original disappears we can still display them. The uri that should be used is: "image://cache/" where image_url is the url that you would use normally without the cache Example: \qml Image { source: "image://cache/http://example.org/example.png" } \endqml */ CachingProvider::CachingProvider() : QQuickImageProvider(QQuickImageProvider::Image) { } QImage CachingProvider::downloadImage(const QUrl &url) { QNetworkAccessManager networkMgr; int followedRedirects = 0; QUrl currentUrl(url); while (followedRedirects < REDIRECT_LIMIT) { QNetworkReply* reply = networkMgr.get(QNetworkRequest(currentUrl)); /* The requestImage method is called in a separate thread and needs * to return a QImage when finished. Therefore the only way to * use QNetworkAccessManager to download the image is to wait for it * to emit the finished() signal by spawning a new event loop */ QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); QVariant attribute = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); QUrl redirect = attribute.toUrl(); if (redirect.isEmpty()) { if (reply->error() != QNetworkReply::NoError) { qWarning() << "FAILED TO DOWNLOAD" << reply->errorString(); } /* If the server reported an error (such as the file not existing) * or is not reachable, then QImageReader::read will fail and return * a QImage where isNull() is true, which when returned from the image * provider will cause QML to print an appropriate warning. */ QImageReader reader(reply); return reader.read(); } else { currentUrl = redirect; followedRedirects++; } } /* We followed too many redirects, and there's one more. Give up */ qWarning() << "Failed to download the image due to too many redirects."; return QImage(); } QImage CachingProvider::requestImage(const QString &id, QSize *size, const QSize& requestedSize) { QUrl url(id); bool canCache = true; QDir dataLocation(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); if (!dataLocation.exists()) { if (!QDir::root().mkpath(dataLocation.absolutePath())) { qWarning() << "Failed to access the application directory. Images will not be cached."; canCache = false; } } QString hash = QString(QCryptographicHash::hash(url.toString().toUtf8(), QCryptographicHash::Md5).toHex()); QString extension = QFileInfo(url.path()).suffix(); QFileInfo cacheFile = dataLocation.filePath(hash + "." + extension); QImage image; bool needDownload = false; if (cacheFile.exists()) { if (!image.load(cacheFile.absoluteFilePath())) { qWarning() << "Failed to load file from cache at path:" << cacheFile.absoluteFilePath(); needDownload = true; } } else needDownload = true; if (needDownload) { if (url.scheme() != "file") { image = downloadImage(url); } else { image.load(url.path()); } if (canCache && !image.isNull()) { if (!image.save(cacheFile.absoluteFilePath())) { qWarning() << "Failed to save file to cache with path:" << cacheFile.absoluteFilePath(); } } } *size = image.size(); if (!image.isNull() && requestedSize.isValid() && (image.size() != requestedSize)) { return image.scaled(requestedSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } else { return image; } } notes-app-1.4+14.04.20140415/src/NotesApp/Plugins/components.h0000644000015301777760000000175012323260622024162 0ustar pbusernogroup00000000000000/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef COMPONENTS_H #define COMPONENTS_H #include #include class Components : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); void initializeEngine(QQmlEngine *engine, const char *uri); }; #endif // COMPONENTS_H notes-app-1.4+14.04.20140415/src/NotesApp/CMakeLists.txt0000644000015301777760000000003312323260622022734 0ustar pbusernogroup00000000000000add_subdirectory(Plugins) notes-app-1.4+14.04.20140415/KeyboardRectangle.qml0000644000015301777760000000430212323260622021757 0ustar pbusernogroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This file is part of notes-app. * * webbrowser-app 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; version 3. * * webbrowser-app is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // This file was originally part of the telephony application. // It is a workaround required to handle interaction with the OSK, // until the shell/WM takes care of that on behalf of the applications. import QtQuick 2.0 import Ubuntu.Components 0.1 Item { id: keyboardRect anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom height: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0 Behavior on height { UbuntuNumberAnimation {} } states: [ State { name: "hidden" when: keyboardRect.height == 0 }, State { name: "shown" when: keyboardRect.height == Qt.inputMethod.keyboardRectangle.height } ] function recursiveFindFocusedItem(parent) { if (parent.activeFocus) { return parent; } for (var i in parent.children) { var child = parent.children[i]; if (child.activeFocus) { return child; } var item = recursiveFindFocusedItem(child); if (item != null) { return item; } } return null; } Connections { target: Qt.inputMethod onVisibleChanged: { if (!Qt.inputMethod.visible) { var focusedItem = recursiveFindFocusedItem(keyboardRect.parent); if (focusedItem != null) { focusedItem.focus = false; } } } } }