64bit/Database: Difference between revisions

From kJams Wiki
Jump to navigation Jump to search
Line 19: Line 19:
* ability to convert existing DB model to new DB model (so when new app is run, old data is sucked in and converted, then set aside in “backup” folder in case things go wrong later), then on subsequent runs it reads new DB data file(s)
* ability to convert existing DB model to new DB model (so when new app is run, old data is sucked in and converted, then set aside in “backup” folder in case things go wrong later), then on subsequent runs it reads new DB data file(s)
* some "playlists" are not part of the main DB, and need separate storage, eg: music stores.  users should be free to delete these DBs in the file system between runs and not mess up the main tables. users can turn these stores on and off at will, they each have their own separate playlist (store) but also they (or a subset) MAY be included (shown) within the main Library playlist along with the rest of the user's songs (so it's a little tricky). updating these stores must be done in such a way as to merge new changes without invalidating the existing song IDs)
* some "playlists" are not part of the main DB, and need separate storage, eg: music stores.  users should be free to delete these DBs in the file system between runs and not mess up the main tables. users can turn these stores on and off at will, they each have their own separate playlist (store) but also they (or a subset) MAY be included (shown) within the main Library playlist along with the rest of the user's songs (so it's a little tricky). updating these stores must be done in such a way as to merge new changes without invalidating the existing song IDs)
* Similarly CDs, they have a separate playlist not shown in the library, but meta data is stored for them, so next time you put i the same CD, you see it's data


==Freelancer Type==
==Freelancer Type==

Revision as of 19:21, 5 February 2019

Deliverable

Using Qt Widgets & C++, you will create a cross-platform database (using SQLite?) with GUI browser with these features:

  • “main browser” window has a “Source” list (tree view) on the left side (listing the “Library” and other “Playlists”) (single column, heirarchical, as some act as folders)
  • “main browser” window has a “Tracks” list (table view) on the right side side (showing contents of currently selected playlist) (multi-column, flat, configurable)
  • playlist may contain tracks (songs) OR other playlists (ie: like folders)
  • when selecting a “Source” on the left, show the contents of that source on the right, in the “Tracks” list
  • fully configurable and customizable list of meta data “sort columns” on the right, ability to hide / show / reorder as user wishes (old DB model & data provided, you create new DB model)
  • ability to sort by any meta data column (quickly)
  • drag and drop reordering of tracks when sorted by “#” (no reorder when sorted by any other column)
  • ability to drag and drop single or group from tracks list (on right) to other play lists (on left)
  • fully supports unicode
  • uses SQL(ite) backend or whatever is the best for QT “fast database search”
  • searches must scale to hundreds of thousands of items, and be very quick (probably never more than 500k)
  • search function will search only the shown (visible) meta data columns, does NOT search in columns that are hidden
  • search allows for these features. Specifically, support for quoted, numeric, targeted (only a specific sort column), and "exact"
  • ability to break out a copy of a playlist (tracks list) into separate window, showing only that tracks list, window has no adornment or other controls. list shown will update if model is changed in any other viewer (renaming, add / remove / reordering etc)
  • database updates / queries must never block UI thread (expensive ops must be on back thread, & obviously be thread safe)
  • ability to convert existing DB model to new DB model (so when new app is run, old data is sucked in and converted, then set aside in “backup” folder in case things go wrong later), then on subsequent runs it reads new DB data file(s)
  • some "playlists" are not part of the main DB, and need separate storage, eg: music stores. users should be free to delete these DBs in the file system between runs and not mess up the main tables. users can turn these stores on and off at will, they each have their own separate playlist (store) but also they (or a subset) MAY be included (shown) within the main Library playlist along with the rest of the user's songs (so it's a little tricky). updating these stores must be done in such a way as to merge new changes without invalidating the existing song IDs)
  • Similarly CDs, they have a separate playlist not shown in the library, but meta data is stored for them, so next time you put i the same CD, you see it's data

Freelancer Type

  • Speak english fluently (no broken english)
  • familiar with both mac and windows QT development environments
  • is fully familiar with developing QT desktop apps
  • is familiar with Version Control (we will be using Perforce)
  • understands MVC
  • familiar with Apple's CoreFoundation data structures and APIs (on windows known as "CFLite")
  • familiar with Python (used in build system for pre/post build steps)
  • totally familiar with databases / search / unicode
  • totally familiar with creating front end for database: lists, lists of lists, GUI data browser, configurable sort columns, drag and drop etc
  • can work pretty much full time
  • must provide weekly work schedule ahead of time (eg: i plan to work monday through thursday for 5 hours each day)
  • provide scrum type progress updates at the start AND END of each working day (what you worked on last, what you plan to work on next, any blocking issues)
  • communicate frequently (literally communicate with me every day)

Required Development environment

  • a powerful, modern mac (hopefully a “trash can” mac pro)
  • current version of Parallels Desktop

I will provide a VM pre configured thusly

  • Qt Creator 4.8 with Qt 5.12.1
  • either: macOS 10.14.3, Xcode 9.4.1, or Windows 10, VS 2017
  • Python 2.7 and all the build scripts that use it
  • Perforce (Helix) for version control, with your creds and workspace
  • my already-working shell program which has:
    • preliminary menus and windows
    • “main browser” window shell where you will put the source & tracks lists
    • old DB model code that works and loads a library, so what you create is compatible with reading it. current DB stored in big binary file, current playlist data is stored in “plist” files (CoreFoundation xml) for you to read in (high level APIs provided) but this will be converted to SQL (or whatever)
    • reference app is this: kJams. Get "kJams Pro". We will be basically re-creating this in Qt. It shows all of what is described above (problem is that it's 32bit, this project is to re-create it for 64bit) except "break out into separate window)

Milestones

10% payout at each milestone, with rest of payout at end / upon acceptance

  1. ability to load & view test database, able to scroll through it
  2. ability to configure and sort by meta data columns
  3. ability to search and get search results
  4. ability to drag and drop a group from tracks list into playlist in sources list
  5. rest of work / finishing touches.